glsl: Handle file numbering.
authorMichal Krol <michal@vmware.com>
Fri, 4 Sep 2009 13:27:08 +0000 (15:27 +0200)
committerMichal Krol <michal@vmware.com>
Mon, 7 Sep 2009 08:12:10 +0000 (10:12 +0200)
src/glsl/pp/sl_pp_context.c
src/glsl/pp/sl_pp_context.h
src/glsl/pp/sl_pp_line.c
src/glsl/pp/sl_pp_macro.c
src/glsl/pp/sl_pp_token.h

index 6aaf76828cc801528caf7228ebf9994e9b8cc677..2fca3791a260d322e17f4d7f35278fa5ea94e4a3 100644 (file)
@@ -38,6 +38,7 @@ sl_pp_context_init(struct sl_pp_context *context)
    context->if_value = 1;
    memset(context->error_msg, 0, sizeof(context->error_msg));
    context->line = 1;
+   context->file = 0;
 }
 
 void
index d656648d0dc22a4f94d735d79539abc85db82e8a..c7e6770f449813b841d46fc65434ad3e8c5cd308 100644 (file)
@@ -50,6 +50,7 @@ struct sl_pp_context {
    char error_msg[SL_PP_MAX_ERROR_MSG];
 
    unsigned int line;
+   unsigned int file;
 };
 
 void
index 9b9f45dcedd9c760c03e2bf344e04b03c21a1897..a56417a8610d64dcc8f1c131adfb20b31c7de7a8 100644 (file)
@@ -134,7 +134,26 @@ sl_pp_process_line(struct sl_pp_context *context,
       context->line = line;
    }
 
-   /* TODO: Do something with the file number. */
+   if (file_number != -1) {
+      unsigned int file;
+
+      str = sl_pp_context_cstr(context, file_number);
+      if (_parse_integer(str, &file)) {
+         return -1;
+      }
+
+      if (context->file != file) {
+         struct sl_pp_token_info ti;
+
+         ti.token = SL_PP_FILE;
+         ti.data.file = file;
+         if (sl_pp_process_out(pstate, &ti)) {
+            return -1;
+         }
+
+         context->file = file;
+      }
+   }
 
    return 0;
 }
index b6214f66edc5ba39d8a0d3b8c8f52f0ddd8e2332..d14c98255571d4f1eeb4d283d0dc28b377b725c2 100644 (file)
@@ -138,9 +138,8 @@ sl_pp_macro_expand(struct sl_pp_context *context,
       (*pi)++;
       return 0;
    }
-   /* TODO: Having the following built-ins hardcoded is a bit lame. */
    if (!strcmp(macro_str, "__FILE__")) {
-      if (!mute && _out_number(context, state, 0)) {
+      if (!mute && _out_number(context, state, context->file)) {
          return -1;
       }
       (*pi)++;
index b347e5cf7a99743dfc1f654c21a6eeac894fc0bf..5901959383909c1bcb23d3017396c04e093ee29d 100644 (file)
@@ -97,6 +97,7 @@ enum sl_pp_token {
    SL_PP_EXTENSION_DISABLE,
 
    SL_PP_LINE,
+   SL_PP_FILE,
 
    SL_PP_EOF
 };
@@ -108,6 +109,7 @@ union sl_pp_token_data {
    int pragma;
    int extension;
    unsigned int line;
+   unsigned int file;
 };
 
 struct sl_pp_token_info {