]> rtime.felk.cvut.cz Git - ulut.git/commitdiff
Custom GSA array can be preinitialized by static intems list now.
authorppisa <ppisa>
Fri, 28 Jul 2006 12:42:33 +0000 (12:42 +0000)
committerppisa <ppisa>
Fri, 28 Jul 2006 12:42:33 +0000 (12:42 +0000)
The functions gsa_cust_insert_at() and gsa_cust_delete_at()
recognizes such case when alloc_count is zero and do array copy
instead of items array free or realloc.

ulut/ul_gsacust.c

index 31368088291c352aa0df945d0dc92939368587c2..c16caddfb7e1cfe1cf7d51e55b1159166d2241c0 100644 (file)
@@ -46,11 +46,18 @@ gsa_cust_insert_at(gsa_array_field_t *array, void *item, unsigned where)
   if(where>cnt) where=cnt;
   if((cnt+1>=acnt)||!array->items)
   {
-    acnt+=GSA_ALLOC_STEP;
-    if(!array->items)
+    if(!array->items || !acnt){
+      acnt=cnt+GSA_ALLOC_STEP;
       items=malloc(acnt*sizeof(void*));
-     else
+      if(array->items && items)
+        memcpy(items,array->items,cnt*sizeof(void*));
+    }else{
+      if(acnt/4>GSA_ALLOC_STEP)
+       acnt+=acnt/4;
+      else
+       acnt+=GSA_ALLOC_STEP;
       items=realloc(array->items,acnt*sizeof(void*));
+    }
     if(!items) return -1;
     array->alloc_count=acnt;
     array->items=items;
@@ -71,6 +78,14 @@ gsa_cust_delete_at(gsa_array_field_t *array, unsigned indx)
   void **items=array->items;
   void **p;
   if(indx>=cnt) return -1;
+  if(cnt && !acnt){
+    p=malloc(cnt*sizeof(void*));
+    if(p){
+      memcpy(p,items,cnt*sizeof(void*));
+      array->alloc_count=acnt=cnt;
+      array->items=items=p;
+    }
+  }
   p=items+indx;
   array->count=--cnt;
   memmove(p,p+1,(items+cnt-p)*sizeof(void *));