summaryrefslogtreecommitdiff
path: root/builtins.c
diff options
context:
space:
mode:
Diffstat (limited to 'builtins.c')
-rw-r--r--builtins.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/builtins.c b/builtins.c
index b33bc49..9699de1 100644
--- a/builtins.c
+++ b/builtins.c
@@ -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