OSDN Git Service

AI003:AI_Think_CandidateWordList_Filter()は実装途中。
[chnosproject/CHNOSProject.git] / CHNOSProject / chn / chnlib00.c
index b14d616..d3d0fa6 100755 (executable)
@@ -95,6 +95,54 @@ int CHNLIB_UIPArray_AppendLast_ProtectFromDuplication(CHNLIB_UIPArray **array, u
     return True;\r
 }\r
 \r
+int CHNLIB_UIPArray_RemoveByIndex(CHNLIB_UIPArray **array, int index)\r
+{\r
+    //戻り値:削除が成功したか(0:成功,-1:指定された添字の要素は存在しない)\r
+    //indexが指し示す要素を削除し、後続の要素は前へつめる。\r
+    //削除された要素に格納されていたデータに関しては関知しない。\r
+    int i;\r
+    \r
+    for(; (index / CHNLIB_UIPArray_INTERNAL_PACKDATAS) > 0; index -= CHNLIB_UIPArray_INTERNAL_PACKDATAS){\r
+        if(*array == NULL){\r
+            return -1;\r
+        }\r
+        array = &(*array)->next;\r
+    }\r
+    if(*array == NULL){\r
+        return -1;\r
+    }\r
+    if(index >= (*array)->using_tags){\r
+        return -1;\r
+    }\r
+    for(i = index; i < (*array)->using_tags - 1; i++){\r
+        (*array)->tag[i] = (*array)->tag[i + 1];\r
+    }\r
+    for(;;){\r
+        if((*array)->next != NULL){\r
+            if((*array)->using_tags != CHNLIB_UIPArray_INTERNAL_PACKDATAS || (*array)->next->using_tags == 0){\r
+                //タグ数とリンクの関係があわない。以下の状態になっている。\r
+                //次のパックがあるのに、間のパックが使い切られていない。\r
+                //次のパックがあるのに、次のパックに一つもデータがない。\r
+                CHNLIB_ReportError("Internal data error.", CHNLIB_DEBUG_ARGUMENTS);\r
+            }\r
+            (*array)->tag[CHNLIB_UIPArray_INTERNAL_PACKDATAS - 1] = (*array)->next->tag[0];\r
+            array = &(*array)->next;\r
+            for(i = 0; i < (*array)->using_tags - 1; i++){\r
+                (*array)->tag[i] = (*array)->tag[i + 1];\r
+            }\r
+        } else{\r
+            (*array)->using_tags--;\r
+            if((*array)->using_tags == 0){\r
+                //もうこのパックにはデータが存在しないので、パックを削除。\r
+                CHNLIB_System_FreeMemory(*array, CHNLIB_DEBUG_ARGUMENTS);\r
+                *array = NULL;\r
+            }\r
+            break;\r
+        }\r
+    }\r
+    return 0;\r
+}\r
+\r
 void CHNLIB_UIPArray_FreeOnlyArray(CHNLIB_UIPArray **array)\r
 {\r
     //ArrayそのものをFreeする。\r
@@ -106,7 +154,8 @@ void CHNLIB_UIPArray_FreeOnlyArray(CHNLIB_UIPArray **array)
     \r
     for(; now != NULL; ){\r
         next = now->next;\r
-        free(now);\r
+        //free(now);\r
+        CHNLIB_System_FreeMemory(now, CHNLIB_DEBUG_ARGUMENTS);\r
         now = next;\r
     }\r
     return;\r
@@ -121,7 +170,8 @@ void CHNLIB_UIPArray_FreeOnlyAllPointer(CHNLIB_UIPArray *array)
     for(; array != NULL; array = array->next){\r
         for(i = 0; i < array->using_tags; i++){\r
             if(array->tag[i].pointer != NULL){\r
-                free(array->tag[i].pointer);\r
+                //free(array->tag[i].pointer);\r
+                CHNLIB_System_FreeMemory(array->tag[i].pointer, CHNLIB_DEBUG_ARGUMENTS);\r
                 array->tag[i].pointer = NULL;\r
             }\r
         }\r
@@ -138,7 +188,8 @@ void CHNLIB_UIPArray_FreeOnlySelectedPointer(CHNLIB_UIPArray *array)
     for(; array != NULL; array = array->next){\r
         for(i = 0; i < array->using_tags; i++){\r
             if(array->tag[i].pointer != NULL && !array->tag[i].data32){\r
-                free(array->tag[i].pointer);\r
+                //free(array->tag[i].pointer);\r
+                CHNLIB_System_FreeMemory(array->tag[i].pointer, CHNLIB_DEBUG_ARGUMENTS);\r
                 array->tag[i].pointer = NULL;\r
             }\r
         }\r