aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
authorLinus Torvalds <torvalds@ppc970.osdl.org>2004-06-05 13:22:51 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-07 21:02:01 -0700
commit1694b992f1834bed9cbceafa795b511ee52efaca (patch)
treeb144a4906130b7df87a847472e82bc04d242223d
parent930f205a62cd53ecf19d68297895bb4025db28e8 (diff)
downloadsparse-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.c54
-rw-r--r--pre-process.c40
-rw-r--r--token.h6
-rw-r--r--tokenize.c147
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;
}
}
diff --git a/token.h b/token.h
index b9a699c8..cc9ff9a2 100644
--- a/token.h
+++ b/token.h
@@ -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;
diff --git a/tokenize.c b/tokenize.c
index 6362d995..b1867d25 100644
--- a/tokenize.c
+++ b/tokenize.c
@@ -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)