 
 
| 
 | 
| 
 | 
| 
 | 
| 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)}
 
