Changeset 753 for trunk/archive/pslib/src/Metadata/metadata.c
- Timestamp:
- May 20, 2004, 6:12:37 PM (22 years ago)
- File:
-
- 1 edited
-
trunk/archive/pslib/src/Metadata/metadata.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/archive/pslib/src/Metadata/metadata.c
r707 r753 47 47 */ 48 48 psMetadataItem *psMetadataItemAlloc( 49 int typeFlags, // type of this piece of metadata + flags50 const void *data, // value of new item49 const char *name, // name of new item of metadata (may be an sprintf format) 50 int format, // type of this piece of metadata + flags 51 51 const char *comment, // comment associated with item; may be NULL 52 ...) // data + possible arguments for name format 53 { 54 va_list ap; 55 va_start(ap, comment); 56 57 psMetadataItem *mi = psMetadataItemAllocV(name, format, comment, ap); 58 59 va_end(ap); 60 61 return mi; 62 } 63 64 psMetadataItem *psMetadataItemAllocV( 52 65 const char *name, // name of new item of metadata (may be an sprintf format) 53 ... // possible arguments for name format 54 ) 55 { 56 va_list ap; 57 va_start(ap, name); 58 59 psMetadataItem *mi = psVMetadataItemAlloc(typeFlags, data, comment, name, ap); 60 61 va_end(ap); 62 63 return mi; 64 } 65 66 psMetadataItem *psVMetadataItemAlloc( 67 int typeFlags, // type of this piece of metadata + flags 68 const void *data, // value of new item 66 int format, // type of this piece of metadata + flags 69 67 const char *comment, // comment associated with item; may be NULL 70 const char *name, // name of new item of metadata (may be an sprintf format) 71 va_list ap // possible arguments for name format 72 ) 73 { 74 const psMetadataType type = typeFlags & PS_META_TYPE_MASK; // the type part of typeFlags 75 psMetadataFlags flags = typeFlags & ~PS_META_TYPE_MASK; // the flags part of typeFlags 68 va_list ap) // possible arguments for name format 69 { 70 const psMetadataType type = format & PS_META_TYPE_MASK; // the type part of format 71 psMetadataFlags flags = format & ~PS_META_TYPE_MASK; // the flags part of format 76 72 static int id = 0; // unique ID for an item of metadata 77 73 psMetadataItem *ms = psAlloc(sizeof(psMetadataItem)); … … 94 90 ms->items = NULL; 95 91 96 assert (name != NULL);97 if (strchr(name, '%') != NULL) {98 static char tmp[201]; // should be enough; we won't overflow even if it isn't99 100 if(vsnprintf(tmp, sizeof(tmp), name, ap) > sizeof(tmp) - 1) {101 psTrace("metadata.name", 1, "Keyword \"%s\" was truncated to \"%s\" upon expansion\n", name, tmp);102 }103 104 name = tmp;105 }106 ms->name = psStringCopy(name);107 108 ms->comment = psStringCopy(comment == NULL ? "" : comment);109 110 92 assert (type >= 0 && type < PS_META_NTYPE); 111 93 switch (type) { 112 94 case PS_META_ITEM_SET: 113 *(void **)&ms->val.v= NULL;95 ms->data.V = NULL; 114 96 ms->items = psDlistAlloc(NULL); 115 97 break; 116 98 117 case PS_META_FLOAT: 118 *(float *)&ms->val.f = *(float *)data; 119 break; 120 121 case PS_META_INT: 122 *(int *)&ms->val.i = *(int *)data; 99 case PS_META_F32: // psF32 promoted to psF64 through ... 100 case PS_META_F64: 101 ms->data.F64 = va_arg (ap, psF64); 102 break; 103 104 case PS_META_S32: 105 ms->data.S32 = va_arg (ap, psS32); 123 106 break; 124 107 125 108 case PS_META_STR: 126 *(void **)&ms->val.v = psStringCopy(data);109 ms->data.V = psStringCopy(va_arg(ap, char *)); 127 110 break; 128 111 … … 132 115 case PS_META_ASTROM: 133 116 case PS_META_UNKNOWN: 134 *(void **)&ms->val.v = (void *)data;117 ms->data.V = va_arg(ap, void *); 135 118 break; 136 119 … … 139 122 break; // NOTREACHED 140 123 } 124 125 assert (name != NULL); 126 if (strchr(name, '%') != NULL) { 127 static char tmp[201]; // should be enough; we won't overflow even if it isn't 128 129 if(vsnprintf(tmp, sizeof(tmp), name, ap) > sizeof(tmp) - 1) { 130 psTrace("metadata.name", 1, "Keyword \"%s\" was truncated to \"%s\" upon expansion\n", name, tmp); 131 } 132 133 name = tmp; 134 } 135 ms->name = psStringCopy(name); 136 137 ms->comment = psStringCopy(comment == NULL ? "" : comment); 141 138 142 139 return ms; … … 159 156 break; 160 157 161 case PS_META_FLOAT: 162 case PS_META_INT: 158 case PS_META_F32: 159 case PS_META_F64: 160 case PS_META_S32: 163 161 break; // nothing to do 164 162 165 163 case PS_META_STR: 166 psFree(ms-> val.v);164 psFree(ms->data.V); 167 165 break; 168 166 … … 198 196 psMetadataItem *head = meta; 199 197 if (head == NULL) { // this is the first item of this name 200 head = psMetadataAppend(ms, PS_META_ITEM_SET, NULL, NULL, item->name);198 head = psMetadataAppend(ms, item->name, PS_META_ITEM_SET, NULL); 201 199 } 202 200 … … 224 222 return item; 225 223 } else if (meta != NULL) { 226 psError(__func__, PS_ERR_UNKNOWN, PS_NEW_ERROR,224 psError(__func__, PS_ERR_UNKNOWN, 1, 227 225 "Key \"%s\" is already present in the metaDataSet 0x%x", item->name, ms); 228 226 psMetadataItemFree(item); … … 242 240 */ 243 241 psMetadataItem *psMetadataAppend(psMetadata *restrict md, ///< Metadata to add to 244 int typeFlags, ///< type of this piece of metadata + flags 245 const void *val, ///< value of new item N.b. a pointer even if the item 246 ///< is of type e.g. int 247 const char *comment, ///< comment associated with item 248 const char *name, ///< name of new item of metadata (may be in sprintf 249 ///< format) 250 ... ///< possible arguments for name format 251 ) 242 const char *name, ///< name of new item of metadata 243 int format, ///< type of this piece of metadata + flags 244 const char *comment, ///< comment associated with item 245 ...) ///< possible arguments for name format 252 246 { 253 247 va_list ap; 254 va_start(ap, name);255 256 psMetadataItem *mi = ps VMetadataItemAlloc(typeFlags, val, comment, name, ap);248 va_start(ap, comment); 249 250 psMetadataItem *mi = psMetadataItemAllocV(name, format, comment, ap); 257 251 258 252 va_end(ap); … … 363 357 break; 364 358 365 case PS_META_FLOAT: 366 fprintf(fd, "%g\n", ms->val.f); 367 break; 368 369 case PS_META_INT: 370 fprintf(fd, "%d\n", ms->val.i); 359 case PS_META_F64: 360 case PS_META_F32: 361 fprintf(fd, "%g\n", ms->data.F32); 362 break; 363 364 case PS_META_S32: 365 fprintf(fd, "%d\n", ms->data.S32); 371 366 break; 372 367 373 368 case PS_META_STR: 374 fprintf(fd, "%s\n", (char *)ms-> val.v);369 fprintf(fd, "%s\n", (char *)ms->data.V); 375 370 break; 376 371
Note:
See TracChangeset
for help on using the changeset viewer.
