Simple data structures / objects in plain C Snapshot
array.c
Go to the documentation of this file.
00001 /* Copyright (c) Michael Moser (2011) . 3-clause BSD License applies */
00002 
00003 
00004 #include <cutils/array.h>
00005 
00006 
00007 static int ARRAY_grow_default(ARRAY *arr,size_t request_size)
00008 {
00009         size_t sz;
00010         void *rt;
00011         
00012 
00013 
00014         sz = 2 * request_size;
00015 
00016         rt = realloc( arr->buffer, sz * arr->elmsize);
00017         if (!rt) {
00018                 return -1;
00019         }
00020         arr->buffer = rt;
00021         arr->elmmaxcount = sz;
00022         return 0;
00023 }
00024 
00025 
00026 
00027 
00028 
00029 int ARRAY_insert_at( ARRAY *arr, size_t index, void *elm, size_t elmsize)
00030 {       
00031         if (elmsize != arr->elmsize) {
00032                 return -1;
00033         }
00034 
00035  
00036         if (index >= arr->elmmaxcount) {
00037                 if (ARRAY_grow_default(arr,index+1)) {
00038                         return -1;
00039                 }
00040         }
00041 
00042 
00043         if (arr->elmcount == arr->elmmaxcount) {
00044                 if (ARRAY_grow_default(arr,arr->elmmaxcount+1)) {
00045                         return -1;
00046                 }
00047         }
00048 
00049 
00050         if (index < arr->elmcount) {
00051                 memmove( arr->buffer + (index + 1) * elmsize, 
00052                                  arr->buffer + index * elmsize, (arr->elmcount - index) * elmsize);
00053 
00054         } 
00055 
00056         if (index <= arr->elmcount) {
00057                 arr->elmcount++;
00058         } else {
00059                 memset( arr->buffer + arr->elmcount * arr->elmsize, 
00060                                 0, 
00061                                 arr->elmsize * (index - arr->elmcount) );               
00062                 arr->elmcount = index + 1;
00063         }
00064 
00065         memcpy(arr->buffer + (index * elmsize), elm, elmsize);
00066 
00067 
00068         return 0;
00069 }
00070 
00071 int ARRAY_set_at( ARRAY *arr, size_t index, void *elm, size_t elmsize)
00072 {       
00073         if (elmsize != arr->elmsize) {
00074                 return -1;
00075         }
00076 
00077  
00078         if (index >= arr->elmmaxcount) {
00079                 if (ARRAY_grow_default(arr,index+1)) {
00080                         return -1;
00081                 }
00082         }
00083 
00084 
00085         memcpy(arr->buffer + (index * elmsize), elm, elmsize);
00086         if (index >= arr->elmcount) {
00087                 memset( arr->buffer + arr->elmcount * arr->elmsize, 
00088                                 0, 
00089                                 arr->elmsize * (index - arr->elmcount) );       
00090                 arr->elmcount = index + 1;
00091 
00092         }
00093 
00094         return 0;
00095 }