Changeset 164 for trunk/archive/pslib/src/Metadata/metadata.c
- Timestamp:
- Mar 9, 2004, 2:34:28 PM (22 years ago)
- File:
-
- 1 edited
-
trunk/archive/pslib/src/Metadata/metadata.c (modified) (18 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
Note:
See TracChangeset
for help on using the changeset viewer.
