summaryrefslogtreecommitdiff
path: root/flags.c
diff options
context:
space:
mode:
Diffstat (limited to 'flags.c')
-rw-r--r--flags.c160
1 files changed, 142 insertions, 18 deletions
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