Просмотр исходного кода

ncd: NCDAst: implement NCDProgram_RemoveElem() and NCDProgram_ReplaceElemWithProgram()

ambrop7 13 лет назад
Родитель
Сommit
ce803281ee
2 измененных файлов с 33 добавлено и 0 удалено
  1. 31 0
      ncd/NCDAst.c
  2. 2 0
      ncd/NCDAst.h

+ 31 - 0
ncd/NCDAst.c

@@ -433,6 +433,37 @@ int NCDProgram_ContainsElemType (NCDProgram *o, int elem_type)
     return 0;
     return 0;
 }
 }
 
 
+void NCDProgram_RemoveElem (NCDProgram *o, NCDProgramElem *ee)
+{
+    ASSERT(ee)
+    
+    struct ProgramElem *e = UPPER_OBJECT(ee, struct ProgramElem, elem);
+    NCDProgramElem_Free(&e->elem);
+    LinkedList1_Remove(&o->elems_list, &e->elems_list_node);
+    free(e);
+    
+    ASSERT(o->num_elems > 0)
+    o->num_elems--;
+}
+
+int NCDProgram_ReplaceElemWithProgram (NCDProgram *o, NCDProgramElem *ee, NCDProgram replace_prog)
+{
+    ASSERT(ee)
+    
+    if (replace_prog.num_elems > SIZE_MAX - o->num_elems) {
+        return 0;
+    }
+    
+    struct ProgramElem *e = UPPER_OBJECT(ee, struct ProgramElem, elem);
+    
+    LinkedList1_InsertListAfter(&o->elems_list, replace_prog.elems_list, &e->elems_list_node);
+    o->num_elems += replace_prog.num_elems;
+    
+    NCDProgram_RemoveElem(o, ee);
+    
+    return 1;
+}
+
 void NCDProgramElem_InitProcess (NCDProgramElem *o, NCDProcess process)
 void NCDProgramElem_InitProcess (NCDProgramElem *o, NCDProcess process)
 {
 {
     o->type = NCDPROGRAMELEM_PROCESS;
     o->type = NCDPROGRAMELEM_PROCESS;

+ 2 - 0
ncd/NCDAst.h

@@ -188,6 +188,8 @@ NCDProgramElem * NCDProgram_FirstElem (NCDProgram *o);
 NCDProgramElem * NCDProgram_NextElem (NCDProgram *o, NCDProgramElem *ee);
 NCDProgramElem * NCDProgram_NextElem (NCDProgram *o, NCDProgramElem *ee);
 size_t NCDProgram_NumElems (NCDProgram *o);
 size_t NCDProgram_NumElems (NCDProgram *o);
 int NCDProgram_ContainsElemType (NCDProgram *o, int elem_type);
 int NCDProgram_ContainsElemType (NCDProgram *o, int elem_type);
+void NCDProgram_RemoveElem (NCDProgram *o, NCDProgramElem *ee);
+int NCDProgram_ReplaceElemWithProgram (NCDProgram *o, NCDProgramElem *ee, NCDProgram replace_prog) WARN_UNUSED;
 
 
 void NCDProgramElem_InitProcess (NCDProgramElem *o, NCDProcess process);
 void NCDProgramElem_InitProcess (NCDProgramElem *o, NCDProcess process);
 int NCDProgramElem_InitInclude (NCDProgramElem *o, const char *path_data, size_t path_length) WARN_UNUSED;
 int NCDProgramElem_InitInclude (NCDProgramElem *o, const char *path_data, size_t path_length) WARN_UNUSED;