Changeset 446 for trunk/archive/pslib/src/Metadata/metadata.c
- Timestamp:
- Apr 19, 2004, 9:41:51 AM (22 years ago)
- File:
-
- 1 edited
-
trunk/archive/pslib/src/Metadata/metadata.c (modified) (21 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/archive/pslib/src/Metadata/metadata.c
r164 r446 6 6 #include <assert.h> 7 7 #include <string.h> 8 #include "ps Utils.h"9 #include "psMeta Data.h"8 #include "psLib.h" 9 #include "psMetadata.h" 10 10 11 11 /*****************************************************************************/ … … 13 13 * Handle sets of metadata 14 14 */ 15 psMeta DataSet *psMetaDataSetAlloc(void) // make a new set of metadata16 { 17 psMeta DataSet *ms = psAlloc(sizeof(psMetaDataSet));15 psMetadata *psMetadataAlloc(void) // make a new set of metadata 16 { 17 psMetadata *ms = psAlloc(sizeof(psMetadata)); 18 18 19 19 ms->list = psDlistAlloc(NULL); // list of metadata 20 ms->table = psHashAlloc( 128);// hash table20 ms->table = psHashAlloc(); // hash table 21 21 22 22 return ms; 23 23 } 24 24 25 void psMeta DataSetFree(psMetaDataSet*ms) // destroy a set of metadata25 void psMetadataFree(psMetadata *ms) // destroy a set of metadata 26 26 { 27 27 if (ms == NULL) { … … 30 30 31 31 psDlistFree(ms->list, (void (*)(void *))NULL); 32 psHashFree(ms->table, (void (*)(void *))psMeta DataItemFree);32 psHashFree(ms->table, (void (*)(void *))psMetadataItemFree); 33 33 34 34 psFree(ms); … … 37 37 /*****************************************************************************/ 38 38 /* 39 * Return a properly filled-out psMeta DataItem39 * Return a properly filled-out psMetadataItem 40 40 * 41 41 * N.b. For types PS_META_FLOAT, PS_META_INT, and PS_META_STR, a COPY … … 43 43 * to the data will be kept. 44 44 */ 45 psMeta DataItem *psMetaDataItemAlloc(45 psMetadataItem *psMetadataItemAlloc( 46 46 int typeFlags, // type of this piece of metadata + flags 47 47 const void *data, // value of new item … … 51 51 ) 52 52 { 53 const psMeta DataType type = typeFlags & PS_META_TYPE_MASK; // the type part of typeFlags54 psMeta DataFlags flags = typeFlags & ~PS_META_TYPE_MASK; // the flags part of typeFlags53 const psMetadataType type = typeFlags & PS_META_TYPE_MASK; // the type part of typeFlags 54 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 psMeta DataItem *ms = psAlloc(sizeof(psMetaDataItem));56 psMetadataItem *ms = psAlloc(sizeof(psMetadataItem)); 57 57 58 58 *(int *)&ms->id = id++; // need to cast away const … … 125 125 } 126 126 127 void psMeta DataItemFree(psMetaDataItem *ms) // piece of metadata to destroy127 void psMetadataItemFree(psMetadataItem *ms) // piece of metadata to destroy 128 128 { 129 129 if(ms == NULL) { … … 167 167 /*****************************************************************************/ 168 168 /* 169 * Add an new psMeta DataItem to a psMetaDataSet170 */ 171 psMeta DataItem *psMetaDataAppend(psMetaDataSet *restrict ms, psMetaDataItem *restrict item)172 { 173 psMeta DataItem *meta = NULL; // an item of metadata169 * Add an new psMetadataItem to a psMetadata 170 */ 171 psMetadataItem *psMetadataAppend(psMetadata *restrict ms, psMetadataItem *restrict item) 172 { 173 psMetadataItem *meta = NULL; // an item of metadata 174 174 assert (ms != NULL && ms->list != NULL && ms->table != NULL); 175 175 … … 178 178 179 179 if (item->flags & PS_META_NON_UNIQUE) { 180 psMeta DataItem *head = meta;180 psMetadataItem *head = meta; 181 181 if (head == NULL) { // this is the first item of this name 182 head = psMeta DataAppend(ms, psMetaDataItemAlloc(PS_META_ITEM_SET, NULL, NULL, item->name));182 head = psMetadataAppend(ms, psMetadataItemAlloc(PS_META_ITEM_SET, NULL, NULL, item->name)); 183 183 } 184 184 … … 202 202 203 203 psDlistAppend(head->items, item); 204 psHashInsert(ms->table, item->name, item, (void (*)(void *))psMeta DataItemFree);204 psHashInsert(ms->table, item->name, item, (void (*)(void *))psMetadataItemFree); 205 205 206 206 return item; 207 207 } else if (meta != NULL) { 208 psError(__func__, "Key \"%s\" is already present in the metaDataSet 0x%x", item->name, ms); 209 //psMetaDataItemFree(item); 208 psError(__func__, PS_ERR_UNKNOWN, PS_NEW_ERROR, 209 "Key \"%s\" is already present in the metaDataSet 0x%x", item->name, ms); 210 //psMetadataItemFree(item); 210 211 211 212 return NULL; … … 213 214 214 215 psDlistAppend(ms->list, item); 215 psHashInsert(ms->table, item->name, item, (void (*)(void *))psMeta DataItemFree);216 psHashInsert(ms->table, item->name, item, (void (*)(void *))psMetadataItemFree); 216 217 217 218 return item; … … 222 223 * Remove and return an item of metadata from a set 223 224 */ 224 psMeta DataItem *psMetaDataRemove(psMetaDataSet*restrict ms, const char *restrict key)225 psMetadataItem *psMetadataRemove(psMetadata *restrict ms, const char *restrict key) 225 226 { 226 227 assert (ms != NULL && ms->list != NULL && ms->table != NULL); 227 228 228 psMeta DataItem *meta = psHashRemove(ms->table, key);229 psMetadataItem *meta = psHashRemove(ms->table, key); 229 230 230 231 if (meta == NULL) { … … 239 240 *ptr = '\0'; 240 241 241 psMeta DataItem *base = psHashLookup(ms->table, baseKey); // here's the non-qualified metadata242 psMetadataItem *base = psHashLookup(ms->table, baseKey); // here's the non-qualified metadata 242 243 assert (base != NULL); 243 244 … … 253 254 * Iterators for the psDlist representation of the metadata 254 255 */ 255 void psMeta DataSetIterator(psMetaDataSet*ms)256 void psMetadataIterator(psMetadata *ms) 256 257 { 257 258 assert (ms != NULL); … … 259 260 } 260 261 261 psMeta DataItem *psMetaDataGetNext(psMetaDataSet*restrict ms,262 psMetadataItem *psMetadataGetNext(psMetadata *restrict ms, 262 263 const char *restrict match) 263 264 { 264 265 assert (ms != NULL); 265 psMeta DataItem *meta = psDlistGetNext(ms->list, 0);266 psMetadataItem *meta = psDlistGetNext(ms->list, 0); 266 267 267 268 if (match == NULL || meta == NULL) { … … 271 272 return meta; 272 273 } else { 273 return psMeta DataGetNext(ms, match);274 return psMetadataGetNext(ms, match); 274 275 } 275 276 } … … 280 281 * Access using the hash table 281 282 */ 282 psMeta DataItem *psMetaDataLookup(const psMetaDataSet*restrict ms,283 psMetadataItem *psMetadataLookup(const psMetadata *restrict ms, 283 284 const char *restrict key) 284 285 { … … 289 290 290 291 /*****************************************************************************/ 291 void psMeta DataItemPrint(FILE *fd, // file descriptor to write to292 const psMeta DataItem *restrict ms, // item of metadata to print292 void psMetadataItemPrint(FILE *fd, // file descriptor to write to 293 const psMetadataItem *restrict ms, // item of metadata to print 293 294 const char *prefix) // print this at the beginning of each line 294 295 { … … 308 309 case PS_META_ITEM_SET: 309 310 { // gcc 3.3 doesn't allow a declaration here 310 psMeta DataItem *meta = NULL;311 psMetadataItem *meta = NULL; 311 312 312 313 fprintf(fd, "\n"); 313 314 psDlistSetIterator(ms->items, PS_DLIST_HEAD, 0); 314 315 while ((meta = psDlistGetNext(ms->items, 0)) != NULL) { 315 psMeta DataItemPrint(fd, meta, "\t");316 psMetadataItemPrint(fd, meta, "\t"); 316 317 } 317 318 } … … 369 370 psSetLogFormat("NM"); // suppress some of the psLogMsg verbosity 370 371 371 psMeta DataSet *ms = psMetaDataSetAlloc(); // set of metadata372 psMeta DataItem *meta = NULL; // used to traverse a set of metadata372 psMetadata *ms = psMetadataAlloc(); // set of metadata 373 psMetadataItem *meta = NULL; // used to traverse a set of metadata 373 374 374 375 for (int i = 0; i < 10; i += 5) { 375 376 float sqrti = sqrt(i); 376 psMeta DataAppend(ms, psMetaDataItemAlloc(PS_META_INT, &i, NULL, "const.%d", i));377 psMeta DataAppend(ms, psMetaDataItemAlloc(PS_META_FLOAT, &sqrti, "square root", "const.sqrt%d", i));378 } 379 psMeta DataAppend(ms, psMetaDataItemAlloc(PS_META_STR | PS_META_NON_UNIQUE,377 psMetadataAppend(ms, psMetadataItemAlloc(PS_META_INT, &i, NULL, "const.%d", i)); 378 psMetadataAppend(ms, psMetadataItemAlloc(PS_META_FLOAT, &sqrti, "square root", "const.sqrt%d", i)); 379 } 380 psMetadataAppend(ms, psMetadataItemAlloc(PS_META_STR | PS_META_NON_UNIQUE, 380 381 "Bonjour", "French", "lang.hello")); 381 psMeta DataAppend(ms, psMetaDataItemAlloc(PS_META_STR | PS_META_NON_UNIQUE,382 psMetadataAppend(ms, psMetadataItemAlloc(PS_META_STR | PS_META_NON_UNIQUE, 382 383 "Aloha", "Hawaiian", "lang.hello")); 383 psMeta DataAppend(ms, psMetaDataItemAlloc(PS_META_STR | PS_META_NON_UNIQUE,384 psMetadataAppend(ms, psMetadataItemAlloc(PS_META_STR | PS_META_NON_UNIQUE, 384 385 "Good Morning", "English", "lang.hello")); 385 386 /* 386 387 * Print all metadata starting "lang" 387 388 */ 388 psMeta DataItemFree(psMetaDataRemove(ms, "lang.hello.0"));389 390 psMeta DataSetIterator(ms);391 while ((meta = psMeta DataGetNext(ms, "lang")) != NULL) {392 psMeta DataItemPrint(stdout, meta, "");389 psMetadataItemFree(psMetadataRemove(ms, "lang.hello.0")); 390 391 psMetadataIterator(ms); 392 while ((meta = psMetadataGetNext(ms, "lang")) != NULL) { 393 psMetadataItemPrint(stdout, meta, ""); 393 394 } 394 395 /* 395 396 * Remove a key 396 397 */ 397 psMeta DataItemFree(psMetaDataRemove(ms, "lang.hello"));398 psMetadataItemFree(psMetadataRemove(ms, "lang.hello")); 398 399 /* 399 400 * Print all metadata 400 401 */ 401 402 fprintf(stdout, "------\n"); 402 psMeta DataSetIterator(ms);403 while ((meta = psMeta DataGetNext(ms, NULL)) != NULL) {404 psMeta DataItemPrint(stdout, meta, "");403 psMetadataIterator(ms); 404 while ((meta = psMetadataGetNext(ms, NULL)) != NULL) { 405 psMetadataItemPrint(stdout, meta, ""); 405 406 } 406 407 /* … … 409 410 fprintf(stdout, "------\n"); 410 411 fprintf(stdout, "Looking up by name:\n"); 411 meta = psMeta DataLookup(ms, "const.5");412 meta = psMetadataLookup(ms, "const.5"); 412 413 if (meta != NULL) { 413 psMeta DataItemPrint(stdout, meta, "");414 psMetadataItemPrint(stdout, meta, ""); 414 415 } 415 416 /* 416 417 * Clean up 417 418 */ 418 psMeta DataSetFree(ms);419 psMetadataFree(ms); 419 420 /* 420 421 * Check for memory leaks
Note:
See TracChangeset
for help on using the changeset viewer.
