add Yap_ReadBuffer

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1064 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc 2004-05-14 16:33:47 +00:00
parent 19bfe301db
commit 0aa358a2b7
8 changed files with 145 additions and 64 deletions

View File

@ -1,17 +1,18 @@
/************************************************************************* /*************************************************************************
* * * *
* YAP Prolog %W% %G% * * YAP Prolog *
* Yap Prolog was developed at NCCUP - Universidade do Porto * * 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 * * File: c_interface.c *
* Last rev: 19/2/88 *
* mods: *
* comments: c_interface primitives definition * * comments: c_interface primitives definition *
* * * *
* Last rev: $Date: 2004-05-14 16:33:44 $,$Author: vsc $ *
* $Log: not supported by cvs2svn $ *
* *
*************************************************************************/ *************************************************************************/
#define Bool int #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_fail,(void));
X_API Int STD_PROTO(YAP_cut_succeed,(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_Unify,(Term,Term));
X_API int STD_PROTO(YAP_Reset,(void)); X_API int STD_PROTO(YAP_Reset,(void));
X_API Int STD_PROTO(YAP_Init,(YAP_init_args *)); X_API Int STD_PROTO(YAP_Init,(YAP_init_args *));
X_API Int STD_PROTO(YAP_FastInit,(char *)); 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_AllocSpaceFromYap,(unsigned int));
X_API void STD_PROTO(YAP_FreeSpaceFromYap,(void *)); X_API void STD_PROTO(YAP_FreeSpaceFromYap,(void *));
X_API int STD_PROTO(YAP_StringToBuffer, (Term, char *, unsigned int)); 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_BufferToString, (char *));
X_API Term STD_PROTO(YAP_BufferToAtomList, (char *)); X_API Term STD_PROTO(YAP_BufferToAtomList, (char *));
X_API void STD_PROTO(YAP_Error,(char *)); X_API void STD_PROTO(YAP_Error,(char *));
@ -227,7 +228,7 @@ YAP_MkFloatTerm(double n)
t = MkFloatTerm(n); t = MkFloatTerm(n);
RECOVER_H(); RECOVER_H();
return(t); return t;
} }
X_API flt X_API flt
@ -242,7 +243,7 @@ YAP_MkAtomTerm(Atom n)
Term t; Term t;
t = MkAtomTerm(n); t = MkAtomTerm(n);
return(t); return t;
} }
X_API Atom X_API Atom
@ -285,7 +286,7 @@ YAP_MkVarTerm(void)
t = MkVarTerm(); t = MkVarTerm();
RECOVER_H(); RECOVER_H();
return(t); return t;
} }
X_API Term X_API Term
@ -297,7 +298,7 @@ YAP_MkPairTerm(Term t1, Term t2)
t = MkPairTerm(t1, t2); t = MkPairTerm(t1, t2);
RECOVER_H(); RECOVER_H();
return(t); return t;
} }
X_API Term X_API Term
@ -309,7 +310,7 @@ YAP_MkNewPairTerm()
t = Yap_MkNewPairTerm(); t = Yap_MkNewPairTerm();
RECOVER_H(); RECOVER_H();
return(t); return t;
} }
X_API Term X_API Term
@ -333,7 +334,7 @@ YAP_MkApplTerm(Functor f,unsigned long int arity, Term args[])
t = Yap_MkApplTerm(f, arity, args); t = Yap_MkApplTerm(f, arity, args);
RECOVER_H(); RECOVER_H();
return(t); return t;
} }
X_API Term X_API Term
@ -345,7 +346,7 @@ YAP_MkNewApplTerm(Functor f,unsigned long int arity)
t = Yap_MkNewApplTerm(f, arity); t = Yap_MkNewApplTerm(f, arity);
RECOVER_H(); RECOVER_H();
return(t); return t;
} }
X_API Functor X_API Functor
@ -658,7 +659,20 @@ YAP_BufferToString(char *s)
t = Yap_StringToList(s); t = Yap_StringToList(s);
RECOVER_H(); 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 */ /* copy a string to a buffer */
@ -671,7 +685,7 @@ YAP_BufferToAtomList(char *s)
t = Yap_StringToListOfAtoms(s); t = Yap_StringToListOfAtoms(s);
RECOVER_H(); RECOVER_H();
return(t); return t;
} }
@ -819,7 +833,7 @@ YAP_Read(int (*mygetc)(void))
TR = old_TR; TR = old_TR;
RECOVER_MACHINE_REGS(); RECOVER_MACHINE_REGS();
return(t); return t;
} }
X_API void X_API void

