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

ncd: NCDValue: add NCDValue_ListGet. ncd/modules/list.c: use NCDValue_ListGet

ambrop7 15 лет назад
Родитель
Сommit
723d4202d0
3 измененных файлов с 21 добавлено и 13 удалено
  1. 19 0
      ncd/NCDValue.c
  2. 1 0
      ncd/NCDValue.h
  3. 1 13
      ncd/modules/list.c

+ 19 - 0
ncd/NCDValue.c

@@ -292,3 +292,22 @@ int NCDValue_ListReadHead (NCDValue *o, int num, ...)
     
     return 1;
 }
+
+NCDValue * NCDValue_ListGet (NCDValue *o, size_t pos)
+{
+    value_assert(o);
+    ASSERT(o->type == NCDVALUE_LIST)
+    ASSERT(pos < o->list_count)
+    
+    NCDValue *e = NCDValue_ListFirst(o);
+    while (e) {
+        if (pos == 0) {
+            break;
+        }
+        pos--;
+        e = NCDValue_ListNext(o, e);
+    }
+    ASSERT(e)
+    
+    return e;
+}

+ 1 - 0
ncd/NCDValue.h

@@ -62,5 +62,6 @@ NCDValue * NCDValue_ListFirst (NCDValue *o);
 NCDValue * NCDValue_ListNext (NCDValue *o, NCDValue *ev);
 int NCDValue_ListRead (NCDValue *o, int num, ...) WARN_UNUSED;
 int NCDValue_ListReadHead (NCDValue *o, int num, ...) WARN_UNUSED;
+NCDValue * NCDValue_ListGet (NCDValue *o, size_t pos);
 
 #endif

+ 1 - 13
ncd/modules/list.c

@@ -361,20 +361,8 @@ static void get_func_new (NCDModuleInst *i)
         goto fail1;
     }
     
-    // find requested element
-    uintmax_t pos = 0;
-    NCDValue *e = NCDValue_ListFirst(&mo->list);
-    while (e) {
-        if (pos == index) {
-            break;
-        }
-        pos++;
-        e = NCDValue_ListNext(&mo->list, e);
-    }
-    ASSERT(e)
-    
     // copy value
-    if (!NCDValue_InitCopy(&o->value, e)) {
+    if (!NCDValue_InitCopy(&o->value, NCDValue_ListGet(&mo->list, index))) {
         ModuleLog(o->i, BLOG_ERROR, "NCDValue_InitCopy failed");
         goto fail1;
     }