Ambroz Bizjak 11 лет назад
Родитель
Сommit
0b3a241355
2 измененных файлов с 43 добавлено и 51 удалено
  1. 25 43
      ncd/NCDEvaluator.c
  2. 18 8
      ncd/NCDEvaluator.h

+ 25 - 43
ncd/NCDEvaluator.c

@@ -30,6 +30,8 @@
 #include <stddef.h>
 #include <limits.h>
 
+#include <misc/debug.h>
+#include <misc/balloc.h>
 #include <base/BLog.h>
 #include <ncd/make_name_indices.h>
 
@@ -37,33 +39,11 @@
 
 #include <generated/blog_channel_ncd.h>
 
-struct NCDEvaluator__var {
-    NCD_string_id_t *varnames;
-    size_t num_names;
-};
-
-struct NCDEvaluator__call {
-    int y;
-};
-
-#define GROWARRAY_NAME VarArray
-#define GROWARRAY_OBJECT_TYPE NCDEvaluator
-#define GROWARRAY_ARRAY_MEMBER vars
-#define GROWARRAY_CAPACITY_MEMBER vars_capacity
-#define GROWARRAY_MAX_CAPACITY INT_MAX
-#include <misc/grow_array.h>
-
-#define GROWARRAY_NAME CallArray
-#define GROWARRAY_OBJECT_TYPE NCDEvaluator
-#define GROWARRAY_ARRAY_MEMBER calls
-#define GROWARRAY_CAPACITY_MEMBER calls_capacity
-#define GROWARRAY_MAX_CAPACITY INT_MAX
-#include <misc/grow_array.h>
+#define NCDEVALUATOR_DEFAULT_VARARRAY_CAPACITY 16
+#define NCDEVALUATOR_DEFAULT_CALLARRAY_CAPACITY 16
 
 static int add_expr_recurser (NCDEvaluator *o, NCDValue *value, NCDValMem *mem, NCDValRef *out)
 {
-    ASSERT((NCDValue_Type(value), 1))
-    
     switch (NCDValue_Type(value)) {
         case NCDVALUE_STRING: {
             const char *str = NCDValue_StringValue(value);
@@ -130,14 +110,13 @@ static int add_expr_recurser (NCDEvaluator *o, NCDValue *value, NCDValMem *mem,
         } break;
         
         case NCDVALUE_VAR: {
-            if (o->num_vars == o->vars_capacity && !VarArray_DoubleUp(o)) {
+            struct NCDEvaluator__Var *var;
+            if (!NCDEvaluator__VarVec_AllocAppend(&o->vars, 1, &var)) {
                 BLog(BLOG_ERROR, "failed to grow var array");
                 goto fail;
             }
             
-            struct NCDEvaluator__var *var = &o->vars[o->num_vars];
-            
-            int plid = o->num_vars;
+            int plid = o->vars.count;
             if (plid >= NCDVAL_TOPPLID) {
                 BLog(BLOG_ERROR, "too many placeholders");
                 goto fail;
@@ -148,7 +127,7 @@ static int add_expr_recurser (NCDEvaluator *o, NCDValue *value, NCDValMem *mem,
                 goto fail;
             }
             
-            o->num_vars++;
+            NCDEvaluator__VarVec_DoAppend(&o->vars, 1);
             
             *out = NCDVal_NewPlaceholder(mem, plid);
         } break;
@@ -174,9 +153,9 @@ static int replace_placeholders_callback (void *arg, int plid, NCDValMem *mem, N
     struct eval_context const *context = arg;
     NCDEvaluator *o = context->eval;
     ASSERT(plid >= 0)
-    ASSERT(plid < o->num_vars)
+    ASSERT(plid < o->vars.count)
     
-    struct NCDEvaluator__var *var = &o->vars[plid];
+    struct NCDEvaluator__Var *var = &o->vars.elems[plid];
     
     return context->funcs->func_eval_var(context->funcs->user, var->varnames, var->num_names, mem, out);
 }
@@ -185,39 +164,38 @@ int NCDEvaluator_Init (NCDEvaluator *o, NCDStringIndex *string_index)
 {
     o->string_index = string_index;
     
-    if (!VarArray_Init(o, 16)) {
-        BLog(BLOG_ERROR, "NamesArray_Init failed");
+    if (!NCDEvaluator__VarVec_Init(&o->vars, NCDEVALUATOR_DEFAULT_VARARRAY_CAPACITY)) {
+        BLog(BLOG_ERROR, "NCDEvaluator__VarVec_Init failed");
         goto fail0;
     }
     
-    if (!CallArray_Init(o, 16)) {
-        BLog(BLOG_ERROR, "EntriesArray_Init failed");
+    if (!NCDEvaluator__CallVec_Init(&o->calls, NCDEVALUATOR_DEFAULT_CALLARRAY_CAPACITY)) {
+        BLog(BLOG_ERROR, "NCDEvaluator__CallVec_Init failed");
         goto fail1;
     }
     
-    o->num_vars = 0;
-    o->num_calls = 0;
-    
     return 1;
     
 fail1:
-    VarArray_Free(o);
+    NCDEvaluator__VarVec_Free(&o->vars);
 fail0:
     return 0;
 }
 
 void NCDEvaluator_Free (NCDEvaluator *o)
 {
-    for (int i = 0; i < o->num_vars; i++) {
-        BFree(o->vars[i].varnames);
+    for (size_t i = 0; i < o->vars.count; i++) {
+        BFree(o->vars.elems[i].varnames);
     }
     
-    CallArray_Free(o);
-    VarArray_Free(o);
+    NCDEvaluator__CallVec_Free(&o->calls);
+    NCDEvaluator__VarVec_Free(&o->vars);
 }
 
 int NCDEvaluatorExpr_Init (NCDEvaluatorExpr *o, NCDEvaluator *eval, NCDValue *value)
 {
+    ASSERT((NCDValue_Type(value), 1))
+    
     NCDValMem_Init(&o->mem);
     
     NCDValRef ref;
@@ -247,6 +225,10 @@ void NCDEvaluatorExpr_Free (NCDEvaluatorExpr *o)
 
 int NCDEvaluatorExpr_Eval (NCDEvaluatorExpr *o, NCDEvaluator *eval, NCDEvaluator_EvalFuncs const *funcs, NCDValMem *out_newmem, NCDValRef *out_val)
 {
+    ASSERT(funcs)
+    ASSERT(out_newmem)
+    ASSERT(out_val)
+    
     if (!NCDValMem_InitCopy(out_newmem, &o->mem)) {
         BLog(BLOG_ERROR, "NCDValMem_InitCopy failed");
         goto fail0;

+ 18 - 8
ncd/NCDEvaluator.h

@@ -37,17 +37,27 @@
 #include <ncd/NCDStringIndex.h>
 #include <ncd/NCDVal.h>
 
-struct NCDEvaluator__var;
-struct NCDEvaluator__call;
+struct NCDEvaluator__Var {
+    NCD_string_id_t *varnames;
+    size_t num_names;
+};
+
+#define VECTOR_NAME NCDEvaluator__VarVec
+#define VECTOR_ELEM_TYPE struct NCDEvaluator__Var
+#include <structure/Vector.h>
+
+struct NCDEvaluator__Call {
+    int tbd;
+};
+
+#define VECTOR_NAME NCDEvaluator__CallVec
+#define VECTOR_ELEM_TYPE struct NCDEvaluator__Call
+#include <structure/Vector.h>
 
 typedef struct {
     NCDStringIndex *string_index;
-    struct NCDEvaluator__var *vars;
-    struct NCDEvaluator__call *calls;
-    int vars_capacity;
-    int calls_capacity;
-    int num_vars;
-    int num_calls;
+    NCDEvaluator__VarVec vars;
+    NCDEvaluator__CallVec calls;
 } NCDEvaluator;
 
 typedef struct {