parser: Add .init directive
authorDavid Schleef <ds@schleef.org>
Thu, 12 Aug 2010 00:46:30 +0000 (17:46 -0700)
committerDavid Schleef <ds@schleef.org>
Thu, 12 Aug 2010 00:46:30 +0000 (17:46 -0700)
orc/orcparse.c
orc/orcparse.h
orc/orcprogram.h
tools/orcc.c

index 2f4d974..2a5f891 100644 (file)
@@ -59,6 +59,7 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log)
 {
   OrcParser _parser;
   OrcParser *parser = &_parser;
+  char *init_function = NULL;
 
   memset (parser, 0, sizeof(*parser));
 
@@ -135,6 +136,14 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log)
         parser->programs[parser->n_programs] = parser->program;
         parser->n_programs++;
         parser->creg_index = 1;
+      } else if (strcmp (token[0], ".init") == 0) {
+        if (init_function) free (init_function);
+        if (n_tokens < 2) {
+          orc_parse_log (parser, "error: line %d: .init without function name\n",
+              parser->line_number);
+        } else {
+          init_function = strdup (token[1]);
+        }
       } else if (strcmp (token[0], ".flags") == 0) {
         int i;
         for(i=1;i<n_tokens;i++){
@@ -247,6 +256,7 @@ orc_parse_full (const char *code, OrcProgram ***programs, char **log)
   } else {
     free (parser->log);
   }
+  parser->programs[0]->init_function = init_function;
   *programs = parser->programs;
   return parser->n_programs;
 }
@@ -400,3 +410,9 @@ orc_parse_sanity_check (OrcParser *parser, OrcProgram *program)
 
 }
 
+const char *
+orc_parse_get_init_function (OrcProgram *program)
+{
+  return program->init_function;
+}
+
index 0d56f4d..b95a267 100644 (file)
@@ -8,6 +8,7 @@ ORC_BEGIN_DECLS
 
 int orc_parse (const char *code, OrcProgram ***programs);
 int orc_parse_full (const char *code, OrcProgram ***programs, char **log);
+const char * orc_parse_get_init_function (OrcProgram *program);
 
 ORC_END_DECLS
 
index e7ba9cd..a741a41 100644 (file)
@@ -369,6 +369,9 @@ struct _OrcProgram {
   int constant_m;
 
   OrcCode *orccode;
+
+  /* Hide this here.  Belongs in a Parser object */
+  char *init_function;
 };
 
 /**
index eac64ef..f28e40c 100644 (file)
@@ -31,7 +31,7 @@ OrcProgram **programs;
 
 int use_inline = FALSE;
 
-char *init_function = NULL;
+const char *init_function = NULL;
 
 char *target = "sse";
 
@@ -220,6 +220,10 @@ main (int argc, char *argv[])
   n_programs = n;
   printf("%s", log);
 
+  if (init_function == NULL) {
+    init_function = orc_parse_get_init_function (programs[0]);
+  }
+
   output = fopen (output_file, "w");
   if (!output) {
     printf("Could not write output file: %s\n", output_file);