IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 7832


Ignore:
Timestamp:
Jul 6, 2006, 4:25:54 PM (20 years ago)
Author:
jhoblitt
Message:

change/fix psMetadataConfigFormat()'s to properly declare MULTIs

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/types/psMetadataConfig.c

    r7766 r7832  
    1010*  @author Eric Van Alst, MHPCC
    1111*
    12 *  @version $Revision: 1.62 $ $Name: not supported by cvs2svn $
    13 *  @date $Date: 2006-06-30 02:20:06 $
     12*  @version $Revision: 1.63 $ $Name: not supported by cvs2svn $
     13*  @date $Date: 2006-07-07 02:25:54 $
    1414*
    1515*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    9090static psBool parseMetadataItem(char* keyName, psS32* level, psArray* levelArray, char* linePtr,
    9191                                psS32 lineCount, char* fileName, psMetadataFlags flags);
     92static psString formatMetadataItem(psMetadataItem *item);
     93static psArray *p_psMetadataKeyArray(psMetadata *md);
    9294static void parseLevelInfoFree(p_psParseLevelInfo* info)
    9395{
     
    14861488    PS_ASSERT_PTR_NON_NULL(md, NULL);
    14871489
    1488     psString mdString = NULL;
    1489     psString content = NULL;
    1490 
    1491     psMetadataItem *item = NULL;
    1492     psMetadataIterator *iter = psMetadataIteratorAlloc(md, PS_LIST_HEAD, NULL);
    1493 
    1494     while ( (item = psMetadataGetAndIncrement(iter)) ) {
    1495         if (item == NULL) {
     1490    psString format = NULL;
     1491
     1492    psArray *keys = p_psMetadataKeyArray(md);
     1493    for (long i = 0; i < psArrayLength(keys); i++) {
     1494        psMetadataItem *item = psMetadataLookup(md, keys->data[i]);
     1495        if (!item) {
    14961496            // XXX : this is probably not the right error value
    14971497            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
    14981498                    PS_ERRORTEXT_psMetadata_METATYPE_INVALID, PS_DATA_UNKNOWN);
    1499             psFree(iter);
     1499            psFree(keys);
     1500            psFree(format);
    15001501            return NULL;
    15011502        }
    1502 
    1503         // In this block, the single item is used to build 'content'
    1504         switch (item->type) {
    1505         case PS_DATA_BOOL:
    1506             psStringAppend (&content, "%s BOOL  ", item->name);
    1507             if ( item->data.B ) {
    1508                 psStringAppend(&content, "TRUE");
     1503        psString str = formatMetadataItem(item);
     1504        if (!str) {
     1505            psError(PS_ERR_UNKNOWN, false, "failed to format psMetadataItem");
     1506            psFree(keys);
     1507            psFree(format);
     1508            return NULL;
     1509        }
     1510        psStringAppend(&format, "%s", str);
     1511        psFree(str);
     1512    }
     1513
     1514    psFree(keys);
     1515
     1516    return format;
     1517}
     1518
     1519
     1520static psString formatMetadataItem(psMetadataItem *item)
     1521{
     1522    PS_ASSERT_PTR_NON_NULL(item, NULL);
     1523
     1524    psString content = NULL;
     1525
     1526    // In this block, the single item is used to build 'content'
     1527    switch (item->type) {
     1528    case PS_DATA_METADATA_MULTI: {
     1529            if (item->comment) {
     1530                psStringAppend(&content, "%s MULTI # %s\n", item->name, item->comment);
    15091531            } else {
    1510                 psStringAppend(&content, "FALSE");
    1511             }
    1512             if ( item->comment != NULL ) {
    1513                 psStringAppend(&content, " #%s", item->comment);
    1514             }
    1515             psStringAppend(&content, " \n", item->comment);
     1532                psStringAppend(&content, "%s MULTI\n", item->name);
     1533            }
     1534
     1535            // a MULTI is a list of items so we need to recurse through the
     1536            // list
     1537            psListIterator *iter = psListIteratorAlloc(item->data.list, 0, false);
     1538            psMetadataItem *multiItem = NULL;
     1539            while ((multiItem = psListGetAndIncrement(iter))) {
     1540                psString str = formatMetadataItem(multiItem);
     1541                psStringAppend(&content, str);
     1542                psFree(str);
     1543            }
     1544        }
     1545        break;
     1546    case PS_DATA_BOOL:
     1547        psStringAppend (&content, "%s BOOL  ", item->name);
     1548        if ( item->data.B ) {
     1549            psStringAppend(&content, "TRUE");
     1550        } else {
     1551            psStringAppend(&content, "FALSE");
     1552        }
     1553        if ( item->comment != NULL ) {
     1554            psStringAppend(&content, " #%s", item->comment);
     1555        }
     1556        psStringAppend(&content, " \n", item->comment);
     1557        break;
     1558    case PS_DATA_S8:
     1559        psStringAppend(&content, "%s S8  ", item->name);
     1560        psStringAppend(&content, "%d ", item->data.S8);
     1561        if ( strncmp(item->comment,"",2) ) {
     1562            psStringAppend(&content, " #%s", item->comment);
     1563        }
     1564        psStringAppend(&content, " \n");
     1565        break;
     1566    case PS_DATA_S16:
     1567        psStringAppend(&content, "%s S16  ", item->name);
     1568        psStringAppend(&content, "%d ", item->data.S16);
     1569        if ( strncmp(item->comment,"",2) ) {
     1570            psStringAppend(&content, " #%s", item->comment);
     1571        }
     1572        psStringAppend(&content, " \n");
     1573        break;
     1574    case PS_DATA_S32:
     1575        psStringAppend(&content, "%s S32  ", item->name);
     1576        psStringAppend(&content, "%d ", item->data.S32);
     1577        if ( strncmp(item->comment,"",2) ) {
     1578            psStringAppend(&content, " #%s", item->comment);
     1579        }
     1580        psStringAppend(&content, " \n");
     1581        break;
     1582    case PS_DATA_S64:
     1583        psStringAppend(&content, "%s S64  ", item->name);
     1584        psStringAppend(&content, "%ld ", item->data.S64);
     1585        if ( strncmp(item->comment,"",2) ) {
     1586            psStringAppend(&content, " #%s", item->comment);
     1587        }
     1588        psStringAppend(&content, " \n");
     1589        break;
     1590    case PS_DATA_U8:
     1591        psStringAppend(&content, "%s U8  ", item->name);
     1592        psStringAppend(&content, "%u ", item->data.U8);
     1593        if ( strncmp(item->comment,"",2) ) {
     1594            psStringAppend(&content, " #%s", item->comment);
     1595        }
     1596        psStringAppend(&content, " \n");
     1597        break;
     1598    case PS_DATA_U16:
     1599        psStringAppend(&content, "%s U16  ", item->name);
     1600        psStringAppend(&content, "%u ", item->data.U16);
     1601        if ( strncmp(item->comment,"",2) ) {
     1602            psStringAppend(&content, " #%s", item->comment);
     1603        }
     1604        psStringAppend(&content, " \n");
     1605        break;
     1606    case PS_DATA_U32:
     1607        psStringAppend(&content, "%s U32  ", item->name);
     1608        psStringAppend(&content, "%u ", item->data.U32);
     1609        if ( strncmp(item->comment,"",2) ) {
     1610            psStringAppend(&content, " #%s", item->comment);
     1611        }
     1612        psStringAppend(&content, " \n");
     1613        break;
     1614    case PS_DATA_U64:
     1615        psStringAppend(&content, "%s U64  ", item->name);
     1616        psStringAppend(&content, "%lu ", item->data.U64);
     1617        if ( strncmp(item->comment,"",2) ) {
     1618            psStringAppend(&content, " #%s", item->comment);
     1619        }
     1620        psStringAppend(&content, " \n");
     1621        break;
     1622    case PS_DATA_F32:
     1623        psStringAppend(&content, "%s F32  ", item->name);
     1624        psStringAppend(&content, "%.7g ", item->data.F32);
     1625        if ( strncmp(item->comment,"",2) ) {
     1626            psStringAppend(&content, " #%s", item->comment);
     1627        }
     1628        psStringAppend(&content, " \n");
     1629        break;
     1630    case PS_DATA_F64:
     1631        psStringAppend(&content, "%s F64  ", item->name);
     1632        psStringAppend(&content, "%.15g ", item->data.F64);
     1633        if ( strncmp(item->comment,"",2) ) {
     1634            psStringAppend(&content, " #%s", item->comment);
     1635        }
     1636        psStringAppend(&content, " \n");
     1637        break;
     1638    case PS_DATA_STRING:
     1639        psStringAppend(&content, "%s STR  ", item->name);
     1640        psStringAppend(&content, "%s ", ((char *)(item->data.V)));
     1641        if ( strncmp(item->comment,"",2) ) {
     1642            psStringAppend(&content, " #%s", item->comment);
     1643        }
     1644        psStringAppend(&content, " \n");
     1645        break;
     1646    case PS_DATA_METADATA:
     1647        psStringAppend(&content, "\n%s  METADATA  ", item->name);
     1648        psString newStr = psMetadataConfigFormat(item->data.md);
     1649        // XXX need to check for NULL return value, implying error
     1650        //     from a lower level
     1651
     1652        // add 3 extra spaces to each metadata folder item
     1653        char *buffer2 = strtok(newStr, "\n");
     1654        while( buffer2 != NULL ) {
     1655            psStringAppend(&content, "\n   %s", buffer2);
     1656            buffer2 = strtok(NULL, "\n");
     1657        }
     1658        if ( strncmp(item->comment,"",2) ) {
     1659            psStringAppend(&content, "\nEND   #%s\n\n", item->comment);
     1660        } else {
     1661            psStringAppend(&content, "\nEND\n\n");
     1662        }
     1663        psFree(newStr);
     1664        break;
     1665    case PS_DATA_TIME:
     1666        psStringAppend(&content, "%s ", item->name);
     1667        psTime *time = item->data.V;
     1668        if ( time->type == PS_TIME_UTC )
     1669            psStringAppend(&content, "PS_TIME_UTC  ");
     1670        else if ( time->type == PS_TIME_TAI )
     1671            psStringAppend(&content, "PS_TIME_TAI  ");
     1672        else if ( time->type == PS_TIME_UT1 )
     1673            psStringAppend(&content, "PS_TIME_UT1  ");
     1674        else if ( time->type == PS_TIME_TT )
     1675            psStringAppend(&content, "PS_TIME_TT  ");
     1676        else {
     1677            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_METATYPE_INVALID, time->type);
     1678            psFree(content);
     1679            return NULL;
     1680        }
     1681
     1682        psStringAppend(&content, "%ld, ", (long)time->sec);
     1683        psStringAppend(&content, "%u, ", time->nsec);
     1684        if ( time->leapsecond )
     1685            psStringAppend(&content, "T ");
     1686        else
     1687            psStringAppend(&content, "F ");
     1688        if ( strncmp(item->comment,"",2) ) {
     1689            psStringAppend(&content, " #%s", item->comment);
     1690        }
     1691        psStringAppend(&content, " \n");
     1692        break;
     1693    case PS_DATA_VECTOR:
     1694        psStringAppend(&content, "@%s ", item->name);
     1695        psVector *vector = item->data.V;
     1696
     1697        switch (vector->type.type) {
     1698        case PS_DATA_U8:
     1699            psStringAppend(&content, "U8 ");
     1700            for (int i = 0; i < vector->n; i++) {
     1701                psStringAppend(&content, "%u ", vector->data.U8[i]);
     1702            }
     1703            break;
     1704        case PS_DATA_U16:
     1705            psStringAppend(&content, "U16 ");
     1706            for (int i = 0; i < vector->n; i++) {
     1707                psStringAppend(&content, "%u ", vector->data.U16[i]);
     1708            }
     1709            break;
     1710        case PS_DATA_U32:
     1711            psStringAppend(&content, "U32 ");
     1712            for (int i = 0; i < vector->n; i++) {
     1713                psStringAppend(&content, "%u ", vector->data.U32[i]);
     1714            }
     1715            break;
     1716        case PS_DATA_U64:
     1717            psStringAppend(&content, "U64 ");
     1718            for (int i = 0; i < vector->n; i++) {
     1719                psStringAppend(&content, "%lu ", vector->data.U64[i]);
     1720            }
    15161721            break;
    15171722        case PS_DATA_S8:
    1518             psStringAppend(&content, "%s S8  ", item->name);
    1519             psStringAppend(&content, "%d ", item->data.S8);
    1520             if ( strncmp(item->comment,"",2) ) {
    1521                 psStringAppend(&content, " #%s", item->comment);
    1522             }
    1523             psStringAppend(&content, " \n");
     1723            psStringAppend(&content, "S8 ");
     1724            for (int i = 0; i < vector->n; i++) {
     1725                psStringAppend(&content, "%d ", vector->data.S8[i]);
     1726            }
    15241727            break;
    15251728        case PS_DATA_S16:
    1526             psStringAppend(&content, "%s S16  ", item->name);
    1527             psStringAppend(&content, "%d ", item->data.S16);
    1528             if ( strncmp(item->comment,"",2) ) {
    1529                 psStringAppend(&content, " #%s", item->comment);
    1530             }
    1531             psStringAppend(&content, " \n");
     1729            psStringAppend(&content, "S16 ");
     1730            for (int i = 0; i < vector->n; i++) {
     1731                psStringAppend(&content, "%d ", vector->data.S16[i]);
     1732            }
    15321733            break;
    15331734        case PS_DATA_S32:
    1534             psStringAppend(&content, "%s S32  ", item->name);
    1535             psStringAppend(&content, "%d ", item->data.S32);
    1536             if ( strncmp(item->comment,"",2) ) {
    1537                 psStringAppend(&content, " #%s", item->comment);
    1538             }
    1539             psStringAppend(&content, " \n");
     1735            psStringAppend(&content, "S32 ");
     1736            for (int i = 0; i < vector->n; i++) {
     1737                psStringAppend(&content, "%d ", vector->data.S32[i]);
     1738            }
    15401739            break;
    15411740        case PS_DATA_S64:
    1542             psStringAppend(&content, "%s S64  ", item->name);
    1543             psStringAppend(&content, "%ld ", item->data.S64);
    1544             if ( strncmp(item->comment,"",2) ) {
    1545                 psStringAppend(&content, " #%s", item->comment);
    1546             }
    1547             psStringAppend(&content, " \n");
    1548             break;
    1549         case PS_DATA_U8:
    1550             psStringAppend(&content, "%s U8  ", item->name);
    1551             psStringAppend(&content, "%u ", item->data.U8);
    1552             if ( strncmp(item->comment,"",2) ) {
    1553                 psStringAppend(&content, " #%s", item->comment);
    1554             }
    1555             psStringAppend(&content, " \n");
    1556             break;
    1557         case PS_DATA_U16:
    1558             psStringAppend(&content, "%s U16  ", item->name);
    1559             psStringAppend(&content, "%u ", item->data.U16);
    1560             if ( strncmp(item->comment,"",2) ) {
    1561                 psStringAppend(&content, " #%s", item->comment);
    1562             }
    1563             psStringAppend(&content, " \n");
    1564             break;
    1565         case PS_DATA_U32:
    1566             psStringAppend(&content, "%s U32  ", item->name);
    1567             psStringAppend(&content, "%u ", item->data.U32);
    1568             if ( strncmp(item->comment,"",2) ) {
    1569                 psStringAppend(&content, " #%s", item->comment);
    1570             }
    1571             psStringAppend(&content, " \n");
    1572             break;
    1573         case PS_DATA_U64:
    1574             psStringAppend(&content, "%s U64  ", item->name);
    1575             psStringAppend(&content, "%lu ", item->data.U64);
    1576             if ( strncmp(item->comment,"",2) ) {
    1577                 psStringAppend(&content, " #%s", item->comment);
    1578             }
    1579             psStringAppend(&content, " \n");
     1741            psStringAppend(&content, "S64 ");
     1742            for (int i = 0; i < vector->n; i++) {
     1743                psStringAppend(&content, "%ld ", vector->data.S64[i]);
     1744            }
    15801745            break;
    15811746        case PS_DATA_F32:
    1582             psStringAppend(&content, "%s F32  ", item->name);
    1583             psStringAppend(&content, "%.7g ", item->data.F32);
    1584             if ( strncmp(item->comment,"",2) ) {
    1585                 psStringAppend(&content, " #%s", item->comment);
    1586             }
    1587             psStringAppend(&content, " \n");
     1747            psStringAppend(&content, "F32 ", MAXSTR);
     1748            for (int i = 0; i < vector->n; i++) {
     1749                psStringAppend(&content, "%.7g ", vector->data.F32[i]);
     1750            }
    15881751            break;
    15891752        case PS_DATA_F64:
    1590             psStringAppend(&content, "%s F64  ", item->name);
    1591             psStringAppend(&content, "%.15g ", item->data.F64);
    1592             if ( strncmp(item->comment,"",2) ) {
    1593                 psStringAppend(&content, " #%s", item->comment);
    1594             }
    1595             psStringAppend(&content, " \n");
    1596             break;
    1597         case PS_DATA_STRING:
    1598             psStringAppend(&content, "%s STR  ", item->name);
    1599             psStringAppend(&content, "%s ", ((char *)(item->data.V)));
    1600             if ( strncmp(item->comment,"",2) ) {
    1601                 psStringAppend(&content, " #%s", item->comment);
    1602             }
    1603             psStringAppend(&content, " \n");
    1604             break;
    1605         case PS_DATA_METADATA:
    1606             psStringAppend(&content, "\n%s  METADATA  ", item->name);
    1607             psString newStr = psMetadataConfigFormat(item->data.md);
    1608             // XXX need to check for NULL return value, implying error
    1609             //     from a lower level
    1610 
    1611             // add 3 extra spaces to each metadata folder item
    1612             char *buffer2 = strtok(newStr, "\n");
    1613             while( buffer2 != NULL ) {
    1614                 psStringAppend(&content, "\n   %s", buffer2);
    1615                 buffer2 = strtok(NULL, "\n");
    1616             }
    1617             if ( strncmp(item->comment,"",2) ) {
    1618                 psStringAppend(&content, "\nEND   #%s\n\n", item->comment);
    1619             } else {
    1620                 psStringAppend(&content, "\nEND\n\n");
    1621             }
    1622             psFree(newStr);
    1623             break;
    1624         case PS_DATA_TIME:
    1625             psStringAppend(&content, "%s ", item->name);
    1626             psTime *time = item->data.V;
    1627             if ( time->type == PS_TIME_UTC )
    1628                 psStringAppend(&content, "PS_TIME_UTC  ");
    1629             else if ( time->type == PS_TIME_TAI )
    1630                 psStringAppend(&content, "PS_TIME_TAI  ");
    1631             else if ( time->type == PS_TIME_UT1 )
    1632                 psStringAppend(&content, "PS_TIME_UT1  ");
    1633             else if ( time->type == PS_TIME_TT )
    1634                 psStringAppend(&content, "PS_TIME_TT  ");
    1635             else {
    1636                 psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_METATYPE_INVALID, time->type);
    1637                 // XXX memory leak: should free content and mdString before returning
    1638                 psFree(iter);
    1639                 return NULL;
    1640             }
    1641 
    1642             psStringAppend(&content, "%ld, ", (long)time->sec);
    1643             psStringAppend(&content, "%u, ", time->nsec);
    1644             if ( time->leapsecond )
    1645                 psStringAppend(&content, "T ");
    1646             else
    1647                 psStringAppend(&content, "F ");
    1648             if ( strncmp(item->comment,"",2) ) {
    1649                 psStringAppend(&content, " #%s", item->comment);
    1650             }
    1651             psStringAppend(&content, " \n");
    1652             break;
    1653         case PS_DATA_VECTOR:
    1654             psStringAppend(&content, "@%s ", item->name);
    1655             psVector *vector = item->data.V;
    1656 
    1657             switch (vector->type.type) {
    1658             case PS_DATA_U8:
    1659                 psStringAppend(&content, "U8 ");
    1660                 for (int i = 0; i < vector->n; i++) {
    1661                     psStringAppend(&content, "%u ", vector->data.U8[i]);
    1662                 }
    1663                 break;
    1664             case PS_DATA_U16:
    1665                 psStringAppend(&content, "U16 ");
    1666                 for (int i = 0; i < vector->n; i++) {
    1667                     psStringAppend(&content, "%u ", vector->data.U16[i]);
    1668                 }
    1669                 break;
    1670             case PS_DATA_U32:
    1671                 psStringAppend(&content, "U32 ");
    1672                 for (int i = 0; i < vector->n; i++) {
    1673                     psStringAppend(&content, "%u ", vector->data.U32[i]);
    1674                 }
    1675                 break;
    1676             case PS_DATA_U64:
    1677                 psStringAppend(&content, "U64 ");
    1678                 for (int i = 0; i < vector->n; i++) {
    1679                     psStringAppend(&content, "%lu ", vector->data.U64[i]);
    1680                 }
    1681                 break;
    1682             case PS_DATA_S8:
    1683                 psStringAppend(&content, "S8 ");
    1684                 for (int i = 0; i < vector->n; i++) {
    1685                     psStringAppend(&content, "%d ", vector->data.S8[i]);
    1686                 }
    1687                 break;
    1688             case PS_DATA_S16:
    1689                 psStringAppend(&content, "S16 ");
    1690                 for (int i = 0; i < vector->n; i++) {
    1691                     psStringAppend(&content, "%d ", vector->data.S16[i]);
    1692                 }
    1693                 break;
    1694             case PS_DATA_S32:
    1695                 psStringAppend(&content, "S32 ");
    1696                 for (int i = 0; i < vector->n; i++) {
    1697                     psStringAppend(&content, "%d ", vector->data.S32[i]);
    1698                 }
    1699                 break;
    1700             case PS_DATA_S64:
    1701                 psStringAppend(&content, "S64 ");
    1702                 for (int i = 0; i < vector->n; i++) {
    1703                     psStringAppend(&content, "%ld ", vector->data.S64[i]);
    1704                 }
    1705                 break;
    1706             case PS_DATA_F32:
    1707                 psStringAppend(&content, "F32 ", MAXSTR);
    1708                 for (int i = 0; i < vector->n; i++) {
    1709                     psStringAppend(&content, "%.7g ", vector->data.F32[i]);
    1710                 }
    1711                 break;
    1712             case PS_DATA_F64:
    1713                 psStringAppend(&content, "F64 ", MAXSTR);
    1714                 for (int i = 0; i < vector->n; i++) {
    1715                     psStringAppend(&content, "%.15g", vector->data.F64[i]);
    1716                 }
    1717                 break;
    1718             case PS_DATA_UNKNOWN:
    1719             default:
    1720                 psError(PS_ERR_BAD_PARAMETER_VALUE, true,
    1721                         PS_ERRORTEXT_psMetadata_METATYPE_INVALID, vector->type.type);
    1722                 psFree(iter);
    1723                 // XXX memory leak: should free content and mdString before returning
    1724                 return NULL;
    1725             }
    1726             if ( strncmp(item->comment,"",2) ) {
    1727                 psStringAppend(&content, " #%s", item->comment);
    1728             }
    1729             psStringAppend(&content, " \n");
     1753            psStringAppend(&content, "F64 ", MAXSTR);
     1754            for (int i = 0; i < vector->n; i++) {
     1755                psStringAppend(&content, "%.15g", vector->data.F64[i]);
     1756            }
    17301757            break;
    17311758        case PS_DATA_UNKNOWN:
    17321759        default:
    17331760            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
    1734                     PS_ERRORTEXT_psMetadata_METATYPE_INVALID, item->type);
    1735             psFree(iter);
    1736             // XXX memory leak: should free content and mdString before returning
     1761                    PS_ERRORTEXT_psMetadata_METATYPE_INVALID, vector->type.type);
     1762            psFree(content);
    17371763            return NULL;
    17381764        }
    1739         psStringAppend(&mdString, content);
     1765        if ( strncmp(item->comment,"",2) ) {
     1766            psStringAppend(&content, " #%s", item->comment);
     1767        }
     1768        psStringAppend(&content, " \n");
     1769        break;
     1770    case PS_DATA_UNKNOWN:
     1771    default:
     1772        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
     1773                PS_ERRORTEXT_psMetadata_METATYPE_INVALID, item->type);
    17401774        psFree(content);
    1741         content = NULL;
    1742     }
    1743     psFree(iter);
    1744     return mdString;
     1775        return NULL;
     1776    }
     1777
     1778    return content;
     1779}
     1780
     1781
     1782static psArray *p_psMetadataKeyArray(psMetadata *md)
     1783{
     1784    PS_ASSERT_PTR_NON_NULL(md, NULL);
     1785
     1786    psArray *keys = psArrayAlloc(psListLength(md->list));
     1787
     1788    // since we want to preserve the order of the keys in the metadata we can't
     1789    // get a list of key names from the metadata's hash table.  Instead we have
     1790    // to iterate through the metadata's list of items and reject duplicate key
     1791    // names.
     1792
     1793    psMetadataItem *item = NULL;
     1794    psMetadataIterator *iter = psMetadataIteratorAlloc(md, PS_LIST_HEAD, NULL);
     1795OUTSIDE:
     1796    while ((item = psMetadataGetAndIncrement(iter))) {
     1797        for (long i = 0; i < psArrayLength(keys); i++) {
     1798            // does this element have a value
     1799            psString elem = keys->data[i];
     1800            if (elem) {
     1801                if(strcmp(elem, item->name) == 0) {
     1802                    goto OUTSIDE;
     1803                }
     1804            }
     1805        }
     1806        psArrayAdd(keys, 0, psStringCopy(item->name));
     1807    }
     1808
     1809    return keys;
    17451810}
    17461811
Note: See TracChangeset for help on using the changeset viewer.