2001-04-09 20:54:03 +01:00
|
|
|
/*************************************************************************
|
|
|
|
* *
|
|
|
|
* YAP Prolog %W% %G%
|
|
|
|
* *
|
|
|
|
* Yap Prolog was developed at NCCUP - Universidade do Porto *
|
|
|
|
* *
|
2003-01-22 14:26:15 +00:00
|
|
|
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-2003 *
|
2001-04-09 20:54:03 +01:00
|
|
|
* *
|
|
|
|
**************************************************************************
|
|
|
|
* *
|
2003-01-22 14:26:15 +00:00
|
|
|
* File: yapio.h *
|
|
|
|
* Last rev: 22/1/03 *
|
2001-04-09 20:54:03 +01:00
|
|
|
* mods: *
|
|
|
|
* comments: Input/Output information *
|
|
|
|
* *
|
|
|
|
*************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef SIMICS
|
|
|
|
#undef HAVE_LIBREADLINE
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <stdio.h>
|
2006-11-28 13:17:17 +00:00
|
|
|
#include <wchar.h>
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2011-02-15 13:54:19 +00:00
|
|
|
#include "SWI-Stream.h"
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
#ifndef YAP_STDIO
|
|
|
|
|
|
|
|
#define YP_printf printf
|
|
|
|
#define YP_putchar putchar
|
|
|
|
#define YP_getc getc
|
|
|
|
#define YP_fgetc fgetc
|
|
|
|
#define YP_getchar getchar
|
|
|
|
#define YP_fgets fgets
|
|
|
|
#define YP_clearerr clearerr
|
|
|
|
#define YP_feof feof
|
|
|
|
#define YP_ferror ferror
|
2008-03-25 22:03:14 +00:00
|
|
|
#if defined(_MSC_VER) || defined(__MINGW32__)
|
2001-06-22 18:53:36 +01:00
|
|
|
#define YP_fileno _fileno
|
|
|
|
#else
|
2001-04-09 20:54:03 +01:00
|
|
|
#define YP_fileno fileno
|
2001-06-22 18:53:36 +01:00
|
|
|
#endif
|
2001-04-09 20:54:03 +01:00
|
|
|
#define YP_fopen fopen
|
|
|
|
#define YP_fclose fclose
|
|
|
|
#define YP_ftell ftell
|
|
|
|
#define YP_fseek fseek
|
|
|
|
#define YP_setbuf setbuf
|
|
|
|
#define YP_fputs fputs
|
|
|
|
#define YP_ungetc ungetc
|
|
|
|
#define YP_fdopen fdopen
|
|
|
|
#define init_yp_stdio()
|
|
|
|
|
|
|
|
#define YP_FILE FILE
|
2001-04-27 17:02:43 +01:00
|
|
|
|
2013-04-25 23:15:04 +01:00
|
|
|
int YP_putc(int, int);
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
#ifdef putc
|
|
|
|
#undef putc
|
|
|
|
#undef getc
|
|
|
|
#undef putchar
|
|
|
|
#undef getchar
|
|
|
|
#undef stdin
|
|
|
|
#undef stdout
|
|
|
|
#undef stderr
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define printf ERR_printf
|
|
|
|
#define fprintf ERR_fprintf
|
|
|
|
#define putchar ERR_putchar
|
|
|
|
#define putc ERR_putc
|
|
|
|
#define getc ERR_getc
|
|
|
|
#define fgetc ERR_fgetc
|
|
|
|
#define getchar ERR_getchar
|
|
|
|
#define fgets ERR_fgets
|
|
|
|
#define clearerr ERR_clearerr
|
|
|
|
#define feof ERR_feof
|
|
|
|
#define ferror ERR_ferror
|
|
|
|
#define fileno ERR_fileno
|
|
|
|
#define fopen ERR_fopen
|
|
|
|
#define fclose ERR_fclose
|
|
|
|
#define fflush ERR_fflush
|
|
|
|
|
|
|
|
/* flags for files in IOSTREAM struct */
|
|
|
|
#define _YP_IO_WRITE 1
|
|
|
|
#define _YP_IO_READ 2
|
|
|
|
|
|
|
|
#define _YP_IO_ERR 0x04
|
|
|
|
#define _YP_IO_EOF 0x08
|
|
|
|
|
|
|
|
#define _YP_IO_FILE 0x10
|
|
|
|
#define _YP_IO_SOCK 0x20
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct IOSTREAM {
|
|
|
|
int check;
|
|
|
|
int fd; /* file descriptor */
|
|
|
|
int flags;
|
|
|
|
int cnt;
|
|
|
|
int buflen;
|
|
|
|
char buf[2];
|
|
|
|
char *ptr;
|
|
|
|
char *base;
|
|
|
|
int (*close)(int fd); /* close file */
|
|
|
|
int (*read)(int fd, char *b, int n); /* read bytes */
|
|
|
|
int (*write)(int fd, char *b, int n);/* write bytes */
|
|
|
|
} YP_FILE;
|
|
|
|
|
|
|
|
#define YP_stdin &yp_iob[0]
|
|
|
|
#define YP_stdout &yp_iob[1]
|
|
|
|
#define YP_stderr &yp_iob[2]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define YP_getc(f) (--(f)->cnt < 0 ? YP_fillbuf(f) : *((unsigned char *) ((f)->ptr++)))
|
|
|
|
#define YP_fgetc(f) YP_fgetc(f)
|
|
|
|
#define YP_putc(c,f) (--(f)->cnt < 0 ? YP_flushbuf(c,f) : (unsigned char) (*(f)->ptr++ = (char) c))
|
|
|
|
#define YP_putchar(cc) YP_putc(cc,YP_stdout)
|
|
|
|
#define YP_getchar() YP_getc(YP_stdin)
|
|
|
|
|
|
|
|
int YP_fillbuf(YP_FILE *f);
|
|
|
|
int YP_flushbuf(int c, YP_FILE *f);
|
|
|
|
|
|
|
|
int YP_printf(char *, ...);
|
|
|
|
int YP_fprintf(YP_FILE *, char *, ...);
|
|
|
|
char* YP_fgets(char *, int, YP_FILE *);
|
|
|
|
char* YP_gets(char *);
|
|
|
|
YP_FILE *YP_fopen(char *, char *);
|
|
|
|
int YP_fclose(YP_FILE *);
|
|
|
|
int YP_fileno(YP_FILE *);
|
|
|
|
int YP_fflush(YP_FILE *);
|
|
|
|
int YP_feof(YP_FILE *);
|
|
|
|
int YP_ftell(YP_FILE *);
|
|
|
|
int YP_fseek(YP_FILE *, int, int);
|
|
|
|
int YP_clearerr(YP_FILE *);
|
|
|
|
void init_yp_stdio(void);
|
|
|
|
int YP_fputs(char *s, YP_FILE *f);
|
|
|
|
int YP_puts(char *s);
|
|
|
|
int YP_setbuf(YP_FILE *f, char *buf);
|
|
|
|
|
|
|
|
|
|
|
|
#define YP_MAX_FILES 40
|
|
|
|
|
|
|
|
extern YP_FILE yp_iob[YP_MAX_FILES];
|
|
|
|
|
|
|
|
#endif /* YAP_STDIO */
|
|
|
|
|
|
|
|
typedef YP_FILE *YP_File;
|
|
|
|
|
2011-05-23 16:19:47 +01:00
|
|
|
/* ricardo
|
2010-04-16 12:11:52 +01:00
|
|
|
typedef enum TokenKinds {
|
2002-11-19 17:10:45 +00:00
|
|
|
Name_tok,
|
|
|
|
Number_tok,
|
|
|
|
Var_tok,
|
|
|
|
String_tok,
|
2006-11-27 17:42:03 +00:00
|
|
|
WString_tok,
|
2002-11-19 17:10:45 +00:00
|
|
|
Ponctuation_tok,
|
|
|
|
Error_tok,
|
|
|
|
eot_tok
|
2010-04-16 12:11:52 +01:00
|
|
|
} tkinds;
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
typedef struct TOKEN {
|
2010-04-16 12:11:52 +01:00
|
|
|
enum TokenKinds Tok;
|
2001-04-09 20:54:03 +01:00
|
|
|
Term TokInfo;
|
|
|
|
int TokPos;
|
|
|
|
struct TOKEN *TokNext;
|
|
|
|
} TokEntry;
|
|
|
|
|
2010-04-16 12:11:52 +01:00
|
|
|
#define Ord(X) ((enum TokenKinds) (X))
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2011-03-07 16:02:55 +00:00
|
|
|
#define NextToken GNextToken( PASS_REGS1 )
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
typedef struct VARSTRUCT {
|
|
|
|
Term VarAdr;
|
|
|
|
CELL hv;
|
|
|
|
struct VARSTRUCT *VarLeft, *VarRight;
|
|
|
|
char VarRep[1];
|
|
|
|
} VarEntry;
|
2011-05-23 16:19:47 +01:00
|
|
|
*/
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2012-02-13 23:07:31 +00:00
|
|
|
#ifndef _PL_WRITE_
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
/* Character types for tokenizer and write.c */
|
|
|
|
|
|
|
|
#define UC 1 /* Upper case */
|
|
|
|
#define UL 2 /* Underline */
|
|
|
|
#define LC 3 /* Lower case */
|
|
|
|
#define NU 4 /* digit */
|
|
|
|
#define QT 5 /* single quote */
|
|
|
|
#define DC 6 /* double quote */
|
|
|
|
#define SY 7 /* Symbol character */
|
|
|
|
#define SL 8 /* Solo character */
|
|
|
|
#define BK 9 /* Brackets & friends */
|
|
|
|
#define BS 10 /* Blank */
|
|
|
|
#define EF 11 /* End of File marker */
|
|
|
|
#define CC 12 /* comment char % */
|
|
|
|
|
|
|
|
#define EOFCHAR EOF
|
|
|
|
|
2012-02-13 23:07:31 +00:00
|
|
|
#endif
|
2007-12-29 12:26:41 +00:00
|
|
|
|
2002-02-04 16:12:54 +00:00
|
|
|
/* info on aliases */
|
|
|
|
typedef struct AliasDescS {
|
|
|
|
Atom name;
|
|
|
|
int alias_stream;
|
|
|
|
} * AliasDesc;
|
|
|
|
|
2006-11-27 17:42:03 +00:00
|
|
|
/************ SWI compatible support for different encodings ************/
|
|
|
|
|
2011-02-15 07:39:27 +00:00
|
|
|
|
2006-11-27 17:42:03 +00:00
|
|
|
#define MAX_ISO_LATIN1 255
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
/****************** character definition table **************************/
|
2010-05-05 12:45:11 +01:00
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
#define NUMBER_OF_CHARS 256
|
2002-11-18 18:18:05 +00:00
|
|
|
extern char *Yap_chtype;
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2012-06-29 22:44:08 +01:00
|
|
|
#include "inline-only.h"
|
2013-04-25 23:15:04 +01:00
|
|
|
INLINE_ONLY EXTERN inline int chtype(Int);
|
|
|
|
int Yap_wide_chtype(Int);
|
2007-12-29 12:26:41 +00:00
|
|
|
|
2012-06-30 19:42:14 +01:00
|
|
|
INLINE_ONLY EXTERN inline int
|
2010-05-05 12:45:11 +01:00
|
|
|
chtype(Int ch)
|
2007-12-29 12:26:41 +00:00
|
|
|
{
|
2010-05-05 12:45:11 +01:00
|
|
|
if (ch < NUMBER_OF_CHARS)
|
2007-12-29 12:26:41 +00:00
|
|
|
return Yap_chtype[ch];
|
2010-05-05 12:45:11 +01:00
|
|
|
return Yap_wide_chtype(ch);
|
2007-12-29 12:26:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
/* parser stack, used to be AuxSp, now is ASP */
|
2011-05-04 10:11:41 +01:00
|
|
|
#define ParserAuxSp LOCAL_ScannerStack
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
/* routines in parser.c */
|
2013-04-25 23:15:04 +01:00
|
|
|
VarEntry *Yap_LookupVar(char *);
|
|
|
|
Term Yap_VarNames(VarEntry *,Term);
|
2013-11-18 12:57:09 +00:00
|
|
|
Term Yap_Variables(VarEntry *,Term);
|
|
|
|
Term Yap_Singletons(VarEntry *,Term);
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2003-01-22 14:26:15 +00:00
|
|
|
/* routines in scanner.c */
|
2014-01-07 01:10:48 +00:00
|
|
|
TokEntry *Yap_tokenizer(struct io_stream *, int, Term *, void *rd);
|
2013-04-25 23:15:04 +01:00
|
|
|
void Yap_clean_tokenizer(TokEntry *, VarEntry *, VarEntry *,Term);
|
|
|
|
Term Yap_scan_num(struct io_stream *);
|
|
|
|
char *Yap_AllocScannerMemory(unsigned int);
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
/* routines in iopreds.c */
|
2013-04-25 23:15:04 +01:00
|
|
|
FILE *Yap_FileDescriptorFromStream(Term);
|
|
|
|
Int Yap_FirstLineInParse(void);
|
|
|
|
int Yap_CheckIOStream(Term, char *);
|
2007-11-26 23:43:10 +00:00
|
|
|
#if defined(YAPOR) || defined(THREADS)
|
2013-04-25 23:15:04 +01:00
|
|
|
void Yap_LockStream(struct io_stream *);
|
|
|
|
void Yap_UnLockStream(struct io_stream *);
|
2007-11-26 23:43:10 +00:00
|
|
|
#else
|
|
|
|
#define Yap_LockStream(X)
|
|
|
|
#define Yap_UnLockStream(X)
|
|
|
|
#endif
|
2013-04-25 23:15:04 +01:00
|
|
|
Int Yap_GetStreamFd(int);
|
|
|
|
void Yap_CloseStreams(int);
|
|
|
|
void Yap_FlushStreams(void);
|
|
|
|
void Yap_CloseStream(int);
|
|
|
|
int Yap_PlGetchar(void);
|
|
|
|
int Yap_PlGetWchar(void);
|
|
|
|
int Yap_PlFGetchar(void);
|
|
|
|
int Yap_GetCharForSIGINT(void);
|
|
|
|
Int Yap_StreamToFileNo(Term);
|
|
|
|
Term Yap_OpenStream(FILE *,char *,Term,int);
|
|
|
|
Term Yap_StringToTerm(char *,Term *);
|
2012-09-18 23:06:26 +01:00
|
|
|
char *Yap_TermToString(Term t, char *s, size_t sz, size_t *length, int *encoding, int flags);
|
2012-09-07 23:12:38 +01:00
|
|
|
int Yap_GetFreeStreamD(void);
|
|
|
|
int Yap_GetFreeStreamDForReading(void);
|
2006-11-27 17:42:03 +00:00
|
|
|
|
2012-09-07 23:12:38 +01:00
|
|
|
Term Yap_WStringToList(wchar_t *);
|
2013-04-25 23:15:04 +01:00
|
|
|
Term Yap_WStringToListOfAtoms(wchar_t *);
|
|
|
|
Atom Yap_LookupWideAtom( wchar_t * );
|
2002-11-11 17:38:10 +00:00
|
|
|
|
2001-05-21 21:00:05 +01:00
|
|
|
#define YAP_INPUT_STREAM 0x01
|
|
|
|
#define YAP_OUTPUT_STREAM 0x02
|
|
|
|
#define YAP_APPEND_STREAM 0x04
|
|
|
|
#define YAP_PIPE_STREAM 0x08
|
|
|
|
#define YAP_TTY_STREAM 0x10
|
|
|
|
#define YAP_POPEN_STREAM 0x20
|
|
|
|
#define YAP_BINARY_STREAM 0x40
|
|
|
|
#define YAP_SEEKABLE_STREAM 0x80
|
|
|
|
|
|
|
|
|
2010-12-13 12:38:37 +00:00
|
|
|
#define Quote_illegal_f 0x01
|
|
|
|
#define Ignore_ops_f 0x02
|
|
|
|
#define Handle_vars_f 0x04
|
|
|
|
#define Use_portray_f 0x08
|
|
|
|
#define To_heap_f 0x10
|
|
|
|
#define Unfold_cyclics_f 0x20
|
|
|
|
#define Use_SWI_Stream_f 0x40
|
2012-02-13 23:07:31 +00:00
|
|
|
#define BackQuote_String_f 0x80
|
|
|
|
#define AttVar_None_f 0x100
|
|
|
|
#define AttVar_Dots_f 0x200
|
|
|
|
#define AttVar_Portray_f 0x400
|
|
|
|
#define Blob_Portray_f 0x800
|
2002-10-17 01:05:29 +01:00
|
|
|
|
2011-06-01 17:34:04 +01:00
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
|
|
|
|
/* grow.c */
|
2013-04-25 23:15:04 +01:00
|
|
|
int Yap_growheap_in_parser(tr_fr_ptr *, TokEntry **, VarEntry **);
|
|
|
|
int Yap_growstack_in_parser(tr_fr_ptr *, TokEntry **, VarEntry **);
|
|
|
|
int Yap_growtrail_in_parser(tr_fr_ptr *, TokEntry **, VarEntry **);
|
2002-11-11 17:38:10 +00:00
|
|
|
|
|
|
|
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2008-03-25 22:03:14 +00:00
|
|
|
#ifdef HAVE_ERRNO_H
|
2001-04-09 20:54:03 +01:00
|
|
|
#include <errno.h>
|
|
|
|
#else
|
|
|
|
extern int errno;
|
|
|
|
#endif
|
|
|
|
|
2013-04-25 23:15:04 +01:00
|
|
|
INLINE_ONLY EXTERN UInt inline HashFunction(unsigned char *);
|
|
|
|
INLINE_ONLY EXTERN UInt inline WideHashFunction(wchar_t *);
|
2003-10-28 01:16:03 +00:00
|
|
|
|
2012-06-30 19:42:14 +01:00
|
|
|
INLINE_ONLY EXTERN inline UInt
|
2005-07-06 16:10:18 +01:00
|
|
|
HashFunction(unsigned char *CHP)
|
2003-10-06 14:49:38 +01:00
|
|
|
{
|
2003-10-28 01:16:03 +00:00
|
|
|
/* djb2 */
|
|
|
|
UInt hash = 5381;
|
|
|
|
UInt c;
|
|
|
|
|
|
|
|
while ((c = *CHP++) != '\0') {
|
|
|
|
/* hash = ((hash << 5) + hash) + c; hash * 33 + c */
|
|
|
|
hash = hash * 33 ^ c;
|
|
|
|
}
|
|
|
|
return hash;
|
|
|
|
/*
|
|
|
|
UInt OUT=0, i = 1;
|
|
|
|
while(*CHP != '\0') { OUT += (UInt)(*CHP++); }
|
2003-10-06 14:49:38 +01:00
|
|
|
return OUT;
|
2003-10-28 01:16:03 +00:00
|
|
|
*/
|
2003-10-06 14:49:38 +01:00
|
|
|
}
|
2001-04-09 20:54:03 +01:00
|
|
|
|
2013-04-25 23:15:04 +01:00
|
|
|
INLINE_ONLY EXTERN UInt inline
|
2006-11-27 17:42:03 +00:00
|
|
|
WideHashFunction(wchar_t *CHP)
|
|
|
|
{
|
|
|
|
UInt hash = 5381;
|
|
|
|
UInt c;
|
|
|
|
|
|
|
|
while ((c = *CHP++) != '\0') {
|
|
|
|
hash = hash * 33 ^ c;
|
|
|
|
}
|
|
|
|
return hash;
|
|
|
|
}
|
|
|
|
|
2002-06-05 02:34:06 +01:00
|
|
|
#define FAIL_ON_PARSER_ERROR 0
|
|
|
|
#define QUIET_ON_PARSER_ERROR 1
|
|
|
|
#define CONTINUE_ON_PARSER_ERROR 2
|
|
|
|
#define EXCEPTION_ON_PARSER_ERROR 3
|
|
|
|
|
2001-09-21 15:22:32 +01:00
|
|
|
|