2002-05-28 17:26:00 +01:00
|
|
|
/*************************************************************************
|
|
|
|
* *
|
|
|
|
* YAP Prolog *
|
|
|
|
* *
|
|
|
|
* Yap Prolog was developed at NCCUP - Universidade do Porto *
|
|
|
|
* *
|
|
|
|
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
|
|
|
|
* *
|
|
|
|
**************************************************************************
|
|
|
|
* *
|
|
|
|
* File: iopreds.c *
|
|
|
|
* Last rev: 5/2/88 *
|
|
|
|
* mods: *
|
|
|
|
* comments: Input/Output C implemented predicates *
|
|
|
|
* *
|
|
|
|
*************************************************************************/
|
|
|
|
#ifdef SCCS
|
|
|
|
static char SccsId[] = "%W% %G%";
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This file defines main data-structure for stream management,
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2006-08-30 02:06:30 +01:00
|
|
|
#if _MSC_VER || defined(__MINGW32__)
|
|
|
|
|
|
|
|
#include <windows.h>
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2006-11-27 17:42:03 +00:00
|
|
|
#include <wchar.h>
|
|
|
|
|
2002-05-28 17:26:00 +01:00
|
|
|
#if HAVE_LIBREADLINE
|
|
|
|
|
|
|
|
#if _MSC_VER || defined(__MINGW32__)
|
2006-08-30 02:06:30 +01:00
|
|
|
|
2002-05-28 17:26:00 +01:00
|
|
|
FILE *rl_instream, *rl_outstream;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2006-08-02 19:18:31 +01:00
|
|
|
typedef int (*GetsFunc)(int, UInt, char *);
|
|
|
|
|
2002-11-11 17:38:10 +00:00
|
|
|
typedef struct stream_desc
|
2002-05-28 17:26:00 +01:00
|
|
|
{
|
|
|
|
union {
|
|
|
|
struct {
|
|
|
|
Atom name;
|
|
|
|
Term user_name;
|
2004-07-28 23:09:02 +01:00
|
|
|
#if defined(__MINGW32__) || _MSC_VER
|
|
|
|
#define PLGETC_BUF_SIZE 4096
|
|
|
|
char *buf, *ptr;
|
|
|
|
int left;
|
|
|
|
#endif
|
2002-05-28 17:26:00 +01:00
|
|
|
YP_File file;
|
|
|
|
} file;
|
|
|
|
struct {
|
|
|
|
char *buf; /* where the file is being read from/written to */
|
|
|
|
Int max_size; /* maximum buffer size (may be changed dynamically) */
|
2005-12-17 03:25:39 +00:00
|
|
|
UInt pos;
|
2004-07-29 19:15:19 +01:00
|
|
|
volatile void *error_handler;
|
2002-05-28 17:26:00 +01:00
|
|
|
} mem_string;
|
|
|
|
struct {
|
|
|
|
#if defined(__MINGW32__) || _MSC_VER
|
|
|
|
HANDLE hdl;
|
|
|
|
#else
|
|
|
|
int fd;
|
|
|
|
#endif
|
|
|
|
} pipe;
|
|
|
|
#if USE_SOCKET
|
|
|
|
struct {
|
|
|
|
socket_domain domain;
|
|
|
|
socket_info flags;
|
|
|
|
int fd;
|
|
|
|
} socket;
|
|
|
|
#endif
|
|
|
|
} u;
|
2006-04-28 16:48:33 +01:00
|
|
|
Int charcount, linecount, linepos;
|
|
|
|
Int status;
|
2006-11-27 17:42:03 +00:00
|
|
|
wchar_t och;
|
2006-04-28 16:48:33 +01:00
|
|
|
#if defined(YAPOR) || defined(THREADS)
|
|
|
|
lockvar streamlock; /* protect stream access */
|
|
|
|
#endif
|
2002-05-28 17:26:00 +01:00
|
|
|
int (* stream_putc)(int, int); /* function the stream uses for writing */
|
|
|
|
int (* stream_getc)(int); /* function the stream uses for reading */
|
2006-08-02 19:18:31 +01:00
|
|
|
GetsFunc stream_gets; /* function the stream uses for reading a sequence of characters */
|
2002-05-28 17:26:00 +01:00
|
|
|
/* function the stream uses for parser. It may be different if the ISO
|
|
|
|
character conversion is on */
|
2006-11-27 17:42:03 +00:00
|
|
|
wchar_t (* stream_wgetc_for_read)(int);
|
|
|
|
wchar_t (* stream_wgetc)(int);
|
|
|
|
wchar_t (* stream_wputc)(int,wchar_t);
|
|
|
|
encoding_t encoding;
|
|
|
|
int use_bom;
|
|
|
|
mbstate_t mbstate;
|
2002-05-28 17:26:00 +01:00
|
|
|
}
|
|
|
|
StreamDesc;
|
|
|
|
|
|
|
|
#define YAP_ERROR NIL
|
|
|
|
|
2004-08-27 21:18:52 +01:00
|
|
|
#define MaxStreams 64
|
2002-05-28 17:26:00 +01:00
|
|
|
|
|
|
|
#define Free_Stream_f 0x000001
|
|
|
|
#define Output_Stream_f 0x000002
|
|
|
|
#define Input_Stream_f 0x000004
|
|
|
|
#define Append_Stream_f 0x000008
|
|
|
|
#define Eof_Stream_f 0x000010
|
|
|
|
#define Null_Stream_f 0x000020
|
|
|
|
#define Tty_Stream_f 0x000040
|
|
|
|
#define Socket_Stream_f 0x000080
|
|
|
|
#define Binary_Stream_f 0x000100
|
|
|
|
#define Eof_Error_Stream_f 0x000200
|
|
|
|
#define Reset_Eof_Stream_f 0x000400
|
|
|
|
#define Past_Eof_Stream_f 0x000800
|
|
|
|
#define Push_Eof_Stream_f 0x001000
|
|
|
|
#define Seekable_Stream_f 0x002000
|
|
|
|
#define Promptable_Stream_f 0x004000
|
|
|
|
#if USE_SOCKET
|
|
|
|
#define Client_Socket_Stream_f 0x008000
|
|
|
|
#define Server_Socket_Stream_f 0x010000
|
|
|
|
#endif
|
|
|
|
#define InMemory_Stream_f 0x020000
|
|
|
|
#define Pipe_Stream_f 0x040000
|
|
|
|
#define Popen_Stream_f 0x080000
|
2006-11-27 17:42:03 +00:00
|
|
|
#define User_Stream_f 0x100000
|
2002-05-28 17:26:00 +01:00
|
|
|
|
|
|
|
#define StdInStream 0
|
|
|
|
#define StdOutStream 1
|
|
|
|
#define StdErrStream 2
|
|
|
|
|
|
|
|
#define ALIASES_BLOCK_SIZE 8
|
|
|
|
|
2002-11-18 18:18:05 +00:00
|
|
|
void STD_PROTO (Yap_InitStdStreams, (void));
|
2002-05-28 17:26:00 +01:00
|
|
|
|
2002-06-17 16:28:01 +01:00
|
|
|
EXTERN inline int
|
2003-02-14 10:56:56 +00:00
|
|
|
GetCurInpPos (int inp_stream)
|
2002-06-17 16:28:01 +01:00
|
|
|
{
|
2003-02-14 10:56:56 +00:00
|
|
|
return (Stream[inp_stream].linecount);
|
2002-06-17 16:28:01 +01:00
|
|
|
}
|
2002-05-28 17:26:00 +01:00
|
|
|
|