Below is an example showing all stages of the declaration of a foreign predicate that transforms atoms possibly holding uppercase letters into an atom only holding lower case letters. Figure 10 shows the C-source file, figure 11 illustrates compiling and loading of foreign code.
/* Include file depends on local installation */ #include <SWI-Prolog.h> #include <stdlib.h> #include <ctype.h> foreign_t pl_lowercase(term_t u, term_t l) { char *copy; char *s, *q; int rval; if ( !PL_get_atom_chars(u, &s) ) return PL_warning("lowercase/2: instantiation fault"); copy = malloc(strlen(s)+1); for( q=copy; *s; q++, s++) *q = (isupper(*s) ? tolower(*s) : *s); *q = '\0'; rval = PL_unify_atom_chars(l, copy); free(copy); return rval; } install_t install() { PL_register_foreign("lowercase", 2, pl_lowercase, 0); } |
% gcc -I/usr/local/lib/pl-\plversion/include -fpic -c lowercase.c % gcc -shared -o lowercase.so lowercase.o % pl Welcome to SWI-Prolog (Version \plversion) Copyright (c) 1993-1996 University of Amsterdam. All rights reserved. For help, use ?- help(Topic). or ?- apropos(Word). 1 ?- load_foreign_library(lowercase). Yes 2 ?- lowercase('Hello World!', L). L = 'hello world!' Yes |