glsl/pp: Differentiate between integer and floating-point number tokens.
authorMichal Krol <michal@vmware.com>
Tue, 22 Sep 2009 10:51:08 +0000 (12:51 +0200)
committerMichal Krol <michal@vmware.com>
Tue, 22 Sep 2009 10:51:08 +0000 (12:51 +0200)
src/glsl/pp/sl_pp_error.c
src/glsl/pp/sl_pp_expression.c
src/glsl/pp/sl_pp_if.c
src/glsl/pp/sl_pp_line.c
src/glsl/pp/sl_pp_macro.c
src/glsl/pp/sl_pp_token.c
src/glsl/pp/sl_pp_token.h
src/glsl/pp/sl_pp_version.c

index d42568d23dc7698cc07468710e4fc68629b3124e..e591f4beef97e98331d47352eb22531f4a4ec656 100644 (file)
@@ -239,8 +239,12 @@ sl_pp_process_error(struct sl_pp_context *context,
          s = sl_pp_context_cstr(context, input[i].data.identifier);
          break;
 
-      case SL_PP_NUMBER:
-         s = sl_pp_context_cstr(context, input[i].data.number);
+      case SL_PP_UINT:
+         s = sl_pp_context_cstr(context, input[i].data._uint);
+         break;
+
+      case SL_PP_FLOAT:
+         s = sl_pp_context_cstr(context, input[i].data._float);
          break;
 
       case SL_PP_OTHER:
index 6b2329ed1a7bfe4f36d2a318d026cecb753b76e4..5093ef6cc9d9b3a0014642f02c86ba44dfca5df8 100644 (file)
@@ -42,8 +42,8 @@ static int
 _parse_primary(struct parse_context *ctx,
                int *result)
 {
-   if (ctx->input->token == SL_PP_NUMBER) {
-      *result = atoi(sl_pp_context_cstr(ctx->context, ctx->input->data.number));
+   if (ctx->input->token == SL_PP_UINT) {
+      *result = atoi(sl_pp_context_cstr(ctx->context, ctx->input->data._uint));
       ctx->input++;
    } else {
       if (ctx->input->token != SL_PP_LPAREN) {
index cf1c746d5f60517c64dbec07693d3f729518f8d1..5fa27fcf053f78bc9bc1c56e7990f105f8be540a 100644 (file)
@@ -81,13 +81,13 @@ _parse_defined(struct sl_pp_context *context,
       (*pi)++;
    }
 
-   result.token = SL_PP_NUMBER;
+   result.token = SL_PP_UINT;
    if (defined) {
-      result.data.number = sl_pp_context_add_unique_str(context, "1");
+      result.data._uint = sl_pp_context_add_unique_str(context, "1");
    } else {
-      result.data.number = sl_pp_context_add_unique_str(context, "0");
+      result.data._uint = sl_pp_context_add_unique_str(context, "0");
    }
-   if (result.data.number == -1) {
+   if (result.data._uint == -1) {
       return -1;
    }
 
index cab0262686ca2b15a7c8dc650580b5f9d256ea74..e8f751003ac0a4d3c016f7af4ea0a07d6a02ea07 100644 (file)
@@ -67,8 +67,8 @@ sl_pp_process_line(struct sl_pp_context *context,
       }
    }
 
-   if (state.out_len > 0 && state.out[0].token == SL_PP_NUMBER) {
-      line_number = state.out[0].data.number;
+   if (state.out_len > 0 && state.out[0].token == SL_PP_UINT) {
+      line_number = state.out[0].data._uint;
    } else {
       strcpy(context->error_msg, "expected a number after `#line'");
       free(state.out);
@@ -76,8 +76,8 @@ sl_pp_process_line(struct sl_pp_context *context,
    }
 
    if (state.out_len > 1) {
-      if (state.out[1].token == SL_PP_NUMBER) {
-         file_number = state.out[1].data.number;
+      if (state.out[1].token == SL_PP_UINT) {
+         file_number = state.out[1].data._uint;
       } else {
          strcpy(context->error_msg, "expected a number after line number");
          free(state.out);
index 878b22ed9c38f92a435de4cb2fbdc453f2bc2e5a..3956ba3b5743c89b2ff2bb0ca5ec7aaac1d6df47 100644 (file)
@@ -105,8 +105,8 @@ _out_number(struct sl_pp_context *context,
 
    sprintf(buf, "%u", number);
 
-   ti.token = SL_PP_NUMBER;
-   ti.data.number = sl_pp_context_add_unique_str(context, buf);
+   ti.token = SL_PP_UINT;
+   ti.data._uint = sl_pp_context_add_unique_str(context, buf);
    if (sl_pp_process_out(state, &ti)) {
       strcpy(context->error_msg, "out of memory");
       return -1;
index 3a7ffe7db15854762f501177f6fab045fc5b7be3..99a32a6e6715b2290dfb2341a3d0176d3c19226e 100644 (file)
@@ -271,6 +271,7 @@ _tokenise_number(struct sl_pp_context *context,
 {
    const char *input = *pinput;
    unsigned int eaten;
+   unsigned int is_float = 0;
    char number[256];   /* XXX: Remove this artifical limit. */
 
    eaten = _parse_float(input);
@@ -282,6 +283,8 @@ _tokenise_number(struct sl_pp_context *context,
             eaten = _parse_dec(input);
          }
       }
+   } else {
+      is_float = 1;
    }
 
    if (!eaten || _is_identifier_char(input[eaten])) {
@@ -297,10 +300,18 @@ _tokenise_number(struct sl_pp_context *context,
    memcpy(number, input, eaten);
    number[eaten] = '\0';
 
-   info->token = SL_PP_NUMBER;
-   info->data.number = sl_pp_context_add_unique_str(context, number);
-   if (info->data.number == -1) {
-      return -1;
+   if (is_float) {
+      info->token = SL_PP_FLOAT;
+      info->data._float = sl_pp_context_add_unique_str(context, number);
+      if (info->data._float == -1) {
+         return -1;
+      }
+   } else {
+      info->token = SL_PP_UINT;
+      info->data._uint = sl_pp_context_add_unique_str(context, number);
+      if (info->data._uint == -1) {
+         return -1;
+      }
    }
 
    *pinput = input + eaten;
index 4131be6bdadd6d49e370b678a1e784d9ff14faf4..2a7b79ea3f7fb5df9ed02dd3ee36ac68a436fa3f 100644 (file)
@@ -82,7 +82,8 @@ enum sl_pp_token {
 
    SL_PP_IDENTIFIER,
 
-   SL_PP_NUMBER,
+   SL_PP_UINT,
+   SL_PP_FLOAT,
 
    SL_PP_OTHER,
 
@@ -102,7 +103,8 @@ enum sl_pp_token {
 
 union sl_pp_token_data {
    int identifier;
-   int number;
+   int _uint;
+   int _float;
    char other;
    int pragma;
    int extension;
index 825967d4c109ae2bbe4e9219829a35f18e538ae7..adf3017bf214ec235ed976ff29dfb03b1ad4d943 100644 (file)
@@ -99,8 +99,8 @@ sl_pp_version(struct sl_pp_context *context,
             i++;
             break;
 
-         case SL_PP_NUMBER:
-            *version = atoi(sl_pp_context_cstr(context, input[i].data.number));
+         case SL_PP_UINT:
+            *version = atoi(sl_pp_context_cstr(context, input[i].data._uint));
             i++;
             found_number = 1;
             break;