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

ncd: NCDVal: add NCDVal_StringEqualsId()

ambrop7 13 лет назад
Родитель
Сommit
c45469174e
2 измененных файлов с 30 добавлено и 0 удалено
  1. 20 0
      ncd/NCDVal.c
  2. 10 0
      ncd/NCDVal.h

+ 20 - 0
ncd/NCDVal.c

@@ -706,6 +706,26 @@ int NCDVal_StringEquals (NCDValRef string, const char *data)
     return !NCDVal_StringHasNulls(string) && !strcmp(NCDVal_StringValue(string), data);
 }
 
+int NCDVal_StringEqualsId (NCDValRef string, NCD_string_id_t string_id,
+                           NCDStringIndex *string_index)
+{
+    ASSERT(NCDVal_IsString(string))
+    ASSERT(string_id >= 0)
+    ASSERT(string_index)
+    
+    void *ptr = NCDValMem__BufAt(string.mem, string.idx);
+    
+    if (*(int *)ptr == IDSTRING_TYPE) {
+        struct NCDVal__idstring *ids_e = ptr;
+        ASSERT(ids_e->string_index == string_index)
+        return ids_e->string_id == string_id;
+    }
+    
+    const char *string_data = NCDStringIndex_Value(string_index, string_id);
+    struct NCDVal__string *str_e = ptr;
+    return !strcmp(str_e->data, string_data) && str_e->length == strlen(string_data);
+}
+
 int NCDVal_IsList (NCDValRef val)
 {
     NCDVal__AssertVal(val);

+ 10 - 0
ncd/NCDVal.h

@@ -382,6 +382,16 @@ int NCDVal_StringHasNulls (NCDValRef string);
  */
 int NCDVal_StringEquals (NCDValRef string, const char *data);
 
+/**
+ * Determines if the string value is equal to the given string represented
+ * by an {@link NCDStringIndex} identifier.
+ * The value reference must point to a string value.
+ * NOTE: \a string_index must be equal to the string_index of every ID-string
+ * that exist within this memory object.
+ */
+int NCDVal_StringEqualsId (NCDValRef string, NCD_string_id_t string_id,
+                           NCDStringIndex *string_index);
+
 /**
  * Determines if a value is a list value.
  * The value reference must not be an invalid reference.