YAP 7.1.0
YapFlags.h
Go to the documentation of this file.
1/*************************************************************************
2* *
3* YAP Prolog *
4* *
5* Yap Prolog was developed at NCCUP - Universidade do Porto *
6* *
7* Copyright L.Damas, V.S.Costa and Universidade do Porto 2015- *
8* *
9**************************************************************************
10* *
11* File: YapFlags.h *
12* Last rev: *
13* mods: *
14* comments: flag system interface. *
15* *
16*************************************************************************/
17
26#ifndef YAP_FLAGS_H
27#define YAP_FLAGS_H 1
28
29// INLINE_ONLY bool nat( Term inp );
30
31#define SYSTEM_OPTION_0 "attributed_variables,rational_trees]"
32#if THREADS
33#define SYSTEM_OPTION_1 "threads,"
34#endif
35#define SYSTEM_OPTION_3 "big_numbers,"
36#if DEPTH_LIMIT
37#define SYSTEM_OPTION_4 "depth_limit,"
38#endif
39#if LOW_LEVEL_TRACE
40#define SYSTEM_OPTION_5 "low_level_tracer,"
41#endif
42#if YAPOR
43#define SYSTEM_OPTION_6 "or_parallelism,"
44#endif
45#if USE_READLINE
46#define SYSTEM_OPTION_7 "readline,"
47#endif
48#if TABLING
49#define SYSTEM_OPTION_8 "tabling,"
50#endif
51
52static inline Term nat(Term inp) {
53 if (IsVarTerm(inp)) {
54 Yap_Error(INSTANTIATION_ERROR, inp, "set_prolog_flag: value must be %s",
55 "bound");
56 return TermZERO;
57 }
58 if (IsIntTerm(inp)) {
59 Int i = IntOfTerm(inp);
60 if (i >= 0)
61 return inp;
62 Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, inp,
63 "set_prolog_flag: value must be %s", ">= 0");
64 return TermZERO;
65 }
66 Yap_Error(TYPE_ERROR_INTEGER, inp, "set_prolog_flag: value must be %s",
67 "integer");
68 return TermZERO;
69}
70
71static inline Term at2n(Term inp) {
72 Yap_Error(PERMISSION_ERROR_READ_ONLY_FLAG, inp, "set_prolog_flag %s",
73 "flag is read-only");
74 return TermZERO;
75}
76
77static inline Term isfloat(Term inp) {
78 if (IsVarTerm(inp)) {
79 Yap_Error(INSTANTIATION_ERROR, inp, "set_prolog_flag: value must be %s",
80 "integer");
81
82 return TermZERO;
83 }
84 if (IsFloatTerm(inp)) {
85 return inp;
86 }
87 Yap_Error(TYPE_ERROR_FLOAT, inp, "set_prolog_flag: value must be %s",
88 "floating-point");
89 return TermZERO;
90}
91
92extern Term ro(Term inp);
93extern Term aro(Term inp);
94extern Term booleanFlag( Term inp );
95extern Term febooleanFlag( Term inp );
96extern Term synerr(Term inp);
97
98
99static inline Term filler(Term inp) { return inp; }
100
101static inline Term list_filler(Term inp) {
102 if (IsVarTerm(inp) || IsPairTerm(inp) || inp == TermNil)
103 return inp;
104
105 Yap_Error(TYPE_ERROR_LIST, inp, "set_prolog_flag in {codes,string}");
106
107 return TermZERO;
108}
109
110// INLINE_ONLY Term isatom( Term inp );
111
112static inline Term isatom(Term inp) {
113 if (IsVarTerm(inp)) {
114 Yap_Error(INSTANTIATION_ERROR, inp, "set_prolog_flag %s",
115 "value must be bound");
116 return TermZERO;
117 }
118 if (IsStringTerm(inp)) {
119 inp = MkStringTerm(RepAtom(AtomOfTerm(inp))->StrOfAE);
120 }
121 if (IsAtomTerm(inp))
122 return inp;
123 Yap_Error(TYPE_ERROR_ATOM, inp, "set_prolog_flag");
124 return TermZERO;
125}
126
127static inline Term isadress(Term inp) {
128 if (IsVarTerm(inp)) {
129 Yap_Error(INSTANTIATION_ERROR, inp, "set_prolog_flag %s",
130 "value must be bound");
131 return TermZERO;
132 }
133 if (IsAddressTerm(inp))
134 return inp;
135 Yap_Error(TYPE_ERROR_ATOM, inp, "set_prolog_flag");
136 return TermZERO;
137}
138
139static inline Term options(Term inp) {
140 return Yap_IsGroundTerm(inp) ? inp : TermZERO;
141}
142
143static inline const char * rootdir(Term inp) {
144 return Yap_ROOTDIR;
145}
146
147// INLINE_ONLY Term ok( Term inp );
148
149static inline Term ok(Term inp) { return inp; }
150
151// a pair, obtained from x(y) -> 1,2,y)
152typedef struct x_el {
153 bool used;
154 Term tvalue;
155} xarg;
156
157typedef struct struct_param {
158 const char *name;
159 flag_func type;
160 int id;
161} param_t;
162
163typedef struct struct_param2 {
164 char *name;
165 flag_func type;
166 int id;
167 const char *scope;
168} param2_t;
169
173typedef struct {
174 char *name; //< user visible name
175 bool writable; //< read-write or read-only
176 flag_func def; //< call on definition
177 const char *init; //< initial value as string
178 flag_helper_func helper; //< operations triggered by writing the flag.
179} flag_info;
180
181typedef struct {
182 char *name;
183 flag_func def;
184 const char *init;
185} arg_info;
186
189typedef union flagTerm {
190 Term at;
191 struct DB_TERM *DBT;
193
194extern void Yap_InitFlags(bool);
195extern bool Yap_InitSIGSEGV(Term enable);
196
205#define YAP_FLAG(ITEM, NAME, WRITABLE, DEF, INIT, HELPER) ITEM
206#define START_LOCAL_FLAGS enum THREAD_LOCAL_FLAGS {
207#define END_LOCAL_FLAGS NULL_LFLAG };
208#define START_GLOBAL_FLAGS enum GLOBAL_FLAGS {
209#define END_GLOBAL_FLAGS NULL_GFLAG};
210
211/* */
212#include "YapGFlagInfo.h"
213
214 /* Local flags */
215#include "YapLFlagInfo.h"
216
217#ifndef DOXYGEN
218
219#undef YAP_FLAG
220#undef START_LOCAL_FLAGS
221#undef END_LOCAL_FLAGS
222#undef START_GLOBAL_FLAGS
223#undef END_GLOBAL_FLAGS
224
225#endif
226
227bool Yap_set_flag(Term tflag, Term t2);
228Term getYapFlag(Term tflag);
229
230int Yap_ArgKey(Atom key, const param_t *def, int n);
231
232static inline bool check_refs_to_ltable(void) { return true; }
233
234static inline void setAtomicGlobalPrologFlag(int id, Term v) {
235 GLOBAL_Flags[id].at = v;
236}
237
238static inline Term getAtomicGlobalPrologFlag(int id) {
239 return GLOBAL_Flags[id].at;
240}
241
242static inline Term getAtomicLocalPrologFlag(int id) {
243 CACHE_REGS
244 return LOCAL_Flags[id].at;
245}
246
247static inline void setAtomicLocalPrologFlag(int id, Term v) {
248 CACHE_REGS
249 check_refs_to_ltable();
250 LOCAL_Flags[id].at = v;
251}
252
253static inline void setBooleanLocalPrologFlag(int id, bool v) {
254 CACHE_REGS
255 check_refs_to_ltable();
256 if (v) {
257 LOCAL_Flags[id].at = TermTrue;
258 } else {
259 LOCAL_Flags[id].at = TermFalse;
260 }
261}
262
263static inline void setBooleanGlobalPrologFlag(int id, bool v) {
264 if (v) {
265 GLOBAL_Flags[id].at = TermTrue;
266 } else {
267 GLOBAL_Flags[id].at = TermFalse;
268 }
269}
270
271static inline bool trueGlobalPrologFlag(int id) {
272 return GLOBAL_Flags[id].at == TermTrue;
273}
274
275static inline bool falseGlobalPrologFlag(int id) {
276 return GLOBAL_Flags[id].at == TermFalse;
277}
278
279static inline bool trueLocalPrologFlag(int id) {
280 CACHE_REGS
281 return LOCAL_Flags[id].at == TermTrue;
282}
283
284static inline bool falseLocalPrologFlag(int id) {
285 CACHE_REGS
286 return LOCAL_Flags[id].at == TermFalse;
287}
288
289static inline bool isoLanguageFlag(void) {
290 return GLOBAL_Flags[ISO_FLAG].at == TermTrue;
291}
292
293static inline bool strictISOFlag(void) {
294 return GLOBAL_Flags[STRICT_ISO_FLAG].at == TermTrue;
295}
296
297static inline bool silentMode(void) {
298 return GLOBAL_Flags[VERBOSE_FLAG].at == TermSilent;
299}
300
301static inline bool verboseMode(void) {
302 return GLOBAL_Flags[VERBOSE_FLAG].at != TermSilent;
303}
304
305static inline bool FileErrors(void) {return LOCAL_Flags[FILE_ERRORS_FLAG].at == TermError; }
306
307
308static inline void setVerbosity(Term val) {
309 GLOBAL_Flags[VERBOSE_FLAG].at = val;
310}
311
312static inline bool setSyntaxErrorsFlag(Term val) {
313 if ((val = synerr(val)) == TermZERO)
314 return false;
315 CACHE_REGS
316 LOCAL_Flags[SYNTAX_ERRORS_FLAG].at = val;
317 return true;
318}
319
320static inline Term getSyntaxErrorsFlag(void) {
321 CACHE_REGS
322 return LOCAL_Flags[SYNTAX_ERRORS_FLAG].at;
323}
324
325// used to overwrite singletons quoteFunc flag
326static inline bool setReadTermBackQuotesFlag(Term val) {
327
328 GLOBAL_Flags[BACK_QUOTES_FLAG].at = val;
329 return true;
330}
331
332static inline Term getBackQuotesFlag(Term mod) {
333 Term val;
334 unsigned int flags = Yap_GetModuleEntry(mod)->flags;
335 if (flags & BCKQ_ATOM) {
336 val = TermAtom;
337 } else if (flags & BCKQ_STRING) {
338 val = TermString;
339 } else if (flags & BCKQ_CHARS) {
340 val = TermChars;
341 } else {
342 val = TermCodes;
343 }
344return val;
345}
346
347static inline Term getSingleQuotesFlag(Term mod) {
348 Term val;
349 unsigned int flags = Yap_GetModuleEntry(mod)->flags;
350 if (flags & SNGQ_ATOM) {
351 val = TermAtom;
352 } else if (flags & SNGQ_STRING) {
353 val = TermString;
354 } else if (flags & SNGQ_CHARS) {
355 val = TermChars;
356 } else {
357 val = TermCodes;
358 }
359 return val;
360}
361
362static inline Term getDoubleQuotesFlag(Term mod) {
363 Term val;
364 unsigned int flags = Yap_GetModuleEntry(mod)->flags;
365 if (flags & DBLQ_ATOM) {
366 val = TermAtom;
367 } else if (flags & DBLQ_STRING) {
368 val = TermString;
369 } else if (flags & DBLQ_CHARS) {
370 val = TermChars;
371 } else {
372 val = TermCodes;
373 }
374 return val;
375}
376
377static inline Term indexingMode(void) { return GLOBAL_Flags[INDEX_FLAG].at; }
378
379static inline const char *floatFormat(void) {
380 return RepAtom(AtomOfTerm(GLOBAL_Flags[FLOAT_FORMAT_FLAG].at))->rep.uStrOfAE;
381}
382
383
384static inline size_t indexingDepth(void) {
385 return IntOfTerm(GLOBAL_Flags[INDEX_SUB_TERM_SEARCH_DEPTH_FLAG].at);
386}
387
388static inline Term gcTrace(void) { return GLOBAL_Flags[GC_TRACE_FLAG].at; }
389
390Term Yap_UnknownFlag(Term mod);
391
392bool rmdot(Term inp);
393
394#define Yap_ArgListToVector(l, def, n, a, e) \
395 Yap_ArgListToVector__(__FILE__, __FUNCTION__, __LINE__, l, def, n, a, e)
396
397extern xarg *Yap_ArgListToVector__(const char *file, const char *function, int lineno,Term listl, const param_t *def, int n, xarg *a,
398 yap_error_number e);
399
400extern xarg *Yap_ArgList2ToVector__(const char *file, const char *function, int lineno, Term listl, const param2_t *def, int n, yap_error_number e);
401
402#define Yap_ArgList2ToVector(l, def, n, e) \
403 Yap_ArgList2ToVector__(__FILE__, __FUNCTION__, __LINE__, l, def, n, e)
404
405#endif // YAP_FLAGS_H
406
int Yap_ArgKey(Atom key, const param_t *def, int n)
Returns the index of an argument key, or -1 if not found.
Definition: args.c:42
xarg * Yap_ArgList2ToVector__(const char *file, const char *function, int lineno, Term listl, const param2_t *def, int n, yap_error_number e)
Yap_ArgList2ToVector is much the same as before, but assumes parameters also have something called a ...
Definition: args.c:153
bool Yap_InitSIGSEGV(Term enable)
This function implements the sigsegv prolog flag.
Definition: sig.c:845
union flagTerm flag_term
a flag is represented as a Prolog term
global flags and their default values
void Yap_InitFlags(bool)
Init System Prolog flags.
Definition: flags.c:2002
Definition: Yatom.h:689
prolog_flag/2 support, notice flag is initialized as text
Definition: YapFlags.h:173
unsigned int flags
module's owner file
Definition: Yatom.h:219
Definition: YapFlags.h:152
a flag is represented as a Prolog term
Definition: YapFlags.h:189