Yap_WriteBuffer

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1067 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc
2004-05-14 17:56:47 +00:00
parent 874758e936
commit e7fbb54532
6 changed files with 103 additions and 47 deletions

View File

@@ -10,8 +10,11 @@
* File: c_interface.c *
* comments: c_interface primitives definition *
* *
* Last rev: $Date: 2004-05-14 17:11:30 $,$Author: vsc $ *
* Last rev: $Date: 2004-05-14 17:56:45 $,$Author: vsc $ *
* $Log: not supported by cvs2svn $
* Revision 1.45 2004/05/14 17:11:30 vsc
* support BigNums in interface
*
* Revision 1.44 2004/05/14 16:33:44 vsc
* add Yap_ReadBuffer
* *
@@ -104,6 +107,7 @@ X_API void STD_PROTO(YAP_InitConsult,(int, char *));
X_API void STD_PROTO(YAP_EndConsult,(void));
X_API Term STD_PROTO(YAP_Read, (int (*)(void)));
X_API void STD_PROTO(YAP_Write, (Term, void (*)(int), int));
X_API Term STD_PROTO(YAP_WriteBuffer, (Term, char *, unsigned int, int));
X_API char *STD_PROTO(YAP_CompileClause, (Term));
X_API void STD_PROTO(YAP_PutValue, (Atom,Term));
X_API Term STD_PROTO(YAP_GetValue, (Atom));
@@ -893,6 +897,15 @@ YAP_Write(Term t, void (*myputc)(int), int flags)
RECOVER_MACHINE_REGS();
}
X_API Term
YAP_WriteBuffer(Term t, char *buf, unsigned int sze, int flags)
{
BACKUP_MACHINE_REGS();
t = Yap_TermToString(t, buf, sze, flags);
RECOVER_MACHINE_REGS();
return t;
}
X_API char *
YAP_CompileClause(Term t)
{

View File

@@ -2058,26 +2058,17 @@ p_open_mem_read_stream (void) /* $open_mem_read_stream(+List,-Stream) */
return (Yap_unify (ARG2, t));
}
static Int
p_open_mem_write_stream (void) /* $open_mem_write_stream(-Stream) */
static int
open_buf_write_stream(char *nbuf, UInt sz)
{
Term t;
StreamDesc *st;
int sno;
char *nbuf;
extern int Yap_page_size;
StreamDesc *st;
while ((nbuf = (char *)Yap_AllocAtomSpace(Yap_page_size*sizeof(char))) == NULL) {
if (!Yap_growheap(FALSE, Yap_page_size*sizeof(char), NULL)) {
Yap_Error(SYSTEM_ERROR, TermNil, Yap_ErrorMessage);
return(FALSE);
}
}
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"));
return -1;
st = &Stream[sno];
/* currently these streams are not seekable */
st->status = Output_Stream_f | InMemory_Stream_f;
@@ -2092,7 +2083,27 @@ p_open_mem_write_stream (void) /* $open_mem_write_stream(-Stream) */
st->stream_getc_for_read = MemGetc;
st->u.mem_string.pos = 0;
st->u.mem_string.buf = nbuf;
st->u.mem_string.max_size = Yap_page_size;
st->u.mem_string.max_size = sz;
return sno;
}
static Int
p_open_mem_write_stream (void) /* $open_mem_write_stream(-Stream) */
{
Term t;
int sno;
char *nbuf;
extern int Yap_page_size;
while ((nbuf = (char *)Yap_AllocAtomSpace(Yap_page_size*sizeof(char))) == NULL) {
if (!Yap_growheap(FALSE, Yap_page_size*sizeof(char), NULL)) {
Yap_Error(SYSTEM_ERROR, TermNil, Yap_ErrorMessage);
return(FALSE);
}
}
sno = open_buf_write_stream(nbuf, Yap_page_size);
if (sno == -1)
return (PlIOError (SYSTEM_ERROR,TermNil, "new stream not available for open_mem_read_stream/1"));
t = MkStream (sno);
return (Yap_unify (ARG1, t));
}
@@ -4672,6 +4683,24 @@ Yap_StringToTerm(char *s,Term *tp)
return t;
}
Term
Yap_TermToString(Term t, char *s, unsigned int sz, int flags)
{
int sno = open_buf_write_stream(s, sz);
int old_output_stream = Yap_c_output_stream;
if (sno < 0)
return FALSE;
*--ASP = MkIntTerm(0);
Yap_c_output_stream = sno;
Yap_plwrite (t, Stream[sno].stream_putc, flags);
s[Stream[sno].u.mem_string.pos] = '\0';
Stream[sno].status = Free_Stream_f;
Yap_c_output_stream = old_output_stream;
++ASP;
return EX;
}
void
Yap_InitBackIO (void)
{