From 3f316c5c9265618fe7095cc39c4cb10909cbe468 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Fri, 16 Jul 2021 20:09:02 +0000 Subject: Implement a bit more of prolog flag predicates set_prolog_flag/2 and current_prolog_flag/2 --- flags.c | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 142 insertions(+), 18 deletions(-) (limited to 'flags.c') diff --git a/flags.c b/flags.c index 9638526..c8e872d 100644 --- a/flags.c +++ b/flags.c @@ -5,36 +5,160 @@ #include "dat.h" #include "fns.h" -Term *setdoublequotes(Term *); +void setcharconversion(Term *); +void setdebug(Term *); +void setunknown(Term *); +void setdoublequotes(Term *); + +static Rune *boundedvals[] = { + [BoundedTrue] = L"true", + [BoundedFalse] = L"false" +}; + +static Rune *integerroundvals[] = { + [IntegerRoundDown] = L"down", + [IntegerRoundTowardZero] = L"toward_zero" +}; + +static Rune *charconversionvals[] = { + [CharConversionOn] = L"on", + [CharConversionOff] = L"off" +}; + +static Rune *debugvals[] = { + [DebugOn] = L"on", + [DebugOff] = L"off" +}; + +static Rune *unknownvals[] = { + [UnknownError] = L"error", + [UnknownFail] = L"fail", + [UnknownWarning] = L"warning" +}; + +static Rune *doublequotesvals[] = { + [DoubleQuotesChars] = L"chars", + [DoubleQuotesCodes] = L"codes", + [DoubleQuotesAtom] = L"atom" +}; void initflags(void) { + uvlong zero = 0; + + flagbounded = BoundedTrue; + flagmaxinteger = (~zero)>>1; + flagmininteger = flagmaxinteger+1; + flagintegerroundingfunction = IntegerRoundDown; + flagcharconversion = CharConversionOff; + flagdebug = DebugOff; + flagunknown = UnknownError; flagdoublequotes = DoubleQuotesChars; } -Term * +void setflag(Rune *flag, Term *value) { - if(runestrcmp(flag, L"double_quotes") == 0) - return setdoublequotes(value); - else - return permissionerror(L"modify", L"flag", mkatom(flag)); + if(runestrcmp(flag, L"char_conversion") == 0) + setcharconversion(value); + else if(runestrcmp(flag, L"debug") == 0) + setdebug(value); + else if(runestrcmp(flag, L"unknown") == 0) + setunknown(value); + else if(runestrcmp(flag, L"double_quotes") == 0) + setdoublequotes(value); } Term * +getallflags(void) +{ + Term *boundedval = mkatom(boundedvals[flagbounded]); + Term *maxintval = mkinteger(flagmaxinteger); + Term *minintval = mkinteger(flagmininteger); + Term *roundingval = mkatom(integerroundvals[flagintegerroundingfunction]); + Term *charconvval = mkatom(charconversionvals[flagcharconversion]); + Term *debugval = mkatom(debugvals[flagdebug]); + Term *unknownval = mkatom(unknownvals[flagunknown]); + Term *doublequotesval = mkatom(doublequotesvals[flagdoublequotes]); + + Term *boundedkey = mkatom(L"bounded"); + boundedkey->next = boundedval; + Term *maxintkey = mkatom(L"max_integer"); + maxintkey->next = maxintval; + Term *minintkey = mkatom(L"min_integer"); + minintkey->next = minintval; + Term *roundingkey = mkatom(L"integer_rounding_function"); + roundingkey->next = roundingval; + Term *charconvkey = mkatom(L"character_conversion"); + charconvkey->next = charconvval; + Term *debugkey = mkatom(L"debug"); + debugkey->next = debugval; + Term *unknownkey = mkatom(L"unknown"); + unknownkey->next = unknownval; + Term *doublequoteskey = mkatom(L"double_quotes"); + doublequoteskey->next = doublequotesval; + + Term *boundedflag = mkcompound(L"flag", 2, boundedkey); + Term *maxintflag = mkcompound(L"flag", 2, maxintkey); + Term *minintflag = mkcompound(L"flag", 2, minintkey); + Term *roundingflag = mkcompound(L"flag", 2, roundingkey); + Term *charconvflag = mkcompound(L"flag", 2, charconvkey); + Term *debugflag = mkcompound(L"flag", 2, debugkey); + Term *unknownflag = mkcompound(L"flag", 2, unknownkey); + Term *doublequotesflag = mkcompound(L"flag", 2, doublequoteskey); + + boundedflag->next = maxintflag; + maxintflag->next = minintflag; + minintflag->next = roundingflag; + roundingflag->next = charconvflag; + charconvflag->next = debugflag; + debugflag->next = unknownflag; + unknownflag->next = doublequotesflag; + + return boundedflag; +} + +void +setcharconversion(Term *value) +{ + int max = 2; + int i; + for(i = 0; i < max; i++){ + if(runestrcmp(value->text, charconversionvals[i]) == 0) + flagcharconversion = i; + } +} + +void +setdebug(Term *value) +{ + int max = 2; + int i; + for(i = 0; i < max; i++){ + if(runestrcmp(value->text, debugvals[i]) == 0) + flagdebug = i; + } +} + +void +setunknown(Term *value) +{ + int max = 3; + int i; + for(i = 0; i < max; i++){ + if(runestrcmp(value->text, unknownvals[i]) == 0) + flagunknown = i; + } +} + +void setdoublequotes(Term *value) { - if(value->tag != AtomTerm) - return typeerror(L"atom", value); - - if(runestrcmp(value->text, L"chars") == 0) - flagdoublequotes = DoubleQuotesChars; - else if(runestrcmp(value->text, L"codes") == 0) - flagdoublequotes = DoubleQuotesCodes; - else if(runestrcmp(value->text, L"atom") == 0) - flagdoublequotes = DoubleQuotesAtom; - else - return domainerror(L"flag_value", value); - return nil; + int max = 3; + int i; + for(i = 0; i < max; i++){ + if(runestrcmp(value->text, doublequotesvals[i]) == 0) + flagdoublequotes = i; + } } \ No newline at end of file -- cgit v1.2.3