glapi.c: misc cosmetic
[mesa.git] / src / glsl / pp / sl_pp_context.c
index 50ec790cc500199d8bfa954ea4d63fa21da21738..74a9bdddfdc13f44e9089f952aa22a0ca7f0391e 100644 (file)
  **************************************************************************/
 
 #include <stdlib.h>
+#include <string.h>
+#include "sl_pp_public.h"
 #include "sl_pp_context.h"
 
 
-void
-sl_pp_context_init(struct sl_pp_context *context)
+struct sl_pp_context *
+sl_pp_context_create(const char *input,
+                     const struct sl_pp_purify_options *options)
 {
-   memset(context, 0, sizeof(struct sl_pp_context));
+   struct sl_pp_context *context;
+
+   context = calloc(1, sizeof(struct sl_pp_context));
+   if (!context) {
+      return NULL;
+   }
+
+   if (sl_pp_dict_init(context)) {
+      sl_pp_context_destroy(context);
+      return NULL;
+   }
+
+   context->getc_buf_capacity = 64;
+   context->getc_buf = malloc(context->getc_buf_capacity * sizeof(char));
+   if (!context->getc_buf) {
+      sl_pp_context_destroy(context);
+      return NULL;
+   }
+
+   if (sl_pp_token_buffer_init(&context->tokens, context)) {
+      sl_pp_context_destroy(context);
+      return NULL;
+   }
+
    context->macro_tail = &context->macro;
    context->if_ptr = SL_PP_MAX_IF_NESTING;
    context->if_value = 1;
+   memset(context->error_msg, 0, sizeof(context->error_msg));
+   context->error_line = 1;
+   context->line = 1;
+   context->file = 0;
+
+   sl_pp_purify_state_init(&context->pure, input, options);
+
+   memset(&context->process_state, 0, sizeof(context->process_state));
+
+   return context;
 }
 
 void
 sl_pp_context_destroy(struct sl_pp_context *context)
 {
-   free(context->cstr_pool);
-   sl_pp_macro_free(context->macro);
+   if (context) {
+      free(context->cstr_pool);
+      sl_pp_macro_free(context->macro);
+      free(context->getc_buf);
+      sl_pp_token_buffer_destroy(&context->tokens);
+      free(context->process_state.out);
+      free(context);
+   }
+}
+
+const char *
+sl_pp_context_error_message(const struct sl_pp_context *context)
+{
+   return context->error_msg;
+}
+
+void
+sl_pp_context_error_position(const struct sl_pp_context *context,
+                             unsigned int *file,
+                             unsigned int *line)
+{
+   if (file) {
+      *file = 0;
+   }
+   if (line) {
+      *line = context->error_line;
+   }
+}
+
+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
@@ -74,6 +160,7 @@ sl_pp_context_add_unique_str(struct sl_pp_context *context,
    }
 
    if (!context->cstr_pool) {
+      strcpy(context->error_msg, "out of memory");
       return -1;
    }