From: Keith Packard Date: Wed, 3 Jan 2018 22:53:48 +0000 (-0800) Subject: altos/scheme: Add support for hex, octal and binary constants X-Git-Tag: 1.8.5~1^2~2^2~30 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=fccb5105b79d5b9e2ed052ce5459028015c01741 altos/scheme: Add support for hex, octal and binary constants Signed-off-by: Keith Packard --- diff --git a/src/scheme/ao_scheme_read.c b/src/scheme/ao_scheme_read.c index e93466fc..9174de5e 100644 --- a/src/scheme/ao_scheme_read.c +++ b/src/scheme/ao_scheme_read.c @@ -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) { diff --git a/src/scheme/ao_scheme_read.h b/src/scheme/ao_scheme_read.h index 1aa11a3a..d0b9b36a 100644 --- a/src/scheme/ao_scheme_read.h +++ b/src/scheme/ao_scheme_read.h @@ -65,10 +65,11 @@ # 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_ */