1 /*************************************************************************
2 *									 *
3 *	 YAP Prolog 	%W% %G%
4 *									 *
5 *	Yap Prolog was developed at NCCUP - Universidade do Porto	 *
6 *									 *
7 * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-2003	 *
8 *									 *
9 **************************************************************************
10 *									 *
11 * File:		yapio.h							 *
12 * Last rev:	22/1/03							 *
13 * mods:									 *
14 * comments:	Input/Output information				 *
15 *									 *
16 *************************************************************************/
17 
18 
19 #ifdef SIMICS
20 #undef HAVE_LIBREADLINE
21 #endif
22 
23 #include <stdio.h>
24 #include <wchar.h>
25 
26 #ifndef YAP_STDIO
27 
28 #define YP_printf	printf
29 #define YP_putchar	putchar
30 #define YP_getc		getc
31 #define YP_fgetc	fgetc
32 #define YP_getchar	getchar
33 #define YP_fgets	fgets
34 #define YP_clearerr     clearerr
35 #define YP_feof		feof
36 #define YP_ferror	ferror
37 #if defined(_MSC_VER) || defined(__MINGW32__)
38 #define YP_fileno	_fileno
39 #else
40 #define YP_fileno	fileno
41 #endif
42 #define YP_fopen	fopen
43 #define YP_fclose	fclose
44 #define YP_ftell	ftell
45 #define YP_fseek	fseek
46 #define YP_setbuf	setbuf
47 #define YP_fputs	fputs
48 #define YP_ungetc	ungetc
49 #define YP_fdopen	fdopen
50 #define init_yp_stdio()
51 
52 #if defined(_MSC_VER) || defined(__MINGW32__)
53 #define open _open
54 #define close _close
55 #define popen _popen
56 #define pclose _pclose
57 #define read _read
58 #define write _write
59 #define isatty _isatty
60 #define putenv(S) _putenv(S)
61 #define chdir(P) _chdir(P)
62 #define getcwd(B,S) _getcwd(B,S)
63 #endif
64 
65 #define YP_FILE		FILE
66 extern YP_FILE *Yap_stdin;
67 extern YP_FILE *Yap_stdout;
68 extern YP_FILE *Yap_stderr;
69 
70 int     STD_PROTO(YP_putc,(int, int));
71 
72 #else
73 
74 #ifdef putc
75 #undef putc
76 #undef getc
77 #undef putchar
78 #undef getchar
79 #undef stdin
80 #undef stdout
81 #undef stderr
82 #endif
83 
84 #define printf	ERR_printf
85 #define fprintf ERR_fprintf
86 #define putchar	ERR_putchar
87 #define putc	ERR_putc
88 #define getc	ERR_getc
89 #define fgetc	ERR_fgetc
90 #define getchar	ERR_getchar
91 #define fgets	ERR_fgets
92 #define clearerr ERR_clearerr
93 #define feof	ERR_feof
94 #define ferror	ERR_ferror
95 #define fileno	ERR_fileno
96 #define fopen	ERR_fopen
97 #define fclose	ERR_fclose
98 #define fflush	ERR_fflush
99 
100 
101 
102 /* flags for files in IOSTREAM struct */
103 #define _YP_IO_WRITE	1
104 #define _YP_IO_READ	2
105 
106 #define _YP_IO_ERR	0x04
107 #define _YP_IO_EOF	0x08
108 
109 #define _YP_IO_FILE	0x10
110 #define _YP_IO_SOCK	0x20
111 
112 
113 typedef struct IOSTREAM {
114   int   check;
115   int	fd;			/* file descriptor 	*/
116   int 	flags;
117   int   cnt;
118   int	buflen;
119   char  buf[2];
120   char  *ptr;
121   char  *base;
122   int   (*close)(int fd);	/* close file		*/
123   int	(*read)(int fd, char *b, int n); /* read bytes	*/
124   int	(*write)(int fd, char *b, int n);/* write bytes */
125 } YP_FILE;
126 
127 #define YP_stdin    &yp_iob[0]
128 #define YP_stdout   &yp_iob[1]
129 #define YP_stderr   &yp_iob[2]
130 
131 
132 
133 #define YP_getc(f)	(--(f)->cnt < 0 ? YP_fillbuf(f) :  *((unsigned char *) ((f)->ptr++)))
134 #define YP_fgetc(f)	YP_fgetc(f)
135 #define YP_putc(c,f)	(--(f)->cnt < 0 ? YP_flushbuf(c,f) : (unsigned char) (*(f)->ptr++ = (char) c))
136 #define YP_putchar(cc)	YP_putc(cc,YP_stdout)
137 #define YP_getchar()	YP_getc(YP_stdin)
138 
139 int YP_fillbuf(YP_FILE *f);
140 int YP_flushbuf(int c, YP_FILE *f);
141 
142 int YP_printf(char *, ...);
143 int YP_fprintf(YP_FILE *, char *, ...);
144 char* YP_fgets(char *, int, YP_FILE *);
145 char* YP_gets(char *);
146 YP_FILE *YP_fopen(char *, char *);
147 int YP_fclose(YP_FILE *);
148 int YP_fileno(YP_FILE *);
149 int YP_fflush(YP_FILE *);
150 int YP_feof(YP_FILE *);
151 int YP_ftell(YP_FILE *);
152 int YP_fseek(YP_FILE *, int, int);
153 int YP_clearerr(YP_FILE *);
154 void init_yp_stdio(void);
155 int YP_fputs(char *s, YP_FILE *f);
156 int YP_puts(char *s);
157 int YP_setbuf(YP_FILE *f, char *buf);
158 
159 
160 #define YP_MAX_FILES 40
161 
162 extern YP_FILE yp_iob[YP_MAX_FILES];
163 
164 #endif /* YAP_STDIO */
165 
166 typedef YP_FILE *YP_File;
167 
168 typedef enum TokenKinds {
169   Name_tok,
170   Number_tok,
171   Var_tok,
172   String_tok,
173   WString_tok,
174   Ponctuation_tok,
175   Error_tok,
176   eot_tok
177 } tkinds;
178 
179 typedef	 struct	TOKEN {
180   enum TokenKinds Tok;
181   Term TokInfo;
182   int	TokPos;
183   struct TOKEN *TokNext;
184 } TokEntry;
185 
186 #define	Ord(X) ((enum TokenKinds) (X))
187 
188 #define	NextToken GNextToken()
189 
190 typedef	struct VARSTRUCT {
191   Term VarAdr;
192   CELL hv;
193   struct VARSTRUCT *VarLeft, *VarRight;
194   char VarRep[1];
195 } VarEntry;
196 
197 /* Character types for tokenizer and write.c */
198 
199 #define UC      1       /* Upper case */
200 #define UL      2       /* Underline */
201 #define LC      3       /* Lower case */
202 #define NU      4       /* digit */
203 #define	QT	5	/* single quote */
204 #define	DC	6	/* double quote */
205 #define SY      7       /* Symbol character */
206 #define SL      8       /* Solo character */
207 #define BK      9       /* Brackets & friends */
208 #define BS      10      /* Blank */
209 #define EF	11	/* End of File marker */
210 #define CC	12	/* comment char %	*/
211 
212 #define EOFCHAR EOF
213 
214 
215 #if USE_SOCKET
216 /****************** defines for sockets *********************************/
217 
218 typedef enum{        /* in YAP, sockets may be in one of 4 possible status */
219   new_socket,
220     server_socket,
221     client_socket,
222     server_session_socket,
223     closed_socket
224 } socket_info;
225 
226 typedef enum{       /* we accept two domains for the moment, IPV6 may follow */
227       af_inet,      /* IPV4 */
228       af_unix       /* or AF_FILE */
229 } socket_domain;
230 
231 Term  STD_PROTO(Yap_InitSocketStream,(int, socket_info, socket_domain));
232 int   STD_PROTO(Yap_CheckStream,(Term, int, char *));
233 int   STD_PROTO(Yap_CheckSocketStream,(Term, char *));
234 socket_domain   STD_PROTO(Yap_GetSocketDomain,(int));
235 socket_info   STD_PROTO(Yap_GetSocketStatus,(int));
236 void  STD_PROTO(Yap_UpdateSocketStream,(int, socket_info, socket_domain));
237 
238 /* routines in ypsocks.c */
239 Int STD_PROTO(Yap_CloseSocket,(int, socket_info, socket_domain));
240 
241 #endif /* USE_SOCKET */
242 
243 /* info on aliases */
244 typedef struct AliasDescS {
245     Atom name;
246     int alias_stream;
247 } * AliasDesc;
248 
249 /************ SWI compatible support for different encodings ************/
250 
251 #ifndef SIO_NL_POSIX
252 typedef enum {
253   ENC_OCTET      = 0,
254   ENC_ISO_LATIN1 = 1,
255   ENC_ISO_ASCII  = 2,
256   ENC_ISO_ANSI   = 4,
257   ENC_ISO_UTF8   = 8,
258   ENC_UNICODE_BE = 16,
259   ENC_UNICODE_LE = 32,
260   ENC_ISO_UTF32_BE = 64,
261   ENC_ISO_UTF32_LE = 128
262 } encoding_t;
263 #endif
264 
265 #define MAX_ISO_LATIN1 255
266 
267 /****************** character definition table **************************/
268 
269 #define NUMBER_OF_CHARS 256
270 extern char *Yap_chtype;
271 
272 EXTERN inline int STD_PROTO(chtype,(Int));
273 int STD_PROTO(Yap_wide_chtype,(Int));
274 
275 EXTERN inline int
chtype(Int ch)276 chtype(Int ch)
277 {
278   if (ch < NUMBER_OF_CHARS)
279     return Yap_chtype[ch];
280   return Yap_wide_chtype(ch);
281 }
282 
283 
284 /* parser stack, used to be AuxSp, now is ASP */
285 #define ParserAuxSp ScannerStack
286 
287 /* routines in parser.c */
288 VarEntry STD_PROTO(*Yap_LookupVar,(char *));
289 Term STD_PROTO(Yap_VarNames,(VarEntry *,Term));
290 
291 /* routines in scanner.c */
292 TokEntry STD_PROTO(*Yap_tokenizer,(int, Term *));
293 void     STD_PROTO(Yap_clean_tokenizer,(TokEntry *, VarEntry *, VarEntry *));
294 Term     STD_PROTO(Yap_scan_num,(int (*)(int)));
295 char	 STD_PROTO(*Yap_AllocScannerMemory,(unsigned int));
296 
297 /* routines in iopreds.c */
298 FILE  *STD_PROTO(Yap_FileDescriptorFromStream,(Term));
299 Int   STD_PROTO(Yap_FirstLineInParse,(void));
300 int   STD_PROTO(Yap_CheckIOStream,(Term, char *));
301 #if  defined(YAPOR) || defined(THREADS)
302 void  STD_PROTO(Yap_LockStream,(int));
303 void  STD_PROTO(Yap_UnLockStream,(int));
304 #else
305 #define Yap_LockStream(X)
306 #define Yap_UnLockStream(X)
307 #endif
308 Int   STD_PROTO(Yap_GetStreamFd,(int));
309 void  STD_PROTO(Yap_CloseStreams,(int));
310 void  STD_PROTO(Yap_FlushStreams,(void));
311 void  STD_PROTO(Yap_CloseStream,(int));
312 int   STD_PROTO(Yap_PlGetchar,(void));
313 int   STD_PROTO(Yap_PlGetWchar,(void));
314 int   STD_PROTO(Yap_PlFGetchar,(void));
315 int   STD_PROTO(Yap_GetCharForSIGINT,(void));
316 Int   STD_PROTO(Yap_StreamToFileNo,(Term));
317 Term  STD_PROTO(Yap_OpenStream,(FILE *,char *,Term,int));
318 Term  STD_PROTO(Yap_StringToTerm,(char *,Term *));
319 Term  STD_PROTO(Yap_TermToString,(Term,char *,unsigned int,int));
320 int   STD_PROTO(Yap_GetFreeStreamD,(void));
321 int   STD_PROTO(Yap_GetFreeStreamDForReading,(void));
322 
323 Term	STD_PROTO(Yap_WStringToList,(wchar_t *));
324 Term	STD_PROTO(Yap_WStringToListOfAtoms,(wchar_t *));
325 Atom	STD_PROTO(Yap_LookupWideAtom,(wchar_t *));
326 
327 #define YAP_INPUT_STREAM	0x01
328 #define YAP_OUTPUT_STREAM	0x02
329 #define YAP_APPEND_STREAM	0x04
330 #define YAP_PIPE_STREAM 	0x08
331 #define YAP_TTY_STREAM	 	0x10
332 #define YAP_POPEN_STREAM	0x20
333 #define YAP_BINARY_STREAM	0x40
334 #define YAP_SEEKABLE_STREAM	0x80
335 
336 
337 #define	Quote_illegal_f		0x01
338 #define	Ignore_ops_f		0x02
339 #define	Handle_vars_f		0x04
340 #define	Use_portray_f		0x08
341 #define	To_heap_f	        0x10
342 #define	Unfold_cyclics_f        0x20
343 #define	Use_SWI_Stream_f        0x40
344 
345 /* write.c */
346 void	STD_PROTO(Yap_plwrite,(Term,int (*)(int, wchar_t), int, int));
347 
348 /* grow.c */
349 int  STD_PROTO(Yap_growheap_in_parser,   (tr_fr_ptr *, TokEntry **, VarEntry **));
350 int  STD_PROTO(Yap_growstack_in_parser,  (tr_fr_ptr *, TokEntry **, VarEntry **));
351 int  STD_PROTO(Yap_growtrail_in_parser,  (tr_fr_ptr *, TokEntry **, VarEntry **));
352 
353 
354 
355 #ifdef HAVE_ERRNO_H
356 #include <errno.h>
357 #else
358 extern int errno;
359 #endif
360 
361 #ifdef DEBUG
362 #if COROUTINING
363 extern int  Yap_Portray_delays;
364 #endif
365 #endif
366 
367 EXTERN inline UInt STD_PROTO(HashFunction, (unsigned char *));
368 EXTERN inline UInt STD_PROTO(WideHashFunction, (wchar_t *));
369 
370 EXTERN inline UInt
HashFunction(unsigned char * CHP)371 HashFunction(unsigned char *CHP)
372 {
373   /* djb2 */
374   UInt hash = 5381;
375   UInt c;
376 
377   while ((c = *CHP++) != '\0') {
378     /* hash = ((hash << 5) + hash) + c; hash * 33 + c */
379     hash = hash * 33 ^ c;
380   }
381   return hash;
382   /*
383   UInt OUT=0, i = 1;
384   while(*CHP != '\0') { OUT += (UInt)(*CHP++); }
385   return OUT;
386   */
387 }
388 
389 EXTERN inline UInt
WideHashFunction(wchar_t * CHP)390 WideHashFunction(wchar_t *CHP)
391 {
392   UInt hash = 5381;
393   UInt c;
394 
395   while ((c = *CHP++) != '\0') {
396     hash = hash * 33 ^ c;
397   }
398   return hash;
399 }
400 
401 #define FAIL_ON_PARSER_ERROR      0
402 #define QUIET_ON_PARSER_ERROR     1
403 #define CONTINUE_ON_PARSER_ERROR  2
404 #define EXCEPTION_ON_PARSER_ERROR 3
405 
406 #ifdef THREADS
407 #define    Yap_IOBotch    Yap_thread_gl[worker_id].io_botch
408 #define    Yap_tokptr     Yap_thread_gl[worker_id].tokptr
409 #define    Yap_toktide    Yap_thread_gl[worker_id].toktide
410 #define    Yap_VarTable   Yap_thread_gl[worker_id].var_table
411 #define    Yap_AnonVarTable   Yap_thread_gl[worker_id].anon_var_table
412 #define    Yap_eot_before_eof   Yap_thread_gl[worker_id].eot_before_eof
413 #define    Yap_FileNameBuf   Yap_thread_gl[worker_id].file_name_buf
414 #define    Yap_FileNameBuf2   Yap_thread_gl[worker_id].file_name_buf2
415 #else
416 extern jmp_buf Yap_IOBotch;
417 
418 /*************** variables concerned with parsing   *********************/
419 extern TokEntry	*Yap_tokptr, *Yap_toktide;
420 extern VarEntry	*Yap_VarTable, *Yap_AnonVarTable;
421 extern int Yap_eot_before_eof;
422 
423 extern char Yap_FileNameBuf[YAP_FILENAME_MAX], Yap_FileNameBuf2[YAP_FILENAME_MAX];
424 
425 #endif
426 
427 #ifdef DEBUG
428 extern YP_FILE *Yap_logfile;
429 #endif
430 
431 #if USE_SOCKET
432 extern int Yap_sockets_io;
433 #endif
434 
435