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

View File

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

View File

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