| Foreign type | Prolog type | C type | Description of the C type |
| integer | integer | int | value of the integer |
| positive | positive integer | int | value of the integer |
| float | floating point number | double | value of the floating point number |
| number | number | double | value of the number |
| atom | atom | int | internal key of the atom |
| boolean | boolean | int | value of the boolean (0=false, 1=true) |
| char | character | int | value of (the code of) the character |
| Code | character code | int | value of the character-code |
| byte | byte | int | value of the byte |
| in_char | in-character | int | value of the character or -1 for end-of-file |
| in_code | in-character code | int | value of the character-code or -1 for end-of-file |
| in_byte | in-byte | int | value of the byte or -1 for the end-of-file |
| string | atom | char * | C string containing the name of the atom |
| chars | character list | char * | C string containing the characters of the list |
| codes | character-code list | char * | C string containing the characters of the list |
| term | Prolog term | PlTerm | generic Prolog term |
typedef struct
{
Bool is_var;
Bool unify;
union
{
long l;
char *s;
double d;
}value;
}FIOArg;
void Get_Choice_Counter(void) TYPE Get_Choice_Buffer (TYPE) void No_More_Choice (void)
#include <string.h>
#include "gprolog.h"
Bool first_occurrence(char *str, int c, int *pos)
{
char *p;
if ((p=strchr(str,c))==NULL) /* C does not appear in A */
return FALSE; /* fail */
*pos=p-str; /* set the output argument */
return TRUE; /* succeed */
}
| ?- first_occurrence(prolog, p, X).
X = 0
| ?- first_occurrence(prolog, k, X).
no
| ?- first_occurrence(prolog, A, X).
{exception: error(instantiation_error,first_occurrence/3)}
| ?- first_occurrence(prolog, 1 ,X).
{exception: error(type_error(character,1),first_occurrence/3)}
#include <string.h>
#include "gprolog.h"
Bool occurrence(char *str, int c, int *pos)
{
char **info_pos;
char *p;
info_pos=Get_Choice_Buffer(char **); /* recover the buffer */
if (Get_Choice_Counter()==0) /* first invocation ? */
*info_pos=str;
if ((p=strchr(*info_pos,c))==NULL) /* C does not appear */
{
No_More_Choice(); /* remove choice-point */
return FALSE; /* fail */
}
*pos=p-str; /* set the output argument */
*info_pos=p+1; /* update next starting pos */
return TRUE; /* succeed */
}
| | ?- occurrence(prolog, o, X). | ||
| X = 2 ? | (here the user presses ; to compute another solution) | |
| X = 4 ? | (here the user presses ; to compute another solution) | |
| no | (no more solution) | |
| | ?- occurrence(prolog, k, X). | ||
| no | ||
#include <string.h>
#include "gprolog.h"
Bool occurrence(char *str, int c, int *pos)
{
char **info_pos;
char *p;
info_pos=Get_Choice_Buffer(char **); /* recover the buffer */
if (Get_Choice_Counter()==0) /* first invocation ? */
{
if ((p=strchr(str,c))==NULL) /* C does not appear at all */
{
No_More_Choice(); /* remove choice-point */
return FALSE; /* fail */
}
*info_pos=p;
}
/* info_pos = an occurrence */
*pos=*info_pos-str; /* set the output argument */
if ((p=strchr(*info_pos+1,c))==NULL) /* no more occurrence */
No_More_Choice(); /* remove choice-point */
else
*info_pos=p; /* else update next solution */
return TRUE; /* succeed */
}
| | ?- occurrence(prolog, l, X). | ||
| X = 3 | (here the user is not prompted since there is no more alternative) | |
| | ?- occurrence(prolog, o, X). | ||
| X = 2 ? | (here the user presses ; to compute another solution) | |
| X = 4 | (here the user is not prompted since there is no more alternative) | |
#include "gprolog.h"
Bool Char_Ascii(FIOArg *c, FIOArg *ascii)
{
if (!c->is_var) /* Char is not a variable */
{
ascii->unify=TRUE; /* enforce unif. of Code */
ascii->value.l=c->value.l; /* set Code */
return TRUE; /* succeed */
}
if (ascii->is_var) /* Code is also a variable */
Pl_Err_Instantiation(); /* emit instantiation_error */
c->value.l=ascii->value.l; /* set Char */
return TRUE; /* succeed */
}
| ?- char_ascii(a, X).
X = 97
| ?- char_ascii(X, 65).
X = 'A'
| ?- char_ascii(a, 12).
no
| ?- char_ascii(X, X).
{exception: error(instantiation_error,char_ascii/2)}
| ?- char_ascii(1, 12).
{exception: error(type_error(character,1),char_ascii/2)}