altos/scheme: Add support for hex, octal and binary constants
authorKeith Packard <keithp@keithp.com>
Wed, 3 Jan 2018 22:53:48 +0000 (14:53 -0800)
committerKeith Packard <keithp@keithp.com>
Wed, 3 Jan 2018 22:53:48 +0000 (14:53 -0800)
Signed-off-by: Keith Packard <keithp@keithp.com>
src/scheme/ao_scheme_read.c
src/scheme/ao_scheme_read.h

index e93466fc688eff4142989f308d01b592e8985eaf..9174de5e2f9cd1d72704c34688c942432a21434a 100644 (file)
@@ -83,12 +83,12 @@ static const uint16_t       lex_classes[128] = {
        PRINTABLE,              /* > */
        PRINTABLE,              /* ? */
        PRINTABLE,              /*  @ */
-       PRINTABLE,              /*  A */
-       PRINTABLE,              /*  B */
-       PRINTABLE,              /*  C */
-       PRINTABLE,              /*  D */
-       PRINTABLE|FLOATC,       /*  E */
-       PRINTABLE,              /*  F */
+       PRINTABLE|HEX_LETTER,   /*  A */
+       PRINTABLE|HEX_LETTER,   /*  B */
+       PRINTABLE|HEX_LETTER,   /*  C */
+       PRINTABLE|HEX_LETTER,   /*  D */
+       PRINTABLE|FLOATC|HEX_LETTER,/*  E */
+       PRINTABLE|HEX_LETTER,   /*  F */
        PRINTABLE,              /*  G */
        PRINTABLE,              /*  H */
        PRINTABLE,              /*  I */
@@ -115,12 +115,12 @@ static const uint16_t     lex_classes[128] = {
        PRINTABLE,              /*  ^ */
        PRINTABLE,              /*  _ */
        PRINTABLE|SPECIAL_QUASI,        /*  ` */
-       PRINTABLE,              /*  a */
-       PRINTABLE,              /*  b */
-       PRINTABLE,              /*  c */
-       PRINTABLE,              /*  d */
-       PRINTABLE|FLOATC,       /*  e */
-       PRINTABLE,              /*  f */
+       PRINTABLE|HEX_LETTER,   /*  a */
+       PRINTABLE|HEX_LETTER,   /*  b */
+       PRINTABLE|HEX_LETTER,   /*  c */
+       PRINTABLE|HEX_LETTER,   /*  d */
+       PRINTABLE|FLOATC|HEX_LETTER,/*  e */
+       PRINTABLE|HEX_LETTER,   /*  f */
        PRINTABLE,              /*  g */
        PRINTABLE,              /*  h */
        PRINTABLE,              /*  i */
@@ -284,6 +284,30 @@ static const struct namedfloat namedfloats[] = {
 #define NUM_NAMED_FLOATS       (sizeof namedfloats / sizeof namedfloats[0])
 #endif
 
+static int
+parse_int(int base)
+{
+       int     cval;
+       int     c;
+
+       token_int = 0;
+       for (;;) {
+               c = lexc();
+               if ((lex_class & HEX_DIGIT) == 0) {
+                       lex_unget(c);
+                       end_token();
+                       return NUM;
+               }
+               add_token(c);
+               if ('0' <= c && c <= '9')
+                       cval = c - '0';
+               else
+                       cval = (c | ('a' - 'A')) - 'a' + 10;
+               token_int = token_int * base + cval;
+       }
+       return NUM;
+}
+
 static int
 _lex(void)
 {
@@ -387,6 +411,12 @@ _lex(void)
                                        continue;
                                }
                                return NUM;
+                       case 'x':
+                               return parse_int(16);
+                       case 'o':
+                               return parse_int(8);
+                       case 'b':
+                               return parse_int(2);
                        }
                }
                if (lex_class & STRINGC) {
index 1aa11a3a025b284e1e79b349fda34bdb2872cbca..d0b9b36a466f7636066177d60a2765de30d1e1a2 100644 (file)
 # define IGNORE                0x0200  /* \0 - ' ' */
 # define BACKSLASH     0x0400  /* \ */
 # define STRINGC       0x0800  /* " */
-# define POUND         0x1000  /* # */
+# define HEX_LETTER    0x1000  /* a-f A-F */
 
 # define NOTNAME       (STRINGC|COMMENT|ENDOFFILE|WHITE|SPECIAL)
 # define INTEGER       (DIGIT|SIGN)
 # define NUMBER                (INTEGER|FLOATC)
+# define HEX_DIGIT     (DIGIT|HEX_LETTER)
 
 #endif /* _AO_SCHEME_READ_H_ */