Changeset 5651 for trunk/archive/scripts/src/phase2/psAdditionals.c
- Timestamp:
- Nov 30, 2005, 6:03:51 PM (20 years ago)
- File:
-
- 1 edited
-
trunk/archive/scripts/src/phase2/psAdditionals.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/archive/scripts/src/phase2/psAdditionals.c
r5633 r5651 3 3 #include "pslib.h" 4 4 #include "psAdditionals.h" 5 6 7 psMetadata *psMetadataCopy(psMetadata *out, 8 const psMetadata *in) 9 { 10 PS_ASSERT_PTR_NON_NULL(in,NULL); 11 if (out == NULL) { 12 out = psMetadataAlloc(); 13 } 14 psMetadataItem *inItem = NULL; 15 psMetadataIterator *iter = psMetadataIteratorAlloc(*(psMetadata**)&in, PS_LIST_HEAD, NULL); 16 unsigned long numPointers = 0; // Number of pointers we were forced to copy 17 while (inItem = psMetadataGetAndIncrement(iter)) { 18 psMetadataItem *outItem = NULL; 19 20 // Need to look for MULTI, which won't be picked up using the iterator. 21 psMetadataItem *multiCheckItem = psMetadataLookup(in, inItem->name); 22 int multiFlag = 0; // Flag to indicate MULTI or not 23 if (multiCheckItem->type == PS_DATA_METADATA_MULTI) { 24 multiFlag = PS_DATA_METADATA_MULTI; 25 } 26 27 #define PS_METADATA_COPY_CASE(NAME,TYPE) \ 28 case PS_TYPE_##NAME: \ 29 psMetadataAdd(out, PS_LIST_TAIL, inItem->name, PS_TYPE_##NAME | multiFlag, inItem->comment, \ 30 inItem->data.TYPE); \ 31 break; 32 33 switch (inItem->type) { 34 // Numerical types 35 PS_METADATA_COPY_CASE(BOOL,B); 36 PS_METADATA_COPY_CASE(S8, S8); 37 PS_METADATA_COPY_CASE(S16, S16); 38 PS_METADATA_COPY_CASE(S32, S32); 39 PS_METADATA_COPY_CASE(U8, U8); 40 PS_METADATA_COPY_CASE(U16, U16); 41 PS_METADATA_COPY_CASE(U32, U32); 42 PS_METADATA_COPY_CASE(F32, F32); 43 PS_METADATA_COPY_CASE(F64, F64); 44 45 // String: relying on the fact that this will copy the string, not point at it. 46 case PS_DATA_STRING: 47 psMetadataAdd(out, PS_LIST_TAIL, inItem->name, PS_DATA_STRING | multiFlag, inItem->comment, 48 inItem->data.V); 49 break; 50 51 // Metadata: copy the next level and stuff that in too 52 case PS_DATA_METADATA: 53 { 54 psMetadata *metadata = psMetadataCopy(NULL, inItem->data.md); 55 psMetadataAdd(out, PS_LIST_TAIL, inItem->name, PS_DATA_METADATA | multiFlag, inItem->comment, 56 metadata); 57 break; 58 } 59 // Other kinds of pointers 60 default: 61 numPointers++; 62 psMetadataItemAlloc(inItem->name, inItem->type, inItem->comment, inItem->data.V); 63 break; 64 } 65 } 66 psFree(iter); 67 68 if (numPointers > 0) { 69 psLogMsg(__func__, PS_LOG_WARN, "Forced to copy %d pointers when copying metadata. Updating the " 70 "copied psMetadata will affect the original!\n"); 71 } 72 73 return out; 74 } 75 5 76 6 77 psMetadata *psMetadataLookupMD(bool *status, const psMetadata *md, const char *key)
Note:
See TracChangeset
for help on using the changeset viewer.
