IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Nov 30, 2005, 6:03:51 PM (20 years ago)
Author:
Paul Price
Message:

pmFPAMorph compiles

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/archive/scripts/src/phase2/psAdditionals.c

    r5633 r5651  
    33#include "pslib.h"
    44#include "psAdditionals.h"
     5
     6
     7psMetadata *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
    576
    677psMetadata *psMetadataLookupMD(bool *status, const psMetadata *md, const char *key)
Note: See TracChangeset for help on using the changeset viewer.