47 Term isatom(Term inp);
48 Term booleanFlag(Term inp);
51static Term list_option(Term inp);
52static Term
argv(Term inp);
53static Term os_argv(Term inp);
54static bool agc_threshold(Term inp);
57static Term sys_thread_id(Term inp);
58static Term sys_pid(Term inp);
59static bool mkprompt(Term inp);
60static Term indexer(Term inp);
61static Term stream(Term inp);
62static bool getenc(Term inp);
63static bool typein(Term inp);
64static bool dqs(Term t2);
65static bool bqs(Term t2);
66static bool sqf(Term t2);
67static bool set_error_stream(Term inp);
68static bool set_input_stream(Term inp);
69static bool set_output_stream(Term inp);
70static bool dollar_to_lc(Term inp);
71static bool setSignals(Term inp);
73static void newFlag(Term fl, Term val);
74static Int current_prolog_flag(USES_REGS1);
75static Int set_prolog_flag(USES_REGS1);
83 if (LOCAL_consult_level)
return Yap_unify(inp,TermTrue);
84 return Yap_unify(inp,TermFalse);
89 Yap_ThrowError(INSTANTIATION_ERROR, inp,
"set_prolog_flag: value must be %s",
93 Yap_ThrowError(PERMISSION_ERROR_READ_ONLY_FLAG, inp,
"set_prolog_flag %s",
100 Yap_ThrowError(INSTANTIATION_ERROR, inp,
"set_prolog_flag %s",
101 "value must be bound");
107Term booleanFlag(Term inp) {
108 if (IsStringTerm(inp)) {
109 inp = MkStringTerm(RepAtom(AtomOfTerm(inp))->StrOfAE);
111 if (inp == TermTrue || inp == TermOn)
113 if (inp == TermFalse || inp == TermOff)
115 if (IsVarTerm(inp)) {
116 Yap_ThrowError(INSTANTIATION_ERROR, inp,
"set_prolog_flag %s",
117 "value must be bound");
121 if (IsAtomTerm(inp)) {
122 Yap_ThrowError(DOMAIN_ERROR_OUT_OF_RANGE, inp,
123 "set_prolog_flag in {true,false,on,off}");
126 Yap_ThrowError(TYPE_ERROR_ATOM, inp,
"set_prolog_flag in {true,false,on,off");
131 Term febooleanFlag(Term inp) {
132 if (IsStringTerm(inp)) {
133 inp = MkStringTerm(RepAtom(AtomOfTerm(inp))->StrOfAE);
135 if (inp == TermTrue || inp == TermError)
137 if (inp == TermFalse || inp == TermFail)
139 if (IsVarTerm(inp)) {
140 Yap_ThrowError(INSTANTIATION_ERROR, inp,
"set_prolog_flag %s",
141 "value must be bound");
145 if (IsAtomTerm(inp)) {
146 Yap_ThrowError(DOMAIN_ERROR_OUT_OF_RANGE, inp,
147 "set_prolog_flag in {true,false,on,off}");
150 Yap_ThrowError(TYPE_ERROR_ATOM, inp,
"set_prolog_flag in {true,false,error,fail");
154Term synerr(Term inp){
155 if (IsStringTerm(inp)) {
156 inp = MkAtomTerm(Yap_LookupAtom(StringOfTerm(inp)));
158 if (inp == TermDec10 || inp == TermFail || inp == TermError ||
162 if (IsAtomTerm(inp)) {
163 Yap_ThrowError(DOMAIN_ERROR_OUT_OF_RANGE, inp,
164 "set_prolog_flag in {dec10,error,fail,quiet}");
167 Yap_ThrowError(TYPE_ERROR_ATOM, inp,
168 "syntax_error flag must be atom");
172#define YAP_FLAG(ID, NAME, WRITABLE, DEF, INIT, HELPER) \
173 { NAME, WRITABLE, DEF, INIT, HELPER }
175#define START_LOCAL_FLAGS static flag_info local_flags_setup[] = {
176#define END_LOCAL_FLAGS \
181#define START_GLOBAL_FLAGS static flag_info global_flags_setup[] = {
182#define END_GLOBAL_FLAGS \
188 { NULL, false, NULL, NULL, NULL }
190 { NULL, false, NULL, NULL, NULL }
196static Term indexer(Term inp) {
197 if (IsStringTerm(inp)) {
198 inp = MkStringTerm(RepAtom(AtomOfTerm(inp))->StrOfAE);
200 if (inp == TermOff || inp == TermSingle || inp == TermCompact ||
201 inp == TermMulti || inp == TermOn || inp == TermMax)
204 if (IsAtomTerm(inp)) {
205 Yap_ThrowError(DOMAIN_ERROR_OUT_OF_RANGE, inp,
206 "set_prolog_flag index in {off,single,compact,multi,on,max}");
209 Yap_ThrowError(TYPE_ERROR_ATOM, inp,
"set_prolog_flag index to an atom");
220static bool setSignals(Term inp) {
221 bool handle = (inp == TermTrue || inp == TermOn);
222 if (handle != GLOBAL_PrologShouldHandleInterrupts) {
225 GLOBAL_PrologShouldHandleInterrupts = handle;
229static bool dqf1(
ModEntry *
new, Term t2 USES_REGS) {
230 new->flags &= ~(DBLQ_CHARS | DBLQ_CODES | DBLQ_ATOM | DBLQ_STRING);
231 if (IsStringTerm(t2)) {
232 t2 = MkStringTerm(RepAtom(AtomOfTerm(t2))->StrOfAE);
234 if (IsAtomTerm(t2)) {
235 if (t2 == TermString) {
236 new->flags |= DBLQ_STRING;
238 }
else if (t2 == TermAtom) {
239 new->flags |= DBLQ_ATOM;
241 }
else if (t2 == TermCodes) {
242 new->flags |= DBLQ_CODES;
244 }
else if (t2 == TermChars) {
245 new->flags |= DBLQ_CHARS;
249 Yap_ThrowError(DOMAIN_ERROR_OUT_OF_RANGE, t2,
250 "bad option %s for backquoted "
251 "string flag, use one string, "
252 "atom, codes or chars",
253 RepAtom(AtomOfTerm(t2))->StrOfAE);
256 Yap_ThrowError(TYPE_ERROR_ATOM, t2,
257 "set_prolog_flag(double_quotes, %s), should "
258 "be {string,atom,codes,chars}",
259 RepAtom(AtomOfTerm(t2))->StrOfAE);
264static bool dqs(Term t2) {
266 ModEntry *
new = Yap_GetModuleEntry(CurrentModule);
267 return dqf1(
new, t2 PASS_REGS);
270static bool bqf1(
ModEntry *
new, Term t2 USES_REGS) {
271 new->flags &= ~(BCKQ_CHARS | BCKQ_CODES | BCKQ_ATOM | BCKQ_STRING);
272 if (IsStringTerm(t2)) {
273 t2 = MkStringTerm(RepAtom(AtomOfTerm(t2))->StrOfAE);
275 if (IsAtomTerm(t2)) {
276 if (t2 == TermString) {
277 new->flags |= BCKQ_STRING;
279 }
else if (t2 == TermAtom) {
280 new->flags |= BCKQ_ATOM;
282 }
else if (t2 == TermCodes) {
283 new->flags |= BCKQ_CODES;
285 }
else if (t2 == TermChars) {
286 new->flags |= BCKQ_CHARS;
289 Yap_ThrowError(DOMAIN_ERROR_OUT_OF_RANGE, t2,
290 "bad option %s for backquoted "
291 "string flag, use one string, "
292 "atom, codes or chars",
293 RepAtom(AtomOfTerm(t2))->StrOfAE);
296 Yap_ThrowError(TYPE_ERROR_ATOM, t2,
"flag %s is not module-scoped",
297 RepAtom(AtomOfTerm(t2))->StrOfAE);
302static bool bqs(Term t2) {
304 ModEntry *
new = Yap_GetModuleEntry(CurrentModule);
305 return bqf1(
new, t2 PASS_REGS);
308static bool sqf1(
ModEntry *
new, Term t2 USES_REGS) {
309 new->flags &= ~(SNGQ_CHARS | SNGQ_CODES | SNGQ_ATOM | SNGQ_STRING);
310 if (IsStringTerm(t2)) {
311 t2 = MkStringTerm(RepAtom(AtomOfTerm(t2))->StrOfAE);
313 if (IsAtomTerm(t2)) {
314 if (t2 == TermString) {
315 new->flags |= SNGQ_STRING;
317 }
else if (t2 == TermAtom) {
318 new->flags |= SNGQ_ATOM;
320 }
else if (t2 == TermCodes) {
321 new->flags |= SNGQ_CODES;
323 }
else if (t2 == TermChars) {
324 new->flags |= SNGQ_CHARS;
327 Yap_ThrowError(DOMAIN_ERROR_OUT_OF_RANGE, t2,
328 "bad option %s for backquoted "
329 "string flag, use one string, "
330 "atom, codes or chars",
331 RepAtom(AtomOfTerm(t2))->StrOfAE);
334 Yap_ThrowError(TYPE_ERROR_ATOM, t2,
"flag %s is not module-scoped",
335 RepAtom(AtomOfTerm(t2))->StrOfAE);
340static bool sqf(Term t2) {
342 ModEntry *
new = Yap_GetModuleEntry(CurrentModule);
343 return sqf1(
new, t2 PASS_REGS);
346static bool dollar_to_lc(Term inp) {
347 if (inp == TermTrue || inp == TermOn) {
348 Yap_chtype0[
'$'+1] = LC;
351 if (inp == TermFalse || inp == TermOff) {
352 Yap_chtype0[
'$'+1] = CC;
355 Yap_ThrowError(TYPE_ERROR_BOOLEAN, inp,
356 "dollar_to_lower_case is a boolean flag");
360static Term isaccess(Term inp) {
361 if (inp == TermReadWrite || inp == TermReadOnly)
364 if (IsStringTerm(inp)) {
365 inp = MkStringTerm(RepAtom(AtomOfTerm(inp))->StrOfAE);
367 if (IsAtomTerm(inp)) {
368 Yap_ThrowError(DOMAIN_ERROR_OUT_OF_RANGE, inp,
369 "set_prolog_flag access in {read_write,read_only}");
372 Yap_ThrowError(TYPE_ERROR_ATOM, inp,
373 "set_prolog_flag access to the {read_write,read_only}");
378static Term stream(Term inp) {
381 if (Yap_CheckStream(inp,
382 Input_Stream_f | Output_Stream_f | Append_Stream_f |
389static bool set_input_stream(Term inp) {
392 return Yap_unify(inp,
393 Yap_MkStream(LOCAL_c_input_stream));
395 int sno = Yap_CheckStream(inp,
399 return Yap_AddAlias(AtomUserIn,sno);
402static bool set_output_stream(Term inp) {
405 return Yap_unify(inp,
406 Yap_MkStream(LOCAL_c_output_stream));
408 sno = Yap_CheckStream(inp,
409 Output_Stream_f | Append_Stream_f |
412 return Yap_AddAlias(AtomUserOut,sno);
415static bool set_error_stream(Term inp) {
418 return Yap_unify(inp,
419 Yap_MkStream(LOCAL_c_error_stream));
422 Output_Stream_f | Append_Stream_f |
425 return Yap_AddAlias(AtomUserErr,sno);
429static Term isground(Term inp) {
430 return Yap_IsGroundTerm(inp) ? inp : TermZERO;
433static Term flagscope(Term inp) {
434 if (inp == TermGlobal || inp == TermThread || inp == TermModule)
437 if (IsStringTerm(inp)) {
438 inp = MkStringTerm(RepAtom(AtomOfTerm(inp))->StrOfAE);
440 if (IsAtomTerm(inp)) {
441 Yap_ThrowError(DOMAIN_ERROR_OUT_OF_RANGE, inp,
442 "set_prolog_flag access in {global,module,thread}");
445 Yap_ThrowError(TYPE_ERROR_ATOM, inp,
446 "set_prolog_flag access in {global,module,thread}");
450static bool mkprompt(Term inp) {
452 if (IsVarTerm(inp)) {
453 return Yap_unify(inp, MkAtomTerm(Yap_LookupAtom(LOCAL_Prompt)));
455 if (IsStringTerm(inp)) {
456 inp = MkStringTerm(RepAtom(AtomOfTerm(inp))->StrOfAE);
458 if (!IsAtomTerm(inp)) {
459 Yap_ThrowError(TYPE_ERROR_ATOM, inp,
"set_prolog_flag");
462 strncpy(LOCAL_Prompt, (
const char *)RepAtom(AtomOfTerm(inp))->StrOfAE,
467static bool getenc(Term inp) {
469 if (IsStringTerm(inp)) {
470 inp = MkStringTerm(RepAtom(AtomOfTerm(inp))->StrOfAE);
472 if (!IsVarTerm(inp) && !IsAtomTerm(inp)) {
473 Yap_ThrowError(TYPE_ERROR_ATOM, inp,
"get_encoding");
476 return Yap_unify(inp, MkAtomTerm(Yap_LookupAtom(enc_name(LOCAL_encoding))));
495static bool typein(Term inp) {
497 if (IsVarTerm(inp)) {
498 Term tin = CurrentModule;
499 if (tin == PROLOG_MODULE)
501 return Yap_unify(inp, tin);
503 if (IsStringTerm(inp)) {
504 inp = MkAtomTerm(Yap_LookupAtom(StringOfTerm(inp)));
506 if (!IsAtomTerm(inp)) {
507 Yap_ThrowError(TYPE_ERROR_ATOM, inp,
"set_prolog_flag");
511 if (inp == TermProlog)
512 CurrentModule = PROLOG_MODULE;
518 static Int p_has_yap_or(USES_REGS1) {
526 static Int p_has_eam(USES_REGS1) {
535 static Int p_has_jit(USES_REGS1) {
543 static bool tabling( Term inp ) {
547 TabEnt_mode(tab_ent) = TabEnt_flags(tab_ent);
548 tab_ent = TabEnt_next(tab_ent);
550 yap_flags[TA BLING_MODE_FLAG] = 0;
551 }
else if (value == 1) {
554 SetMode_Batched(TabEnt_mode(tab_ent));
555 tab_ent = TabEnt_next(tab_ent);
557 SetMode_Batched(yap_flags[TABLING_MODE_FLAG]);
558 }
else if (value == 2) {
561 SetMode_Local(TabEnt_mode(tab_ent));
562 tab_ent = TabEnt_next(tab_ent);
564 SetMode_Local(yap_flags[TABLING_MODE_FLAG]);
565 }
else if (value == 3) {
568 SetMode_ExecAnswers(TabEnt_mode(tab_ent));
569 tab_ent = TabEnt_next(tab_ent);
571 SetMode_ExecAnswers(yap_flags[TABLING_MODE_FLAG]);
572 }
else if (value == 4) {
575 SetMode_LoadAnswers(TabEnt_mode(tab_ent));
576 tab_ent = TabEnt_next(tab_ent);
578 SetMode_LoadAnswers(yap_flags[TABLING_MODE_FLAG]);
579 }
else if (value == 5) {
582 SetMode_LocalTrie(TabEnt_mode(tab_ent));
583 tab_ent = TabEnt_next(tab_ent);
585 SetMode_LocalTrie(yap_flags[TABLING_MODE_FLAG]);
586 }
else if (value == 6) {
589 SetMode_GlobalTrie(TabEnt_mode(tab_ent));
590 tab_ent = TabEnt_next(tab_ent);
592 SetMode_GlobalTrie(yap_flags[TABLING_MODE_FLAG]);
593 }
else if (value == 7) {
596 SetMode_CoInductive(TabEnt_mode(tab_ent));
597 tab_ent = TabEnt_next(tab_ent);
599 SetMode_CoInductive(yap_flags[TABLING_MODE_FLAG]);
603 static bool string( Term inp ) {
604 if (IsVarTerm(inp)) {
605 Yap_ThrowError(INSTANTIATION_ERROR, inp,
"set_prolog_flag in \"...\"");
608 if (IsStringTerm( inp ))
611 if (IsPairTerm(inp)) {
612 Term hd = HeadOfTerm(inp);
613 if (IsAtomTerm(hd)) {
615 Term hd = HeadOfTerm(inp);
616 if (IsStringTerm(hd)) {
617 hd = MkStringTerm(RepAtom(AtomOfTerm(hd))->StrOfAE);
619 if (!IsAtomTerm(hd)) {
620 Yap_ThrowError(TYPE_ERROR_TEXT, inp0,
"set_prolog_flag in \"...\"");
623 }
while (IsPairTerm( inp ) );
624 }
else if (IsIntTerm(hd)) {
626 Term hd = HeadOfTerm(inp);
627 if (!IsIntTerm(hd)) {
628 Yap_ThrowError(TYPE_ERROR_TEXT, inp0,
"set_prolog_flag in \"...\"");
631 if (IntOfTerm(hd) < 0) {
632 Yap_ThrowError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, inp0,
"set_prolog_flag in 0...");
635 }
while (IsPairTerm( inp ) );
637 Yap_ThrowError(TYPE_ERROR_TEXT, inp0,
"set_prolog_flag in \"...\"");
641 if ( inp != TermNil ) {
642 Yap_ThrowError(TYPE_ERROR_TEXT, inp0,
"set_prolog_flag in \"...\"");
648x
static bool list_atom( Term inp ) {
649 if (IsVarTerm(inp)) {
650 Yap_ThrowError(INSTANTIATION_ERROR, inp,
"set_prolog_flag in \"...\"");
654 if (IsPairTerm(inp)) {
655 Term hd = HeadOfTerm(inp);
657 if (IsStringTerm(hd)) {
658 hd = MkStringTerm(RepAtom(AtomOfTerm(hd))->StrOfAE);
661 if (!IsAtomTerm(hd)) {
662 Yap_ThrowError(TYPE_ERROR_ATOM, inp0,
"set_prolog_flag in \"...\"");
665 }
while (IsPairTerm( inp ) );
667 if ( inp != TermNil ) {
668 Yap_ThrowError(TYPE_ERROR_LIST, inp0,
"set_prolog_flag in [...]");
675static Term list_option(Term inp) {
676 if (IsVarTerm(inp)) {
677 Yap_ThrowError(INSTANTIATION_ERROR, inp,
"set_prolog_flag in \"...\"");
681 if (IsPairTerm(inp)) {
683 Term hd = HeadOfTerm(inp);
684 inp = TailOfTerm(inp);
685 if (IsStringTerm(hd)) {
686 hd = MkStringTerm(RepAtom(AtomOfTerm(hd))->StrOfAE);
688 if (IsAtomTerm(hd)) {
691 if (IsApplTerm(hd)) {
693 if (!IsExtensionFunctor(f) && ArityOfFunctor(f) == 1 &&
694 Yap_IsGroundTerm(hd)) {
697 if (!Yap_IsGroundTerm(hd))
698 Yap_ThrowError(INSTANTIATION_ERROR, hd,
"set_prolog_flag in \"...\"");
701 }
while (IsPairTerm(inp));
702 if (inp == TermNil) {
705 Yap_ThrowError(TYPE_ERROR_LIST, inp0,
"set_prolog_flag in [...]");
708 if (IsStringTerm(inp)) {
709 inp = MkStringTerm(RepAtom(AtomOfTerm(inp))->StrOfAE);
711 if (IsAtomTerm(inp)) {
713 }
else if (IsApplTerm(inp)) {
714 Functor f = FunctorOfTerm(inp);
715 if (!IsExtensionFunctor(f) && ArityOfFunctor(f) == 1 &&
716 Yap_IsGroundTerm(ArgOfTerm(1, inp))) {
724static bool agc_threshold(Term t) {
728 return Yap_unify(t, MkIntegerTerm(GLOBAL_AGcThreshold));
729 }
else if (!IsIntegerTerm(t)) {
730 Yap_ThrowError(TYPE_ERROR_INTEGER, t,
"prolog_flag/2 agc_margin");
733 Int i = IntegerOfTerm(t);
735 Yap_ThrowError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, t,
"prolog_flag/2 agc_margin");
738 GLOBAL_AGcThreshold = i;
747 return Yap_unify(t, Yap_GetValue(AtomGcMargin));
748 }
else if (!IsIntegerTerm(t)) {
749 Yap_ThrowError(TYPE_ERROR_INTEGER, t,
"prolog_flag/2 agc_margin");
752 Int i = IntegerOfTerm(t);
754 Yap_ThrowError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, t,
"prolog_flag/2 gc_margin");
758 Yap_PutValue(AtomGcMargin, MkIntegerTerm(i));
764static Term mk_argc_list(USES_REGS1) {
767 while (i < GLOBAL_argc) {
768 char *arg = GLOBAL_argv[i];
770 if (arg[0] ==
'-' && arg[1] ==
'L') {
772 while (*arg !=
'\0' && (*arg ==
' ' || *arg ==
'\t'))
774 if (*arg ==
'-' && arg[1] ==
'-' && arg[2] ==
'\0') {
777 for (j = GLOBAL_argc - 1; j > i + 1; --j) {
778 t = MkPairTerm(MkAtomTerm(Yap_LookupAtom(GLOBAL_argv[j])), t);
781 }
else if (GLOBAL_argv[i + 1] && GLOBAL_argv[i + 1][0] ==
'-' &&
782 GLOBAL_argv[i + 1][1] ==
'-' &&
783 GLOBAL_argv[i + 1][2] ==
'\0') {
786 for (j = GLOBAL_argc - 1; j > i + 2; --j) {
787 t = MkPairTerm(MkAtomTerm(Yap_LookupAtom(GLOBAL_argv[j])), t);
792 if (arg[0] ==
'-' && arg[1] ==
'-' && arg[2] ==
'\0') {
795 for (j = GLOBAL_argc - 1; j > i; --j) {
796 t = MkPairTerm(MkAtomTerm(Yap_LookupAtom(GLOBAL_argv[j])), t);
805static Term mk_os_argc_list(USES_REGS1) {
808 for (i = GLOBAL_argc; i >0; ) {
810 const char *arg = GLOBAL_argv[i];
811 t = MkPairTerm(MkAtomTerm(Yap_LookupAtom(arg)), t);
816static Term
argv(Term inp) {
818 return mk_argc_list(PASS_REGS1);
821static Term os_argv(Term inp) {
823 return mk_os_argc_list(PASS_REGS1);
831 READ_LOCK(ae->ARWLock);
833 pp = RepFlagProp(ae->PropsOfAE);
834 while (!EndOfPAEntr(pp) && pp->KindOfPE != FlagProperty)
835 pp = RepFlagProp(pp->NextOfPE);
836 READ_UNLOCK(ae->ARWLock);
854static void initFlag(
flag_info *f,
int fnum,
bool global) {
856 Atom name = Yap_LookupAtom(f->name);
858 WRITE_LOCK(ae->ARWLock);
859 FlagEntry *fprop = RepFlagProp(Yap_GetAPropHavingLock(name, FlagProperty));
863 WRITE_UNLOCK(ae->ARWLock);
864 Yap_ThrowError(RESOURCE_ERROR_HEAP, TermNil,
865 "not enough space for new Flag %s", ae->StrOfAE);
868 fprop->KindOfPE = FlagProperty;
869 fprop->FlagOfVE = fnum;
870 fprop->rw = f->writable;
871 fprop->global = global;
872 fprop->type = f->def;
873 fprop->helper = f->helper;
874 AddPropToAtom(ae, AbsFlagProp(fprop));
876 WRITE_UNLOCK(ae->ARWLock);
881 return MkAtomTerm(Yap_LookupAtom(Yap_FindExecutable()));
884static Term sys_thread_id(Term inp) {
887#ifdef HAVE_GETTID_SYSCALL
888 pid = syscall(__NR_gettid);
889#elif defined(HAVE_GETTID_MACRO)
891#elif defined(__WINDOWS__)
892 pid = GetCurrentThreadId();
897 return MkIntegerTerm(pid);
900static Term sys_pid(Term inp) {
903#if defined(__MINGW32__) || _MSC_VER
909 return MkIntegerTerm(pid);
912static bool setYapFlagInModule(Term tflag, Term t2, Term mod) {
915 ModEntry *me = Yap_GetModuleEntry(mod);
918 fv = GetFlagProp(AtomOfTerm(tflag));
919 if (!fv && !fv->global) {
920 Yap_ThrowError(DOMAIN_ERROR_PROLOG_FLAG, tflag,
921 "trying to set unknown module flag");
925 if (mod == USER_MODULE) {
930 if (fv->helper && !(fv->helper(t2)))
932 Term tout = tarr[fv->FlagOfVE].at;
933 if (IsVarTerm(tout)) {
935 while ((t = Yap_PopTermFromDB(tarr[fv->FlagOfVE].DBT)) == 0) {
937 Yap_ThrowError(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage);
941 }
else if (IsAtomOrIntTerm(t2))
942 tarr[fv->FlagOfVE].at = t2;
944 tarr[fv->FlagOfVE].DBT = Yap_StoreTermInDB(t2, 2);
949 if (fv->FlagOfVE == UNKNOWN_FLAG) {
950 me->
flags &= ~(UNKNOWN_MASK);
951 if (t2 == TermError) {
952 me->
flags |= (UNKNOWN_ERROR);
954 }
else if (t2 == TermExit) {
955 me->
flags |= (UNKNOWN_ERROR);
957 }
else if (t2 == TermFail) {
958 me->
flags |= (UNKNOWN_FAIL);
960 }
else if (t2 == TermWarning) {
961 me->
flags |= (UNKNOWN_WARNING);
963 }
else if (t2 == TermFastFail) {
964 me->
flags |= (UNKNOWN_FAST_FAIL);
968 DOMAIN_ERROR_OUT_OF_RANGE, t2,
969 "bad option %s for unknown flag, use one of error, fail or warning.",
970 RepAtom(AtomOfTerm(tflag))->StrOfAE);
972 }
else if (fv->FlagOfVE == DOUBLE_QUOTES_FLAG) {
973 return dqf1(me, t2 PASS_REGS);
974 }
else if (fv->FlagOfVE == CHARACTER_ESCAPES_FLAG) {
975 if (t2 == TermTrue) {
976 me->
flags |= M_CHARESCAPE;
978 }
else if (t2 == TermFalse) {
979 me->
flags &= ~(M_CHARESCAPE);
982 Yap_ThrowError(DOMAIN_ERROR_OUT_OF_RANGE, t2,
983 "bad option %s for character_escapes flag, use true or false",
984 RepAtom(AtomOfTerm(tflag))->StrOfAE);
986 }
else if (fv->FlagOfVE == BACK_QUOTES_FLAG) {
987 return bqf1(me, t2 PASS_REGS);
988 }
else if (fv->FlagOfVE == SINGLE_QUOTES_FLAG) {
989 return sqf1(me, t2 PASS_REGS);
995static Term getYapFlagInModule(Term tflag, Term mod) {
997 ModEntry *me = Yap_GetModuleEntry(mod);
1000 fv = GetFlagProp(AtomOfTerm(tflag));
1001 if (!fv && !fv->global) {
1002 Yap_ThrowError(DOMAIN_ERROR_OUT_OF_RANGE, tflag,
"trying to set unknown flag");
1007 if (fv->FlagOfVE == UNKNOWN_FLAG) {
1008 if (me->
flags & UNKNOWN_ERROR)
1010 if (me->
flags & UNKNOWN_WARNING)
1013 }
else if (fv->FlagOfVE == CHARACTER_ESCAPES_FLAG) {
1014 if (me->
flags & M_CHARESCAPE)
1016 }
else if (fv->FlagOfVE == BACK_QUOTES_FLAG) {
1017 if (me->
flags & BCKQ_CHARS)
1019 if (me->
flags & BCKQ_CODES)
1021 if (me->
flags & BCKQ_ATOM)
1024 }
else if (fv->FlagOfVE == SINGLE_QUOTES_FLAG) {
1025 if (me->
flags & SNGQ_CHARS)
1027 if (me->
flags & SNGQ_CODES)
1029 if (me->
flags & SNGQ_ATOM)
1032 }
else if (fv->FlagOfVE == DOUBLE_QUOTES_FLAG) {
1033 if (me->
flags & DBLQ_CHARS)
1035 if (me->
flags & DBLQ_CODES)
1037 if (me->
flags & DBLQ_ATOM)
1041 Yap_ThrowError(DOMAIN_ERROR_OUT_OF_RANGE, tflag,
"flag %s is not module-scoped",
1042 RepAtom(AtomOfTerm(tflag))->StrOfAE);
1046static Int cont_yap_flag(USES_REGS1) {
1047 int i = IntOfTerm(EXTRA_CBACK_ARG(2, 1));
1048 int gmax = GLOBAL_flagCount;
1049 int lmax = LOCAL_flagCount;
1050 Term tflag = Deref(ARG1);
1051 EXTRA_CBACK_ARG(2, 1) = MkIntTerm(i + 1);
1053 if (IsApplTerm(tflag) && FunctorOfTerm(tflag) == FunctorModule) {
1054 Term modt = CurrentModule;
1055 tflag = Yap_StripModule(tflag, &modt);
1056 while (i != gmax && i != UNKNOWN_FLAG && i != CHARACTER_ESCAPES_FLAG &&
1057 i != BACK_QUOTES_FLAG && i != SINGLE_QUOTES_FLAG &&
1058 i != DOUBLE_QUOTES_FLAG)
1062 EXTRA_CBACK_ARG(2, 1) = MkIntTerm(i + 1);
1064 Term lab = MkAtomTerm(Yap_LookupAtom(global_flags_setup[i].name));
1065 Term val = Deref(ARG2);
1067 if (!Yap_unify(tflag, lab))
1069 if (IsVarTerm(val)) {
1070 Term oval = getYapFlagInModule(lab, modt);
1073 return Yap_unify(oval, val);
1075 return setYapFlagInModule(tflag, val, modt);
1082 MkAtomTerm(Yap_LookupAtom(local_flags_setup[i - gmax].name)));
1083 if (i == gmax + lmax - 1)
1086 Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom(global_flags_setup[i].name)));
1088 Term flag = getYapFlag(Deref(ARG1));
1089 return Yap_unify(flag, ARG2);
1104static Int yap_flag(USES_REGS1) {
1105 Term tflag = Deref(ARG1);
1106 Term val = Deref(ARG2);
1107 if (IsVarTerm(tflag)) {
1108 EXTRA_CBACK_ARG(2, 1) = MkIntTerm(0);
1109 return cont_yap_flag(PASS_REGS1);
1111 if (IsApplTerm(tflag) && FunctorOfTerm(tflag) == FunctorModule) {
1113 tflag = Yap_StripModule(tflag, &modt);
1114 if (IsVarTerm(tflag)) {
1115 EXTRA_CBACK_ARG(2, 1) = MkIntTerm(0);
1116 return cont_yap_flag(PASS_REGS1);
1124 if (IsVarTerm(val)) {
1125 Term flag = getYapFlagInModule(tflag, modt);
1128 return Yap_unify(flag, ARG2);
1130 return setYapFlagInModule(tflag, val, modt);
1139 Term flag = getYapFlag(tflag);
1142 if (! Yap_unify(flag, val) )
1144 return Yap_set_flag(tflag, Deref(ARG3) PASS_REGS1);
1147static Int cont_prolog_flag(USES_REGS1) {
1148 int i = IntOfTerm(EXTRA_CBACK_ARG(3, 1));
1149 while (i < GLOBAL_flagCount + LOCAL_flagCount) {
1150 int gmax = GLOBAL_flagCount;
1151 int lmax = LOCAL_flagCount;
1154 if (i >= gmax + lmax) {
1156 }
else if (i >= gmax) {
1157 Yap_unify(ARG1, (f = MkAtomTerm(
1158 Yap_LookupAtom(local_flags_setup[i - gmax].name))));
1161 (f = MkAtomTerm(Yap_LookupAtom(global_flags_setup[i].name))));
1163 EXTRA_CBACK_ARG(3, 1) = MkIntTerm(++i);
1164 flag = getYapFlag(f);
1165 if (!Yap_unify(flag, ARG2))
1167 return Yap_set_flag(f, Deref(ARG3));
1180static Int yap_flag2(USES_REGS1) {
1182 if (!IsVarTerm(Deref(ARG2))) {
1185 return yap_flag(PASS_REGS);
1197static Int prolog_flag(USES_REGS1) {
1198 if (IsVarTerm(Deref(ARG1))) {
1199 EXTRA_CBACK_ARG(3, 1) = MkIntTerm(0);
1200 return cont_prolog_flag(PASS_REGS1);
1203 if (IsVarTerm(Deref(ARG3))) {
1204 Term flag = getYapFlag(Deref(ARG1));
1207 return Yap_unify(flag, ARG2);
1209 return Yap_set_flag(Deref(ARG1), Deref(ARG3));
1212static Int cont_current_prolog_flag(USES_REGS1) {
1213 int i = IntOfTerm(EXTRA_CBACK_ARG(2, 1));
1214 while (i < GLOBAL_flagCount + LOCAL_flagCount) {
1215 int gmax = GLOBAL_flagCount;
1216 int lmax = LOCAL_flagCount;
1219 if (i >= gmax + lmax) {
1221 }
else if (i >= gmax) {
1222 Yap_unify(ARG1, (f = MkAtomTerm(
1223 Yap_LookupAtom(local_flags_setup[i - gmax].name))));
1226 (f = MkAtomTerm(Yap_LookupAtom(global_flags_setup[i].name))));
1228 EXTRA_CBACK_ARG(2, 1) = MkIntTerm(++i);
1229 flag = getYapFlag(f);
1230 return Yap_unify(flag, ARG2);
1240static Int current_prolog_flag(USES_REGS1) {
1241 if (IsVarTerm(Deref(ARG1))) {
1242 EXTRA_CBACK_ARG(3, 1) = MkIntTerm(0);
1243 return cont_current_prolog_flag(PASS_REGS1);
1246 Term flag = getYapFlag(Deref(ARG1));
1249 return Yap_unify(flag, ARG2);
1259static Int current_prolog_flag2(USES_REGS1) {
1260 Term tflag = Deref(ARG1);
1265 if (IsVarTerm(tflag)) {
1266 EXTRA_CBACK_ARG(2, 1) = MkIntTerm(0);
1267 return cont_yap_flag(PASS_REGS1);
1270 if (IsStringTerm(tflag)) {
1271 tflag = MkStringTerm(RepAtom(AtomOfTerm(tflag))->StrOfAE);
1273 if (!IsAtomTerm(tflag)) {
1274 Yap_ThrowError(TYPE_ERROR_ATOM, tflag,
"current_prolog_flag/3");
1277 fv = GetFlagProp(AtomOfTerm(tflag));
1283 tarr = GLOBAL_Flags;
1286 tout = tarr[fv->FlagOfVE].at;
1287 if (tout == TermZERO) {
1291 if (!IsAtomicTerm(tout)) {
1292 while ((tout = Yap_FetchTermFromDB(tarr[fv->FlagOfVE].DBT)) == 0) {
1294 if (LOCAL_Error_TYPE == RESOURCE_ERROR_ATTRIBUTED_VARIABLES) {
1295 LOCAL_Error_TYPE = YAP_NO_ERROR;
1296 if (!Yap_growglobal(NULL)) {
1297 Yap_ThrowError(RESOURCE_ERROR_ATTRIBUTED_VARIABLES, TermNil,
1298 LOCAL_ErrorMessage);
1303 LOCAL_Error_TYPE = YAP_NO_ERROR;
1305 Yap_ThrowError(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage);
1312 return (Yap_unify(ARG2, tout));
1318 Atom at =
new->AtomOfME;
1319 if (at == AtomProlog || CurrentModule == PROLOG_MODULE) {
1320 new->flags = M_SYSTEM | UNKNOWN_ERROR | M_CHARESCAPE | DBLQ_CODES |
1321 BCKQ_STRING | SNGQ_ATOM;
1324 UNKNOWN_ERROR | M_CHARESCAPE | DBLQ_CODES | BCKQ_STRING | SNGQ_ATOM;
1325 }
else if (cme && cme->
flags && cme !=
new) {
1326 new->flags = cme->
flags;
1329 (UNKNOWN_ERROR | M_CHARESCAPE | DBLQ_CODES | BCKQ_STRING | SNGQ_ATOM);
1334bool Yap_set_flag(Term tflag, Term t2) {
1337 tflag = Deref(tflag);
1339 if (IsVarTerm(tflag)) {
1340 Yap_ThrowError(INSTANTIATION_ERROR, tflag,
"yap_flag/2");
1343 if (IsStringTerm(tflag)) {
1344 tflag = MkStringTerm(RepAtom(AtomOfTerm(tflag))->StrOfAE);
1347 if (IsApplTerm(tflag) && FunctorOfTerm(tflag) == FunctorModule) {
1349 tflag = Yap_StripModule(tflag, &modt);
1354 return setYapFlagInModule(tflag, t2, modt);
1356 if (!IsAtomTerm(tflag)) {
1357 Yap_ThrowError(TYPE_ERROR_ATOM, tflag,
"yap_flag/2");
1360 fv = GetFlagProp(AtomOfTerm(tflag));
1362 Term fl = GLOBAL_Flags[USER_FLAGS_FLAG].at;
1363 if (fl == TermSilent) {
1365 Term t2 = Deref(ARG2);
1367 }
else if (fl == TermWarning) {
1368 Yap_Warning(
"Flag %s does not exist", RepAtom(AtomOfTerm(fl))->StrOfAE);
1370 Yap_ThrowError(DOMAIN_ERROR_PROLOG_FLAG, tflag,
1371 "trying to set unknown flag \"%s\"",
1372 AtomName(AtomOfTerm(tflag)));
1378 switch (fv->FlagOfVE) {
1380 case CHARACTER_ESCAPES_FLAG:
1381 case BACK_QUOTES_FLAG:
1382 case DOUBLE_QUOTES_FLAG:
1383 case SINGLE_QUOTES_FLAG:
1384 return setYapFlagInModule(tflag, t2, CurrentModule);
1386 tarr = GLOBAL_Flags;
1392 if (!(t2 = fv->type(t2)))
1394 if (fv->helper && !(fv->helper(t2)))
1396 Term tout = tarr[fv->FlagOfVE].at;
1397 if (IsVarTerm(tout))
1398 Yap_PopTermFromDB(tarr[fv->FlagOfVE].DBT);
1399 if (IsAtomOrIntTerm(t2))
1400 tarr[fv->FlagOfVE].at = t2;
1402 tarr[fv->FlagOfVE].DBT = Yap_StoreTermInDB(t2, 2);
1407Term Yap_UnknownFlag(Term mod) {
1408 if (mod == PROLOG_MODULE)
1411 ModEntry *fv = Yap_GetModuleEntry(mod);
1413 fv = Yap_GetModuleEntry(TermUser);
1414 if (fv->
flags & UNKNOWN_ERROR)
1416 if (fv->
flags & UNKNOWN_WARNING)
1421Term getYapFlag(Term tflag) {
1424 tflag = Deref(tflag);
1425 if (IsVarTerm(tflag)) {
1426 Yap_ThrowError(INSTANTIATION_ERROR, tflag,
"yap_flag/2");
1429 if (IsStringTerm(tflag)) {
1430 tflag = MkStringTerm(RepAtom(AtomOfTerm(tflag))->StrOfAE);
1432 if (IsApplTerm(tflag) && FunctorOfTerm(tflag) == FunctorModule) {
1434 tflag = Yap_StripModule(tflag, &modt);
1435 if (IsStringTerm(tflag)) {
1436 tflag = MkStringTerm(RepAtom(AtomOfTerm(tflag))->StrOfAE);
1440 if (IsStringTerm(modt)) {
1441 modt = MkStringTerm(RepAtom(AtomOfTerm(modt))->StrOfAE);
1445 return getYapFlagInModule(tflag, modt);
1447 if (!IsAtomTerm(tflag)) {
1448 Yap_ThrowError(TYPE_ERROR_ATOM, tflag,
"yap_flag/2");
1451 if (tflag == TermSilent)
1453 Yap_DebugPlWriteln(TermSilent);
1455 fv = GetFlagProp(AtomOfTerm(tflag));
1457 Term fl = GLOBAL_Flags[USER_FLAGS_FLAG].at;
1458 if (fl == TermSilent) {
1460 }
else if (fl == TermWarning) {
1461 Yap_Warning(
"Flag ~s does not exist",
1462 RepAtom(AtomOfTerm(tflag))->StrOfAE);
1464 Yap_ThrowError(DOMAIN_ERROR_PROLOG_FLAG, tflag,
1465 "trying to use unknown flag %s",
1466 RepAtom(AtomOfTerm(tflag))->StrOfAE);
1471 tarr = GLOBAL_Flags;
1476 Term tout = tarr[fv->FlagOfVE].at;
1477 if (IsVarTerm(tout))
1478 return Yap_FetchTermFromDB(tarr[fv->FlagOfVE].DBT);
1489static Int set_prolog_flag(USES_REGS1) {
1490 Term tflag = Deref(ARG1), t2 = Deref(ARG2);
1491 return Yap_set_flag(tflag, t2);
1504static Int
source(USES_REGS1) {
1505 setBooleanGlobalPrologFlag(SOURCE_FLAG,
true);
1515static Int no_source(USES_REGS1) {
1516 setBooleanGlobalPrologFlag(SOURCE_FLAG,
false);
1529static Int source_mode(USES_REGS1) {
1531 bool current = trueGlobalPrologFlag(SOURCE_FLAG);
1532 if (current && !Yap_unify_constant(ARG1, TermTrue))
1534 if (!current && !Yap_unify_constant(ARG1, TermFalse))
1537 Yap_set_flag(TermSource, targ);
1541static bool setInitialValue(
bool bootstrap, flag_func f,
const char *s,
1544 const char *ss = (
const char *)s;
1546 if (f == booleanFlag) {
1550 const char *ss = (
const char *)s;
1551 if (!strcmp(ss,
"true")) {
1552 tarr->at = TermTrue;
1555 if (!strcmp(ss,
"false")) {
1556 tarr->at = TermFalse;
1559 if (!strcmp(ss,
"on")) {
1560 tarr->at = TermTrue;
1563 if (!strcmp(ss,
"off")) {
1564 tarr->at = TermFalse;
1567 Yap_ThrowError(DOMAIN_ERROR_OUT_OF_RANGE, TermNil,
1568 "~s should be either true (on) or false (off)", s);
1570 }
else if (f == nat) {
1574 UInt r = strtoul(ss, NULL, 10);
1577 Yap_ThrowError(DOMAIN_ERROR_OUT_OF_RANGE, TermNil,
1578 "~s should be a positive integer)", s);
1582 t = MkIntegerTerm(r);
1586 tarr->DBT = Yap_StoreTermInDB(t, 2);
1589 }
else if (f == at2n) {
1593 if (!strcmp(ss,
"INT_MAX")) {
1594 tarr->at = MkIntTerm(Int_MAX);
1597 if (!strcmp(ss,
"MAX_THREADS")) {
1598 tarr->at = MkIntTerm(MAX_THREADS);
1601 if (!strcmp(ss,
"MAX_WORKERS")) {
1602 tarr->at = MkIntTerm(MAX_WORKERS);
1605 if (!strcmp(ss,
"INT_MIN")) {
1606 tarr->at = MkIntTerm(Int_MIN);
1609 if (!strcmp(ss,
"YAP_NUMERIC_VERSION")) {
1610 tarr->at = MkIntTerm(atol(YAP_NUMERIC_VERSION));
1613 Yap_ThrowError(DOMAIN_ERROR_OUT_OF_RANGE, TermNil,
1614 "~s should be either true (on) or false (off)", s);
1616 }
else if (f == isatom) {
1620 Atom r = Yap_LookupAtom(s);
1622 Yap_ThrowError(DOMAIN_ERROR_OUT_OF_RANGE, TermNil,
1623 "~s should be a positive integer)", s);
1626 tarr->at = MkAtomTerm(r);
1628 }
else if (f == options) {
1637 int i = 0, ch = s[0];
1638 while (ch !=
'\0' && ch !=
';') {
1646 HR[-2] = MkAtomTerm(Yap_LookupAtom(tmp));
1648 HR[-1] = AbsPair(HR);
1653 tarr->DBT = Yap_StoreTermInDB(t0, 2);
1657 }
else if (strcmp(ss,
"@boot") == 0) {
1662 Term t = f(TermZERO);
1665 if (IsAtomOrIntTerm(t)) {
1668 tarr->DBT = Yap_StoreTermInDB(t, 2);
1677 const char *us = (
const char *)s;
1678 t0 = Yap_BufferToTermWithPrioBindings(us, TermNil, 0L, strlen(s) + 1,
1679 GLOBAL_MaxPriority);
1682 if (IsStringTerm(t0)) {
1683 t0 = MkStringTerm(RepAtom(AtomOfTerm(t0))->StrOfAE);
1685 if (IsAtomTerm(t0) || IsIntTerm(t0)) {
1687 if (t0 == MkAtomTerm(AtomQuery)) {
1693 tarr->DBT = Yap_StoreTermInDB(t0, 2);
1702#define PROLOG_FLAG_PROPERTY_DEFS() \
1703 PAR("access", isaccess, PROLOG_FLAG_PROPERTY_ACCESS, "read_write") \
1704 , PAR("type", isground, PROLOG_FLAG_PROPERTY_TYPE, "term"), \
1705 PAR("scope", flagscope, PROLOG_FLAG_PROPERTY_SCOPE, "global"), \
1706 PAR("keep", booleanFlag, PROLOG_FLAG_PROPERTY_KEEP, "false"), \
1707 PAR(NULL, ok, PROLOG_FLAG_PROPERTY_END, 0)
1709#define PAR(x, y, z, w) z
1711typedef enum prolog_flag_property_enum_choices {
1712 PROLOG_FLAG_PROPERTY_DEFS()
1713} prolog_flag_property_choices_t;
1717#define PAR(x, y, z, w) \
1720static const param2_t prolog_flag_property_defs[] = {
1721 PROLOG_FLAG_PROPERTY_DEFS()};
1725do_prolog_flag_property(Term tflag,
1726 Term opts USES_REGS) {
1729 prolog_flag_property_choices_t i;
1732 Yap_ArgList2ToVector(opts, prolog_flag_property_defs,
1733 PROLOG_FLAG_PROPERTY_END, DOMAIN_ERROR_PROLOG_FLAG);
1735 Yap_ThrowError(LOCAL_Error_TYPE, opts, NULL);
1739 Term modt = CurrentModule;
1740 tflag = Yap_YapStripModule(tflag, &modt);
1741 if (IsStringTerm(tflag)) {
1742 atflag = Yap_LookupAtom(StringOfTerm(tflag));
1743 }
else if (IsAtomTerm(tflag)) {
1744 atflag = AtomOfTerm(tflag);
1747 Yap_ThrowError(TYPE_ERROR_ATOM, tflag,
"yap_flag/2");
1750 fv = GetFlagProp(atflag);
1754 for (i = 0; i < PROLOG_FLAG_PROPERTY_END; i++) {
1757 case PROLOG_FLAG_PROPERTY_ACCESS:
1759 rc = rc && Yap_unify(TermReadWrite,
1760 args[PROLOG_FLAG_PROPERTY_ACCESS].tvalue);
1762 rc = rc && Yap_unify(TermReadOnly,
1763 args[PROLOG_FLAG_PROPERTY_ACCESS].tvalue);
1765 case PROLOG_FLAG_PROPERTY_TYPE:
1766 if (fv->type == booleanFlag)
1768 Yap_unify(TermBoolean, args[PROLOG_FLAG_PROPERTY_TYPE].tvalue);
1769 else if (fv->type == isatom)
1771 rc && Yap_unify(TermAtom, args[PROLOG_FLAG_PROPERTY_TYPE].tvalue);
1772 else if (fv->type == nat)
1775 Yap_unify(TermInteger, args[PROLOG_FLAG_PROPERTY_TYPE].tvalue);
1776 else if (fv->type == isfloat)
1778 Yap_unify(TermFloat, args[PROLOG_FLAG_PROPERTY_TYPE].tvalue);
1781 rc && Yap_unify(TermTerm, args[PROLOG_FLAG_PROPERTY_TYPE].tvalue);
1783 case PROLOG_FLAG_PROPERTY_KEEP:
1786 case PROLOG_FLAG_PROPERTY_SCOPE:
1788 if (fv->FlagOfVE == UNKNOWN_FLAG ||
1789 fv->FlagOfVE == CHARACTER_ESCAPES_FLAG ||
1790 fv->FlagOfVE == SINGLE_QUOTES_FLAG ||
1791 fv->FlagOfVE == DOUBLE_QUOTES_FLAG ||
1792 fv->FlagOfVE == BACK_QUOTES_FLAG)
1793 Yap_unify(TermModule, args[PROLOG_FLAG_PROPERTY_SCOPE].tvalue);
1795 Yap_unify(TermGlobal, args[PROLOG_FLAG_PROPERTY_SCOPE].tvalue);
1798 Yap_unify(TermThread, args[PROLOG_FLAG_PROPERTY_SCOPE].tvalue);
1800 case PROLOG_FLAG_PROPERTY_END:
1802 Yap_ThrowError(DOMAIN_ERROR_PROLOG_FLAG, opts,
"Flag not supported by YAP");
1811static Int cont_prolog_flag_property(USES_REGS1) {
1812 int i = IntOfTerm(EXTRA_CBACK_ARG(2, 1));
1814 while (i < GLOBAL_flagCount + LOCAL_flagCount) {
1815 int gmax = GLOBAL_flagCount;
1816 int lmax = LOCAL_flagCount;
1819 if (i >= gmax + lmax) {
1821 }
else if (i >= gmax) {
1822 lab = MkAtomTerm(Yap_LookupAtom(local_flags_setup[i - gmax].name));
1824 if (i == UNKNOWN_FLAG || i == CHARACTER_ESCAPES_FLAG ||
1825 i == SINGLE_QUOTES_FLAG || i == DOUBLE_QUOTES_FLAG ||
1826 i == BACK_QUOTES_FLAG) {
1828 labs[0] = MkVarTerm();
1829 labs[1] = MkAtomTerm(Yap_LookupAtom(global_flags_setup[i].name));
1830 lab = Yap_MkApplTerm(FunctorModule, 2, labs);
1832 lab = MkAtomTerm(Yap_LookupAtom(global_flags_setup[i].name));
1835 EXTRA_CBACK_ARG(2, 1) = MkIntTerm(++i);
1836 Yap_unify(ARG1, lab);
1837 return do_prolog_flag_property(lab, Deref(ARG2) PASS_REGS);
1855static Int prolog_flag_property(USES_REGS1) {
1856 Term t1 = Deref(ARG1);
1858 EXTRA_CBACK_ARG(2, 1) = MkIntTerm(0);
1859 if (IsStringTerm(t1)) {
1860 t1 = MkStringTerm(RepAtom(AtomOfTerm(t1))->StrOfAE);
1862 if (IsVarTerm(t1)) {
1863 return (cont_prolog_flag_property(PASS_REGS1));
1865 if (IsApplTerm(t1) && FunctorOfTerm(t1) == FunctorModule) {
1867 t1 = Yap_StripModule(t1, &modt);
1868 if (IsAtomTerm(modt)) {
1870 rc = cont_prolog_flag_property(PASS_REGS1);
1874 }
else if (IsAtomTerm(t1)) {
1876 return do_prolog_flag_property(t1, Deref(ARG2) PASS_REGS);
1878 Yap_ThrowError(TYPE_ERROR_ATOM, t1,
"prolog_flag_property/2");
1884static void newFlag(Term fl, Term val) {
1886 int i = GLOBAL_flagCount;
1889 f.name = (
char *)RepAtom(AtomOfTerm(fl))->StrOfAE;
1893 initFlag(&f, i,
true);
1894 if (IsAtomOrIntTerm(val)) {
1895 GLOBAL_Flags[i].at = val;
1897 GLOBAL_Flags[i].DBT = Yap_StoreTermInDB(val, 2);
1901static Int do_create_prolog_flag(USES_REGS1) {
1904 prolog_flag_property_choices_t i;
1905 Term tflag = Deref(ARG1), tval = Deref(ARG2), opts = Deref(ARG3);
1908 Yap_ArgList2ToVector(opts, prolog_flag_property_defs,
1909 PROLOG_FLAG_PROPERTY_END, DOMAIN_ERROR_PROLOG_FLAG);
1911 Yap_ThrowError(LOCAL_Error_TYPE, opts, NULL);
1914 fv = GetFlagProp(AtomOfTerm(tflag));
1916 if (args[PROLOG_FLAG_PROPERTY_KEEP].used &&
1917 args[PROLOG_FLAG_PROPERTY_KEEP].tvalue == TermTrue) {
1922 newFlag(tflag, tval);
1923 fv = GetFlagProp(AtomOfTerm(tflag));
1925 for (i = 0; i < PROLOG_FLAG_PROPERTY_END; i++) {
1928 case PROLOG_FLAG_PROPERTY_KEEP:
1930 case PROLOG_FLAG_PROPERTY_ACCESS:
1931 if (args[PROLOG_FLAG_PROPERTY_ACCESS].tvalue == TermReadWrite)
1936 case PROLOG_FLAG_PROPERTY_TYPE: {
1937 Term ttype = args[PROLOG_FLAG_PROPERTY_TYPE].tvalue;
1938 if (ttype == TermBoolean)
1939 fv->type = booleanFlag;
1940 else if (ttype == TermInteger)
1942 else if (ttype == TermFloat)
1945 fv->type = isground;
1947 case PROLOG_FLAG_PROPERTY_SCOPE:
1950 case PROLOG_FLAG_PROPERTY_END:
1970 Atom aname = Yap_LookupAtom (name);
1972 fv = GetFlagProp(aname);
1976 newFlag(MkAtomTerm(aname), v);
1977 fv = GetFlagProp(aname);
1980 if (ttype == TermBoolean)
1981 fv->type = booleanFlag;
1982 else if (ttype == TermInteger)
1984 else if (ttype == TermFloat)
1987 fv->type = isground;
2006 int lvl = push_text_stack();
2007 char *buf =
Malloc(4098);
2008 GLOBAL_flagCount = 0;
2010 GLOBAL_Flags = (
union flagTerm *)Yap_AllocCodeSpace(
2012 (2 *
sizeof(global_flags_setup) /
sizeof(
flag_info)));
2014 while (f->name != NULL) {
2015 bool itf = setInitialValue(bootstrap, f->def, f->init,
2016 GLOBAL_Flags + GLOBAL_flagCount);
2018 initFlag(f, GLOBAL_flagCount,
true);
2023 LOCAL_flagCount = 0;
2024 int nflags =
sizeof(local_flags_setup) /
sizeof(
flag_info);
2028 f = local_flags_setup;
2029 while (f->name != NULL) {
2031 if (f->init == NULL || f->init[0] ==
'\0') s = NULL;
2032 else if (strlen(f->init) < 4096) {
2034 strcpy(buf, f->init);
2036 s =
Malloc(strlen(f->init)+1);
2039 bool itf = setInitialValue(bootstrap, f->def, s,
2040 LOCAL_Flags + LOCAL_flagCount);
2045 initFlag(f, LOCAL_flagCount,
false);
2051 if (GLOBAL_Stream[StdInStream].status & Readline_Stream_f) {
2052 setBooleanGlobalPrologFlag(READLINE_FLAG,
true);
2054 pop_text_stack(lvl);
2056 Yap_InitCPredBack(
"current_prolog_flag", 2, 1, current_prolog_flag,
2059 Yap_InitCPredBack(
"prolog_flag", 3, 1, prolog_flag, cont_yap_flag,
2061 Yap_InitCPredBack(
"yap_flag", 3, 1, yap_flag, cont_yap_flag, 0);
2062 Yap_InitCPredBack(
"yap_flag", 2, 1, yap_flag2, cont_yap_flag, 0);
2063 Yap_InitCPredBack(
"prolog_flag", 2, 1, current_prolog_flag2,
2064 cont_current_prolog_flag, 0);
2065 Yap_InitCPredBack(
"current_prolog_flag", 2, 1, current_prolog_flag2,
2066 cont_current_prolog_flag, 0);
2067 Yap_InitCPred(
"set_prolog_flag", 2, set_prolog_flag, SyncPredFlag);
2068 Yap_InitCPred(
"$create_prolog_flag", 3, do_create_prolog_flag,
2071 Yap_InitCPredBack(
"prolog_flag_property", 2, 1, prolog_flag_property,
2072 cont_prolog_flag_property, 0);
2073 Yap_InitCPred(
"source", 0,
source, SyncPredFlag);
2074 Yap_InitCPred(
"no_source", 0, no_source, SyncPredFlag);
2075 Yap_InitCPred(
"source_mode", 2, source_mode, SyncPredFlag);
global flags and their default values
void * Malloc(size_t sz USES_REGS)
allocate a temporary text block
void Yap_InitFlags(bool bootstrap)
Init System Prolog flags.
X_API bool Yap_create_prolog_flag(const char *name, bool writable, Term ttype, Term v)
Create a new global prolog flag.
@ argv
read-only atom, it describes the list with all arguments received by YAP at boot
@ source
If true maintain the source for all clauses.
@ executable
Read-only flag.
@ gc_margin
controls when to do garbage collection
@ compiling
Indicates YAP is running within the compiler.
prolog_flag/2 support, notice flag is initialized as text
Module property: low-level data used to manage modes.
unsigned int flags
module's owner file
a flag is represented as a Prolog term