瀏覽代碼

ncd: NCDAst: implement include_guard directive

ambrop7 13 年之前
父節點
當前提交
509167b3b3
共有 6 個文件被更改,包括 49 次插入0 次删除
  1. 4 0
      examples/ncd_parser_test.c
  2. 31 0
      ncd/NCDAst.c
  3. 8 0
      ncd/NCDAst.h
  4. 1 0
      ncd/NCDInterpProg.c
  5. 4 0
      ncd/NCDInterpreter.c
  6. 1 0
      ncd/NCDSugar.c

+ 4 - 0
examples/ncd_parser_test.c

@@ -276,6 +276,10 @@ int main (int argc, char **argv)
                 printf("include path=%s\n", NCDProgramElem_IncludePathData(elem));
             } break;
             
+            case NCDPROGRAMELEM_INCLUDE_GUARD: {
+                printf("include_guard id=%s\n", NCDProgramElem_IncludeGuardIdData(elem));
+            } break;
+            
             default: ASSERT(0);
         }
     }

+ 31 - 0
ncd/NCDAst.c

@@ -451,6 +451,19 @@ int NCDProgramElem_InitInclude (NCDProgramElem *o, const char *path_data, size_t
     return 1;
 }
 
+int NCDProgramElem_InitIncludeGuard (NCDProgramElem *o, const char *id_data, size_t id_length)
+{
+    if (!(o->include_guard.id_data = b_strdup_bin(id_data, id_length))) {
+        return 0;
+    }
+    
+    o->type = NCDPROGRAMELEM_INCLUDE_GUARD;
+    o->include_guard.id_length = id_length;
+    
+    return 1;
+}
+
+
 void NCDProgramElem_Free (NCDProgramElem *o)
 {
     switch (o->type) {
@@ -462,6 +475,10 @@ void NCDProgramElem_Free (NCDProgramElem *o)
             free(o->include.path_data);
         } break;
         
+        case NCDPROGRAMELEM_INCLUDE_GUARD: {
+            free(o->include_guard.id_data);
+        } break;
+        
         default: ASSERT(0);
     }
 }
@@ -492,6 +509,20 @@ size_t NCDProgramElem_IncludePathLength (NCDProgramElem *o)
     return o->include.path_length;
 }
 
+const char * NCDProgramElem_IncludeGuardIdData (NCDProgramElem *o)
+{
+    ASSERT(o->type == NCDPROGRAMELEM_INCLUDE_GUARD)
+    
+    return o->include_guard.id_data;
+}
+
+size_t NCDProgramElem_IncludeGuardIdLength (NCDProgramElem *o)
+{
+    ASSERT(o->type == NCDPROGRAMELEM_INCLUDE_GUARD)
+    
+    return o->include_guard.id_length;
+}
+
 int NCDProcess_Init (NCDProcess *o, int is_template, const char *name, NCDBlock block)
 {
     ASSERT(is_template == !!is_template)

+ 8 - 0
ncd/NCDAst.h

@@ -90,6 +90,10 @@ struct NCDProgramElem_s {
             char *path_data;
             size_t path_length;
         } include;
+        struct {
+            char *id_data;
+            size_t id_length;
+        } include_guard;
     };
 };
 
@@ -150,6 +154,7 @@ struct IfBlockIf {
 
 #define NCDPROGRAMELEM_PROCESS 1
 #define NCDPROGRAMELEM_INCLUDE 2
+#define NCDPROGRAMELEM_INCLUDE_GUARD 3
 
 #define NCDSTATEMENT_REG 1
 #define NCDSTATEMENT_IF 2
@@ -186,11 +191,14 @@ int NCDProgram_ContainsElemType (NCDProgram *o, int elem_type);
 
 void NCDProgramElem_InitProcess (NCDProgramElem *o, NCDProcess process);
 int NCDProgramElem_InitInclude (NCDProgramElem *o, const char *path_data, size_t path_length) WARN_UNUSED;
+int NCDProgramElem_InitIncludeGuard (NCDProgramElem *o, const char *id_data, size_t id_length) WARN_UNUSED;
 void NCDProgramElem_Free (NCDProgramElem *o);
 int NCDProgramElem_Type (NCDProgramElem *o);
 NCDProcess * NCDProgramElem_Process (NCDProgramElem *o);
 const char * NCDProgramElem_IncludePathData (NCDProgramElem *o);
 size_t NCDProgramElem_IncludePathLength (NCDProgramElem *o);
+const char * NCDProgramElem_IncludeGuardIdData (NCDProgramElem *o);
+size_t NCDProgramElem_IncludeGuardIdLength (NCDProgramElem *o);
 
 int NCDProcess_Init (NCDProcess *o, int is_template, const char *name, NCDBlock block) WARN_UNUSED;
 void NCDProcess_Free (NCDProcess *o);

+ 1 - 0
ncd/NCDInterpProg.c

@@ -45,6 +45,7 @@ int NCDInterpProg_Init (NCDInterpProg *o, NCDProgram *prog, NCDStringIndex *stri
 {
     ASSERT(prog)
     ASSERT(!NCDProgram_ContainsElemType(prog, NCDPROGRAMELEM_INCLUDE))
+    ASSERT(!NCDProgram_ContainsElemType(prog, NCDPROGRAMELEM_INCLUDE_GUARD))
     ASSERT(string_index)
     ASSERT(pdb)
     ASSERT(module_index)

+ 4 - 0
ncd/NCDInterpreter.c

@@ -186,6 +186,10 @@ int NCDInterpreter_Init (NCDInterpreter *o, const char *program, size_t program_
         BLog(BLOG_ERROR, "TODO include not implemented");
         goto fail4;
     }
+    if (NCDProgram_ContainsElemType(&o->program, NCDPROGRAMELEM_INCLUDE_GUARD)) {
+        BLog(BLOG_ERROR, "TODO include_guard not implemented");
+        goto fail4;
+    }
     
     // desugar
     if (!NCDSugar_Desugar(&o->program)) {

+ 1 - 0
ncd/NCDSugar.c

@@ -234,6 +234,7 @@ fail:
 int NCDSugar_Desugar (NCDProgram *prog)
 {
     ASSERT(!NCDProgram_ContainsElemType(prog, NCDPROGRAMELEM_INCLUDE))
+    ASSERT(!NCDProgram_ContainsElemType(prog, NCDPROGRAMELEM_INCLUDE_GUARD))
     
     struct desugar_state state;
     state.prog = prog;