diff options
| author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2004-06-05 13:22:51 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-07 21:02:01 -0700 |
| commit | 1694b992f1834bed9cbceafa795b511ee52efaca (patch) | |
| tree | b144a4906130b7df87a847472e82bc04d242223d | |
| parent | 930f205a62cd53ecf19d68297895bb4025db28e8 (diff) | |
| download | sparse-dev-1694b992f1834bed9cbceafa795b511ee52efaca.tar.gz | |
Remove TOKEN_FP vs TOKEN_INTEGER distinction, and make numbers be
just TOKEN_NUMBER.
This matches how tokenization is supposed to be done, and simplifies
the code.
Expression evaluation changed to cope with the new rules.
| -rw-r--r-- | expression.c | 54 | ||||
| -rw-r--r-- | pre-process.c | 40 | ||||
| -rw-r--r-- | token.h | 6 | ||||
| -rw-r--r-- | tokenize.c | 147 |
4 files changed, 84 insertions, 163 deletions
diff --git a/expression.c b/expression.c index a8ca454b..a8f39d30 100644 --- a/expression.c +++ b/expression.c @@ -88,21 +88,35 @@ static struct token *string_expression(struct token *token, struct expression *e return next; } -static void get_int_value(struct expression *expr, struct token *token) +static void get_fp_value(struct expression *expr, struct token *token) { - const char *str = token->integer; + static int fp_warned; + + expr->ctype = &double_ctype; + expr->value = 0; + if (!fp_warned) { + warn(token->pos, "FP values not yet implemented"); + fp_warned = 1; + } +} + +static void get_number_value(struct expression *expr, struct token *token) +{ + const char *str = token->number; unsigned long long value = 0; unsigned int base = 10, digit, bits; unsigned long modifiers, extramod; - switch (str[0]) { - case 'x': - base = 18; // the -= 2 for the octal case will - str++; // skip the 'x' - /* fallthrough */ - case 'o': - str++; // skip the 'o' or 'x/X' - base -= 2; // the fall-through will make this 8 + if (str[0] == '0') { + switch (str[1]) { + case 'x': case 'X': + base = 18; // the -= 2 for the octal case will + str++; // skip the '0' + /* fallthrough */ + case '0'...'7': + str++; // skip the '0' or 'x/X' + base -= 2; // the fall-through will make this 8 + } } while ((digit = hexval(*str)) < base) { value = value * base + digit; @@ -121,6 +135,10 @@ static void get_int_value(struct expression *expr, struct token *token) modifiers |= MOD_LONG; continue; } + if (c) { + get_fp_value(expr, token); + return; + } break; } @@ -175,18 +193,6 @@ struct token *primary_expression(struct token *token, struct expression **tree) struct expression *expr = NULL; switch (token_type(token)) { - static int fp_warned; - case TOKEN_FP: - expr = alloc_expression(token->pos, EXPR_VALUE); - expr->ctype = &double_ctype; - expr->value = 0; - if (!fp_warned) { - warn(token->pos, "FP values not yet implemented"); - fp_warned = 1; - } - token = token->next; - break; - case TOKEN_CHAR: expr = alloc_expression(token->pos, EXPR_VALUE); expr->ctype = &int_ctype; @@ -194,9 +200,9 @@ struct token *primary_expression(struct token *token, struct expression **tree) token = token->next; break; - case TOKEN_INTEGER: + case TOKEN_NUMBER: expr = alloc_expression(token->pos, EXPR_VALUE); - get_int_value(expr, token); + get_number_value(expr, token); token = token->next; break; diff --git a/pre-process.c b/pre-process.c index c9708c68..72077361 100644 --- a/pre-process.c +++ b/pre-process.c @@ -99,8 +99,8 @@ static struct token *is_defined(struct token *head, struct token *token, struct char *defined = string[lookup_symbol(token->ident, NS_PREPROCESSOR) != NULL]; struct token *newtoken = alloc_token(&token->pos); - token_type(newtoken) = TOKEN_INTEGER; - newtoken->integer = defined; + token_type(newtoken) = TOKEN_NUMBER; + newtoken->number = defined; newtoken->next = next; head->next = newtoken; return next; @@ -144,8 +144,8 @@ static void replace_with_integer(struct token *token, unsigned int val) { char *buf = __alloc_bytes(10); sprintf(buf, "%d", val); - token_type(token) = TOKEN_INTEGER; - token->integer = buf; + token_type(token) = TOKEN_NUMBER; + token->number = buf; } struct token *expand_one_symbol(struct token *parent, struct token *head, struct token *token) @@ -212,7 +212,7 @@ static struct token *dup_token(struct token *token, struct position *streampos, token_type(alloc) = token_type(token); alloc->pos.newline = pos->newline; alloc->pos.whitespace = pos->whitespace; - alloc->integer = token->integer; + alloc->number = token->number; return alloc; } @@ -386,22 +386,12 @@ static struct token *hashhash(struct token *head, struct token *first) int len; switch (token_type(token)) { - case TOKEN_INTEGER: - src = token->integer; - len = strlen(src); - switch (*src) { - case 'o': case 'x': - *p++ = '0'; - len--; - src++; - } - break; case TOKEN_IDENT: len = token->ident->len; src = token->ident->name; break; - case TOKEN_FP: - src = token->fp; + case TOKEN_NUMBER: + src = token->number; len = strlen(src); break; default: @@ -425,19 +415,9 @@ out: case TOKEN_IDENT: newtoken->ident = built_in_ident(buffer); break; - case TOKEN_INTEGER: { - if (buffer[0] == '0') { - switch (buffer[1]) { - case 'x': case 'X': - buffer[0] = 'x'; - break; - case '0' ... '7': - buffer[0] = 'o'; - break; - } - } - newtoken->integer = __alloc_bytes(p - buffer); - memcpy(newtoken->integer, buffer, p - buffer); + case TOKEN_NUMBER: { + newtoken->number = __alloc_bytes(p - buffer); + memcpy(newtoken->number, buffer, p - buffer); break; } } @@ -50,8 +50,7 @@ enum token_type { TOKEN_EOF, TOKEN_ERROR, TOKEN_IDENT, - TOKEN_INTEGER, - TOKEN_FP, + TOKEN_NUMBER, TOKEN_CHAR, TOKEN_STRING, TOKEN_SPECIAL, @@ -122,8 +121,7 @@ struct token { struct token *next; struct token *parent; union { - char *integer; - char *fp; + char *number; struct ident *ident; unsigned int special; struct string *string; @@ -117,21 +117,8 @@ const char *show_token(const struct token *token) case TOKEN_STRING: return show_string(token->string); - case TOKEN_INTEGER: { - const char *p = token->integer; - switch (*p) { - case 'o': // octal - case 'x': // hex - buffer[0] = '0'; - strcpy(buffer+1, p+1); - return buffer; - default: - return p; - } - } - - case TOKEN_FP: - return token->fp; + case TOKEN_NUMBER: + return token->number; case TOKEN_SPECIAL: return show_special(token->special); @@ -278,108 +265,58 @@ static void drop_token(stream_t *stream) stream->token = NULL; } -static int get_base_number(unsigned int base, char **p, int next, stream_t *stream) -{ - char *buf = *p; - - *buf++ = next; - for (;;) { - unsigned int n; - next = nextchar(stream); - n = hexval(next); - if (n >= base) - break; - *buf++ = next; - } - *p = buf; - return next; -} -static int do_fp(char *buffer, int len, int next, stream_t *stream) +/* + * pp-number: + * digit + * . digit + * pp-number digit + * pp-number identifier-nodigit + * pp-number e sign + * pp-number E sign + * pp-number p sign + * pp-number P sign + * pp-number . + */ +static int get_one_number(int c, int next, stream_t *stream) { - struct token *token = stream->token; - void *buf; + struct token *token; + static char buffer[256]; + char *p = buffer, *buf; + int len; - /* Get the decimal part */ - if (next == '.') { - buffer[len++] = next; - next = nextchar(stream); - while (next >= '0' && next <= '9') { - buffer[len++] = next; + *p++ = c; + for (;;) { + switch (next) { + case 'e': case 'E': + case 'p': case 'P': + *p++ = next; next = nextchar(stream); - } - } - - /* Get the exponential part */ - if (next == 'e' || next == 'E') { - buffer[len++] = next; - next = nextchar(stream); - while (next >= '0' && next <= '9') { - buffer[len++] = next; + if (next != '-' && next != '+') + continue; + /* Fallthrough for sign of 'e'/'p' */ + case '0'...'9': + case '.': case '_': + case 'a'...'d': case 'A'...'D': + case 'f'...'o': case 'F'...'O': + case 'q'...'z': case 'Q'...'Z': + *p++ = next; next = nextchar(stream); + continue; } + break; } - - /* Get the 'lf' type specifiers */ - while (next == 'f' || next == 'F' || next == 'l' || next == 'L') { - buffer[len++] = next; - next = nextchar(stream); - } - - buffer[len++] = '\0'; + *p++ = 0; + len = p - buffer; buf = __alloc_bytes(len); memcpy(buf, buffer, len); - token_type(token) = TOKEN_FP; - token->fp = buf; - add_token(stream); - return next; -} - -static int do_integer(char *buffer, int len, int next, stream_t *stream) -{ - struct token *token = stream->token; - void *buf; - if (next == '.' || next == 'e' || next == 'E') - return do_fp(buffer, len, next, stream); - - while (next == 'u' || next == 'U' || next == 'l' || next == 'L') { - buffer[len++] = next; - next = nextchar(stream); - } - buffer[len++] = '\0'; - buf = __alloc_bytes(len); - memcpy(buf, buffer, len); - token_type(token) = TOKEN_INTEGER; - token->integer = buf; + token = stream->token; + token_type(token) = TOKEN_NUMBER; + token->number = buf; add_token(stream); - return next; -} - -static int get_one_number(int c, int next, stream_t *stream) -{ - static char buffer[256]; - char *p = buffer; - *p++ = c; - switch (next) { - case '0'...'7': - if (c == '0') { - buffer[0] = 'o'; - next = get_base_number(8, &p, next, stream); - break; - } - /* fallthrough */ - case '8'...'9': - next = get_base_number(10, &p, next, stream); - break; - case 'x': case 'X': - if (c == '0') { - buffer[0] = 'x'; - next = get_base_number(16, &p, next, stream); - } - } - return do_integer(buffer, p - buffer, next, stream); + return next; } static int escapechar(int first, int type, stream_t *stream, int *valp) |
