remove YAP memory (string) streams.
This commit is contained in:
@@ -4723,6 +4723,7 @@ init_yap(void)
|
||||
PL_register_extensions(PL_predicates_from_files);
|
||||
PL_register_extensions(PL_predicates_from_glob);
|
||||
PL_register_extensions(PL_predicates_from_write);
|
||||
PL_register_extensions(PL_predicates_from_read);
|
||||
PL_register_extensions(foreigns);
|
||||
fileerrors = TRUE;
|
||||
SinitStreams();
|
||||
|
@@ -1104,4 +1104,5 @@ extern const PL_extension PL_predicates_from_file[];
|
||||
extern const PL_extension PL_predicates_from_files[];
|
||||
extern const PL_extension PL_predicates_from_glob[];
|
||||
extern const PL_extension PL_predicates_from_write[];
|
||||
extern const PL_extension PL_predicates_from_read[];
|
||||
|
||||
|
134
packages/PLStream/pl-read.c
Normal file
134
packages/PLStream/pl-read.c
Normal file
@@ -0,0 +1,134 @@
|
||||
|
||||
#include "pl-incl.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
term_t varnames; /* Report variables+names */
|
||||
IOSTREAM *stream;
|
||||
int has_exception; /* exception is raised */
|
||||
|
||||
term_t exception; /* raised exception */
|
||||
} read_data, *ReadData;
|
||||
|
||||
static void
|
||||
init_read_data(ReadData _PL_rd, IOSTREAM *in ARG_LD)
|
||||
{
|
||||
_PL_rd->varnames = 0;
|
||||
_PL_rd->stream = in;
|
||||
}
|
||||
|
||||
static void
|
||||
free_read_data(ReadData _PL_rd)
|
||||
{
|
||||
}
|
||||
|
||||
static int
|
||||
read_term(term_t t, ReadData rd ARG_LD)
|
||||
{
|
||||
return Yap_read_term(t, rd->stream, rd->varnames);
|
||||
}
|
||||
|
||||
|
||||
/*******************************
|
||||
* TERM <->ATOM *
|
||||
*******************************/
|
||||
|
||||
static int
|
||||
atom_to_term(term_t atom, term_t term, term_t bindings)
|
||||
{ GET_LD
|
||||
PL_chars_t txt;
|
||||
|
||||
if ( !bindings && PL_is_variable(atom) ) /* term_to_atom(+, -) */
|
||||
{ char buf[1024];
|
||||
size_t bufsize = sizeof(buf);
|
||||
int rval;
|
||||
char *s = buf;
|
||||
IOSTREAM *stream;
|
||||
PL_chars_t txt;
|
||||
|
||||
stream = Sopenmem(&s, &bufsize, "w");
|
||||
stream->encoding = ENC_UTF8;
|
||||
PL_write_term(stream, term, 1200, PL_WRT_QUOTED);
|
||||
Sflush(stream);
|
||||
|
||||
txt.text.t = s;
|
||||
txt.length = bufsize;
|
||||
txt.storage = PL_CHARS_HEAP;
|
||||
txt.encoding = ENC_UTF8;
|
||||
txt.canonical = FALSE;
|
||||
rval = PL_unify_text(atom, 0, &txt, PL_ATOM);
|
||||
|
||||
Sclose(stream);
|
||||
if ( s != buf )
|
||||
Sfree(s);
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
if ( PL_get_text(atom, &txt, CVT_ALL|CVT_EXCEPTION) )
|
||||
{ GET_LD
|
||||
read_data rd;
|
||||
int rval;
|
||||
IOSTREAM *stream;
|
||||
source_location oldsrc = LD->read_source;
|
||||
|
||||
stream = Sopen_text(&txt, "r");
|
||||
|
||||
init_read_data(&rd, stream PASS_LD);
|
||||
if ( bindings && (PL_is_variable(bindings) || PL_is_list(bindings)) )
|
||||
rd.varnames = bindings;
|
||||
else if ( bindings )
|
||||
return PL_error(NULL, 0, NULL, ERR_TYPE, ATOM_list, bindings);
|
||||
|
||||
if ( !(rval = read_term(term, &rd PASS_LD)) && rd.has_exception )
|
||||
rval = PL_raise_exception(rd.exception);
|
||||
free_read_data(&rd);
|
||||
Sclose(stream);
|
||||
LD->read_source = oldsrc;
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
fail;
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
PRED_IMPL("atom_to_term", 3, atom_to_term, 0)
|
||||
{ return atom_to_term(A1, A2, A3);
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
PRED_IMPL("term_to_atom", 2, term_to_atom, 0)
|
||||
{ return atom_to_term(A2, A1, 0);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
PL_chars_to_term(const char *s, term_t t)
|
||||
{ GET_LD
|
||||
read_data rd;
|
||||
int rval;
|
||||
IOSTREAM *stream = Sopen_string(NULL, (char *)s, -1, "r");
|
||||
source_location oldsrc = LD->read_source;
|
||||
|
||||
init_read_data(&rd, stream PASS_LD);
|
||||
PL_put_variable(t);
|
||||
if ( !(rval = read_term(t, &rd PASS_LD)) && rd.has_exception )
|
||||
PL_put_term(t, rd.exception);
|
||||
free_read_data(&rd);
|
||||
Sclose(stream);
|
||||
LD->read_source = oldsrc;
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
/*******************************
|
||||
* PUBLISH PREDICATES *
|
||||
*******************************/
|
||||
|
||||
BeginPredDefs(read)
|
||||
PRED_DEF("atom_to_term", 3, atom_to_term, 0)
|
||||
PRED_DEF("term_to_atom", 2, term_to_atom, 0)
|
||||
EndPredDefs
|
@@ -29,8 +29,9 @@ typedef YAP_Term *Word; /* Anonymous 4 byte object */
|
||||
typedef YAP_Atom Atom;
|
||||
typedef YAP_Term (*Func)(term_t); /* foreign functions */
|
||||
|
||||
const char *Yap_GetCurrentPredName(void);
|
||||
YAP_Int Yap_GetCurrentPredArity(void);
|
||||
extern const char *Yap_GetCurrentPredName(void);
|
||||
extern YAP_Int Yap_GetCurrentPredArity(void);
|
||||
extern int Yap_read_term(term_t t, IOSTREAM *st, term_t *vs);
|
||||
|
||||
|
||||
extern atom_t codeToAtom(int chrcode);
|
||||
|
Reference in New Issue
Block a user