Changeset 164
- Timestamp:
- Mar 9, 2004, 2:34:28 PM (22 years ago)
- Location:
- trunk/archive/pslib/src
- Files:
-
- 4 edited
-
Metadata/metadata.c (modified) (18 diffs)
-
Metadata/psMetaData.h (modified) (4 diffs)
-
Utils/array.c (modified) (6 diffs)
-
Utils/psArray.h (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/archive/pslib/src/Metadata/metadata.c
r156 r164 13 13 * Handle sets of metadata 14 14 */ 15 psMetaDataSet *psMetaDataSet New(void) // make a new set of metadata15 psMetaDataSet *psMetaDataSetAlloc(void) // make a new set of metadata 16 16 { 17 17 psMetaDataSet *ms = psAlloc(sizeof(psMetaDataSet)); 18 18 19 ms->list = psDlist New(NULL); // list of metadata20 ms->table = psHash New(128);// hash table19 ms->list = psDlistAlloc(NULL); // list of metadata 20 ms->table = psHashAlloc(128); // hash table 21 21 22 22 return ms; 23 23 } 24 24 25 void psMetaDataSet Del(psMetaDataSet *ms) // destroy a set of metadata25 void psMetaDataSetFree(psMetaDataSet *ms) // destroy a set of metadata 26 26 { 27 27 if (ms == NULL) { … … 29 29 } 30 30 31 psDlist Del(ms->list, (void (*)(void *))NULL);32 psHash Del(ms->table, (void (*)(void *))psMetaDataItemDel);31 psDlistFree(ms->list, (void (*)(void *))NULL); 32 psHashFree(ms->table, (void (*)(void *))psMetaDataItemFree); 33 33 34 34 psFree(ms); … … 43 43 * to the data will be kept. 44 44 */ 45 psMetaDataItem *psMetaDataItem New(45 psMetaDataItem *psMetaDataItemAlloc( 46 46 int typeFlags, // type of this piece of metadata + flags 47 47 const void *data, // value of new item … … 52 52 { 53 53 const psMetaDataType type = typeFlags & PS_META_TYPE_MASK; // the type part of typeFlags 54 const long flags = typeFlags & ~PS_META_TYPE_MASK;// the flags part of typeFlags54 psMetaDataFlags flags = typeFlags & ~PS_META_TYPE_MASK; // the flags part of typeFlags 55 55 static int id = 0; // unique ID for an item of metadata 56 56 psMetaDataItem *ms = psAlloc(sizeof(psMetaDataItem)); … … 94 94 case PS_META_ITEM_SET: 95 95 *(void **)&ms->val.v = NULL; 96 ms->items = psDlist New(NULL);96 ms->items = psDlistAlloc(NULL); 97 97 break; 98 98 … … 106 106 107 107 case PS_META_STR: 108 *(void **)&ms->val.v = psAlloc(strlen(data) + 1); 109 strcpy(ms->val.v, data); 108 *(void **)&ms->val.v = psStringCopy(data); 110 109 break; 111 110 … … 117 116 *(void **)&ms->val.v = (void *)data; 118 117 break; 118 119 119 case PS_META_NTYPE: 120 120 psAbort(__FILE__, "You cannot get here (%d)\n", __LINE__); … … 125 125 } 126 126 127 void psMetaDataItem Del(psMetaDataItem *ms)// piece of metadata to destroy127 void psMetaDataItemFree(psMetaDataItem *ms) // piece of metadata to destroy 128 128 { 129 129 if(ms == NULL) { … … 137 137 switch (ms->type) { 138 138 case PS_META_ITEM_SET: 139 psDlist Del(ms->items, (void (*)(void *))NULL); // they're still in the hash table139 psDlistFree(ms->items, (void (*)(void *))NULL); // they're still in the hash table 140 140 ms->items = NULL; 141 141 break; 142 142 143 case PS_META_FLOAT: 143 144 case PS_META_INT: 144 145 break; // nothing to do 146 145 147 case PS_META_STR: 146 148 psFree(ms->val.v); … … 153 155 case PS_META_UNKNOWN: 154 156 break; // we don't own the memory 157 155 158 case PS_META_NTYPE: 156 159 psAbort(__FILE__, "You cannot get here (%d)\n", __LINE__); … … 177 180 psMetaDataItem *head = meta; 178 181 if (head == NULL) { // this is the first item of this name 179 head = psMetaDataAppend(ms, psMetaDataItem New(PS_META_ITEM_SET, NULL, NULL, item->name));182 head = psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_ITEM_SET, NULL, NULL, item->name)); 180 183 } 181 184 … … 199 202 200 203 psDlistAppend(head->items, item); 201 psHashInsert(ms->table, item->name, item, (void (*)(void *))psMetaDataItem Del);204 psHashInsert(ms->table, item->name, item, (void (*)(void *))psMetaDataItemFree); 202 205 203 206 return item; 204 207 } else if (meta != NULL) { 205 208 psError(__func__, "Key \"%s\" is already present in the metaDataSet 0x%x", item->name, ms); 206 //psMetaDataItem Del(item);209 //psMetaDataItemFree(item); 207 210 208 211 return NULL; … … 210 213 211 214 psDlistAppend(ms->list, item); 212 psHashInsert(ms->table, item->name, item, (void (*)(void *))psMetaDataItem Del);215 psHashInsert(ms->table, item->name, item, (void (*)(void *))psMetaDataItemFree); 213 216 214 217 return item; … … 223 226 assert (ms != NULL && ms->list != NULL && ms->table != NULL); 224 227 225 void *data = psHashRemove(ms->table, key);226 227 if ( data == NULL) {228 psMetaDataItem *meta = psHashRemove(ms->table, key); 229 230 if (meta == NULL) { 228 231 return NULL; 229 232 } else { 230 return psDlistRemove(ms->list, data, PS_DLIST_UNKNOWN); 233 if (meta->flags & PS_META_NON_UNIQUE) { // it's on someone's ->items list; find that someone 234 char baseKey[strlen(key) + 1]; // Name without the .nnn tacked on 235 strcpy(baseKey, key); 236 237 char *ptr = strrchr(baseKey, '.'); 238 assert (ptr != NULL); 239 *ptr = '\0'; 240 241 psMetaDataItem *base = psHashLookup(ms->table, baseKey); // here's the non-qualified metadata 242 assert (base != NULL); 243 244 return psDlistRemove(base->items, meta, PS_DLIST_UNKNOWN); 245 } else { 246 return psDlistRemove(ms->list, meta, PS_DLIST_UNKNOWN); 247 } 231 248 } 232 249 } … … 301 318 302 319 break; 320 303 321 case PS_META_FLOAT: 304 322 fprintf(fd, "%g\n", ms->val.f); 305 323 break; 324 306 325 case PS_META_INT: 307 326 fprintf(fd, "%d\n", ms->val.i); 308 327 break; 328 309 329 case PS_META_STR: 310 330 fprintf(fd, "%s\n", (char *)ms->val.v); 311 331 break; 332 312 333 case PS_META_IMG: 313 334 fprintf(fd, "(IMG)\n"); 314 335 break; 336 315 337 case PS_META_JPEG: 316 338 fprintf(fd, "(JPG)\n"); 317 339 break; 340 318 341 case PS_META_PNG: 319 342 fprintf(fd, "(PNG)\n"); 320 343 break; 344 321 345 case PS_META_ASTROM: 322 346 fprintf(fd, "(ASTROM)\n"); 323 347 break; 348 324 349 case PS_META_UNKNOWN: 325 350 fprintf(fd, "(UNKNOWN)\n"); 326 351 break; 352 327 353 case PS_META_NTYPE: 328 354 psAbort(__FILE__, "You cannot get here (%d)\n", __LINE__); … … 343 369 psSetLogFormat("NM"); // suppress some of the psLogMsg verbosity 344 370 345 psMetaDataSet *ms = psMetaDataSet New(); // set of metadata371 psMetaDataSet *ms = psMetaDataSetAlloc(); // set of metadata 346 372 psMetaDataItem *meta = NULL; // used to traverse a set of metadata 347 373 348 374 for (int i = 0; i < 10; i += 5) { 349 375 float sqrti = sqrt(i); 350 psMetaDataAppend(ms, psMetaDataItem New(PS_META_INT, &i, NULL, "const.%d", i));351 psMetaDataAppend(ms, psMetaDataItem New(PS_META_FLOAT, &sqrti, "square root", "const.sqrt%d", i));352 } 353 psMetaDataAppend(ms, psMetaDataItem New(PS_META_STR | PS_META_NON_UNIQUE,376 psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_INT, &i, NULL, "const.%d", i)); 377 psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_FLOAT, &sqrti, "square root", "const.sqrt%d", i)); 378 } 379 psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_STR | PS_META_NON_UNIQUE, 354 380 "Bonjour", "French", "lang.hello")); 355 psMetaDataAppend(ms, psMetaDataItem New(PS_META_STR | PS_META_NON_UNIQUE,381 psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_STR | PS_META_NON_UNIQUE, 356 382 "Aloha", "Hawaiian", "lang.hello")); 357 psMetaDataAppend(ms, psMetaDataItem New(PS_META_STR | PS_META_NON_UNIQUE,383 psMetaDataAppend(ms, psMetaDataItemAlloc(PS_META_STR | PS_META_NON_UNIQUE, 358 384 "Good Morning", "English", "lang.hello")); 359 385 /* 360 386 * Print all metadata starting "lang" 361 387 */ 388 psMetaDataItemFree(psMetaDataRemove(ms, "lang.hello.0")); 389 362 390 psMetaDataSetIterator(ms); 363 391 while ((meta = psMetaDataGetNext(ms, "lang")) != NULL) { … … 367 395 * Remove a key 368 396 */ 369 psMetaDataItem Del(psMetaDataRemove(ms, "lang.hello"));397 psMetaDataItemFree(psMetaDataRemove(ms, "lang.hello")); 370 398 /* 371 399 * Print all metadata … … 388 416 * Clean up 389 417 */ 390 psMetaDataSet Del(ms);418 psMetaDataSetFree(ms); 391 419 /* 392 420 * Check for memory leaks -
trunk/archive/pslib/src/Metadata/psMetaData.h
r156 r164 20 20 } psMetaDataType; 21 21 22 enum {22 typedef enum { 23 23 PS_META_TYPE_MASK = 0xffff, // the type enum must fit in this mask 24 24 PS_META_UNIQUE = 0x10000, // the name must be unique (default) 25 25 PS_META_NON_UNIQUE = 0x20000, // the name may be repeated, and should be disambiguated for us 26 } ;26 } psMetaDataFlags; 27 27 28 28 /* … … 34 34 char *restrict name; // Name of item 35 35 psMetaDataType type; // type of this item 36 int flags;// flags associated with this item36 psMetaDataFlags flags; // flags associated with this item 37 37 const union { 38 38 float f; // floating value … … 56 56 * Constructors and destructors 57 57 */ 58 psMetaDataItem *psMetaDataItem New(58 psMetaDataItem *psMetaDataItemAlloc( 59 59 int typeFlags, // type of this piece of metadata + flags 60 60 const void *val, // value of new item … … 65 65 ...); // possible arguments for name format 66 66 67 void psMetaDataItem Del(psMetaDataItem *ms); // piece of metadata to destroy67 void psMetaDataItemFree(psMetaDataItem *ms); // piece of metadata to destroy 68 68 69 psMetaDataSet *psMetaDataSet New(void);// make a new set of metadata70 void psMetaDataSet Del(psMetaDataSet *ms); // destroy a set of metadata69 psMetaDataSet *psMetaDataSetAlloc(void); // make a new set of metadata 70 void psMetaDataSetFree(psMetaDataSet *ms); // destroy a set of metadata 71 71 72 72 /*****************************************************************************/ -
trunk/archive/pslib/src/Utils/array.c
r141 r164 10 10 P_PS_CREATE_ARRAY_TYPE(static, my_, psVoidPtr); 11 11 12 psVoidPtrArray *psVoidPtrArray New(int n, int s)12 psVoidPtrArray *psVoidPtrArrayAlloc(int n, int s) 13 13 { 14 return my_psVoidPtrArray New(n, s);14 return my_psVoidPtrArrayAlloc(n, s); 15 15 } 16 16 … … 20 20 } 21 21 22 void psVoidPtrArray Del(psVoidPtrArray *arr,23 void (*elemDel)(void *)) // destructor for data on array22 void psVoidPtrArrayFree(psVoidPtrArray *arr, 23 void (*elemFree)(void *)) // destructor for data on array 24 24 { 25 25 if (arr == NULL) { … … 28 28 29 29 for (int i = 0; i < arr->n; i++) { 30 if (elem Del== NULL) {30 if (elemFree == NULL) { 31 31 psMemDecrRefCounter(arr->arr[i]); 32 32 } else { 33 elem Del(psMemDecrRefCounter(arr->arr[i]));33 elemFree(psMemDecrRefCounter(arr->arr[i])); 34 34 } 35 35 } 36 my_psVoidPtrArray Del(arr);36 my_psVoidPtrArrayFree(arr); 37 37 } 38 38 … … 44 44 } psXY; 45 45 46 psXY *psXY New(void)46 psXY *psXYAlloc(void) 47 47 { 48 48 return psAlloc(sizeof(psXY)); 49 49 } 50 50 51 void psXY Del(psXY *xy)51 void psXYFree(psXY *xy) 52 52 { 53 53 psFree(xy); … … 62 62 int main(void) 63 63 { 64 psXYArray *t = psXYArray New(10, 15);65 psXYPtrArray *pt = psXYPtrArray New(10, 10);64 psXYArray *t = psXYArrayAlloc(10, 15); 65 psXYPtrArray *pt = psXYPtrArrayAlloc(10, 10); 66 66 67 67 for (int i = 0; i < t->n; i++) { … … 78 78 printf("\n"); 79 79 80 psXYArray Del(t);80 psXYArrayFree(t); 81 81 82 82 psXY *xy = psMemDecrRefCounter(pt->arr[0]); 83 83 pt->arr[0] = NULL; 84 psXY Del(xy);84 psXYFree(xy); 85 85 86 psXYPtrArray Del(pt);86 psXYPtrArrayFree(pt); 87 87 88 88 psMemCheckLeaks(0, NULL, stderr); -
trunk/archive/pslib/src/Utils/psArray.h
r141 r164 14 14 } PS_CONCAT(TYPE, Array); \ 15 15 \ 16 PS_CONCAT(TYPE, Array) *PS_CONCAT3(TYPE,Array, New)(int n, int s); \16 PS_CONCAT(TYPE, Array) *PS_CONCAT3(TYPE,Array,Alloc)(int n, int s); \ 17 17 PS_CONCAT(TYPE, Array) *PS_CONCAT3(TYPE,Array,Realloc)(PS_CONCAT(TYPE, Array) *arr, int n); \ 18 void PS_CONCAT3(TYPE,Array, Del)(PS_CONCAT(TYPE, Array) *arr)18 void PS_CONCAT3(TYPE,Array,Free)(PS_CONCAT(TYPE, Array) *arr) 19 19 20 20 /*****************************************************************************/ … … 27 27 #define P_PS_CREATE_ARRAY_TYPE(QUAL,PREFIX,TYPE) \ 28 28 \ 29 QUAL PS_CONCAT(TYPE, Array) *PS_CONCAT4(PREFIX,TYPE,Array, New)(int n, /* initial dimension */\29 QUAL PS_CONCAT(TYPE, Array) *PS_CONCAT4(PREFIX,TYPE,Array,Alloc)(int n, /* initial dimension */\ 30 30 int s) /* initial number of elements */ \ 31 31 { \ … … 33 33 \ 34 34 if (n > s) { \ 35 psLogMsg(PS_STRING(TYPE) "Array New", PS_LOG_ERROR, "Too few elements requested in array (%d < %d)\n", s, n); \35 psLogMsg(PS_STRING(TYPE) "ArrayAlloc", PS_LOG_ERROR, "Too few elements requested in array (%d < %d)\n", s, n); \ 36 36 s = n; \ 37 37 } \ … … 52 52 { \ 53 53 if (arr == NULL) { \ 54 return PS_CONCAT4(PREFIX,TYPE,Array, New)(n, n); \54 return PS_CONCAT4(PREFIX,TYPE,Array,Alloc)(n, n); \ 55 55 } \ 56 56 \ … … 67 67 } \ 68 68 \ 69 QUAL void PS_CONCAT4(PREFIX,TYPE,Array, Del)(PS_CONCAT(TYPE,Array) *arr) \69 QUAL void PS_CONCAT4(PREFIX,TYPE,Array,Free)(PS_CONCAT(TYPE,Array) *arr) \ 70 70 { \ 71 71 if (arr == NULL) { \ … … 88 88 P_PS_CREATE_ARRAY_TYPE(static, my_, P_PS_CONCAT(TYPE, Ptr)) \ 89 89 \ 90 PS_CONCAT(TYPE, PtrArray) *PS_CONCAT3(TYPE,PtrArray, New)(int n, int s) \90 PS_CONCAT(TYPE, PtrArray) *PS_CONCAT3(TYPE,PtrArray,Alloc)(int n, int s) \ 91 91 { \ 92 PS_CONCAT(TYPE, PtrArray) *arr = PS_CONCAT4(my_,TYPE,PtrArray, New)(n, s); \92 PS_CONCAT(TYPE, PtrArray) *arr = PS_CONCAT4(my_,TYPE,PtrArray,Alloc)(n, s); \ 93 93 for (int i = 0; i < arr->n; i++) { \ 94 arr->arr[i] = psMemIncrRefCounter,(PS_CONCAT(TYPE, New)());\94 arr->arr[i] = psMemIncrRefCounter,(PS_CONCAT(TYPE, Alloc)());\ 95 95 } \ 96 96 \ … … 101 101 { \ 102 102 for (int i = n; i < arr->n; i++) { \ 103 PS_CONCAT(TYPE, Del)(psMemDecrRefCounter(arr->arr[i]));\103 PS_CONCAT(TYPE, Free)(psMemDecrRefCounter(arr->arr[i]));\ 104 104 } \ 105 105 \ … … 107 107 } \ 108 108 \ 109 void PS_CONCAT3(TYPE,PtrArray, Del)(PS_CONCAT2(TYPE,PtrArray) *arr) \109 void PS_CONCAT3(TYPE,PtrArray,Free)(PS_CONCAT2(TYPE,PtrArray) *arr) \ 110 110 { \ 111 111 if (arr == NULL) { return; } \ 112 112 for (int i = 0; i < arr->size; i++) { \ 113 PS_CONCAT(TYPE, Del)(psMemDecrRefCounter(arr->arr[i])); \113 PS_CONCAT(TYPE, Free)(psMemDecrRefCounter(arr->arr[i])); \ 114 114 } \ 115 PS_CONCAT4(my_, TYPE, PtrArray, Del)(arr); \115 PS_CONCAT4(my_, TYPE, PtrArray, Free)(arr); \ 116 116 } 117 117 … … 129 129 } psVoidPtrArray; 130 130 131 psVoidPtrArray *psVoidPtrArray New(int n, int s);131 psVoidPtrArray *psVoidPtrArrayAlloc(int n, int s); 132 132 psVoidPtrArray *psVoidPtrArrayRealloc(psVoidPtrArray *arr, int n); 133 void psVoidPtrArray Del(psVoidPtrArray *arr,134 void (*elemDel)(void *)); // destructor for array data133 void psVoidPtrArrayFree(psVoidPtrArray *arr, 134 void (*elemFree)(void *)); // destructor for array data 135 135 136 136
Note:
See TracChangeset
for help on using the changeset viewer.
