glsl/pp: Add support for user-defined macros.
authorMichal Krol <michal@vmware.com>
Thu, 10 Dec 2009 11:58:21 +0000 (12:58 +0100)
committerMichal Krol <michal@vmware.com>
Thu, 10 Dec 2009 11:58:21 +0000 (12:58 +0100)
src/glsl/pp/sl_pp_context.c
src/glsl/pp/sl_pp_context.h
src/glsl/pp/sl_pp_macro.c
src/glsl/pp/sl_pp_public.h

index 134588d90668a234ae798dd86d4e0b8c897eea9d..afc1b84d16af9443e100c28523de38798e853d0c 100644 (file)
@@ -79,6 +79,31 @@ sl_pp_context_error_message(const struct sl_pp_context *context)
    return context->error_msg;
 }
 
+int
+sl_pp_context_add_predefined(struct sl_pp_context *context,
+                             const char *name,
+                             const char *value)
+{
+   struct sl_pp_predefined pre;
+
+   if (context->num_predefined == SL_PP_MAX_PREDEFINED) {
+      return -1;
+   }
+
+   pre.name = sl_pp_context_add_unique_str(context, name);
+   if (pre.name == -1) {
+      return -1;
+   }
+
+   pre.value = sl_pp_context_add_unique_str(context, value);
+   if (pre.value == -1) {
+      return -1;
+   }
+
+   context->predefined[context->num_predefined++] = pre;
+   return 0;
+}
+
 int
 sl_pp_context_add_unique_str(struct sl_pp_context *context,
                              const char *str)
index 5e3ae72fdfa1cba66ad6ab866b546458db3da35d..d95d29e275c9c6205c5b67cf098d11520b75b34a 100644 (file)
 
 #define SL_PP_MAX_EXTENSIONS  16
 
+#define SL_PP_MAX_PREDEFINED  16
+
 struct sl_pp_extension {
    int name;         /*< VENDOR_extension_name */
    int name_string;  /*< GL_VENDOR_extension_name */
 };
 
+struct sl_pp_predefined {
+   int name;
+   int value;
+};
+
 struct sl_pp_context {
    char *cstr_pool;
    unsigned int cstr_pool_max;
@@ -56,6 +63,9 @@ struct sl_pp_context {
    struct sl_pp_extension extensions[SL_PP_MAX_EXTENSIONS];
    unsigned int num_extensions;
 
+   struct sl_pp_predefined predefined[SL_PP_MAX_PREDEFINED];
+   unsigned int num_predefined;
+
    unsigned int if_stack[SL_PP_MAX_IF_NESTING];
    unsigned int if_ptr;
    unsigned int if_value;
index 05466c9a7c39f8cbcb0b6292c08f1d8be83890aa..08b44c7cbe4ebe30a80f5fb36fb77bf718c0d825 100644 (file)
@@ -163,6 +163,23 @@ sl_pp_macro_expand(struct sl_pp_context *context,
       return 0;
    }
 
+   for (j = 0; j < context->num_predefined; j++) {
+      if (macro_name == context->predefined[j].name) {
+         if (!mute) {
+            struct sl_pp_token_info ti;
+
+            ti.token = SL_PP_UINT;
+            ti.data._uint = context->predefined[j].value;
+            if (sl_pp_process_out(state, &ti)) {
+               strcpy(context->error_msg, "out of memory");
+               return -1;
+            }
+         }
+         (*pi)++;
+         return 0;
+      }
+   }
+
    /* Replace extension names with 1.
     */
    for (j = 0; j < context->num_extensions; j++) {
index 20f208975e4d2bc789a2ff23f7d5faeeaaadffd0..076903649cd5941946ccf05ed98bb7ff43c81b65 100644 (file)
@@ -50,6 +50,11 @@ sl_pp_context_add_extension(struct sl_pp_context *context,
                             const char *name,
                             const char *name_string);
 
+int
+sl_pp_context_add_predefined(struct sl_pp_context *context,
+                             const char *name,
+                             const char *value);
+
 int
 sl_pp_context_add_unique_str(struct sl_pp_context *context,
                              const char *str);