Simple data structures / objects in plain C Snapshot
|
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 }