init fields
lots of docs, boolean -> booleanFlag
This commit is contained in:
parent
794d04c851
commit
06a2caf7a9
@ -1,6 +1,6 @@
|
|||||||
/* Define if you have libreadline */
|
/* Define if you have libreadline */
|
||||||
#ifndef HAVE_LIBREADLINE
|
#ifndef HAVE_LIBREADLINE
|
||||||
#cmakedefine USE_READLINE ${USE_READLINE}
|
#cmakedefine HAVE_LIBREADLINE ${HAVE_LIBREADLINE}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Define to 1 if you have the <readline/history.h> header file. */
|
/* Define to 1 if you have the <readline/history.h> header file. */
|
||||||
@ -10,7 +10,11 @@
|
|||||||
|
|
||||||
/* Define to 1 if you have the <readline/readline.h> header file. */
|
/* Define to 1 if you have the <readline/readline.h> header file. */
|
||||||
#ifndef HAVE_READLINE_READLINE_H
|
#ifndef HAVE_READLINE_READLINE_H
|
||||||
#cmakedefine HAVE_READLINE_READLINE_H ${HAVE_READLINE_READLINE_H}
|
#cmakedefine HAVE_READLINE_READLINE_H ${HAVE_READLINE_READLINE_H}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(HAVE_LIBREADLINE) && defined(HAVE_READLINE_READLINE_H)
|
||||||
|
#define USE_READLINE 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `rl_catch_signals ', and to 0 if
|
/* Define to 1 if you have the declaration of `rl_catch_signals ', and to 0 if
|
||||||
|
30
os/iopreds.h
30
os/iopreds.h
@ -13,6 +13,11 @@ static char SccsId[] = "%W% %G%";
|
|||||||
#ifndef IOPREDS_H
|
#ifndef IOPREDS_H
|
||||||
#define IOPREDS_H 1
|
#define IOPREDS_H 1
|
||||||
|
|
||||||
|
#if _WIN32
|
||||||
|
#define USE_SOCKET 1
|
||||||
|
#define HAVE_SOCKET 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "Yap.h"
|
#include "Yap.h"
|
||||||
#include "Atoms.h"
|
#include "Atoms.h"
|
||||||
@ -32,6 +37,15 @@ extern size_t Yap_page_size;
|
|||||||
|
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
|
|
||||||
|
#define Yap_CheckStream( arg, kind, msg) Yap_CheckStream__(__FILE__, __FUNCTION__, __LINE__, arg, kind, msg)
|
||||||
|
extern int Yap_CheckStream__(const char *, const char *, int , Term, int, const char *);
|
||||||
|
#define Yap_CheckTextStream( arg, kind, msg) Yap_CheckTextStream__(__FILE__, __FUNCTION__, __LINE__, arg, kind, msg)
|
||||||
|
extern int Yap_CheckTextStream__(const char *, const char *, int , Term, int, const char *);
|
||||||
|
|
||||||
|
extern bool Yap_initStream(int sno, FILE *fd, const char *name, Term file_name,
|
||||||
|
encoding_t encoding, stream_flags_t flags,
|
||||||
|
Atom open_mode);
|
||||||
|
|
||||||
#if HAVE_SOCKET
|
#if HAVE_SOCKET
|
||||||
extern int Yap_sockets_io;
|
extern int Yap_sockets_io;
|
||||||
|
|
||||||
@ -50,14 +64,7 @@ typedef enum{ /* we accept two domains for the moment, IPV6 may follow */
|
|||||||
af_unix /* or AF_FILE */
|
af_unix /* or AF_FILE */
|
||||||
} socket_domain;
|
} socket_domain;
|
||||||
|
|
||||||
extern bool Yap_initStream(int sno, FILE *fd, const char *name, Term file_name,
|
|
||||||
encoding_t encoding, stream_flags_t flags,
|
|
||||||
Atom open_mode);
|
|
||||||
extern Term Yap_InitSocketStream(int, socket_info, socket_domain);
|
extern Term Yap_InitSocketStream(int, socket_info, socket_domain);
|
||||||
#define Yap_CheckStream( arg, kind, msg) Yap_CheckStream__(__FILE__, __FUNCTION__, __LINE__, arg, kind, msg)
|
|
||||||
extern int Yap_CheckStream__(const char *, const char *, int , Term, int, const char *);
|
|
||||||
#define Yap_CheckTextStream( arg, kind, msg) Yap_CheckTextStream__(__FILE__, __FUNCTION__, __LINE__, arg, kind, msg)
|
|
||||||
extern int Yap_CheckTextStream__(const char *, const char *, int , Term, int, const char *);
|
|
||||||
extern int Yap_CheckSocketStream(Term, const char *);
|
extern int Yap_CheckSocketStream(Term, const char *);
|
||||||
extern socket_domain Yap_GetSocketDomain(int);
|
extern socket_domain Yap_GetSocketDomain(int);
|
||||||
extern socket_info Yap_GetSocketStatus(int);
|
extern socket_info Yap_GetSocketStatus(int);
|
||||||
@ -181,11 +188,7 @@ typedef struct stream_desc
|
|||||||
} file;
|
} file;
|
||||||
memHandle mem_string;
|
memHandle mem_string;
|
||||||
struct {
|
struct {
|
||||||
#if defined(__MINGW32__) || defined(_MSC_VER)
|
|
||||||
HANDLE hdl;
|
|
||||||
#else
|
|
||||||
int fd;
|
int fd;
|
||||||
#endif
|
|
||||||
} pipe;
|
} pipe;
|
||||||
#if HAVE_SOCKET
|
#if HAVE_SOCKET
|
||||||
struct {
|
struct {
|
||||||
@ -239,7 +242,6 @@ Yap_GetStreamHandle(Term t)
|
|||||||
|
|
||||||
#define YAP_ERROR NIL
|
#define YAP_ERROR NIL
|
||||||
|
|
||||||
/// maximum number of open streams
|
|
||||||
#define MaxStreams 64
|
#define MaxStreams 64
|
||||||
|
|
||||||
#define EXPAND_FILENAME 0x000080
|
#define EXPAND_FILENAME 0x000080
|
||||||
@ -277,6 +279,7 @@ Term Yap_scan_num(struct stream_desc *);
|
|||||||
void Yap_DefaultStreamOps( StreamDesc *st );
|
void Yap_DefaultStreamOps( StreamDesc *st );
|
||||||
void Yap_PipeOps( StreamDesc *st );
|
void Yap_PipeOps( StreamDesc *st );
|
||||||
void Yap_MemOps( StreamDesc *st );
|
void Yap_MemOps( StreamDesc *st );
|
||||||
|
bool Yap_CloseMemoryStream( int sno );
|
||||||
void Yap_ConsolePipeOps( StreamDesc *st );
|
void Yap_ConsolePipeOps( StreamDesc *st );
|
||||||
void Yap_SocketOps( StreamDesc *st );
|
void Yap_SocketOps( StreamDesc *st );
|
||||||
void Yap_ConsoleSocketOps( StreamDesc *st );
|
void Yap_ConsoleSocketOps( StreamDesc *st );
|
||||||
@ -295,7 +298,8 @@ void Yap_InitSockets( void );
|
|||||||
void Yap_InitSocketLayer(void);
|
void Yap_InitSocketLayer(void);
|
||||||
void Yap_InitMems( void );
|
void Yap_InitMems( void );
|
||||||
void Yap_InitConsole( void );
|
void Yap_InitConsole( void );
|
||||||
void Yap_InitReadline( void );
|
void Yap_InitReadlinePreds( void );
|
||||||
|
bool Yap_InitReadline( Term );
|
||||||
void Yap_InitChtypes(void);
|
void Yap_InitChtypes(void);
|
||||||
void Yap_InitCharsio(void);
|
void Yap_InitCharsio(void);
|
||||||
void Yap_InitFormat(void);
|
void Yap_InitFormat(void);
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
// #include "verify.h"
|
// #include "verify.h"
|
||||||
|
|
||||||
#if !HAVE_OPEN_MEMSTREAM
|
#if !HAVE_OPEN_MEMSTREAM && !_WIN32
|
||||||
|
|
||||||
#if !HAVE_FUNOPEN
|
#if !HAVE_FUNOPEN
|
||||||
# error Sorry, not ported to your platform yet
|
# error Sorry, not ported to your platform yet
|
||||||
|
75
os/pipes.c
75
os/pipes.c
@ -47,6 +47,12 @@ static char SccsId[] = "%W% %G%";
|
|||||||
#define S_ISDIR(x) (((x)&_S_IFDIR)==_S_IFDIR)
|
#define S_ISDIR(x) (((x)&_S_IFDIR)==_S_IFDIR)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#if HAVE_ERRNO_H
|
||||||
|
#include <errno.h>
|
||||||
|
#endif
|
||||||
|
#if HAVE_FCNTL_H
|
||||||
|
#include <fcntl.h>
|
||||||
|
#endif
|
||||||
#include "iopreds.h"
|
#include "iopreds.h"
|
||||||
|
|
||||||
static int PipePutc( int, int);
|
static int PipePutc( int, int);
|
||||||
@ -66,15 +72,6 @@ ConsolePipePutc (int sno, int ch)
|
|||||||
ch = '\n';
|
ch = '\n';
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if _MSC_VER || defined(__MINGW32__)
|
|
||||||
{
|
|
||||||
DWORD written;
|
|
||||||
if (WriteFile(s->u.pipe.hdl, &c, sizeof(c), &written, NULL) == FALSE) {
|
|
||||||
PlIOError (SYSTEM_ERROR_INTERNAL,TermNil, "write to pipe returned error");
|
|
||||||
return EOF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
{
|
{
|
||||||
int out = 0;
|
int out = 0;
|
||||||
while (!out) {
|
while (!out) {
|
||||||
@ -88,7 +85,6 @@ ConsolePipePutc (int sno, int ch)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
count_output_char(ch,s);
|
count_output_char(ch,s);
|
||||||
return ((int) ch);
|
return ((int) ch);
|
||||||
}
|
}
|
||||||
@ -104,15 +100,6 @@ PipePutc (int sno, int ch)
|
|||||||
ch = '\n';
|
ch = '\n';
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if _MSC_VER || defined(__MINGW32__)
|
|
||||||
{
|
|
||||||
DWORD written;
|
|
||||||
if (WriteFile(s->u.pipe.hdl, &c, sizeof(c), &written, NULL) == FALSE) {
|
|
||||||
PlIOError (SYSTEM_ERROR_INTERNAL,TermNil, "write to pipe returned error");
|
|
||||||
return EOF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
{
|
{
|
||||||
int out = 0;
|
int out = 0;
|
||||||
while (!out) {
|
while (!out) {
|
||||||
@ -126,7 +113,6 @@ PipePutc (int sno, int ch)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
console_count_output_char(ch,s);
|
console_count_output_char(ch,s);
|
||||||
return ((int) ch);
|
return ((int) ch);
|
||||||
}
|
}
|
||||||
@ -159,19 +145,10 @@ ConsolePipeGetc(int sno)
|
|||||||
strncpy(LOCAL_Prompt, RepAtom (LOCAL_AtPrompt)->StrOfAE, MAX_PROMPT);
|
strncpy(LOCAL_Prompt, RepAtom (LOCAL_AtPrompt)->StrOfAE, MAX_PROMPT);
|
||||||
LOCAL_newline = false;
|
LOCAL_newline = false;
|
||||||
}
|
}
|
||||||
#if _MSC_VER || defined(__MINGW32__)
|
|
||||||
if (ReadFile(s->u.pipe.hdl, &c, sizeof(c), &count, NULL) == FALSE) {
|
|
||||||
LOCAL_PrologMode |= ConsoleGetcMode;
|
|
||||||
Yap_WinError("read from console pipe returned error");
|
|
||||||
LOCAL_PrologMode &= ~ConsoleGetcMode;
|
|
||||||
return console_post_process_eof(s);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/* should be able to use a buffer */
|
/* should be able to use a buffer */
|
||||||
LOCAL_PrologMode |= ConsoleGetcMode;
|
LOCAL_PrologMode |= ConsoleGetcMode;
|
||||||
count = read(s->u.pipe.fd, &c, sizeof(char));
|
count = read(s->u.pipe.fd, &c, sizeof(char));
|
||||||
LOCAL_PrologMode &= ~ConsoleGetcMode;
|
LOCAL_PrologMode &= ~ConsoleGetcMode;
|
||||||
#endif
|
|
||||||
if (count == 0) {
|
if (count == 0) {
|
||||||
return console_post_process_eof(s);
|
return console_post_process_eof(s);
|
||||||
} else if (count > 0) {
|
} else if (count > 0) {
|
||||||
@ -192,16 +169,8 @@ PipeGetc(int sno)
|
|||||||
char c;
|
char c;
|
||||||
|
|
||||||
/* should be able to use a buffer */
|
/* should be able to use a buffer */
|
||||||
#if _MSC_VER || defined(__MINGW32__)
|
|
||||||
DWORD count;
|
|
||||||
if (ReadFile(s->u.pipe.hdl, &c, sizeof(c), &count, NULL) == FALSE) {
|
|
||||||
Yap_WinError("read from pipe returned error");
|
|
||||||
return EOF;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
int count;
|
int count;
|
||||||
count = read(s->u.pipe.fd, &c, sizeof(char));
|
count = read(s->u.pipe.fd, &c, sizeof(char));
|
||||||
#endif
|
|
||||||
if (count == 0) {
|
if (count == 0) {
|
||||||
return post_process_eof(s);
|
return post_process_eof(s);
|
||||||
} else if (count > 0) {
|
} else if (count > 0) {
|
||||||
@ -237,25 +206,19 @@ open_pipe_stream (USES_REGS1)
|
|||||||
Term t1, t2;
|
Term t1, t2;
|
||||||
StreamDesc *st;
|
StreamDesc *st;
|
||||||
int sno;
|
int sno;
|
||||||
#if _MSC_VER || defined(__MINGW32__)
|
|
||||||
HANDLE ReadPipe, WritePipe;
|
|
||||||
SECURITY_ATTRIBUTES satt;
|
|
||||||
|
|
||||||
satt.nLength = sizeof(satt);
|
|
||||||
satt.lpSecurityDescriptor = NULL;
|
|
||||||
satt.bInheritHandle = TRUE;
|
|
||||||
if (!CreatePipe(&ReadPipe, &WritePipe, &satt, 0))
|
|
||||||
{
|
|
||||||
return (PlIOError (SYSTEM_ERROR_INTERNAL,TermNil, "open_pipe_stream/2 could not create pipe"));
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
int filedes[2];
|
int filedes[2];
|
||||||
|
|
||||||
if (pipe(filedes) != 0)
|
if (
|
||||||
|
#if _MSC_VER || defined(__MINGW32__)
|
||||||
|
// assume for now only text streams...
|
||||||
|
_pipe(filedes, 1024, O_TEXT)
|
||||||
|
#else
|
||||||
|
pipe(filedes)
|
||||||
|
#endif
|
||||||
|
!= 0)
|
||||||
{
|
{
|
||||||
return (PlIOError (SYSTEM_ERROR_INTERNAL,TermNil, "open_pipe_stream/2 could not create pipe"));
|
return (PlIOError (SYSTEM_ERROR_INTERNAL,TermNil, "error %s", strerror(errno)) );
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
sno = GetFreeStreamD();
|
sno = GetFreeStreamD();
|
||||||
if (sno < 0)
|
if (sno < 0)
|
||||||
return (PlIOError (RESOURCE_ERROR_MAX_STREAMS,TermNil, "new stream not available for open_pipe_stream/2"));
|
return (PlIOError (RESOURCE_ERROR_MAX_STREAMS,TermNil, "new stream not available for open_pipe_stream/2"));
|
||||||
@ -268,11 +231,7 @@ open_pipe_stream (USES_REGS1)
|
|||||||
st->stream_putc = PipePutc;
|
st->stream_putc = PipePutc;
|
||||||
st->stream_getc = PipeGetc;
|
st->stream_getc = PipeGetc;
|
||||||
Yap_DefaultStreamOps( st );
|
Yap_DefaultStreamOps( st );
|
||||||
#if _MSC_VER || defined(__MINGW32__)
|
|
||||||
st->u.pipe.hdl = ReadPipe;
|
|
||||||
#else
|
|
||||||
st->u.pipe.fd = filedes[0];
|
st->u.pipe.fd = filedes[0];
|
||||||
#endif
|
|
||||||
st->file = fdopen( filedes[0], "r");
|
st->file = fdopen( filedes[0], "r");
|
||||||
UNLOCK(st->streamlock);
|
UNLOCK(st->streamlock);
|
||||||
sno = GetFreeStreamD();
|
sno = GetFreeStreamD();
|
||||||
@ -286,11 +245,7 @@ open_pipe_stream (USES_REGS1)
|
|||||||
st->stream_putc = PipePutc;
|
st->stream_putc = PipePutc;
|
||||||
st->stream_getc = PipeGetc;
|
st->stream_getc = PipeGetc;
|
||||||
Yap_DefaultStreamOps( st );
|
Yap_DefaultStreamOps( st );
|
||||||
#if _MSC_VER || defined(__MINGW32__)
|
|
||||||
st->u.pipe.hdl = WritePipe;
|
|
||||||
#else
|
|
||||||
st->u.pipe.fd = filedes[1];
|
st->u.pipe.fd = filedes[1];
|
||||||
#endif
|
|
||||||
st->file = fdopen( filedes[1], "w");
|
st->file = fdopen( filedes[1], "w");
|
||||||
UNLOCK(st->streamlock);
|
UNLOCK(st->streamlock);
|
||||||
t2 = Yap_MkStream (sno);
|
t2 = Yap_MkStream (sno);
|
||||||
|
35
os/random.c
35
os/random.c
@ -1,7 +1,34 @@
|
|||||||
|
#include "Yap.h"
|
||||||
|
#include "Yatom.h"
|
||||||
#include "sysbits.h"
|
#include "YapHeap.h"
|
||||||
|
#include "yapio.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
#if HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
#if HAVE_STDARG_H
|
||||||
|
#include <stdarg.h>
|
||||||
|
#endif
|
||||||
|
#ifdef _WIN32
|
||||||
|
#if HAVE_IO_H
|
||||||
|
/* Windows */
|
||||||
|
#include <io.h>
|
||||||
|
#endif
|
||||||
|
#if HAVE_SOCKET
|
||||||
|
#include <winsock2.h>
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifndef S_ISDIR
|
||||||
|
#define S_ISDIR(x) (((x)&_S_IFDIR)==_S_IFDIR)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if HAVE_ERRNO_H
|
||||||
|
#include <errno.h>
|
||||||
|
#endif
|
||||||
|
#if HAVE_FCNTL_H
|
||||||
|
#include <fcntl.h>
|
||||||
|
#endif
|
||||||
|
#include "iopreds.h"
|
||||||
|
|
||||||
#if HAVE_TIME_H
|
#if HAVE_TIME_H
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* *
|
* *
|
||||||
* YAP Prolog *
|
* YAP Prolog *
|
||||||
* *
|
* *
|
||||||
@ -51,7 +51,7 @@ static char SccsId[] = "%W% %G%";
|
|||||||
|
|
||||||
#include "iopreds.h"
|
#include "iopreds.h"
|
||||||
|
|
||||||
#if defined(USE_READLINE)
|
#if USE_READLINE
|
||||||
|
|
||||||
#include <readline/readline.h>
|
#include <readline/readline.h>
|
||||||
#include <readline/history.h>
|
#include <readline/history.h>
|
||||||
@ -191,18 +191,21 @@ static int prolog_complete(int ignore, int key) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void InitReadline(void) {
|
bool Yap_InitReadline(Term enable) {
|
||||||
// don't call readline within emacs
|
// don't call readline within emacs
|
||||||
// if (getenv("ËMACS"))
|
// if (getenv("ËMACS"))
|
||||||
// return;
|
// return;
|
||||||
|
if (enable == TermFalse)
|
||||||
|
return true;
|
||||||
GLOBAL_Stream[StdInStream].u.irl.buf = NULL;
|
GLOBAL_Stream[StdInStream].u.irl.buf = NULL;
|
||||||
GLOBAL_Stream[StdInStream].u.irl.ptr = NULL;
|
GLOBAL_Stream[StdInStream].u.irl.ptr = NULL;
|
||||||
|
GLOBAL_Stream[StdInStream].status |= Readline_Stream_f;
|
||||||
#if _MSC_VER || defined(__MINGW32__)
|
#if _MSC_VER || defined(__MINGW32__)
|
||||||
rl_instream = stdin;
|
rl_instream = stdin;
|
||||||
#endif
|
#endif
|
||||||
rl_outstream = stderr;
|
rl_outstream = stderr;
|
||||||
using_history();
|
using_history();
|
||||||
char *s = Yap_AbsoluteFile("~/.YAP.history", NULL, true);
|
const char *s = Yap_AbsoluteFile("~/.YAP.history", NULL, true);
|
||||||
if (!read_history(s)) {
|
if (!read_history(s)) {
|
||||||
FILE *f = fopen(s, "w");
|
FILE *f = fopen(s, "w");
|
||||||
if (f) {
|
if (f) {
|
||||||
@ -217,6 +220,7 @@ static void InitReadline(void) {
|
|||||||
#else
|
#else
|
||||||
rl_add_defun("prolog-complete", (void *)prolog_complete, '\t');
|
rl_add_defun("prolog-complete", (void *)prolog_complete, '\t');
|
||||||
#endif
|
#endif
|
||||||
|
return Yap_ReadlineOps(GLOBAL_Stream + StdInStream);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool getLine(int inp, int out) {
|
static bool getLine(int inp, int out) {
|
||||||
@ -250,6 +254,7 @@ static bool getLine(int inp, int out) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
LOCAL_PrologMode &= ~ConsoleGetcMode;
|
LOCAL_PrologMode &= ~ConsoleGetcMode;
|
||||||
|
LOCAL_newline = true;
|
||||||
}
|
}
|
||||||
strncpy(LOCAL_Prompt, RepAtom(LOCAL_AtPrompt)->StrOfAE, MAX_PROMPT);
|
strncpy(LOCAL_Prompt, RepAtom(LOCAL_AtPrompt)->StrOfAE, MAX_PROMPT);
|
||||||
/* window of vulnerability closed */
|
/* window of vulnerability closed */
|
||||||
@ -274,6 +279,7 @@ static int ReadlinePutc(int sno, int ch) {
|
|||||||
console_count_output_char(ch, s);
|
console_count_output_char(ch, s);
|
||||||
if (ch == 10) {
|
if (ch == 10) {
|
||||||
Yap_ReadlineFlush(sno);
|
Yap_ReadlineFlush(sno);
|
||||||
|
LOCAL_newline = true;
|
||||||
}
|
}
|
||||||
return ((int)ch);
|
return ((int)ch);
|
||||||
}
|
}
|
||||||
@ -303,15 +309,15 @@ static int ReadlineGetc(int sno) {
|
|||||||
return console_post_process_read_char(ch, s);
|
return console_post_process_read_char(ch, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
/**
|
|
||||||
@brief Yap_ReadlinePeekChar peeks the next char from the
|
@brief Yap_ReadlinePeekChar peeks the next char from the
|
||||||
readline buffer, but does not actually grab it.
|
readline buffer, but does not actually grab it.
|
||||||
|
|
||||||
The idea is to take advantage of the buffering. Special care must be taken with EOF, though.
|
The idea is to take advantage of the buffering. Special care must be taken
|
||||||
|
with EOF, though.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
Int Yap_ReadlinePeekChar( int sno) {
|
Int Yap_ReadlinePeekChar(int sno) {
|
||||||
StreamDesc *s = &GLOBAL_Stream[sno];
|
StreamDesc *s = &GLOBAL_Stream[sno];
|
||||||
int ch;
|
int ch;
|
||||||
|
|
||||||
@ -319,13 +325,14 @@ Int Yap_ReadlinePeekChar( int sno) {
|
|||||||
const char *ttyptr = s->u.irl.ptr;
|
const char *ttyptr = s->u.irl.ptr;
|
||||||
ch = *ttyptr;
|
ch = *ttyptr;
|
||||||
if (ch == '\0') {
|
if (ch == '\0') {
|
||||||
ch = '\n';
|
ch = '\n';
|
||||||
}
|
}
|
||||||
} if (getLine(sno, StdErrStream) ) {
|
}
|
||||||
CACHE_REGS
|
if (getLine(sno, StdErrStream)) {
|
||||||
|
CACHE_REGS
|
||||||
ch = s->u.irl.ptr[0];
|
ch = s->u.irl.ptr[0];
|
||||||
if (ch == '\0') {
|
if (ch == '\0') {
|
||||||
ch = '\n';
|
ch = '\n';
|
||||||
}
|
}
|
||||||
if (ch == '\n') {
|
if (ch == '\n') {
|
||||||
LOCAL_newline = true;
|
LOCAL_newline = true;
|
||||||
@ -338,7 +345,6 @@ Int Yap_ReadlinePeekChar( int sno) {
|
|||||||
return ch;
|
return ch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int Yap_ReadlineForSIGINT(void) {
|
int Yap_ReadlineForSIGINT(void) {
|
||||||
CACHE_REGS
|
CACHE_REGS
|
||||||
int ch;
|
int ch;
|
||||||
@ -372,10 +378,17 @@ static Int has_readline(USES_REGS1) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void Yap_InitReadline(void) {
|
void Yap_InitReadlinePreds(void) {
|
||||||
Yap_InitCPred("$has_readline", 0, has_readline,
|
Yap_InitCPred("$has_readline", 0, has_readline,
|
||||||
SafePredFlag | HiddenPredFlag);
|
SafePredFlag | HiddenPredFlag);
|
||||||
InitReadline();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
bool Yap_InitReadline(Term enable) {
|
||||||
|
if (enable == TermTrue)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Yap_InitReadlinePreds(void) {}
|
||||||
#endif
|
#endif
|
||||||
|
411
os/readterm.c
411
os/readterm.c
@ -95,6 +95,8 @@ static char SccsId[] = "%W% %G%";
|
|||||||
#define SYSTEM_STAT stat
|
#define SYSTEM_STAT stat
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static Term readFromBuffer(const char *s, Term opts);
|
||||||
|
|
||||||
static void clean_vars(VarEntry *p) {
|
static void clean_vars(VarEntry *p) {
|
||||||
if (p == NULL)
|
if (p == NULL)
|
||||||
return;
|
return;
|
||||||
@ -180,8 +182,8 @@ static int parse_quasi_quotations(ReadData _PL_rd ARG_LD) {
|
|||||||
#endif /*O_QUASIQUOTATIONS*/
|
#endif /*O_QUASIQUOTATIONS*/
|
||||||
|
|
||||||
#define READ_DEFS() \
|
#define READ_DEFS() \
|
||||||
PAR("comments", filler, READ_COMMENTS), \
|
PAR("comments", list_filler, READ_COMMENTS),\
|
||||||
PAR("module", isatom, READ_MODULE), \
|
PAR("module", isatom, READ_MODULE), \
|
||||||
PAR("priority", nat, READ_PRIORITY), \
|
PAR("priority", nat, READ_PRIORITY), \
|
||||||
PAR("quasi_quotations", filler, READ_QUASI_QUOTATIONS), \
|
PAR("quasi_quotations", filler, READ_QUASI_QUOTATIONS), \
|
||||||
PAR("term_position", filler, READ_TERM_POSITION), \
|
PAR("term_position", filler, READ_TERM_POSITION), \
|
||||||
@ -189,7 +191,7 @@ static int parse_quasi_quotations(ReadData _PL_rd ARG_LD) {
|
|||||||
PAR("singletons", filler, READ_SINGLETONS), \
|
PAR("singletons", filler, READ_SINGLETONS), \
|
||||||
PAR("variables", filler, READ_VARIABLES), \
|
PAR("variables", filler, READ_VARIABLES), \
|
||||||
PAR("variable_names", filler, READ_VARIABLE_NAMES), \
|
PAR("variable_names", filler, READ_VARIABLE_NAMES), \
|
||||||
PAR("character_escapes", boolean, READ_CHARACTER_ESCAPES), \
|
PAR("character_escapes", booleanFlag, READ_CHARACTER_ESCAPES), \
|
||||||
PAR("backquoted_string", isatom, READ_BACKQUOTED_STRING), \
|
PAR("backquoted_string", isatom, READ_BACKQUOTED_STRING), \
|
||||||
PAR("cycles", ok, READ_CYCLES), PAR(NULL, ok, READ_END)
|
PAR("cycles", ok, READ_CYCLES), PAR(NULL, ok, READ_END)
|
||||||
|
|
||||||
@ -374,11 +376,11 @@ typedef struct FEnv {
|
|||||||
size_t nargs; /// arity of current procedure
|
size_t nargs; /// arity of current procedure
|
||||||
encoding_t enc; /// encoding of the stream being read
|
encoding_t enc; /// encoding of the stream being read
|
||||||
Term tcomms; /// Access to comments
|
Term tcomms; /// Access to comments
|
||||||
Term cmod; /// Access to comments
|
Term cmod; /// Access to comments
|
||||||
} FEnv;
|
} FEnv;
|
||||||
|
|
||||||
typedef struct renv {
|
typedef struct renv {
|
||||||
Term bq;
|
Term bq;
|
||||||
bool ce, sw;
|
bool ce, sw;
|
||||||
Term sy;
|
Term sy;
|
||||||
UInt cpos;
|
UInt cpos;
|
||||||
@ -419,6 +421,8 @@ static xarg *setReadEnv(Term opts, FEnv *fe, struct renv *re, int inp_stream) {
|
|||||||
}
|
}
|
||||||
if (args[READ_COMMENTS].used) {
|
if (args[READ_COMMENTS].used) {
|
||||||
fe->tcomms = args[READ_COMMENTS].tvalue;
|
fe->tcomms = args[READ_COMMENTS].tvalue;
|
||||||
|
if (fe->tcomms == TermProlog)
|
||||||
|
fe->tcomms = PROLOG_MODULE;
|
||||||
} else {
|
} else {
|
||||||
fe->tcomms = 0;
|
fe->tcomms = 0;
|
||||||
}
|
}
|
||||||
@ -520,63 +524,187 @@ static void reset_regs(TokEntry *tokstart, FEnv *fe) {
|
|||||||
POPFET(qq);
|
POPFET(qq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool complete_clause_processing(FEnv *fe, TokEntry *tokstarts, Term t);
|
static Term
|
||||||
|
get_variables(FEnv *fe, TokEntry *tokstart)
|
||||||
static bool complete_processing(FEnv *fe, TokEntry *tokstart) {
|
{
|
||||||
CACHE_REGS
|
Term v;
|
||||||
Term v1, v2, v3;
|
|
||||||
|
|
||||||
CurrentModule = fe->cmod;
|
|
||||||
if (fe->vp) {
|
if (fe->vp) {
|
||||||
while (TRUE) {
|
|
||||||
fe->old_H = HR;
|
|
||||||
|
|
||||||
if (setjmp(LOCAL_IOBotch) == 0) {
|
|
||||||
if ((v1 = Yap_Variables(LOCAL_VarTable, TermNil)))
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
reset_regs(tokstart, fe);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (fe->np) {
|
|
||||||
while (true) {
|
while (true) {
|
||||||
fe->old_H = HR;
|
fe->old_H = HR;
|
||||||
|
|
||||||
if (setjmp(LOCAL_IOBotch) == 0) {
|
if (setjmp(LOCAL_IOBotch) == 0) {
|
||||||
if ((v2 = Yap_VarNames(LOCAL_VarTable, TermNil))) {
|
if ((v = Yap_Variables(LOCAL_VarTable, TermNil))) {
|
||||||
fe->old_H = HR;
|
fe->old_H = HR;
|
||||||
break;
|
return v;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
reset_regs(tokstart, fe);
|
reset_regs(tokstart, fe);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static Term
|
||||||
|
get_varnames(FEnv *fe, TokEntry *tokstart)
|
||||||
|
{
|
||||||
|
Term v;
|
||||||
|
if (fe->np) {
|
||||||
|
while (true) {
|
||||||
|
fe->old_H = HR;
|
||||||
|
|
||||||
|
if (setjmp(LOCAL_IOBotch) == 0) {
|
||||||
|
if ((v = Yap_VarNames(LOCAL_VarTable, TermNil))) {
|
||||||
|
fe->old_H = HR;
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
reset_regs(tokstart, fe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static Term
|
||||||
|
get_singletons(FEnv *fe, TokEntry *tokstart)
|
||||||
|
{
|
||||||
|
Term v;
|
||||||
if (fe->sp) {
|
if (fe->sp) {
|
||||||
while (TRUE) {
|
while (TRUE) {
|
||||||
fe->old_H = HR;
|
fe->old_H = HR;
|
||||||
|
|
||||||
if (setjmp(LOCAL_IOBotch) == 0) {
|
if (setjmp(LOCAL_IOBotch) == 0) {
|
||||||
if ((v3 = Yap_Singletons(LOCAL_VarTable, TermNil)))
|
if ((v = Yap_Singletons(LOCAL_VarTable, TermNil)))
|
||||||
break;
|
return v;
|
||||||
} else {
|
} else {
|
||||||
reset_regs(tokstart, fe);
|
reset_regs(tokstart, fe);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
warn_singletons(FEnv *fe, TokEntry *tokstart)
|
||||||
|
{
|
||||||
|
Term v;
|
||||||
|
fe->sp = TermNil;
|
||||||
|
v = get_singletons(fe, tokstart);
|
||||||
|
if (v && v != TermNil) {
|
||||||
|
Term singls[4];
|
||||||
|
singls[0] = Yap_MkApplTerm(Yap_MkFunctor(AtomSingleton, 1), 1, &v);
|
||||||
|
singls[1] = MkIntegerTerm(LOCAL_SourceFileLineno);
|
||||||
|
singls[2] = MkAtomTerm(LOCAL_SourceFileName);
|
||||||
|
singls[3] = v;
|
||||||
|
Term t = Yap_MkApplTerm(Yap_MkFunctor(AtomStyleCheck, 4), 4, singls);
|
||||||
|
singls[0] = Yap_MkApplTerm(Yap_MkFunctor(AtomStyleCheck, 1), 1, &t);
|
||||||
|
singls[1] = TermNil;
|
||||||
|
Yap_PrintWarning(Yap_MkApplTerm(FunctorError, 2, singls));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static Term
|
||||||
|
get_stream_position(FEnv *fe, TokEntry *tokstart)
|
||||||
|
{
|
||||||
|
Term v;
|
||||||
|
if (fe->tp) {
|
||||||
|
while (true) {
|
||||||
|
fe->old_H = HR;
|
||||||
|
|
||||||
|
if (setjmp(LOCAL_IOBotch) == 0) {
|
||||||
|
if ((v = CurrentPositionToTerm()))
|
||||||
|
return v;
|
||||||
|
} else {
|
||||||
|
reset_regs(tokstart, fe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static bool complete_processing(FEnv *fe, TokEntry *tokstart) {
|
||||||
|
CACHE_REGS
|
||||||
|
Term v1, v2, v3, vc, tp;
|
||||||
|
|
||||||
|
CurrentModule = fe->cmod;
|
||||||
|
if (CurrentModule == TermProlog)
|
||||||
|
CurrentModule = PROLOG_MODULE;
|
||||||
|
if (fe->vp)
|
||||||
|
v1 = get_variables(fe, tokstart);
|
||||||
|
else
|
||||||
|
v1 = 0L;
|
||||||
|
if (fe->np)
|
||||||
|
v2 = get_varnames(fe, tokstart);
|
||||||
|
else
|
||||||
|
v2 = 0L;
|
||||||
|
if (fe->sp)
|
||||||
|
v3 = get_singletons(fe, tokstart);
|
||||||
|
else
|
||||||
|
v3 = 0L;
|
||||||
|
if (fe->tcomms)
|
||||||
|
vc = LOCAL_Comments;
|
||||||
|
else
|
||||||
|
vc = 0L;
|
||||||
|
if (fe->tp)
|
||||||
|
tp = get_stream_position(fe, tokstart );
|
||||||
|
else
|
||||||
|
tp = 0L;
|
||||||
Yap_clean_tokenizer(tokstart, LOCAL_VarTable, LOCAL_AnonVarTable);
|
Yap_clean_tokenizer(tokstart, LOCAL_VarTable, LOCAL_AnonVarTable);
|
||||||
|
|
||||||
// trail must be ok by now.]
|
// trail must be ok by now.]
|
||||||
if ((!fe->vp || Yap_unify(v1, fe->vp)) &&
|
if ( ( !v1 || Yap_unify(v1, fe->vp) ) &&
|
||||||
(!fe->np || Yap_unify(v2, fe->np)) &&
|
( !v2 || Yap_unify(v2, fe->np)) &&
|
||||||
(!fe->sp || Yap_unify(v3, fe->sp)) &&
|
( !v3 || Yap_unify(v3, fe->sp)) &&
|
||||||
(!fe->tcomms || Yap_unify(LOCAL_Comments, fe->tcomms)) &&
|
( !tp || Yap_unify(tp, fe->tp)) &&
|
||||||
(!fe->tp || Yap_unify(fe->tp, CurrentPositionToTerm())))
|
( !vc || Yap_unify(vc, fe->tcomms)))
|
||||||
return fe->t;
|
return fe->t;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool complete_clause_processing(FEnv *fe, TokEntry
|
||||||
|
*tokstart) {
|
||||||
|
CACHE_REGS
|
||||||
|
Term v_vp, v_vnames, v_comments, v_pos;
|
||||||
|
|
||||||
|
CurrentModule = fe->cmod;
|
||||||
|
if (CurrentModule == TermProlog)
|
||||||
|
CurrentModule = PROLOG_MODULE;
|
||||||
|
if (fe->vp)
|
||||||
|
v_vp = get_variables(fe, tokstart);
|
||||||
|
else
|
||||||
|
v_vp = 0L;
|
||||||
|
if (fe->np)
|
||||||
|
v_vnames = get_varnames(fe, tokstart);
|
||||||
|
else
|
||||||
|
v_vnames = 0L;
|
||||||
|
if (trueGlobalPrologFlag(SINGLE_VAR_WARNINGS_FLAG)) {
|
||||||
|
warn_singletons(fe, tokstart);
|
||||||
|
}
|
||||||
|
if (fe->tcomms)
|
||||||
|
v_comments = LOCAL_Comments;
|
||||||
|
else
|
||||||
|
v_comments = 0L;
|
||||||
|
if (fe->tp)
|
||||||
|
v_pos = get_stream_position(fe, tokstart );
|
||||||
|
else
|
||||||
|
v_pos = 0L;
|
||||||
|
Yap_clean_tokenizer(tokstart, LOCAL_VarTable, LOCAL_AnonVarTable);
|
||||||
|
|
||||||
|
// trail must be ok by now.]
|
||||||
|
if ( ( !v_vp || Yap_unify(v_vp, fe->vp) ) &&
|
||||||
|
( !v_vnames || Yap_unify(v_vnames, fe->np)) &&
|
||||||
|
( !v_pos || Yap_unify(v_pos, fe->tp)) &&
|
||||||
|
( !v_comments || Yap_unify(v_comments, fe->tcomms)))
|
||||||
|
return fe->t;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static parser_state_t initParser(Term opts, FEnv *fe, REnv *re, int inp_stream,
|
static parser_state_t initParser(Term opts, FEnv *fe, REnv *re, int inp_stream,
|
||||||
int nargs);
|
int nargs);
|
||||||
|
|
||||||
@ -680,6 +808,12 @@ static parser_state_t scan(REnv *re, FEnv *fe, int inp_stream) {
|
|||||||
// next step
|
// next step
|
||||||
return YAP_PARSING;
|
return YAP_PARSING;
|
||||||
}
|
}
|
||||||
|
if (LOCAL_tokptr->Tok == eot_tok && LOCAL_tokptr->TokInfo == TermNl) {
|
||||||
|
LOCAL_ErrorMessage = "Empty clause";
|
||||||
|
LOCAL_Error_TYPE = SYNTAX_ERROR;
|
||||||
|
LOCAL_Error_Term = TermEof;
|
||||||
|
return YAP_PARSING_ERROR;
|
||||||
|
}
|
||||||
return scanEOF(fe, inp_stream);
|
return scanEOF(fe, inp_stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -768,7 +902,7 @@ static parser_state_t parse(REnv *re, FEnv *fe, int inp_stream) {
|
|||||||
TR = (tr_fr_ptr)tokstart;
|
TR = (tr_fr_ptr)tokstart;
|
||||||
if (fe->t == 0)
|
if (fe->t == 0)
|
||||||
return YAP_PARSING_ERROR;
|
return YAP_PARSING_ERROR;
|
||||||
if (fe->reading_clause && !complete_clause_processing(fe, tokstart, fe->t))
|
if (fe->reading_clause && !complete_clause_processing(fe, tokstart))
|
||||||
fe->t = 0;
|
fe->t = 0;
|
||||||
else if (!fe->reading_clause && !complete_processing(fe, tokstart))
|
else if (!fe->reading_clause && !complete_processing(fe, tokstart))
|
||||||
fe->t = 0;
|
fe->t = 0;
|
||||||
@ -825,7 +959,7 @@ Term Yap_read_term(int inp_stream, Term opts, int nargs) {
|
|||||||
{
|
{
|
||||||
CACHE_REGS
|
CACHE_REGS
|
||||||
if (fe.reading_clause &&
|
if (fe.reading_clause &&
|
||||||
!complete_clause_processing(&fe, LOCAL_tokptr, fe.t))
|
!complete_clause_processing(&fe, LOCAL_tokptr))
|
||||||
fe.t = 0;
|
fe.t = 0;
|
||||||
else if (!fe.reading_clause && !complete_processing(&fe, LOCAL_tokptr))
|
else if (!fe.reading_clause && !complete_processing(&fe, LOCAL_tokptr))
|
||||||
fe.t = 0;
|
fe.t = 0;
|
||||||
@ -839,12 +973,11 @@ Term Yap_read_term(int inp_stream, Term opts, int nargs) {
|
|||||||
static Int
|
static Int
|
||||||
read_term2(USES_REGS1) { /* '$read'(+Flag,?Term,?Module,?Vars,-Pos,-Err) */
|
read_term2(USES_REGS1) { /* '$read'(+Flag,?Term,?Module,?Vars,-Pos,-Err) */
|
||||||
Term rc;
|
Term rc;
|
||||||
yhandle_t h = Yap_InitSlot(ARG1);
|
yhandle_t h = Yap_PushHandle(ARG1);
|
||||||
if ((rc = Yap_read_term(LOCAL_c_input_stream, ARG2, 2)) == 0)
|
if ((rc = Yap_read_term(LOCAL_c_input_stream, ARG2, 2)) == 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
Term tf = Yap_GetFromSlot(h);
|
Term tf = Yap_PopHandle(h);
|
||||||
Yap_RecoverSlots(1, h);
|
return rc && Yap_unify(tf, rc);
|
||||||
return Yap_unify(tf, rc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static Int read_term(
|
static Int read_term(
|
||||||
@ -853,23 +986,23 @@ static Int read_term(
|
|||||||
Int out;
|
Int out;
|
||||||
|
|
||||||
/* needs to change LOCAL_output_stream for write */
|
/* needs to change LOCAL_output_stream for write */
|
||||||
yhandle_t h = Yap_InitSlot(ARG2);
|
yhandle_t h = Yap_PushHandle(ARG2);
|
||||||
inp_stream = Yap_CheckTextStream(ARG1, Input_Stream_f, "read/3");
|
inp_stream = Yap_CheckTextStream(ARG1, Input_Stream_f, "read/3");
|
||||||
if (inp_stream == -1) {
|
if (inp_stream == -1) {
|
||||||
return (FALSE);
|
return (FALSE);
|
||||||
|
|
||||||
}
|
}
|
||||||
out = Yap_read_term(inp_stream, ARG3, 3);
|
out = Yap_read_term(inp_stream, ARG3, 3);
|
||||||
UNLOCK(GLOBAL_Stream[inp_stream].streamlock);
|
UNLOCK(GLOBAL_Stream[inp_stream].streamlock);
|
||||||
Term tf = Yap_GetFromSlot(h);
|
Term tf = Yap_PopHandle(h);
|
||||||
Yap_RecoverSlots(1, h);
|
|
||||||
return out != 0L && Yap_unify(tf, out);
|
return out != 0L && Yap_unify(tf, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define READ_CLAUSE_DEFS() \
|
#define READ_CLAUSE_DEFS() \
|
||||||
PAR("comments", filler, READ_CLAUSE_COMMENTS), \
|
PAR("comments", list_filler, READ_CLAUSE_COMMENTS), \
|
||||||
PAR("process_comments", boolean, READ_CLAUSE_PROCESS_COMMENTS), \
|
|
||||||
PAR("module", isatom, READ_CLAUSE_MODULE), \
|
PAR("module", isatom, READ_CLAUSE_MODULE), \
|
||||||
PAR("variable_names", filler, READ_CLAUSE_VARIABLE_NAMES), \
|
PAR("variable_names", filler, READ_CLAUSE_VARIABLE_NAMES), \
|
||||||
|
PAR("variables", filler, READ_CLAUSE_VARIABLES), \
|
||||||
PAR("term_position", filler, READ_CLAUSE_TERM_POSITION), \
|
PAR("term_position", filler, READ_CLAUSE_TERM_POSITION), \
|
||||||
PAR("syntax_errors", isatom, READ_CLAUSE_SYNTAX_ERRORS), \
|
PAR("syntax_errors", isatom, READ_CLAUSE_SYNTAX_ERRORS), \
|
||||||
PAR(NULL, ok, READ_CLAUSE_END)
|
PAR(NULL, ok, READ_CLAUSE_END)
|
||||||
@ -897,23 +1030,32 @@ static xarg *setClauseReadEnv(Term opts, FEnv *fe, struct renv *re,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
re->bq = getBackQuotesFlag();
|
re->bq = getBackQuotesFlag();
|
||||||
|
fe->enc = GLOBAL_Stream[inp_stream].encoding;
|
||||||
|
fe->cmod = CurrentModule;
|
||||||
CurrentModule = LOCAL_SourceModule;
|
CurrentModule = LOCAL_SourceModule;
|
||||||
|
if (CurrentModule == TermProlog)
|
||||||
|
CurrentModule = PROLOG_MODULE;
|
||||||
|
if (args[READ_CLAUSE_MODULE].used) {
|
||||||
|
fe->tcomms = args[READ_CLAUSE_MODULE].tvalue;
|
||||||
|
} else {
|
||||||
|
fe->tcomms = 0L;
|
||||||
|
}
|
||||||
|
fe->sp = 0;
|
||||||
fe->qq = 0;
|
fe->qq = 0;
|
||||||
if (args[READ_CLAUSE_TERM_POSITION].used) {
|
if (args[READ_CLAUSE_TERM_POSITION].used) {
|
||||||
fe->tp = args[READ_CLAUSE_TERM_POSITION].tvalue;
|
fe->tp = args[READ_CLAUSE_TERM_POSITION].tvalue;
|
||||||
} else {
|
} else {
|
||||||
fe->tp = 0;
|
fe->tp = 0;
|
||||||
}
|
}
|
||||||
if (trueLocalPrologFlag(SINGLE_VAR_WARNINGS_FLAG)) {
|
fe->sp = 0;
|
||||||
fe->sp = TermNil;
|
if (args[READ_CLAUSE_COMMENTS].used) {
|
||||||
} else {
|
|
||||||
fe->sp = 0;
|
|
||||||
}
|
|
||||||
if (args[READ_CLAUSE_COMMENTS].used) {
|
|
||||||
fe->tcomms = args[READ_CLAUSE_COMMENTS].tvalue;
|
fe->tcomms = args[READ_CLAUSE_COMMENTS].tvalue;
|
||||||
|
if (fe->tcomms == TermProlog)
|
||||||
|
fe->tcomms = PROLOG_MODULE;
|
||||||
} else {
|
} else {
|
||||||
fe->tcomms = 0;
|
fe->tcomms = 0L;
|
||||||
} if (args[READ_CLAUSE_SYNTAX_ERRORS].used) {
|
}
|
||||||
|
if (args[READ_CLAUSE_SYNTAX_ERRORS].used) {
|
||||||
re->sy = args[READ_CLAUSE_SYNTAX_ERRORS].tvalue;
|
re->sy = args[READ_CLAUSE_SYNTAX_ERRORS].tvalue;
|
||||||
} else {
|
} else {
|
||||||
re->sy = TermDec10;
|
re->sy = TermDec10;
|
||||||
@ -924,6 +1066,11 @@ static xarg *setClauseReadEnv(Term opts, FEnv *fe, struct renv *re,
|
|||||||
} else {
|
} else {
|
||||||
fe->np = 0;
|
fe->np = 0;
|
||||||
}
|
}
|
||||||
|
if (args[READ_CLAUSE_VARIABLES].used) {
|
||||||
|
fe->vp = args[READ_CLAUSE_VARIABLES].tvalue;
|
||||||
|
} else {
|
||||||
|
fe->vp = 0;
|
||||||
|
}
|
||||||
fe->ce = Yap_CharacterEscapes(CurrentModule);
|
fe->ce = Yap_CharacterEscapes(CurrentModule);
|
||||||
re->seekable = (GLOBAL_Stream[inp_stream].status & Seekable_Stream_f) != 0;
|
re->seekable = (GLOBAL_Stream[inp_stream].status & Seekable_Stream_f) != 0;
|
||||||
if (re->seekable) {
|
if (re->seekable) {
|
||||||
@ -937,75 +1084,6 @@ static xarg *setClauseReadEnv(Term opts, FEnv *fe, struct renv *re,
|
|||||||
return args;
|
return args;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool complete_clause_processing(FEnv *fe, TokEntry *tokstart, Term t) {
|
|
||||||
CACHE_REGS
|
|
||||||
Term v1, v2, v3 = TermNil;
|
|
||||||
CurrentModule = fe->cmod;
|
|
||||||
{
|
|
||||||
fe->old_H = HR;
|
|
||||||
while (TRUE) {
|
|
||||||
fe->old_H = HR;
|
|
||||||
|
|
||||||
if (setjmp(LOCAL_IOBotch) == 0) {
|
|
||||||
v1 = Yap_VarNames(LOCAL_VarTable, TermNil);
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
reset_regs(tokstart, fe);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (fe->tp) {
|
|
||||||
fe->old_H = HR;
|
|
||||||
while (TRUE) {
|
|
||||||
if (setjmp(LOCAL_IOBotch) == 0) {
|
|
||||||
v2 = MkIntegerTerm(Yap_FirstLineInParse());
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
*HR++ = v1;
|
|
||||||
reset_regs(tokstart, fe);
|
|
||||||
v1 = *--HR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (fe->sp) {
|
|
||||||
fe->old_H = HR;
|
|
||||||
while (TRUE) {
|
|
||||||
fe->old_H = HR;
|
|
||||||
|
|
||||||
if (setjmp(LOCAL_IOBotch) == 0) {
|
|
||||||
v3 = Yap_Singletons(LOCAL_VarTable, TermNil);
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
*HR++ = v1;
|
|
||||||
*HR++ = v2;
|
|
||||||
reset_regs(tokstart, fe);
|
|
||||||
v2 = *--HR;
|
|
||||||
v1 = *--HR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Yap_clean_tokenizer(tokstart, LOCAL_VarTable, LOCAL_AnonVarTable);
|
|
||||||
|
|
||||||
if (fe->tcomms && Yap_unify(LOCAL_Comments, fe->tcomms))
|
|
||||||
return false;
|
|
||||||
if (v3 != TermNil) {
|
|
||||||
Term singls[4];
|
|
||||||
singls[0] = Yap_MkApplTerm(Yap_MkFunctor(AtomSingleton, 1), 1, &v3);
|
|
||||||
singls[1] = MkIntegerTerm(LOCAL_SourceFileLineno);
|
|
||||||
singls[2] = MkAtomTerm(LOCAL_SourceFileName);
|
|
||||||
singls[3] = t;
|
|
||||||
t = Yap_MkApplTerm(Yap_MkFunctor(AtomStyleCheck, 4), 4, singls);
|
|
||||||
singls[0] = Yap_MkApplTerm(Yap_MkFunctor(AtomStyleCheck, 1), 1, &t);
|
|
||||||
singls[1] = TermNil;
|
|
||||||
Yap_PrintWarning(Yap_MkApplTerm(FunctorError, 2, singls));
|
|
||||||
}
|
|
||||||
if (fe->np && !Yap_unify(v1, fe->np))
|
|
||||||
return 0;
|
|
||||||
if (fe->tp && !Yap_unify(v2, fe->tp))
|
|
||||||
return 0;
|
|
||||||
return fe->t;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @pred read_clause( +_Stream_, -_Clause_, ?_Opts) is det
|
* @pred read_clause( +_Stream_, -_Clause_, ?_Opts) is det
|
||||||
*
|
*
|
||||||
@ -1015,12 +1093,13 @@ static bool complete_clause_processing(FEnv *fe, TokEntry *tokstart, Term t) {
|
|||||||
static Int read_clause2(USES_REGS1) {
|
static Int read_clause2(USES_REGS1) {
|
||||||
Term rc;
|
Term rc;
|
||||||
yhandle_t h = Yap_InitSlot(ARG1);
|
yhandle_t h = Yap_InitSlot(ARG1);
|
||||||
rc = Yap_read_term(LOCAL_c_input_stream, Deref(ARG2), -2);
|
rc = Yap_read_term(LOCAL_c_input_stream, Deref(ARG2), 2);
|
||||||
Term tf = Yap_GetFromSlot(h);
|
Term tf = Yap_GetFromSlot(h);
|
||||||
Yap_RecoverSlots(1, h);
|
Yap_RecoverSlots(1, h);
|
||||||
return rc && Yap_unify(tf, rc);
|
return rc && Yap_unify(tf, rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @pred read_clause( +_Stream_, -_Clause_, ?_Opts) is det
|
* @pred read_clause( +_Stream_, -_Clause_, ?_Opts) is det
|
||||||
*
|
*
|
||||||
@ -1059,6 +1138,7 @@ static Int read_clause(
|
|||||||
return out && Yap_unify(tf, out);
|
return out && Yap_unify(tf, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @pred source_location( - _File_ , _Line_ )
|
* @pred source_location( - _File_ , _Line_ )
|
||||||
*
|
*
|
||||||
@ -1195,7 +1275,7 @@ Term Yap_StringToTerm(const char *s, size_t len, encoding_t *encp, int prio,
|
|||||||
|
|
||||||
if (bindings) {
|
if (bindings) {
|
||||||
ctl = Yap_MkApplTerm(Yap_MkFunctor(AtomVariableNames, 1), 1, &bvar);
|
ctl = Yap_MkApplTerm(Yap_MkFunctor(AtomVariableNames, 1), 1, &bvar);
|
||||||
sl = Yap_InitSlot(bvar);
|
sl = Yap_PushHandle(bvar);
|
||||||
} else {
|
} else {
|
||||||
ctl = TermNil;
|
ctl = TermNil;
|
||||||
sl = 0;
|
sl = 0;
|
||||||
@ -1208,45 +1288,12 @@ Term Yap_StringToTerm(const char *s, size_t len, encoding_t *encp, int prio,
|
|||||||
Yap_CloseStream(stream);
|
Yap_CloseStream(stream);
|
||||||
UNLOCK(GLOBAL_Stream[stream].streamlock);
|
UNLOCK(GLOBAL_Stream[stream].streamlock);
|
||||||
if (rval && bindings) {
|
if (rval && bindings) {
|
||||||
*bindings = Yap_GetFromSlot(sl);
|
*bindings = Yap_PopHandle(sl);
|
||||||
}
|
|
||||||
if (bindings) {
|
|
||||||
Yap_RecoverSlots(sl, 1);
|
|
||||||
}
|
}
|
||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
Term Yap_ReadFromAtom(Atom a, Term opts) {
|
|
||||||
Term rval;
|
|
||||||
int sno;
|
|
||||||
if (IsWideAtom(a)) {
|
|
||||||
wchar_t *ws = a->WStrOfAE;
|
|
||||||
size_t len = wcslen(ws);
|
|
||||||
encoding_t enc = ENC_ISO_ANSI;
|
|
||||||
sno = Yap_open_buf_read_stream((char *)ws, len, &enc, MEM_BUF_USER);
|
|
||||||
} else {
|
|
||||||
char *s = a->StrOfAE;
|
|
||||||
size_t len = strlen(s);
|
|
||||||
encoding_t enc = ENC_ISO_LATIN1;
|
|
||||||
sno = Yap_open_buf_read_stream((char *)s, len, &enc, MEM_BUF_USER);
|
|
||||||
}
|
|
||||||
|
|
||||||
rval = Yap_read_term(sno, opts, 3);
|
|
||||||
Yap_CloseStream(sno);
|
|
||||||
return rval;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Term readFromBuffer(const char *s, Term opts) {
|
|
||||||
Term rval;
|
|
||||||
int sno;
|
|
||||||
encoding_t enc = ENC_ISO_UTF8;
|
|
||||||
sno = Yap_open_buf_read_stream((char *)s, strlen_utf8((unsigned char *)s),
|
|
||||||
&enc, MEM_BUF_USER);
|
|
||||||
|
|
||||||
rval = Yap_read_term(sno, opts, 3);
|
|
||||||
Yap_CloseStream(sno);
|
|
||||||
return rval;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @pred read_term_from_atom( +_Atom_ , - _T_ , + _VarNames_
|
* @pred read_term_from_atom( +_Atom_ , - _T_ , + _VarNames_
|
||||||
@ -1320,23 +1367,23 @@ static Int term_to_string(USES_REGS1) {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static Int term_to_atom(USES_REGS1) {
|
static Int term_to_atom(USES_REGS1) {
|
||||||
Term t1 = Deref(ARG2), ctl, rc = false;
|
Term t2 = Deref(ARG2), ctl, rc = false;
|
||||||
Atom at;
|
Atom at;
|
||||||
if (IsVarTerm(t1)) {
|
if (IsVarTerm(t2)) {
|
||||||
size_t length;
|
size_t length;
|
||||||
char *s = Yap_TermToString(t1, NULL, 0, &length, NULL,
|
char *s = Yap_TermToString(Deref(ARG1), NULL, 0, &length, NULL,
|
||||||
Quote_illegal_f | Handle_vars_f);
|
Quote_illegal_f | Handle_vars_f);
|
||||||
if (!s || !(at = Yap_LookupAtom(s))) {
|
if (!s || !(at = Yap_LookupAtom(s))) {
|
||||||
Yap_Error(RESOURCE_ERROR_HEAP, t1,
|
Yap_Error(RESOURCE_ERROR_HEAP, t2,
|
||||||
"Could not get memory from the operating system");
|
"Could not get memory from the operating system");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return Yap_unify(ARG2, MkAtomTerm(at));
|
return Yap_unify(ARG2, MkAtomTerm(at));
|
||||||
} else if (!IsAtomTerm(t1)) {
|
} else if (!IsAtomTerm(t2)) {
|
||||||
Yap_Error(TYPE_ERROR_ATOM, t1, "atom_to_term/2");
|
Yap_Error(TYPE_ERROR_ATOM, t2, "atom_to_term/2");
|
||||||
return (FALSE);
|
return (FALSE);
|
||||||
} else {
|
} else {
|
||||||
at = AtomOfTerm(t1);
|
at = AtomOfTerm(t2);
|
||||||
}
|
}
|
||||||
ctl = TermNil;
|
ctl = TermNil;
|
||||||
return Yap_ReadFromAtom(at, ctl) == 0L && Yap_unify(rc, ARG1);
|
return Yap_ReadFromAtom(at, ctl) == 0L && Yap_unify(rc, ARG1);
|
||||||
@ -1373,6 +1420,38 @@ static Int read_term_from_atom(USES_REGS1) {
|
|||||||
return Yap_unify(rc, ARG2);
|
return Yap_unify(rc, ARG2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Term Yap_ReadFromAtom(Atom a, Term opts) {
|
||||||
|
Term rval;
|
||||||
|
int sno;
|
||||||
|
if (IsWideAtom(a)) {
|
||||||
|
wchar_t *ws = a->WStrOfAE;
|
||||||
|
size_t len = wcslen(ws);
|
||||||
|
encoding_t enc = ENC_ISO_ANSI;
|
||||||
|
sno = Yap_open_buf_read_stream((char *)ws, len, &enc, MEM_BUF_USER);
|
||||||
|
} else {
|
||||||
|
char *s = a->StrOfAE;
|
||||||
|
size_t len = strlen(s);
|
||||||
|
encoding_t enc = ENC_ISO_LATIN1;
|
||||||
|
sno = Yap_open_buf_read_stream((char *)s, len, &enc, MEM_BUF_USER);
|
||||||
|
}
|
||||||
|
|
||||||
|
rval = Yap_read_term(sno, opts, 3);
|
||||||
|
Yap_CloseStream(sno);
|
||||||
|
return rval;
|
||||||
|
}
|
||||||
|
static Term readFromBuffer(const char *s, Term opts) {
|
||||||
|
Term rval;
|
||||||
|
int sno;
|
||||||
|
encoding_t enc = ENC_ISO_UTF8;
|
||||||
|
sno = Yap_open_buf_read_stream((char *)s, strlen_utf8((unsigned char *)s),
|
||||||
|
&enc, MEM_BUF_USER);
|
||||||
|
|
||||||
|
rval = Yap_read_term(sno, opts, 3);
|
||||||
|
Yap_CloseStream(sno);
|
||||||
|
return rval;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @pred read_term_from_string( +_String_ , - _T_ , + _Options_
|
* @pred read_term_from_string( +_String_ , - _T_ , + _Options_
|
||||||
*
|
*
|
||||||
@ -1452,7 +1531,7 @@ void Yap_InitReadTPreds(void) {
|
|||||||
Yap_InitCPred("read", 1, read1, SyncPredFlag);
|
Yap_InitCPred("read", 1, read1, SyncPredFlag);
|
||||||
Yap_InitCPred("read", 2, read2, SyncPredFlag);
|
Yap_InitCPred("read", 2, read2, SyncPredFlag);
|
||||||
Yap_InitCPred("read_term", 2, read_term2, SyncPredFlag);
|
Yap_InitCPred("read_term", 2, read_term2, SyncPredFlag);
|
||||||
Yap_InitCPred("read_term", 3, read_term, 0);
|
Yap_InitCPred("read_term", 3, read_term, SyncPredFlag);
|
||||||
Yap_InitCPred("read_clause", 2, read_clause2, SyncPredFlag);
|
Yap_InitCPred("read_clause", 2, read_clause2, SyncPredFlag);
|
||||||
Yap_InitCPred("read_clause", 3, read_clause, 0);
|
Yap_InitCPred("read_clause", 3, read_clause, 0);
|
||||||
|
|
||||||
|
43
os/sig.c
43
os/sig.c
@ -1,15 +1,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "sysbits.h"
|
#include "sysbits.h"
|
||||||
|
|
||||||
#if HAVE_SIGNAL_H
|
#if HAVE_SIGNAL
|
||||||
|
|
||||||
#include <signal.h>
|
|
||||||
|
|
||||||
#ifdef MPW
|
|
||||||
#define signal sigset
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef MSH
|
#ifdef MSH
|
||||||
|
|
||||||
@ -579,6 +571,39 @@ MSCHandleSignal(DWORD dwCtrlType) {
|
|||||||
|
|
||||||
#endif /* HAVE_SIGNAL */
|
#endif /* HAVE_SIGNAL */
|
||||||
|
|
||||||
|
|
||||||
|
/* wrapper for alarm system call */
|
||||||
|
#if _MSC_VER || defined(__MINGW32__)
|
||||||
|
|
||||||
|
static DWORD WINAPI
|
||||||
|
DoTimerThread(LPVOID targ)
|
||||||
|
{
|
||||||
|
Int *time = (Int *)targ;
|
||||||
|
HANDLE htimer;
|
||||||
|
LARGE_INTEGER liDueTime;
|
||||||
|
|
||||||
|
htimer = CreateWaitableTimer(NULL, FALSE, NULL);
|
||||||
|
liDueTime.QuadPart = -10000000;
|
||||||
|
liDueTime.QuadPart *= time[0];
|
||||||
|
/* add time in usecs */
|
||||||
|
liDueTime.QuadPart -= time[1]*10;
|
||||||
|
/* Copy the relative time into a LARGE_INTEGER. */
|
||||||
|
if (SetWaitableTimer(htimer, &liDueTime,0,NULL,NULL,0) == 0) {
|
||||||
|
return(FALSE);
|
||||||
|
}
|
||||||
|
if (WaitForSingleObject(htimer, INFINITE) != WAIT_OBJECT_0)
|
||||||
|
fprintf(stderr,"WaitForSingleObject failed (%ld)\n", GetLastError());
|
||||||
|
Yap_signal (YAP_WINTIMER_SIGNAL);
|
||||||
|
/* now, say what is going on */
|
||||||
|
Yap_PutValue(AtomAlarm, MkAtomTerm(AtomTrue));
|
||||||
|
ExitThread(1);
|
||||||
|
#if _MSC_VER
|
||||||
|
return(0L);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
static Int
|
static Int
|
||||||
enable_interrupts( USES_REGS1 )
|
enable_interrupts( USES_REGS1 )
|
||||||
{
|
{
|
||||||
|
27
os/streams.c
27
os/streams.c
@ -189,7 +189,7 @@ static Int is_output(int sno
|
|||||||
static Int
|
static Int
|
||||||
has_bom(int sno, Term t2 USES_REGS) { /* '$set_output'(+Stream,-ErrorMessage) */
|
has_bom(int sno, Term t2 USES_REGS) { /* '$set_output'(+Stream,-ErrorMessage) */
|
||||||
bool rc = GLOBAL_Stream[sno].status & Seekable_Stream_f;
|
bool rc = GLOBAL_Stream[sno].status & Seekable_Stream_f;
|
||||||
if (!IsVarTerm(t2) && !boolean(t2)) {
|
if (!IsVarTerm(t2) && !booleanFlag(t2)) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
if (rc) {
|
if (rc) {
|
||||||
@ -203,7 +203,7 @@ static Int
|
|||||||
has_reposition(int sno,
|
has_reposition(int sno,
|
||||||
Term t2 USES_REGS) { /* '$set_output'(+Stream,-ErrorMessage) */
|
Term t2 USES_REGS) { /* '$set_output'(+Stream,-ErrorMessage) */
|
||||||
bool rc = GLOBAL_Stream[sno].status & Seekable_Stream_f;
|
bool rc = GLOBAL_Stream[sno].status & Seekable_Stream_f;
|
||||||
if (!IsVarTerm(t2) && !boolean(t2)) {
|
if (!IsVarTerm(t2) && !booleanFlag(t2)) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
if (rc) {
|
if (rc) {
|
||||||
@ -647,9 +647,9 @@ static Int stream_property(USES_REGS1) { /* Init current_stream */
|
|||||||
|
|
||||||
#define SET_STREAM_DEFS() \
|
#define SET_STREAM_DEFS() \
|
||||||
PAR("alias", isatom, SET_STREAM_ALIAS), \
|
PAR("alias", isatom, SET_STREAM_ALIAS), \
|
||||||
PAR("buffer", boolean, SET_STREAM_BUFFER), \
|
PAR("buffer", booleanFlag, SET_STREAM_BUFFER), \
|
||||||
PAR("buffer_size", nat, SET_STREAM_BUFFER_SIZE), \
|
PAR("buffer_size", nat, SET_STREAM_BUFFER_SIZE), \
|
||||||
PAR("close_on_abort", boolean, SET_STREAM_CLOSE_ON_ABORT), \
|
PAR("close_on_abort", booleanFlag, SET_STREAM_CLOSE_ON_ABORT), \
|
||||||
PAR("encoding", isatom, SET_STREAM_ENCODING), \
|
PAR("encoding", isatom, SET_STREAM_ENCODING), \
|
||||||
PAR("eof_action", isatom, SET_STREAM_EOF_ACTION), \
|
PAR("eof_action", isatom, SET_STREAM_EOF_ACTION), \
|
||||||
PAR("file_name", isatom, SET_STREAM_FILE_NAME), \
|
PAR("file_name", isatom, SET_STREAM_FILE_NAME), \
|
||||||
@ -798,18 +798,16 @@ void Yap_CloseStreams(int loud) {
|
|||||||
continue;
|
continue;
|
||||||
if ((GLOBAL_Stream[sno].status & Popen_Stream_f))
|
if ((GLOBAL_Stream[sno].status & Popen_Stream_f))
|
||||||
pclose(GLOBAL_Stream[sno].file);
|
pclose(GLOBAL_Stream[sno].file);
|
||||||
#if _MSC_VER || defined(__MINGW32__)
|
|
||||||
if (GLOBAL_Stream[sno].status & Pipe_Stream_f)
|
|
||||||
CloseHandle(GLOBAL_Stream[sno].u.pipe.hdl);
|
|
||||||
#else
|
|
||||||
if (GLOBAL_Stream[sno].status & (Pipe_Stream_f | Socket_Stream_f))
|
if (GLOBAL_Stream[sno].status & (Pipe_Stream_f | Socket_Stream_f))
|
||||||
close(GLOBAL_Stream[sno].u.pipe.fd);
|
close(GLOBAL_Stream[sno].u.pipe.fd);
|
||||||
#endif
|
#if USE_SOCKET
|
||||||
else if (GLOBAL_Stream[sno].status & (Socket_Stream_f)) {
|
else if (GLOBAL_Stream[sno].status & (Socket_Stream_f)) {
|
||||||
Yap_CloseSocket(GLOBAL_Stream[sno].u.socket.fd,
|
Yap_CloseSocket(GLOBAL_Stream[sno].u.socket.fd,
|
||||||
GLOBAL_Stream[sno].u.socket.flags,
|
GLOBAL_Stream[sno].u.socket.flags,
|
||||||
GLOBAL_Stream[sno].u.socket.domain);
|
GLOBAL_Stream[sno].u.socket.domain);
|
||||||
} else if (GLOBAL_Stream[sno].status & InMemory_Stream_f) {
|
}
|
||||||
|
#endif
|
||||||
|
else if (GLOBAL_Stream[sno].status & InMemory_Stream_f) {
|
||||||
if (GLOBAL_Stream[sno].u.mem_string.src == MEM_BUF_CODE) {
|
if (GLOBAL_Stream[sno].u.mem_string.src == MEM_BUF_CODE) {
|
||||||
Yap_FreeAtomSpace(GLOBAL_Stream[sno].u.mem_string.buf);
|
Yap_FreeAtomSpace(GLOBAL_Stream[sno].u.mem_string.buf);
|
||||||
} else if (GLOBAL_Stream[sno].u.mem_string.src == MEM_BUF_MALLOC) {
|
} else if (GLOBAL_Stream[sno].u.mem_string.src == MEM_BUF_MALLOC) {
|
||||||
@ -846,12 +844,9 @@ static void CloseStream(int sno) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else if (GLOBAL_Stream[sno].status & Pipe_Stream_f) {
|
else if (GLOBAL_Stream[sno].status & Pipe_Stream_f) {
|
||||||
#if _MSC_VER || defined(__MINGW32__)
|
|
||||||
CloseHandle(GLOBAL_Stream[sno].u.pipe.hdl);
|
|
||||||
#else
|
|
||||||
close(GLOBAL_Stream[sno].u.pipe.fd);
|
close(GLOBAL_Stream[sno].u.pipe.fd);
|
||||||
#endif
|
|
||||||
} else if (GLOBAL_Stream[sno].status & (InMemory_Stream_f)) {
|
} else if (GLOBAL_Stream[sno].status & (InMemory_Stream_f)) {
|
||||||
|
Yap_CloseMemoryStream( sno );
|
||||||
if (GLOBAL_Stream[sno].u.mem_string.src == MEM_BUF_CODE)
|
if (GLOBAL_Stream[sno].u.mem_string.src == MEM_BUF_CODE)
|
||||||
Yap_FreeAtomSpace(GLOBAL_Stream[sno].u.mem_string.buf);
|
Yap_FreeAtomSpace(GLOBAL_Stream[sno].u.mem_string.buf);
|
||||||
else if (GLOBAL_Stream[sno].u.mem_string.src == MEM_BUF_MALLOC) {
|
else if (GLOBAL_Stream[sno].u.mem_string.src == MEM_BUF_MALLOC) {
|
||||||
@ -1329,11 +1324,7 @@ Int Yap_StreamToFileNo(Term t) {
|
|||||||
Yap_CheckStream(t, (Input_Stream_f | Output_Stream_f), "StreamToFileNo");
|
Yap_CheckStream(t, (Input_Stream_f | Output_Stream_f), "StreamToFileNo");
|
||||||
if (GLOBAL_Stream[sno].status & Pipe_Stream_f) {
|
if (GLOBAL_Stream[sno].status & Pipe_Stream_f) {
|
||||||
UNLOCK(GLOBAL_Stream[sno].streamlock);
|
UNLOCK(GLOBAL_Stream[sno].streamlock);
|
||||||
#if _MSC_VER || defined(__MINGW32__)
|
|
||||||
return ((Int)(GLOBAL_Stream[sno].u.pipe.hdl));
|
|
||||||
#else
|
|
||||||
return (GLOBAL_Stream[sno].u.pipe.fd);
|
return (GLOBAL_Stream[sno].u.pipe.fd);
|
||||||
#endif
|
|
||||||
#if HAVE_SOCKET
|
#if HAVE_SOCKET
|
||||||
} else if (GLOBAL_Stream[sno].status & Socket_Stream_f) {
|
} else if (GLOBAL_Stream[sno].status & Socket_Stream_f) {
|
||||||
UNLOCK(GLOBAL_Stream[sno].streamlock);
|
UNLOCK(GLOBAL_Stream[sno].streamlock);
|
||||||
|
@ -100,19 +100,19 @@ static char SccsId[] = "%W% %G%";
|
|||||||
#define WRITE_DEFS() \
|
#define WRITE_DEFS() \
|
||||||
PAR( "module", isatom, WRITE_MODULE ), \
|
PAR( "module", isatom, WRITE_MODULE ), \
|
||||||
PAR( "attributes", isatom, WRITE_ATTRIBUTES ), \
|
PAR( "attributes", isatom, WRITE_ATTRIBUTES ), \
|
||||||
PAR( "cycles", boolean, WRITE_CYCLES ), \
|
PAR( "cycles", booleanFlag, WRITE_CYCLES ), \
|
||||||
PAR( "quoted", boolean, WRITE_QUOTED ), \
|
PAR( "quoted", booleanFlag, WRITE_QUOTED ), \
|
||||||
PAR( "ignore_ops", boolean, WRITE_IGNORE_OPS ), \
|
PAR( "ignore_ops", booleanFlag, WRITE_IGNORE_OPS ), \
|
||||||
PAR( "max_depth",nat, WRITE_MAX_DEPTH ), \
|
PAR( "max_depth",nat, WRITE_MAX_DEPTH ), \
|
||||||
PAR( "numbervars", boolean, WRITE_NUMBERVARS ), \
|
PAR( "numbervars", booleanFlag, WRITE_NUMBERVARS ), \
|
||||||
PAR( "portrayed", boolean, WRITE_PORTRAYED ), \
|
PAR( "portrayed", booleanFlag, WRITE_PORTRAYED ), \
|
||||||
PAR( "portray", boolean, WRITE_PORTRAY ), \
|
PAR( "portray", booleanFlag, WRITE_PORTRAY ), \
|
||||||
PAR( "priority", nat, WRITE_PRIORITY ), \
|
PAR( "priority", nat, WRITE_PRIORITY ), \
|
||||||
PAR( "character_escapes", boolean, WRITE_CHARACTER_ESCAPES ), \
|
PAR( "character_escapes", booleanFlag, WRITE_CHARACTER_ESCAPES ), \
|
||||||
PAR( "backquotes", boolean, WRITE_BACKQUOTES ), \
|
PAR( "backquotes", booleanFlag, WRITE_BACKQUOTES ), \
|
||||||
PAR( "brace_terms", boolean, WRITE_BRACE_TERMS ), \
|
PAR( "brace_terms", booleanFlag, WRITE_BRACE_TERMS ), \
|
||||||
PAR( "fullstop", boolean, WRITE_FULLSTOP ), \
|
PAR( "fullstop", booleanFlag, WRITE_FULLSTOP ), \
|
||||||
PAR( "nl", boolean, WRITE_NL ), \
|
PAR( "nl", booleanFlag, WRITE_NL ), \
|
||||||
PAR( "variable_names",ok, WRITE_VARIABLE_NAMES ), \
|
PAR( "variable_names",ok, WRITE_VARIABLE_NAMES ), \
|
||||||
PAR( NULL, ok, WRITE_END )
|
PAR( NULL, ok, WRITE_END )
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user