Changeset 7832
- Timestamp:
- Jul 6, 2006, 4:25:54 PM (20 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/types/psMetadataConfig.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/types/psMetadataConfig.c
r7766 r7832 10 10 * @author Eric Van Alst, MHPCC 11 11 * 12 * @version $Revision: 1.6 2$ $Name: not supported by cvs2svn $13 * @date $Date: 2006-0 6-30 02:20:06$12 * @version $Revision: 1.63 $ $Name: not supported by cvs2svn $ 13 * @date $Date: 2006-07-07 02:25:54 $ 14 14 * 15 15 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 90 90 static psBool parseMetadataItem(char* keyName, psS32* level, psArray* levelArray, char* linePtr, 91 91 psS32 lineCount, char* fileName, psMetadataFlags flags); 92 static psString formatMetadataItem(psMetadataItem *item); 93 static psArray *p_psMetadataKeyArray(psMetadata *md); 92 94 static void parseLevelInfoFree(p_psParseLevelInfo* info) 93 95 { … … 1486 1488 PS_ASSERT_PTR_NON_NULL(md, NULL); 1487 1489 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) { 1496 1496 // XXX : this is probably not the right error value 1497 1497 psError(PS_ERR_BAD_PARAMETER_VALUE, true, 1498 1498 PS_ERRORTEXT_psMetadata_METATYPE_INVALID, PS_DATA_UNKNOWN); 1499 psFree(iter); 1499 psFree(keys); 1500 psFree(format); 1500 1501 return NULL; 1501 1502 } 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 1520 static 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); 1509 1531 } 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 } 1516 1721 break; 1517 1722 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 } 1524 1727 break; 1525 1728 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 } 1532 1733 break; 1533 1734 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 } 1540 1739 break; 1541 1740 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 } 1580 1745 break; 1581 1746 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 } 1588 1751 break; 1589 1752 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 } 1730 1757 break; 1731 1758 case PS_DATA_UNKNOWN: 1732 1759 default: 1733 1760 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); 1737 1763 return NULL; 1738 1764 } 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); 1740 1774 psFree(content); 1741 content = NULL; 1742 } 1743 psFree(iter); 1744 return mdString; 1775 return NULL; 1776 } 1777 1778 return content; 1779 } 1780 1781 1782 static 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); 1795 OUTSIDE: 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; 1745 1810 } 1746 1811
Note:
See TracChangeset
for help on using the changeset viewer.
