From 0aa358a2b76b1b8506016f53cdb9624ba61f8ac1 Mon Sep 17 00:00:00 2001 From: vsc Date: Fri, 14 May 2004 16:33:47 +0000 Subject: [PATCH] add Yap_ReadBuffer git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1064 b08c6af1-5177-4d33-ba66-4b1c6b8b522a --- C/c_interface.c | 44 ++++++++++++++------- C/iopreds.c | 90 ++++++++++++++++++++++++++++++++---------- C/stdpreds.c | 8 +++- H/yapio.h | 1 + console/yap.c | 7 +++- docs/yap.tex | 19 +++++++-- include/YapInterface.h | 3 ++ misc/yap.def | 37 ++++++++--------- 8 files changed, 145 insertions(+), 64 deletions(-) diff --git a/C/c_interface.c b/C/c_interface.c index 42773cc13..26758dcf9 100644 --- a/C/c_interface.c +++ b/C/c_interface.c @@ -1,17 +1,18 @@ /************************************************************************* * * -* YAP Prolog %W% %G% * +* YAP Prolog * * Yap Prolog was developed at NCCUP - Universidade do Porto * * * -* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * +* Copyright L.Damas, V.Santos Costa and Universidade do Porto 1985-- * * * ************************************************************************** * * * File: c_interface.c * -* Last rev: 19/2/88 * -* mods: * * comments: c_interface primitives definition * * * +* Last rev: $Date: 2004-05-14 16:33:44 $,$Author: vsc $ * +* $Log: not supported by cvs2svn $ * +* * *************************************************************************/ #define Bool int @@ -77,7 +78,6 @@ X_API void *STD_PROTO(YAP_ExtraSpace,(void)); X_API Int STD_PROTO(YAP_cut_fail,(void)); X_API Int STD_PROTO(YAP_cut_succeed,(void)); X_API Int STD_PROTO(YAP_Unify,(Term,Term)); -X_API Int STD_PROTO(YAP_Unify,(Term,Term)); X_API int STD_PROTO(YAP_Reset,(void)); X_API Int STD_PROTO(YAP_Init,(YAP_init_args *)); X_API Int STD_PROTO(YAP_FastInit,(char *)); @@ -85,6 +85,7 @@ X_API Int STD_PROTO(YAP_CallProlog,(Term)); X_API void *STD_PROTO(YAP_AllocSpaceFromYap,(unsigned int)); X_API void STD_PROTO(YAP_FreeSpaceFromYap,(void *)); X_API int STD_PROTO(YAP_StringToBuffer, (Term, char *, unsigned int)); +X_API Term STD_PROTO(YAP_ReadBuffer, (char *,Term *)); X_API Term STD_PROTO(YAP_BufferToString, (char *)); X_API Term STD_PROTO(YAP_BufferToAtomList, (char *)); X_API void STD_PROTO(YAP_Error,(char *)); @@ -227,7 +228,7 @@ YAP_MkFloatTerm(double n) t = MkFloatTerm(n); RECOVER_H(); - return(t); + return t; } X_API flt @@ -242,7 +243,7 @@ YAP_MkAtomTerm(Atom n) Term t; t = MkAtomTerm(n); - return(t); + return t; } X_API Atom @@ -285,7 +286,7 @@ YAP_MkVarTerm(void) t = MkVarTerm(); RECOVER_H(); - return(t); + return t; } X_API Term @@ -297,7 +298,7 @@ YAP_MkPairTerm(Term t1, Term t2) t = MkPairTerm(t1, t2); RECOVER_H(); - return(t); + return t; } X_API Term @@ -309,7 +310,7 @@ YAP_MkNewPairTerm() t = Yap_MkNewPairTerm(); RECOVER_H(); - return(t); + return t; } X_API Term @@ -333,7 +334,7 @@ YAP_MkApplTerm(Functor f,unsigned long int arity, Term args[]) t = Yap_MkApplTerm(f, arity, args); RECOVER_H(); - return(t); + return t; } X_API Term @@ -345,7 +346,7 @@ YAP_MkNewApplTerm(Functor f,unsigned long int arity) t = Yap_MkNewApplTerm(f, arity); RECOVER_H(); - return(t); + return t; } X_API Functor @@ -658,7 +659,20 @@ YAP_BufferToString(char *s) t = Yap_StringToList(s); RECOVER_H(); - return(t); + return t; +} + +/* copy a string to a buffer */ +X_API Term +YAP_ReadBuffer(char *s, Term *tp) +{ + Term t; + BACKUP_H(); + + t = Yap_StringToTerm(s,tp); + + RECOVER_H(); + return t; } /* copy a string to a buffer */ @@ -671,7 +685,7 @@ YAP_BufferToAtomList(char *s) t = Yap_StringToListOfAtoms(s); RECOVER_H(); - return(t); + return t; } @@ -819,7 +833,7 @@ YAP_Read(int (*mygetc)(void)) TR = old_TR; RECOVER_MACHINE_REGS(); - return(t); + return t; } X_API void diff --git a/C/iopreds.c b/C/iopreds.c index 11d1f414e..f725563c8 100644 --- a/C/iopreds.c +++ b/C/iopreds.c @@ -1981,11 +1981,40 @@ p_open_pipe_stream (void) return (Yap_unify (ARG1, t1) && Yap_unify (ARG2, t2)); } +static int +open_buf_read_stream(char *nbuf, Int nchars) +{ + int sno; + StreamDesc *st; + + + for (sno = 0; sno < MaxStreams; ++sno) + if (Stream[sno].status & Free_Stream_f) + break; + if (sno == MaxStreams) + return (PlIOError (SYSTEM_ERROR,TermNil, "new stream not available for open_mem_read_stream/1")); + st = &Stream[sno]; + /* currently these streams are not seekable */ + st->status = Input_Stream_f | InMemory_Stream_f; + st->linepos = 0; + st->charcount = 0; + st->linecount = 1; + st->stream_putc = MemPutc; + st->stream_getc = MemGetc; + if (CharConversionTable != NULL) + st->stream_getc_for_read = ISOGetc; + else + st->stream_getc_for_read = MemGetc; + st->u.mem_string.pos = 0; + st->u.mem_string.buf = nbuf; + st->u.mem_string.max_size = nchars; + return sno; +} + static Int p_open_mem_read_stream (void) /* $open_mem_read_stream(+List,-Stream) */ { Term t, ti; - StreamDesc *st; int sno; Int sl = 0, nchars = 0; char *nbuf; @@ -2024,26 +2053,7 @@ p_open_mem_read_stream (void) /* $open_mem_read_stream(+List,-Stream) */ ti = TailOfTerm(ti); } nbuf[nchars] = '\0'; - for (sno = 0; sno < MaxStreams; ++sno) - if (Stream[sno].status & Free_Stream_f) - break; - if (sno == MaxStreams) - return (PlIOError (SYSTEM_ERROR,TermNil, "new stream not available for open_mem_read_stream/1")); - st = &Stream[sno]; - /* currently these streams are not seekable */ - st->status = Input_Stream_f | InMemory_Stream_f; - st->linepos = 0; - st->charcount = 0; - st->linecount = 1; - st->stream_putc = MemPutc; - st->stream_getc = MemGetc; - if (CharConversionTable != NULL) - st->stream_getc_for_read = ISOGetc; - else - st->stream_getc_for_read = MemGetc; - st->u.mem_string.pos = 0; - st->u.mem_string.buf = nbuf; - st->u.mem_string.max_size = nchars; + sno = open_buf_read_stream(nbuf, nchars); t = MkStream (sno); return (Yap_unify (ARG2, t)); } @@ -4624,6 +4634,44 @@ p_same_file(void) { #endif } + +Term +Yap_StringToTerm(char *s,Term *tp) +{ + int sno = open_buf_read_stream(s, strlen(s)+1); + Term t; + TokEntry *tokstart; + + if (sno < 0) + return FALSE; + tokstart = Yap_tokptr = Yap_toktide = Yap_tokenizer(sno); + /* cannot actually use CloseStream, because we didn't allocate the buffer */ + Stream[sno].status = Free_Stream_f; + if (tokstart == NIL && tokstart->Tok == Ord (eot_tok)) { + if (tp) { + *tp = MkAtomTerm(Yap_LookupAtom("end of file found before end of term")); + } + Yap_clean_tokenizer(tokstart, Yap_VarTable, Yap_AnonVarTable); + return FALSE; + } else if (Yap_ErrorMessage) { + if (tp) { + *tp = MkAtomTerm(Yap_LookupAtom(Yap_ErrorMessage)); + } + Yap_clean_tokenizer(tokstart, Yap_VarTable, Yap_AnonVarTable); + return FALSE; + } + t = Yap_Parse(); + if (Yap_ErrorMessage) { + if (tp) { + *tp = syntax_error(tokstart); + } + Yap_clean_tokenizer(tokstart, Yap_VarTable, Yap_AnonVarTable); + return FALSE; + } + Yap_clean_tokenizer(tokstart, Yap_VarTable, Yap_AnonVarTable); + return t; +} + void Yap_InitBackIO (void) { diff --git a/C/stdpreds.c b/C/stdpreds.c index c7ee6b7b5..a84319f7f 100644 --- a/C/stdpreds.c +++ b/C/stdpreds.c @@ -4,15 +4,19 @@ * * * Yap Prolog was developed at NCCUP - Universidade do Porto * * * -* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * +* Copyright L.Damas, V. Santos Costa and Universidade do Porto 1985-- * * * ************************************************************************** * * * File: stdpreds.c * * comments: General-purpose C implemented system predicates * * * -* Last rev: $Date: 2004-05-13 20:54:58 $,$Author: vsc $ * +* Last rev: $Date: 2004-05-14 16:33:45 $,$Author: vsc $ * * $Log: not supported by cvs2svn $ +* Revision 1.66 2004/05/13 20:54:58 vsc +* debugger fixes +* make sure we always go back to current module, even during initizlization. +* * Revision 1.65 2004/04/27 15:14:36 vsc * fix halt/0 and halt/1 * * diff --git a/H/yapio.h b/H/yapio.h index ac18b25c1..9e5cd29d7 100644 --- a/H/yapio.h +++ b/H/yapio.h @@ -274,6 +274,7 @@ int STD_PROTO(Yap_PlFGetchar,(void)); int STD_PROTO(Yap_GetCharForSIGINT,(void)); int STD_PROTO(Yap_StreamToFileNo,(Term)); Term STD_PROTO(Yap_OpenStream,(FILE *,char *,Term,int)); +Term STD_PROTO(Yap_StringToTerm,(char *,Term *)); extern int Yap_c_input_stream, diff --git a/console/yap.c b/console/yap.c index fef3a6e19..d15f89901 100644 --- a/console/yap.c +++ b/console/yap.c @@ -105,13 +105,11 @@ static FILE *bootfile; static int eof_found = FALSE; static int yap_lineno = 0; -#ifdef DEBUG static void myputc (int ch) { putc(ch,stderr); } -#endif static int mygetc (void) @@ -532,6 +530,11 @@ exec_top_level(int BootMode, YAP_init_args *iap) */ livegoal = YAP_FullLookupAtom("$live"); atomfalse = YAP_MkAtomTerm (YAP_FullLookupAtom("$false")); + { + YAP_Term t = YAP_ReadBuffer("a(1)",NULL); + if (t) + YAP_Write(t,myputc,0); + } while (YAP_GetValue (livegoal) != atomfalse) { YAP_Reset(); do_top_goal (YAP_MkAtomTerm (livegoal)); diff --git a/docs/yap.tex b/docs/yap.tex index 09fbb93e8..cdd2e13dc 100644 --- a/docs/yap.tex +++ b/docs/yap.tex @@ -5627,11 +5627,11 @@ signal name or one that is not supported on this platform. No checks are made on the handler provided by the user. @table @code -@item SIGHUP (Hangup) - sig_hup in YAP; Reconsult the initialization files +@item sig_up (Hangup) + SIGHUP in Unix/Linux; Reconsult the initialization files ~/.yaprc, ~/.prologrc and ~/prolog.ini. -@item SIGUSR1 and SIGUSR2 (User signals) - sig_usr1 and sig_usr2 in YAP; Print a message and halt. +@item sig_usr1 and sig_usr2 (User signals) + SIGUSR1 and SIGUSR2 in Unix/Linux; Print a message and halt. @end table A special case is made, where if @var{Callable} is bound to @@ -13585,6 +13585,17 @@ character atoms @noindent The user-provided string must include a terminating null character. +@findex YAP_ReadBuffer (C-Interface function) +The C-interface function calls the parser on a sequence of characters +stored at @var{buf} and returns the resulting term. +@example + YAP_Term YAP_ReadBuffer(char *@var{buf},YAP_Term *@var{error}) +@end example +@noindent +The user-provided string must include a terminating null +character. Syntax errors will cause returning @code{FALSE} and binding +@var{error} to a Prolog term. + @node Memory Allocation, Controlling Streams, Manipulating Strings, C-Interface @section Memory Allocation diff --git a/include/YapInterface.h b/include/YapInterface.h index e506aff31..7653a80a9 100644 --- a/include/YapInterface.h +++ b/include/YapInterface.h @@ -250,6 +250,9 @@ extern X_API int PROTO(YAP_StringToBuffer,(YAP_Term,char *,unsigned int)); /* int BufferToString(char *) */ extern X_API YAP_Term PROTO(YAP_BufferToString,(char *)); +/* YAP_Term BufferToTerm(char *) */ +extern X_API YAP_Term PROTO(YAP_ReadBuffer,(char *,YAP_Term *)); + /* int BufferToAtomList(char *) */ extern X_API YAP_Term PROTO(YAP_BufferToAtomList,(char *)); diff --git a/misc/yap.def b/misc/yap.def index 3c693ec67..e9885b4ed 100644 --- a/misc/yap.def +++ b/misc/yap.def @@ -1,13 +1,9 @@ EXPORTS YAP_A -YAP_Init -YAP_RunGoal -YAP_RestartGoal -YAP_Reset YAP_Deref +YAP_MkVarTerm YAP_IsVarTerm YAP_IsNonVarTerm -YAP_MkVarTerm YAP_IsIntTerm YAP_IsFloatTerm YAP_IsDbRefTerm @@ -18,8 +14,8 @@ YAP_MkIntTerm YAP_IntOfTerm YAP_MkFloatTerm YAP_FloatOfTerm -YAP_MkAtomTerm YAP_AtomOfTerm +YAP_MkAtomTerm YAP_LookupAtom YAP_FullLookupAtom YAP_AtomName @@ -35,36 +31,36 @@ YAP_MkFunctor YAP_NameOfFunctor YAP_ArityOfFunctor YAP_ExtraSpace -YAP_Unify -YAP_UserCPredicate -YAP_UserCPredicateWithArgs -YAP_UserBackCPredicate -YAP_CallProlog YAP_cut_fail YAP_cut_succeed +YAP_Unify +YAP_Reset +YAP_Init +YAP_FastInit +YAP_CallProlog YAP_AllocSpaceFromYap YAP_FreeSpaceFromYap YAP_StringToBuffer +YAP_ReadBuffer YAP_BufferToString YAP_BufferToAtomList YAP_Error YAP_RunGoal +YAP_RestartGoal +YAP_GoalHasException YAP_ContinueGoal YAP_PruneGoal -YAP_GoalHasException +YAP_InitConsult +YAP_EndConsult YAP_Read +YAP_Write YAP_CompileClause -YAP_Init -YAP_FastInit YAP_PutValue YAP_GetValue YAP_Reset YAP_Exit YAP_InitSocks YAP_SetOutputMessage -YAP_Write -YAP_InitConsult -YAP_EndConsult YAP_StreamToFileNo YAP_CloseAllOpenStreams YAP_OpenStream @@ -75,11 +71,12 @@ YAP_AddressFromSlot YAP_PutInSlot YAP_RecoverSlots YAP_Throw -YAP_LookupModule YAP_ModuleName YAP_Halt YAP_TopOfLocalStack YAP_Predicate -YAP_CurrentModule YAP_PredicateInfo - +YAP_UserCPredicate +YAP_UserBackCPredicate +YAP_UserCPredicateWithArgs +YAP_CurrentModule