View File

@ -1981,11 +1981,40 @@ p_open_pipe_stream (void)
return (Yap_unify (ARG1, t1) && Yap_unify (ARG2, t2)); 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 static Int
p_open_mem_read_stream (void) /* $open_mem_read_stream(+List,-Stream) */ p_open_mem_read_stream (void) /* $open_mem_read_stream(+List,-Stream) */
{ {
Term t, ti; Term t, ti;
StreamDesc *st;
int sno; int sno;
Int sl = 0, nchars = 0; Int sl = 0, nchars = 0;
char *nbuf; char *nbuf;
@ -2024,26 +2053,7 @@ p_open_mem_read_stream (void) /* $open_mem_read_stream(+List,-Stream) */
ti = TailOfTerm(ti); ti = TailOfTerm(ti);
} }
nbuf[nchars] = '\0'; nbuf[nchars] = '\0';
for (sno = 0; sno < MaxStreams; ++sno) sno = open_buf_read_stream(nbuf, nchars);
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;
t = MkStream (sno); t = MkStream (sno);
return (Yap_unify (ARG2, t)); return (Yap_unify (ARG2, t));
} }
@ -4624,6 +4634,44 @@ p_same_file(void) {
#endif #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 void
Yap_InitBackIO (void) Yap_InitBackIO (void)
{ {

View File

@ -4,15 +4,19 @@
* * * *
* Yap Prolog was developed at NCCUP - Universidade do Porto * * 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 * * File: stdpreds.c *
* comments: General-purpose C implemented system predicates * * 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 $ * $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 * Revision 1.65 2004/04/27 15:14:36 vsc
* fix halt/0 and halt/1 * fix halt/0 and halt/1
* * * *

View File

@ -274,6 +274,7 @@ int STD_PROTO(Yap_PlFGetchar,(void));
int STD_PROTO(Yap_GetCharForSIGINT,(void)); int STD_PROTO(Yap_GetCharForSIGINT,(void));
int STD_PROTO(Yap_StreamToFileNo,(Term)); int STD_PROTO(Yap_StreamToFileNo,(Term));
Term STD_PROTO(Yap_OpenStream,(FILE *,char *,Term,int)); Term STD_PROTO(Yap_OpenStream,(FILE *,char *,Term,int));
Term STD_PROTO(Yap_StringToTerm,(char *,Term *));
extern int extern int
Yap_c_input_stream, Yap_c_input_stream,

View File

@ -105,13 +105,11 @@ static FILE *bootfile;
static int eof_found = FALSE; static int eof_found = FALSE;
static int yap_lineno = 0; static int yap_lineno = 0;
#ifdef DEBUG
static void static void
myputc (int ch) myputc (int ch)
{ {
putc(ch,stderr); putc(ch,stderr);
} }
#endif
static int static int
mygetc (void) mygetc (void)
@ -532,6 +530,11 @@ exec_top_level(int BootMode, YAP_init_args *iap)
*/ */
livegoal = YAP_FullLookupAtom("$live"); livegoal = YAP_FullLookupAtom("$live");
atomfalse = YAP_MkAtomTerm (YAP_FullLookupAtom("$false")); 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) { while (YAP_GetValue (livegoal) != atomfalse) {
YAP_Reset(); YAP_Reset();
do_top_goal (YAP_MkAtomTerm (livegoal)); do_top_goal (YAP_MkAtomTerm (livegoal));

View File

@ -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. are made on the handler provided by the user.
@table @code @table @code
@item SIGHUP (Hangup) @item sig_up (Hangup)
sig_hup in YAP; Reconsult the initialization files SIGHUP in Unix/Linux; Reconsult the initialization files
~/.yaprc, ~/.prologrc and ~/prolog.ini. ~/.yaprc, ~/.prologrc and ~/prolog.ini.
@item SIGUSR1 and SIGUSR2 (User signals) @item sig_usr1 and sig_usr2 (User signals)
sig_usr1 and sig_usr2 in YAP; Print a message and halt. SIGUSR1 and SIGUSR2 in Unix/Linux; Print a message and halt.
@end table @end table
A special case is made, where if @var{Callable} is bound to A special case is made, where if @var{Callable} is bound to
@ -13585,6 +13585,17 @@ character atoms
@noindent @noindent
The user-provided string must include a terminating null character. 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 @node Memory Allocation, Controlling Streams, Manipulating Strings, C-Interface
@section Memory Allocation @section Memory Allocation

View File

@ -250,6 +250,9 @@ extern X_API int PROTO(YAP_StringToBuffer,(YAP_Term,char *,unsigned int));
/* int BufferToString(char *) */ /* int BufferToString(char *) */
extern X_API YAP_Term PROTO(YAP_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 *) */ /* int BufferToAtomList(char *) */
extern X_API YAP_Term PROTO(YAP_BufferToAtomList,(char *)); extern X_API YAP_Term PROTO(YAP_BufferToAtomList,(char *));

View File

@ -1,13 +1,9 @@
EXPORTS EXPORTS
YAP_A YAP_A
YAP_Init
YAP_RunGoal
YAP_RestartGoal
YAP_Reset
YAP_Deref YAP_Deref
YAP_MkVarTerm
YAP_IsVarTerm YAP_IsVarTerm
YAP_IsNonVarTerm YAP_IsNonVarTerm
YAP_MkVarTerm
YAP_IsIntTerm YAP_IsIntTerm
YAP_IsFloatTerm YAP_IsFloatTerm
YAP_IsDbRefTerm YAP_IsDbRefTerm
@ -18,8 +14,8 @@ YAP_MkIntTerm
YAP_IntOfTerm YAP_IntOfTerm
YAP_MkFloatTerm YAP_MkFloatTerm
YAP_FloatOfTerm YAP_FloatOfTerm
YAP_MkAtomTerm
YAP_AtomOfTerm YAP_AtomOfTerm
YAP_MkAtomTerm
YAP_LookupAtom YAP_LookupAtom
YAP_FullLookupAtom YAP_FullLookupAtom
YAP_AtomName YAP_AtomName
@ -35,36 +31,36 @@ YAP_MkFunctor
YAP_NameOfFunctor YAP_NameOfFunctor
YAP_ArityOfFunctor YAP_ArityOfFunctor
YAP_ExtraSpace YAP_ExtraSpace
YAP_Unify
YAP_UserCPredicate
YAP_UserCPredicateWithArgs
YAP_UserBackCPredicate
YAP_CallProlog
YAP_cut_fail YAP_cut_fail
YAP_cut_succeed YAP_cut_succeed
YAP_Unify
YAP_Reset
YAP_Init
YAP_FastInit
YAP_CallProlog
YAP_AllocSpaceFromYap YAP_AllocSpaceFromYap
YAP_FreeSpaceFromYap YAP_FreeSpaceFromYap
YAP_StringToBuffer YAP_StringToBuffer
YAP_ReadBuffer
YAP_BufferToString YAP_BufferToString
YAP_BufferToAtomList YAP_BufferToAtomList
YAP_Error YAP_Error
YAP_RunGoal YAP_RunGoal
YAP_RestartGoal
YAP_GoalHasException
YAP_ContinueGoal YAP_ContinueGoal
YAP_PruneGoal YAP_PruneGoal
YAP_GoalHasException YAP_InitConsult
YAP_EndConsult
YAP_Read YAP_Read
YAP_Write
YAP_CompileClause YAP_CompileClause
YAP_Init
YAP_FastInit
YAP_PutValue YAP_PutValue
YAP_GetValue YAP_GetValue
YAP_Reset YAP_Reset
YAP_Exit YAP_Exit
YAP_InitSocks YAP_InitSocks
YAP_SetOutputMessage YAP_SetOutputMessage
YAP_Write
YAP_InitConsult
YAP_EndConsult
YAP_StreamToFileNo YAP_StreamToFileNo
YAP_CloseAllOpenStreams YAP_CloseAllOpenStreams
YAP_OpenStream YAP_OpenStream
@ -75,11 +71,12 @@ YAP_AddressFromSlot
YAP_PutInSlot YAP_PutInSlot
YAP_RecoverSlots YAP_RecoverSlots
YAP_Throw YAP_Throw
YAP_LookupModule
YAP_ModuleName YAP_ModuleName
YAP_Halt YAP_Halt
YAP_TopOfLocalStack YAP_TopOfLocalStack
YAP_Predicate YAP_Predicate
YAP_CurrentModule
YAP_PredicateInfo YAP_PredicateInfo
YAP_UserCPredicate
YAP_UserBackCPredicate
YAP_UserCPredicateWithArgs
YAP_CurrentModule