Changeset 6956
- Timestamp:
- Apr 21, 2006, 5:20:33 PM (20 years ago)
- Location:
- trunk/psModules/src/pslib
- Files:
-
- 2 edited
-
psAdditionals.c (modified) (2 diffs)
-
psAdditionals.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/pslib/psAdditionals.c
r6872 r6956 3 3 #include "pslib.h" 4 4 #include "psAdditionals.h" 5 6 psMetadata *pap_psMetadataCopy(psMetadata *out,7 const psMetadata *in)8 {9 PS_ASSERT_PTR_NON_NULL(in,NULL);10 if (out == NULL) {11 out = psMetadataAlloc();12 }13 psMetadataItem *inItem = NULL;14 psMetadataIterator *iter = psMetadataIteratorAlloc(*(psMetadata**)&in, PS_LIST_HEAD, NULL);15 unsigned long numPointers = 0; // Number of pointers we were forced to copy16 while ((inItem = psMetadataGetAndIncrement(iter))) {17 // Need to look for MULTI, which won't be picked up using the iterator.18 psMetadataItem *multiCheckItem = psMetadataLookup(in, inItem->name);19 unsigned int flag = PS_META_REPLACE; // Flag to indicate MULTI; otherwise, replace20 if (multiCheckItem->type == PS_DATA_METADATA_MULTI) {21 psTrace(__func__, 10, "MULTI: %s (%s)\n", inItem->name, inItem->comment);22 flag = PS_DATA_METADATA_MULTI;23 }24 25 psTrace(__func__, 5, "Copying %s (%s)...\n", inItem->name, inItem->comment);26 27 #define PS_METADATA_COPY_CASE(NAME,TYPE) \28 case PS_TYPE_##NAME: \29 if (! psMetadataAdd(out, PS_LIST_TAIL, inItem->name, PS_TYPE_##NAME | flag, inItem->comment, \30 inItem->data.TYPE)) { \31 psErrorStackPrint(stderr, "Error copying %s (%s) in the metadata\n", inItem->name, \32 inItem->comment); \33 } \34 break;35 36 switch (inItem->type) {37 // Numerical types38 PS_METADATA_COPY_CASE(BOOL,B);39 PS_METADATA_COPY_CASE(S8,S8);40 PS_METADATA_COPY_CASE(S16,S16);41 PS_METADATA_COPY_CASE(S32,S32);42 PS_METADATA_COPY_CASE(U8,U8);43 PS_METADATA_COPY_CASE(U16,U16);44 PS_METADATA_COPY_CASE(U32,U32);45 PS_METADATA_COPY_CASE(F32,F32);46 PS_METADATA_COPY_CASE(F64,F64);47 48 // String: relying on the fact that this will copy the string, not point at it.49 case PS_DATA_STRING:50 psMetadataAdd(out, PS_LIST_TAIL, inItem->name, PS_DATA_STRING | flag, inItem->comment,51 inItem->data.V);52 break;53 54 // Metadata: copy the next level and stuff that in too55 case PS_DATA_METADATA: {56 psMetadata *metadata = pap_psMetadataCopy(NULL, inItem->data.md);57 psMetadataAdd(out, PS_LIST_TAIL, inItem->name, PS_DATA_METADATA | flag, inItem->comment,58 metadata);59 break;60 }61 // Other kinds of pointers62 default:63 numPointers++;64 psTrace(__func__, 10, "Copying a pointer in the metadata: %x\n", inItem->type);65 psMetadataAdd(out, PS_LIST_TAIL, inItem->name, inItem->type | flag, inItem->comment,66 inItem->data.V);67 break;68 }69 }70 psFree(iter);71 72 if (numPointers > 0) {73 psLogMsg(__func__, PS_LOG_WARN, "Forced to copy %d pointers when copying metadata. Updating the "74 "copied psMetadata will affect the original!\n", numPointers);75 }76 return out;77 }78 5 79 6 // may need to extend this to change the keyname in the copy … … 87 14 psMetadataAddItem (out, item, PS_LIST_TAIL, PS_META_REPLACE); 88 15 return true; 89 }90 91 void psMetadataPrint(psMetadata *md, int level)92 {93 psMetadataIterator *iter = psMetadataIteratorAlloc(md, PS_LIST_HEAD, NULL); // Iterator94 psMetadataItem *item = NULL; // Item from metadata95 while ((item = psMetadataGetAndIncrement(iter))) {96 // Indent...97 for (int i = 0; i < level; i++) {98 printf(" ");99 }100 printf("%s", item->name);101 if (item->comment && strlen(item->comment) > 0) {102 printf(" (%s)", item->comment);103 }104 printf(": ");105 switch (item->type) {106 case PS_DATA_STRING:107 printf("%s", (char*)item->data.V);108 break;109 case PS_DATA_BOOL:110 if (item->data.B) {111 printf("True");112 } else {113 printf("False");114 }115 break;116 case PS_DATA_S32:117 printf("%d", item->data.S32);118 break;119 case PS_DATA_F32:120 printf("%f", item->data.F32);121 break;122 case PS_DATA_F64:123 printf("%f", item->data.F64);124 break;125 case PS_DATA_METADATA:126 printf("\n");127 psMetadataPrint(item->data.V, level + 1);128 break;129 default:130 printf("\n");131 psError(PS_ERR_IO, false, "Non-printable metadata type: %x\n", item->type);132 }133 printf("\n");134 }135 psFree(iter);136 137 return;138 }139 140 // XXX: This should probably be implemented using strpbrk141 psList *psStringSplit(const char *string,142 const char *splitters)143 {144 psList *values = psListAlloc(NULL); // The list of values to return145 if (string == NULL)146 return values; // NULL string is not an error, just an empty list147 148 unsigned int length = strlen(string); // The length of the string149 unsigned int numSplitters = strlen(splitters); // Number of characters that might split150 unsigned int start = 0; // The position of the start of a word151 for (int i = 1; i < length; i++) {152 bool split = false; // Is this character a splitter?153 for (int j = 0; j < numSplitters && ! split; j++) {154 if (string[i] == splitters[j]) {155 split = true;156 }157 }158 if (split) {159 if (i == start) {160 // Some idiot put in two spaces, or two commas or something161 start++;162 } else {163 // We're at the end of the word164 psString word = psStringNCopy(&string[start], i - start);165 (void)psListAdd(values, PS_LIST_TAIL, word);166 start = i + 1;167 psFree(word);168 }169 }170 }171 if (start < length) {172 // Copy the last word173 psString word = psStringNCopy(&string[start], length - start);174 (void)psListAdd(values, PS_LIST_TAIL, word);175 psFree(word);176 }177 178 return values;179 16 } 180 17 -
trunk/psModules/src/pslib/psAdditionals.h
r6872 r6956 7 7 #include "pslib.h" 8 8 9 // Deep copy of metadata10 // Corrected version of MHPCC code in psLib at the moment11 psMetadata *pap_psMetadataCopy(psMetadata *out, // Target, to which the copy is made12 const psMetadata *in // Source, from which the copy is made13 );14 15 9 // copy a metadata item from one psMetadata to another 16 10 bool psMetadataItemTransfer (psMetadata *out, // Destination: copy is placed here … … 18 12 char *key // key to identify the metadata item 19 13 ); 20 21 22 // Print out the metadata23 void psMetadataPrint(psMetadata *md, // Metadata to print24 int level // Indent level25 );26 27 // Split string on given characters28 psList *psStringSplit(const char *string, // String to split29 const char *splitters // Characters on which to split30 );31 14 32 15 // Split string on given characters
Note:
See TracChangeset
for help on using the changeset viewer.
