diff options
Diffstat (limited to 'builtins.c')
-rw-r--r-- | builtins.c | 63 |
1 files changed, 63 insertions, 0 deletions
@@ -63,6 +63,9 @@ BuiltinProto(builtincharcode); BuiltinProto(builtinchoicestacksize); BuiltinProto(builtincollectgarbage); BuiltinProto(builtinloadmodulefromfile); +BuiltinProto(builtinflushoutput); +BuiltinProto(builtinstreamproperties); +BuiltinProto(builtinsetstreamposition); int compareterms(Term *, Term *); @@ -178,6 +181,12 @@ findbuiltin(Term *goal) return builtincollectgarbage; if(Match(L"$load_module_from_file", 1)) return builtinloadmodulefromfile; + if(Match(L"flush_output", 1)) + return builtinflushoutput; + if(Match(L"stream_properties", 1)) + return builtinstreamproperties; + if(Match(L"set_stream_position", 2)) + return builtinsetstreamposition; return nil; } @@ -1445,4 +1454,58 @@ builtinloadmodulefromfile(Term *goal, Binding **bindings, Module *module) return 1; else return 0; +} + +int +builtinflushoutput(Term *goal, Binding **bindings, Module *module) +{ + USED(bindings); + USED(module); + Term *s = goal->children; + + if(s->tag == VariableTerm) + Throw(instantiationerror()); + if(s->tag != IntegerTerm && s->tag != AtomTerm) + Throw(domainerror(L"stream_or_alias", s)); + if(!isopenstream(s)) + Throw(existenceerror(L"stream", s)); + if(!isoutputstream(s)) + Throw(permissionerror(L"output", L"stream", s)); + + flushstream(s); + return 1; +} + +int +builtinstreamproperties(Term *goal, Binding **bindings, Module *module) +{ + USED(module); + USED(bindings); + Term *props = goal->children; + Term *list = streamsproperties(); + Term *realprops = mklist(list); + return unify(props, realprops, bindings); +} + +int +builtinsetstreamposition(Term *goal, Binding **bindings, Module *module) +{ + USED(module); + USED(bindings); + Term *s = goal->children; + Term *pos = s->next; + + if(s->tag == VariableTerm || pos->tag == VariableTerm) + Throw(instantiationerror()); + if(s->tag != IntegerTerm && s->tag != AtomTerm) + Throw(domainerror(L"stream_or_alias", s)); + if(pos->tag != IntegerTerm || pos->ival < 0) + Throw(domainerror(L"stream_position", pos)); + if(!isopenstream(s)) + Throw(existenceerror(L"stream", s)); + if(!canreposition(s)) + Throw(permissionerror(L"reposition", L"stream", s)); + + reposition(s, pos->ival); + return 1; }
\ No newline at end of file |