enable obtaining current stream_position from SWI.y

This commit is contained in:
Vitor Santos Costa 2010-12-19 21:32:13 +00:00
parent cb7c2e0ca8
commit 168a6366f8
11 changed files with 36 additions and 0 deletions

View File

@ -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--;
}

View File

@ -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"

View File

@ -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));

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -199,6 +199,7 @@ static void RestoreGlobal(void) {
#if HAVE_LIBREADLINE

View File

@ -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 */

View File

@ -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);

View File

@ -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

View File

@ -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();