From 168a6366f8199a7e744629a32ba30e771bc528a5 Mon Sep 17 00:00:00 2001 From: Vitor Santos Costa Date: Sun, 19 Dec 2010 21:32:13 +0000 Subject: [PATCH] enable obtaining current stream_position from SWI.y --- C/iopreds.c | 3 +++ H/YapHeap.h | 1 + H/Yapproto.h | 1 + H/dglobals.h | 1 + H/hglobals.h | 1 + H/iglobals.h | 1 + H/rglobals.h | 1 + include/SWI-Prolog.h | 1 + library/dialect/swi/fli/swi.c | 18 ++++++++++++++++++ misc/GLOBALS | 1 + packages/PLStream/pl-file.c | 7 +++++++ 11 files changed, 36 insertions(+) diff --git a/C/iopreds.c b/C/iopreds.c index 01f17ba6e..08fc17565 100644 --- a/C/iopreds.c +++ b/C/iopreds.c @@ -4765,6 +4765,9 @@ StreamPosition(int sno) Term sargs[5]; Int cpos; cpos = Stream[sno].charcount; + if (Stream[sno].status & SWI_Stream_f) { + return Yap_get_stream_position(Stream[sno].u.swi_stream.swi_ptr); + } if (Stream[sno].stream_getc == PlUnGetc) { cpos--; } diff --git a/H/YapHeap.h b/H/YapHeap.h index fe815007a..ead1a77b8 100755 --- a/H/YapHeap.h +++ b/H/YapHeap.h @@ -29,6 +29,7 @@ typedef int (*SWI_GetWideFunction)(void *); typedef int (*SWI_CloseFunction)(void *); typedef int (*SWI_FlushFunction)(void *); typedef int (*SWI_PLGetStreamFunction)(void *); +typedef int (*SWI_PLGetStreamPositionFunction)(void *); #include "../include/dswiatoms.h" diff --git a/H/Yapproto.h b/H/Yapproto.h index 5048b856f..6ac8085c9 100755 --- a/H/Yapproto.h +++ b/H/Yapproto.h @@ -462,6 +462,7 @@ void STD_PROTO(Yap_InitMYDDAS_TopLevelPreds,(void)); void STD_PROTO(Yap_swi_install,(void)); void STD_PROTO(Yap_InitSWIHash,(void)); int STD_PROTO(Yap_get_stream_handle,(Term, int, int, void *)); +Term STD_PROTO(Yap_get_stream_position,(void *)); /* ypsocks.c */ void STD_PROTO(Yap_InitSockets,(void)); diff --git a/H/dglobals.h b/H/dglobals.h index 36d72d2b4..17c514015 100644 --- a/H/dglobals.h +++ b/H/dglobals.h @@ -188,6 +188,7 @@ #define SWIClose Yap_global->swi_close #define SWIFlush Yap_global->swi_flush #define SWIGetStream Yap_global->swi_get_stream_f +#define SWIGetStreamPosition Yap_global->swi_get_stream_position_f #define Yap_AllowLocalExpansion Yap_global->allow_local_expansion #define Yap_AllowGlobalExpansion Yap_global->allow_global_expansion diff --git a/H/hglobals.h b/H/hglobals.h index 09c3587a1..87719458c 100644 --- a/H/hglobals.h +++ b/H/hglobals.h @@ -190,6 +190,7 @@ typedef struct worker_shared { SWI_CloseFunction swi_close; SWI_FlushFunction swi_flush; SWI_PLGetStreamFunction swi_get_stream_f; + SWI_PLGetStreamPositionFunction swi_get_stream_position_f; int allow_local_expansion; int allow_global_expansion; diff --git a/H/iglobals.h b/H/iglobals.h index 978c91658..4c6012a7e 100644 --- a/H/iglobals.h +++ b/H/iglobals.h @@ -188,6 +188,7 @@ static void InitGlobal(void) { Yap_global->swi_close = NULL; Yap_global->swi_flush = NULL; Yap_global->swi_get_stream_f = NULL; + Yap_global->swi_get_stream_position_f = NULL; Yap_global->allow_local_expansion = TRUE; Yap_global->allow_global_expansion = TRUE; diff --git a/H/rglobals.h b/H/rglobals.h index 81d3bb0e2..7aaa8d045 100644 --- a/H/rglobals.h +++ b/H/rglobals.h @@ -199,6 +199,7 @@ static void RestoreGlobal(void) { + #if HAVE_LIBREADLINE diff --git a/include/SWI-Prolog.h b/include/SWI-Prolog.h index a3b301169..7a5e77311 100755 --- a/include/SWI-Prolog.h +++ b/include/SWI-Prolog.h @@ -699,6 +699,7 @@ typedef struct SWI_IO { void *flush_s; void *close_s; void *get_stream_handle; + void *get_stream_position; } swi_io_struct; /* SWI stream info */ diff --git a/library/dialect/swi/fli/swi.c b/library/dialect/swi/fli/swi.c index bd4aae8e4..37a551df5 100755 --- a/library/dialect/swi/fli/swi.c +++ b/library/dialect/swi/fli/swi.c @@ -3096,6 +3096,7 @@ PL_YAP_InitSWIIO(struct SWI_IO *swio) SWIFlush = swio->flush_s; SWIClose = swio->close_s; SWIGetStream = swio->get_stream_handle; + SWIGetStreamPosition = swio->get_stream_position; } typedef int (*GetStreamF)(term_t, int, int, IOSTREAM **s); @@ -3115,6 +3116,23 @@ Yap_get_stream_handle(Term t0, int read_mode, int write_mode, void *s){ } +typedef int (*GetStreamPosF)(IOSTREAM *s, term_t); + +Term +Yap_get_stream_position(void *s){ + term_t t; + Term t0; + GetStreamPosF f = (GetStreamPosF)SWIGetStreamPosition; + + t = (term_t)Yap_NewSlots(1); + if (!(*f)(s, t)) + return 0L; + t0 = Yap_GetFromSlot((Int)t); + Yap_RecoverSlots(1); + return t0; +} + + X_API void (*PL_signal(int sig, void (*func)(int)))(int) { // return Yap_signal2(sig,func); diff --git a/misc/GLOBALS b/misc/GLOBALS index 1219f8c65..1dcda6810 100644 --- a/misc/GLOBALS +++ b/misc/GLOBALS @@ -211,6 +211,7 @@ SWI_PutWideFunction swi_wputc SWIWidePutc =NULL SWI_CloseFunction swi_close SWIClose =NULL SWI_FlushFunction swi_flush SWIFlush =NULL SWI_PLGetStreamFunction swi_get_stream_f SWIGetStream =NULL +SWI_PLGetStreamPositionFunction swi_get_stream_position_f SWIGetStreamPosition =NULL // stack overflow expansion/gc control int allow_local_expansion Yap_AllowLocalExpansion =TRUE diff --git a/packages/PLStream/pl-file.c b/packages/PLStream/pl-file.c index 6c0fef260..14146fa47 100755 --- a/packages/PLStream/pl-file.c +++ b/packages/PLStream/pl-file.c @@ -4350,6 +4350,12 @@ get_stream_handle_no_errors(term_t t, int read, int write, IOSTREAM **s) return get_stream_handle(t, s, SH_ALIAS); } +static int +get_stream_position(IOSTREAM *s, term_t t) +{ GET_LD + return stream_position_prop(s, t); +} + static void init_yap_extras(void) { @@ -4363,6 +4369,7 @@ init_yap_extras(void) swiio.flush_s = Sflush; swiio.close_s = closeStream; swiio.get_stream_handle = get_stream_handle_no_errors; + swiio.get_stream_position = get_stream_position; PL_YAP_InitSWIIO(&swiio); initCharTypes(); initFiles();