diff --git a/C/iopreds.c b/C/iopreds.c index 490f7e63a..50d62da65 100755 --- a/C/iopreds.c +++ b/C/iopreds.c @@ -806,6 +806,20 @@ MemPutc(int sno, int ch) return ((int) ch); } +/* static */ +static int +IOSWIPutc(int sno, int ch) +{ + return (SWIPutc)(ch, Stream[sno].u.swi_stream.swi_ptr); +} + +/* static */ +static int +IOSWIGetc(int sno, int ch) +{ + return (SWIGetc)(Stream[sno].u.swi_stream.swi_ptr); +} + #if USE_SOCKET /* static */ static int @@ -3107,6 +3121,43 @@ FindStreamForAlias (Atom al) return(FALSE); } +static int +LookupSWIStream (struct io_stream *swi_s) +{ + int i = 0; + + while (i < MaxStreams) { + LOCK(Stream[i].streamlock); + if (Stream[i].status & SWI_Stream_f && + Stream[i].u.swi_stream.swi_ptr == swi_s + ) { + UNLOCK(Stream[i].streamlock); + return i; + } + UNLOCK(Stream[i].streamlock); + i++; + } + i = GetFreeStreamD(); + if (i < 0) + return i; + Stream[i].u.swi_stream.swi_ptr = swi_s; + Stream[i].status = SWI_Stream_f|Output_Stream_f|Input_Stream_f|Append_Stream_f|Tty_Stream_f|Promptable_Stream_f; + Stream[i].linepos = 0; + Stream[i].linecount = 1; + Stream[i].charcount = 0; + Stream[i].encoding = DefaultEncoding(); + Stream[i].stream_getc = IOSWIGetc; + Stream[i].stream_putc = IOSWIPutc; + Stream[i].stream_wputc = put_wchar; + Stream[i].stream_wgetc = get_wchar; + Stream[i].stream_gets = DefaultGets; + if (CharConversionTable != NULL) + Stream[i].stream_wgetc_for_read = ISOWGetc; + else + Stream[i].stream_wgetc_for_read = get_wchar; + return i; +} + static int CheckStream (Term arg, int kind, char *msg) { @@ -3136,8 +3187,18 @@ CheckStream (Term arg, int kind, char *msg) } } else if (IsApplTerm (arg) && FunctorOfTerm (arg) == FunctorStream) { arg = ArgOfTerm (1, arg); - if (!IsVarTerm (arg) && IsIntTerm (arg)) - sno = IntOfTerm (arg); + if (!IsVarTerm (arg) && IsIntegerTerm (arg)) { + Int xsno = IntegerOfTerm(arg); + if (xsno > MaxStreams) { + sno = LookupSWIStream((struct io_stream *)xsno); + } else { + sno = xsno; + } + } + } else if (IsApplTerm (arg) && FunctorOfTerm (arg) == FSWIStream) { + arg = ArgOfTerm (1, arg); + if (!IsVarTerm (arg) && IsIntegerTerm (arg)) + sno = LookupSWIStream((struct io_stream *)IntegerOfTerm (arg)); } if (sno < 0) { @@ -3332,7 +3393,7 @@ Yap_CloseStreams (int loud) static void CloseStream(int sno) { - if (!(Stream[sno].status & (Null_Stream_f|Socket_Stream_f|InMemory_Stream_f|Pipe_Stream_f))) + if (!(Stream[sno].status & (Null_Stream_f|Socket_Stream_f|InMemory_Stream_f|Pipe_Stream_f|SWI_Stream_f))) YP_fclose (Stream[sno].u.file.file); #if USE_SOCKET else if (Stream[sno].status & (Socket_Stream_f)) { @@ -3354,6 +3415,9 @@ CloseStream(int sno) else free(Stream[sno].u.mem_string.buf); } + else if (Stream[sno].status & (SWI_Stream_f)) { + SWIClose(Stream[sno].u.swi_stream.swi_ptr); + } Stream[sno].status = Free_Stream_f; PurgeAlias(sno); if (Yap_c_input_stream == sno) diff --git a/C/load_dl.c b/C/load_dl.c index 667f2912e..86c65a5ba 100644 --- a/C/load_dl.c +++ b/C/load_dl.c @@ -61,7 +61,7 @@ Yap_CallForeignFile(void *handle, char *f) { YapInitProc proc = (YapInitProc) dlsym(handle, f); if (!proc) { - Yap_Error(SYSTEM_ERROR, ARG1, "dlsym error %s\n", dlerror()); + /* Yap_Error(SYSTEM_ERROR, ARG1, "dlsym error %s\n", dlerror());*/ return FALSE; } (*proc) (); diff --git a/C/scanner.c b/C/scanner.c index df6c0f264..fa0594ca7 100755 --- a/C/scanner.c +++ b/C/scanner.c @@ -261,9 +261,13 @@ read_quoted_char(int *scan_nextp, int inp_stream, int (*QuotedNxtch)(int)) ch = QuotedNxtch(inp_stream); switch (ch) { case 10: - ch = QuotedNxtch(inp_stream); - if (ch == '\\') goto restart; - return ch; + do { + ch = QuotedNxtch(inp_stream); + if (ch == '\\') goto restart; + if (chtype(ch) != BS || ch == 10) { + return ch; + } + } while (TRUE); case 'a': return '\a'; case 'b':