소스 검색

cmData.h/c : Added scalar bool (kBoolDtId) data type.

Changed container values from integers to flags so they can be mixed with
basic data types when used with var-arg based functions.
Added cmErr_t* arg's to all var-arg based functions.
master
kpl 10 년 전
부모
커밋
86f64739e4
2개의 변경된 파일369개의 추가작업 그리고 161개의 파일을 삭제
  1. 262
    98
      cmData.c
  2. 107
    63
      cmData.h

+ 262
- 98
cmData.c 파일 보기

@@ -26,6 +26,7 @@ typedef struct
26 26
 cmDtTypeInfo_t _cmDtTypeInfoArray[] =
27 27
 {
28 28
   { kNullDtId,   0,                    "null"           },
29
+  { kBoolDtId,   sizeof(bool),            "bool"         },
29 30
   { kUCharDtId,  sizeof(unsigned char),  "uchar"        },
30 31
   { kCharDtId,   sizeof(char),           "char"         },
31 32
   { kUShortDtId, sizeof(unsigned short), "ushort"       },
@@ -235,6 +236,8 @@ cmDtRC_t cmDataNewScalar( cmData_t* parent, cmDataTypeId_t tid, unsigned flags,
235 236
 
236 237
 cmDtRC_t cmDataNewNull(   cmData_t* parent, unsigned flags, cmData_t** ref )
237 238
 { *ref = _cmDataNew(parent, kScalarDtId, kNullDtId); return kOkDtRC; }
239
+cmDtRC_t cmDataNewBool(   cmData_t* parent, unsigned flags, bool v, cmData_t** ref )
240
+{ return cmDataNewScalar(parent,kBoolDtId,flags,&v,0,ref); }
238 241
 cmDtRC_t cmDataNewChar(   cmData_t* parent, unsigned flags, char v, cmData_t** ref )
239 242
 { return cmDataNewScalar(parent,kCharDtId,flags,&v,0,ref); }
240 243
 cmDtRC_t cmDataNewUChar(  cmData_t* parent, unsigned flags, unsigned char v,  cmData_t** ref )
@@ -297,6 +300,7 @@ cmDtRC_t  cmDataSetScalarValue( cmData_t* d, cmDataTypeId_t tid, void* vp, unsig
297 300
     case kNullDtId: // 'd' is already NULL.      
298 301
       break;
299 302
       
303
+    case kBoolDtId:    d->u.b  = *(bool*)vp;           break;
300 304
     case kUCharDtId:   d->u.uc = *(unsigned char*)vp;  break;
301 305
     case kCharDtId:    d->u.c  = *(char*)vp;           break;  
302 306
     case kUShortDtId:  d->u.us = *(unsigned short*)vp; break;   
@@ -379,6 +383,8 @@ cmDtRC_t  cmDataSetScalarValue( cmData_t* d, cmDataTypeId_t tid, void* vp, unsig
379 383
 
380 384
 cmDtRC_t cmDataSetNull(      cmData_t* d )
381 385
 { return cmDataSetScalarValue(d, kNullDtId, NULL, 0, kNoFlagsDtFl ); }
386
+cmDtRC_t cmDataSetBool(      cmData_t* d, bool v )
387
+{ return cmDataSetScalarValue(d, kBoolDtId, &v, 0, kNoFlagsDtFl ); }
382 388
 cmDtRC_t cmDataSetChar(      cmData_t* d, char v )
383 389
 { return cmDataSetScalarValue(d, kCharDtId, &v, 0, kNoFlagsDtFl ); }
384 390
 cmDtRC_t cmDataSetUChar(     cmData_t* d, unsigned char v )
@@ -413,6 +419,13 @@ cmDtRC_t cmDataSetConstBlob( cmData_t* d, unsigned flags, const void* v, unsigne
413 419
 { return cmDataSetScalarValue(d, kBlobDtId, (void*)v, byteCnt, flags |= kConstValueDtFl); }
414 420
 
415 421
 
422
+cmDtRC_t cmDataBool(      const cmData_t* d, bool* v )
423
+{
424
+  if( d->tid != kBoolDtId )
425
+    return _cmDtErrMsg(d,kInvalidTypeDtRC,"Expected type:bool but encountered type:%s.",cmDataTypeToLabel(d->tid));
426
+  *v = d->u.c;
427
+  return kOkDtRC; 
428
+}
416 429
 
417 430
 cmDtRC_t cmDataChar(      const cmData_t* d, char* v )
418 431
 {
@@ -555,6 +568,13 @@ cmDtRC_t cmDataConstBlob(  const cmData_t* d, const void** v, unsigned* byteCntR
555 568
   return kOkDtRC;
556 569
 }
557 570
 
571
+bool           cmDtBool(      const cmData_t* p )
572
+{
573
+  bool v;
574
+  if( cmDataBool(p,&v) != kOkDtRC )
575
+    v = kInvalidDtBool;
576
+  return v;
577
+}
558 578
 
559 579
 char           cmDtChar(      const cmData_t* p )
560 580
 {
@@ -668,6 +688,29 @@ const void*    cmDtConstBlob( const cmData_t* p, unsigned* byteCntRef )
668 688
   return v;
669 689
 }
670 690
 
691
+cmDtRC_t  cmDataGetBool( const cmData_t* p, bool* vp )
692
+{
693
+  if( p->cid != kScalarDtId )
694
+    return _cmDtErrMsg(p,kInvalidContDtRC,"Cannot convert a non-scalar value to a scalar value.");
695
+
696
+  switch( p->tid )
697
+  {
698
+    case kBoolDtId:   *vp =       p->u.b;  break;
699
+    case kUCharDtId:  *vp = (bool)p->u.uc; break;
700
+    case kCharDtId:   *vp = (bool)p->u.c;  break;
701
+    case kUShortDtId: *vp = (bool)p->u.us; break;
702
+    case kShortDtId:  *vp = (bool)p->u.s;  break;
703
+    case kUIntDtId:   *vp = (bool)p->u.ui; break;
704
+    case kIntDtId:    *vp = (bool)p->u.i;  break;
705
+    case kULongDtId:  *vp = (bool)p->u.ul; break;
706
+    case kLongDtId:   *vp = (bool)p->u.l;  break;
707
+    case kFloatDtId:  *vp = (bool)p->u.f;  break;
708
+    case kDoubleDtId: *vp = (bool)p->u.d;  break;
709
+    default:
710
+      return _cmDtErrMsg(p,kCvtErrDtRC,"Cannot convert '%s' to 'bool'.",cmDataTypeToLabel(p->tid));
711
+  }
712
+  return kOkDtRC;
713
+}
671 714
 
672 715
 cmDtRC_t  cmDataGetUChar( const cmData_t* p, unsigned char* vp )
673 716
 {
@@ -677,6 +720,7 @@ cmDtRC_t  cmDataGetUChar( const cmData_t* p, unsigned char* vp )
677 720
   switch( p->tid )
678 721
   {
679 722
     case kUCharDtId:  *vp =                p->u.uc; break;
723
+    case kBoolDtId:   *vp = (unsigned char)p->u.b;  break;
680 724
     case kCharDtId:   *vp = (unsigned char)p->u.c;  break;
681 725
     case kUShortDtId: *vp = (unsigned char)p->u.us; break;
682 726
     case kShortDtId:  *vp = (unsigned char)p->u.s;  break;
@@ -699,6 +743,7 @@ cmDtRC_t  cmDataGetChar( const cmData_t* p, char* vp )
699 743
 
700 744
   switch( p->tid )
701 745
   {
746
+    case kBoolDtId:   *vp = (char)p->u.b;  break;
702 747
     case kUCharDtId:  *vp = (char)p->u.uc; break;
703 748
     case kCharDtId:   *vp =       p->u.c;  break;
704 749
     case kUShortDtId: *vp = (char)p->u.us; break;
@@ -722,6 +767,7 @@ cmDtRC_t cmDataGetShort(     const cmData_t* p, short* vp )
722 767
 
723 768
   switch( p->tid )
724 769
   {
770
+    case kBoolDtId:   *vp = (short)p->u.b;  break;
725 771
     case kUCharDtId:  *vp = (short)p->u.uc; break;
726 772
     case kCharDtId:   *vp = (short)p->u.c;  break;
727 773
     case kUShortDtId: *vp = (short)p->u.us; break;
@@ -747,6 +793,7 @@ cmDtRC_t  cmDataGetUShort(    const cmData_t* p, unsigned short* vp )
747 793
 
748 794
   switch( p->tid )
749 795
   {
796
+    case kBoolDtId:   *vp = (unsigned short)p->u.b;  break;
750 797
     case kUCharDtId:  *vp = (unsigned short)p->u.uc; break;
751 798
     case kCharDtId:   *vp = (unsigned short)p->u.c;  break;
752 799
     case kUShortDtId: *vp =                 p->u.us; break;
@@ -771,6 +818,7 @@ cmDtRC_t cmDataGetInt(       const cmData_t* p, int* vp )
771 818
 
772 819
   switch( p->tid )
773 820
   {
821
+    case kBoolDtId:   *vp = (int)p->u.b;  break;
774 822
     case kUCharDtId:  *vp = (int)p->u.uc; break;
775 823
     case kCharDtId:   *vp = (int)p->u.c;  break;
776 824
     case kUShortDtId: *vp = (int)p->u.us; break;
@@ -795,6 +843,7 @@ cmDtRC_t    cmDataGetUInt(      const cmData_t* p, unsigned int* vp )
795 843
 
796 844
   switch( p->tid )
797 845
   {
846
+    case kBoolDtId:   *vp = (unsigned int)p->u.b;  break;
798 847
     case kUCharDtId:  *vp = (unsigned int)p->u.uc; break;
799 848
     case kCharDtId:   *vp = (unsigned int)p->u.c;  break;
800 849
     case kUShortDtId: *vp = (unsigned int)p->u.us; break;
@@ -819,6 +868,7 @@ cmDtRC_t  cmDataGetLong( const cmData_t* p, long* vp )
819 868
 
820 869
   switch( p->tid )
821 870
   {
871
+    case kBoolDtId:   *vp = (long)p->u.b;  break;
822 872
     case kUCharDtId:  *vp = (long)p->u.uc; break;
823 873
     case kCharDtId:   *vp = (long)p->u.c;  break;
824 874
     case kUShortDtId: *vp = (long)p->u.us; break;
@@ -843,6 +893,7 @@ cmDtRC_t   cmDataGetULong(     const cmData_t* p, unsigned long* vp )
843 893
 
844 894
   switch( p->tid )
845 895
   {
896
+    case kBoolDtId:   *vp = (unsigned long)p->u.b;  break;
846 897
     case kUCharDtId:  *vp = (unsigned long)p->u.uc; break;
847 898
     case kCharDtId:   *vp = (unsigned long)p->u.c;  break;
848 899
     case kUShortDtId: *vp = (unsigned long)p->u.us; break;
@@ -867,6 +918,7 @@ cmDtRC_t   cmDataGetFloat(     const cmData_t* p, float* vp )
867 918
 
868 919
   switch( p->tid )
869 920
   {
921
+    case kBoolDtId:   *vp = (float)p->u.b;  break;
870 922
     case kUCharDtId:  *vp = (float)p->u.uc; break;
871 923
     case kCharDtId:   *vp = (float)p->u.c;  break;
872 924
     case kUShortDtId: *vp = (float)p->u.us; break;
@@ -891,6 +943,7 @@ cmDtRC_t  cmDataGetDouble(    const cmData_t* p, double* vp )
891 943
 
892 944
   switch( p->tid )
893 945
   {
946
+    case kBoolDtId:   *vp = (double)p->u.b;  break;
894 947
     case kUCharDtId:  *vp = (double)p->u.uc; break;
895 948
     case kCharDtId:   *vp = (double)p->u.c;  break;
896 949
     case kUShortDtId: *vp = (double)p->u.us; break;
@@ -1014,6 +1067,8 @@ cmDtRC_t cmDataNewArray( cmData_t* parent, cmDataTypeId_t tid, void* vp, unsigne
1014 1067
 
1015 1068
 }
1016 1069
 
1070
+cmDtRC_t cmDataNewBoolArray(   cmData_t* parent, bool* v,  unsigned eleCnt, unsigned flags, cmData_t** ref )
1071
+{ return cmDataNewArray(parent, kBoolDtId, v, eleCnt, flags, ref ); }
1017 1072
 cmDtRC_t cmDataNewCharArray(   cmData_t* parent, char* v,  unsigned eleCnt, unsigned flags, cmData_t** ref )
1018 1073
 { return cmDataNewArray(parent, kCharDtId, v, eleCnt, flags, ref ); }
1019 1074
 cmDtRC_t cmDataNewUCharArray(  cmData_t* parent, unsigned char* v,  unsigned eleCnt, unsigned flags, cmData_t** ref )
@@ -1099,6 +1154,8 @@ cmDtRC_t cmDataSetArrayValue( cmData_t* d, cmDataTypeId_t tid, void* vp, unsigne
1099 1154
 
1100 1155
 }
1101 1156
 
1157
+cmDtRC_t cmDataSetBoolArray(   cmData_t* d, bool* v,           unsigned eleCnt, unsigned flags )
1158
+{ return cmDataSetArrayValue(d, kBoolDtId, v, eleCnt, flags ); }
1102 1159
 cmDtRC_t cmDataSetCharArray(   cmData_t* d, char* v,           unsigned eleCnt, unsigned flags )
1103 1160
 { return cmDataSetArrayValue(d, kCharDtId, v, eleCnt, flags ); }
1104 1161
 cmDtRC_t cmDataSetUCharArray(  cmData_t* d, unsigned char* v,  unsigned eleCnt, unsigned flags )
@@ -1128,6 +1185,13 @@ cmDtRC_t cmDataSetConstStrArray(cmData_t* d,const cmChar_t** v,unsigned eleCnt,
1128 1185
 unsigned cmDataArrayEleCount( const cmData_t* d )
1129 1186
 { return d->cid==kArrayDtId ? d->cnt : 0; }
1130 1187
 
1188
+cmDtRC_t cmDataBoolArray(      const cmData_t* d, bool** v )
1189
+{
1190
+  if( d->cid != kArrayDtId )
1191
+    return _cmDtErrMsg(d,kInvalidContDtRC,"Cannot return an array base for a %s container.",cmDataContainerIdToLabel(d->cid));
1192
+  *v = (bool*)d->u.vp;
1193
+  return kOkDtRC;
1194
+}
1131 1195
 
1132 1196
 cmDtRC_t cmDataCharArray(      const cmData_t* d, char** v )
1133 1197
 {
@@ -1209,6 +1273,14 @@ cmDtRC_t cmDataDoubleArray(    const cmData_t* d, double** v )
1209 1273
   return kOkDtRC;
1210 1274
 }
1211 1275
 
1276
+bool*           cmDtBoolArray(      const cmData_t* d )
1277
+{
1278
+  bool* v = NULL;
1279
+  if( cmDataBoolArray(d,&v) != kOkDtRC )
1280
+    return NULL;
1281
+  return v;
1282
+}
1283
+
1212 1284
 char*           cmDtCharArray(      const cmData_t* d )
1213 1285
 {
1214 1286
   char* v = NULL;
@@ -1612,46 +1684,108 @@ cmData_t* cmDataPairMake( cmData_t* parent, cmData_t* p, cmData_t* key, cmData_t
1612 1684
 }
1613 1685
 
1614 1686
 // Dynamically allocate a pair node 
1615
-cmData_t* cmDataPairAlloc(  cmData_t* parent, const cmData_t* key, const cmData_t* value )
1687
+cmRC_t cmDataPairAlloc(  cmData_t* parent, const cmData_t* key, const cmData_t* value, cmData_t** ref )
1616 1688
 {
1689
+  cmRC_t    rc = kOkDtRC;
1617 1690
   cmData_t* p  = _cmDataNew(parent,kPairDtId,kStructDtId);
1618
-  cmData_t* kp  = NULL;
1691
+  cmData_t* kp = NULL;
1619 1692
   cmData_t* vp = NULL;
1620 1693
 
1621
-  // BUG BUG BUG - must check return value of cmDataDupl()
1622
-  cmDataDupl(key,&kp);
1623
-  cmDataDupl(value,&vp);
1694
+  if( ref != NULL )
1695
+    *ref = NULL;
1696
+
1697
+  if((rc = cmDataDupl(key,&kp)) != kOkDtRC )
1698
+    goto errLabel;
1699
+
1700
+  if((rc = cmDataDupl(value,&vp)) != kOkDtRC )
1701
+    goto errLabel;
1624 1702
 
1625 1703
   cmDataPrependChild(p,vp);
1626 1704
   cmDataPrependChild(p,kp);
1627
-  return p;
1705
+
1706
+  if( ref != NULL )
1707
+    *ref = p;
1708
+
1709
+ errLabel:
1710
+  if( rc != kOkDtRC )
1711
+  {
1712
+    cmDataFree(kp);
1713
+    cmDataFree(vp);
1714
+    cmDataFree(p);
1715
+  }
1716
+
1717
+  return rc;
1628 1718
 }
1629 1719
 
1630
-cmData_t* cmDataPairAllocId(cmData_t* parent, unsigned  keyId,  cmData_t* value )
1720
+cmRC_t cmDataPairAllocId(cmData_t* parent, unsigned  keyId,  cmData_t* value, cmData_t** ref )
1631 1721
 {
1722
+  cmRC_t rc = kOkDtRC;
1723
+  if( ref != NULL )
1724
+    *ref = NULL;
1725
+
1632 1726
   cmData_t* p  = _cmDataNew(parent,kPairDtId,kStructDtId);
1633
-  cmDataNewUInt(p,kNoFlagsDtFl,keyId,NULL);
1727
+
1728
+  if((rc = cmDataNewUInt(p,kNoFlagsDtFl,keyId,NULL)) != kOkDtRC )
1729
+    goto errLabel;
1730
+
1634 1731
   cmDataAppendChild(p,value);
1635
-  return p;
1732
+
1733
+  if( ref != NULL )
1734
+    *ref = p;
1735
+  
1736
+ errLabel:
1737
+  if( rc != kOkDtRC )
1738
+    cmDataFree(p);
1739
+
1740
+  return rc;
1636 1741
 }
1637 1742
 
1638
-cmData_t* cmDataPairAllocLabel( cmData_t* parent, const cmChar_t *label, cmData_t* value )
1743
+cmRC_t cmDataPairAllocLabel( cmData_t* parent, const cmChar_t *label, cmData_t* value, cmData_t** ref )
1639 1744
 {
1745
+  cmRC_t    rc = kOkDtRC;
1640 1746
   cmData_t* p  = _cmDataNew(parent,kPairDtId,kStructDtId);
1641 1747
 
1642
-  // BUG BUG BUG - should check return value
1643
-  cmDataNewConstStr(p,kNoFlagsDtFl,label,NULL);
1748
+  if( ref != NULL )
1749
+    *ref = NULL;
1750
+
1751
+  if((rc = cmDataNewConstStr(p,kNoFlagsDtFl,label,NULL)) != kOkDtRC )
1752
+    goto errLabel;
1753
+
1644 1754
   cmDataAppendChild(p,value);
1645
-  return p;
1755
+
1756
+  if( ref != NULL )
1757
+    *ref = p;
1758
+
1759
+ errLabel:
1760
+
1761
+  if( rc != kOkDtRC )
1762
+    cmDataFree(p);
1763
+
1764
+  return rc;
1646 1765
 }
1647 1766
 
1648
-cmData_t* cmDataPairAllocLabelN(cmData_t* parent, const cmChar_t* label, unsigned charCnt, cmData_t* value)
1767
+cmRC_t cmDataPairAllocLabelN(cmData_t* parent, const cmChar_t* label, unsigned charCnt, cmData_t* value, cmData_t** ref)
1649 1768
 {
1769
+  cmRC_t rc = kOkDtRC;
1770
+
1771
+  if( ref != NULL )
1772
+    *ref = NULL;
1773
+
1650 1774
   cmData_t* p  = _cmDataNew(parent,kPairDtId,kStructDtId);
1651
-  // BUG BUG BUG - should check return value
1652
-  cmDataNewConstStrN(p,kNoFlagsDtFl,label,charCnt,NULL);
1775
+
1776
+  if((rc = cmDataNewConstStrN(p,kNoFlagsDtFl,label,charCnt,NULL)) != kOkDtRC )
1777
+    goto errLabel;
1778
+
1653 1779
   cmDataAppendChild(p,value);
1654
-  return p;
1780
+
1781
+  if( ref != NULL )
1782
+    *ref = p;
1783
+
1784
+ errLabel:
1785
+  if( rc != kOkDtRC )
1786
+    cmMemFree(p);
1787
+
1788
+  return rc;
1655 1789
 }
1656 1790
 
1657 1791
   
@@ -1678,35 +1812,47 @@ cmData_t* cmDataListMake(  cmData_t* parent, cmData_t* p )
1678 1812
 cmData_t* cmDataListAlloc( cmData_t* parent)
1679 1813
 { return _cmDataNew(parent,kListDtId,kStructDtId); }
1680 1814
 
1681
-cmDtRC_t  _cmDataParseArgV( cmData_t* parent, va_list vl, cmData_t** vpp )
1815
+cmDtRC_t  _cmDataParseArgV( cmData_t* parent, cmErr_t* err, cmRC_t errRC, va_list vl, cmData_t** vpp )
1682 1816
 {
1683
-  cmDtRC_t            rc  = kOkDtRC;
1684
-  cmData_t*           vp  = NULL;
1685
-  cmDataContainerId_t cid = va_arg(vl,unsigned);
1686
-  cmDataTypeId_t      tid = va_arg(vl,unsigned);
1817
+  cmDtRC_t            rc    = kOkDtRC;
1818
+  cmData_t*           vp    = NULL;
1819
+  cmDataTypeId_t      tid   = va_arg(vl,unsigned);
1820
+  cmDataContainerId_t cid   = tid & kContainerDtMask;
1821
+  unsigned            flags = tid & kFlagsDtMask;
1822
+
1823
+  tid = cmClrFlag(tid,kContainerDtMask | kFlagsDtMask);
1824
+
1825
+  // if no container flag was given assume a scalar container
1826
+  if( cid == 0 )
1827
+    cid = kScalarDtId;
1687 1828
     
1688 1829
   switch(cid)
1689 1830
   {
1690
-    case kInvalidCntDtId:    rc = kEolDtRC; break;
1691
-      
1692 1831
     case kScalarDtId:
1693 1832
       switch(tid)
1694 1833
       {
1695
-        case kNullDtId:       rc = cmDataNewNull(     parent,kNoFlagsDtFl,&vp);                                break;
1696
-        case kUCharDtId:      rc = cmDataNewUChar(    parent,kNoFlagsDtFl,va_arg(vl,int),&vp);            break;
1697
-        case kCharDtId:       rc = cmDataNewChar(     parent,kNoFlagsDtFl,va_arg(vl,int),&vp);            break;
1698
-        case kUShortDtId:     rc = cmDataNewUShort(   parent,kNoFlagsDtFl,va_arg(vl,int),&vp);            break;
1699
-        case kShortDtId:      rc = cmDataNewShort(    parent,kNoFlagsDtFl,va_arg(vl,int),&vp);            break;
1700
-        case kUIntDtId:       rc = cmDataNewUInt(     parent,kNoFlagsDtFl,va_arg(vl,unsigned int),&vp);   break;
1701
-        case kIntDtId:        rc = cmDataNewInt(      parent,kNoFlagsDtFl,va_arg(vl,int),&vp);            break;
1702
-        case kULongDtId:      rc = cmDataNewULong(    parent,kNoFlagsDtFl,va_arg(vl,unsigned long),&vp);  break;
1703
-        case kLongDtId:       rc = cmDataNewLong(     parent,kNoFlagsDtFl,va_arg(vl,long),&vp);           break;
1704
-        case kFloatDtId:      rc = cmDataNewFloat(    parent,kNoFlagsDtFl,va_arg(vl,double),&vp);         break;
1705
-        case kDoubleDtId:     rc = cmDataNewDouble(   parent,kNoFlagsDtFl,va_arg(vl,double),&vp);         break;
1706
-        case kStrDtId:        rc = cmDataNewStr(      parent,kNoFlagsDtFl,va_arg(vl,cmChar_t*),&vp);       break;
1834
+        case kInvalidTypeDtId:    
1835
+          rc = kEolDtRC; 
1836
+          break;
1837
+
1838
+        case kNullDtId:       rc = cmDataNewNull(     parent,flags,&vp);                           break;
1839
+        case kBoolDtId:       rc = cmDataNewBool(     parent,flags,va_arg(vl,int),&vp);            break;
1840
+        case kUCharDtId:      rc = cmDataNewUChar(    parent,flags,va_arg(vl,int),&vp);            break;
1841
+        case kCharDtId:       rc = cmDataNewChar(     parent,flags,va_arg(vl,int),&vp);            break;
1842
+        case kUShortDtId:     rc = cmDataNewUShort(   parent,flags,va_arg(vl,int),&vp);            break;
1843
+        case kShortDtId:      rc = cmDataNewShort(    parent,flags,va_arg(vl,int),&vp);            break;
1844
+        case kUIntDtId:       rc = cmDataNewUInt(     parent,flags,va_arg(vl,unsigned int),&vp);   break;
1845
+        case kIntDtId:        rc = cmDataNewInt(      parent,flags,va_arg(vl,int),&vp);            break;
1846
+        case kULongDtId:      rc = cmDataNewULong(    parent,flags,va_arg(vl,unsigned long),&vp);  break;
1847
+        case kLongDtId:       rc = cmDataNewLong(     parent,flags,va_arg(vl,long),&vp);           break;
1848
+        case kFloatDtId:      rc = cmDataNewFloat(    parent,flags,va_arg(vl,double),&vp);         break;
1849
+        case kDoubleDtId:     rc = cmDataNewDouble(   parent,flags,va_arg(vl,double),&vp);         break;
1850
+        case kStrDtId:        rc = cmDataNewStr(      parent,flags,va_arg(vl,cmChar_t*),&vp);      break;
1707 1851
         default:
1708
-          // BUG BUG BUG - signal an error here
1709
-          assert(0);
1852
+          if( err != NULL )
1853
+            cmErrMsg(err,errRC,"Unknown scalar data type id (%i) when parsing new object var-args list.",tid);
1854
+          else
1855
+            rc = kInvalidTypeDtRC;
1710 1856
           break;
1711 1857
       }
1712 1858
       break;
@@ -1718,21 +1864,23 @@ cmDtRC_t  _cmDataParseArgV( cmData_t* parent, va_list vl, cmData_t** vpp )
1718 1864
 
1719 1865
         switch(tid)
1720 1866
         {
1721
-          case kUCharDtId:      rc = cmDataNewUCharArray(    parent,(unsigned char*)svp, cnt,kNoFlagsDtFl,&vp); break;
1722
-          case kCharDtId:       rc = cmDataNewCharArray(     parent,(char*)svp,          cnt,kNoFlagsDtFl,&vp); break;
1723
-          case kUShortDtId:     rc = cmDataNewUShortArray(   parent,(unsigned short*)svp,cnt,kNoFlagsDtFl,&vp); break;
1724
-          case kShortDtId:      rc = cmDataNewShortArray(    parent,(short*)svp,         cnt,kNoFlagsDtFl,&vp); break;
1725
-          case kUIntDtId:       rc = cmDataNewUIntArray(     parent,(unsigned int*)svp,  cnt,kNoFlagsDtFl,&vp); break;
1726
-          case kIntDtId:        rc = cmDataNewIntArray(      parent,(int*)svp,           cnt,kNoFlagsDtFl,&vp); break;
1727
-          case kULongDtId:      rc = cmDataNewULongArray(    parent,(unsigned long*)svp, cnt,kNoFlagsDtFl,&vp); break;
1728
-          case kLongDtId:       rc = cmDataNewLongArray(     parent,(long*)svp,          cnt,kNoFlagsDtFl,&vp); break;
1729
-          case kFloatDtId:      rc = cmDataNewFloatArray(    parent,(float*)svp,         cnt,kNoFlagsDtFl,&vp); break;
1730
-          case kDoubleDtId:     rc = cmDataNewDoubleArray(   parent,(double*)svp,        cnt,kNoFlagsDtFl,&vp); break;
1731
-          case kStrDtId:        rc = cmDataNewStrArray(      parent,(cmChar_t**)svp,     cnt,kNoFlagsDtFl,&vp); break;
1867
+          case kBoolDtId:       rc = cmDataNewBoolArray(     parent,(bool*)svp,          cnt,flags,&vp); break;
1868
+          case kUCharDtId:      rc = cmDataNewUCharArray(    parent,(unsigned char*)svp, cnt,flags,&vp); break;
1869
+          case kCharDtId:       rc = cmDataNewCharArray(     parent,(char*)svp,          cnt,flags,&vp); break;
1870
+          case kUShortDtId:     rc = cmDataNewUShortArray(   parent,(unsigned short*)svp,cnt,flags,&vp); break;
1871
+          case kShortDtId:      rc = cmDataNewShortArray(    parent,(short*)svp,         cnt,flags,&vp); break;
1872
+          case kUIntDtId:       rc = cmDataNewUIntArray(     parent,(unsigned int*)svp,  cnt,flags,&vp); break;
1873
+          case kIntDtId:        rc = cmDataNewIntArray(      parent,(int*)svp,           cnt,flags,&vp); break;
1874
+          case kULongDtId:      rc = cmDataNewULongArray(    parent,(unsigned long*)svp, cnt,flags,&vp); break;
1875
+          case kLongDtId:       rc = cmDataNewLongArray(     parent,(long*)svp,          cnt,flags,&vp); break;
1876
+          case kFloatDtId:      rc = cmDataNewFloatArray(    parent,(float*)svp,         cnt,flags,&vp); break;
1877
+          case kDoubleDtId:     rc = cmDataNewDoubleArray(   parent,(double*)svp,        cnt,flags,&vp); break;
1878
+          case kStrDtId:        rc = cmDataNewStrArray(      parent,(cmChar_t**)svp,     cnt,flags,&vp); break;
1732 1879
           default:
1733
-            // BUG BUG BUG - signal an error here
1734
-          
1735
-            assert(0);
1880
+            if( err != NULL )
1881
+              cmErrMsg(err,errRC,"Unknown array data type id (%i) when parsing new object var-args list.",tid);
1882
+            else
1883
+              rc = kInvalidTypeDtRC;
1736 1884
             break;
1737 1885
         }
1738 1886
       }
@@ -1741,12 +1889,14 @@ cmDtRC_t  _cmDataParseArgV( cmData_t* parent, va_list vl, cmData_t** vpp )
1741 1889
     case kListDtId:
1742 1890
     case kPairDtId:
1743 1891
     case kRecordDtId:
1744
-      vp = _cmDataNew(parent,cid,kStructDtId);
1892
+      cmDataAppendChild(parent,va_arg(vl,cmData_t*));
1745 1893
       break;
1746 1894
 
1747 1895
     default:
1748
-      // BUG BUG BUG - signal an error here
1749
-      assert(0);
1896
+      if( err != NULL )
1897
+        cmErrMsg(err,errRC,"Unknown container type id (%i) when parsing new object var-args list.",cid);
1898
+      else
1899
+        rc = kInvalidContDtRC;
1750 1900
       break;
1751 1901
   }
1752 1902
 
@@ -1755,7 +1905,7 @@ cmDtRC_t  _cmDataParseArgV( cmData_t* parent, va_list vl, cmData_t** vpp )
1755 1905
   return rc;
1756 1906
 }
1757 1907
 
1758
-cmDtRC_t  _cmDataListParseV(cmData_t* parent, va_list vl )
1908
+cmDtRC_t  _cmDataListParseV(cmData_t* parent, cmErr_t* err, cmRC_t errRC, va_list vl )
1759 1909
 {
1760 1910
   cmDtRC_t  rc = kOkDtRC;
1761 1911
   bool      contFl = true;
@@ -1764,7 +1914,7 @@ cmDtRC_t  _cmDataListParseV(cmData_t* parent, va_list vl )
1764 1914
   {  
1765 1915
     cmData_t* vp;
1766 1916
 
1767
-    rc = _cmDataParseArgV(parent, vl, &vp);
1917
+    rc = _cmDataParseArgV(parent,err,errRC,vl,&vp);
1768 1918
     
1769 1919
     if(rc != kOkDtRC )    
1770 1920
     {
@@ -1778,13 +1928,13 @@ cmDtRC_t  _cmDataListParseV(cmData_t* parent, va_list vl )
1778 1928
   return rc;
1779 1929
 }
1780 1930
 
1781
-cmRC_t  cmDataListAllocV(cmData_t* parent, cmData_t** ref, va_list vl )
1931
+cmRC_t  cmDataListAllocV(cmData_t* parent, cmErr_t* err, cmRC_t errRC, cmData_t** ref, va_list vl )
1782 1932
 {
1783 1933
   cmData_t* p = cmDataListAlloc(parent);
1784 1934
 
1785 1935
   cmRC_t rc;
1786 1936
 
1787
-  if((rc = _cmDataListParseV(p, vl )) != kOkDtRC )
1937
+  if((rc = _cmDataListParseV(p,err,errRC,vl )) != kOkDtRC )
1788 1938
   {
1789 1939
     cmDataUnlinkAndFree(p);
1790 1940
     return rc;
@@ -1796,11 +1946,11 @@ cmRC_t  cmDataListAllocV(cmData_t* parent, cmData_t** ref, va_list vl )
1796 1946
   return rc;
1797 1947
 }
1798 1948
 
1799
-cmRC_t cmDataListAllocA(cmData_t* parent, cmData_t** ref,  ... )
1949
+cmRC_t cmDataListAllocA(cmData_t* parent, cmErr_t* err, cmRC_t errRC, cmData_t** ref,  ... )
1800 1950
 {
1801 1951
   va_list vl;
1802 1952
   va_start(vl,ref);
1803
-  cmRC_t rc  = cmDataListAllocV(parent,ref,vl);
1953
+  cmRC_t rc  = cmDataListAllocV(parent,err,errRC,ref,vl);
1804 1954
   va_end(vl);
1805 1955
   return rc;
1806 1956
 }
@@ -1827,20 +1977,20 @@ cmData_t* cmDataListAppendEleN(cmData_t* p, cmData_t* ele[], unsigned n )
1827 1977
   return rp;
1828 1978
 }
1829 1979
 
1830
-cmDtRC_t  cmDataListAppendV(   cmData_t* p, va_list vl )
1980
+cmDtRC_t  cmDataListAppendV(   cmData_t* p, cmErr_t* err, cmRC_t errRC, va_list vl )
1831 1981
 {
1832 1982
   cmDtRC_t rc;
1833
-  if((rc = _cmDataListParseV(p, vl )) != kOkDtRC )
1983
+  if((rc = _cmDataListParseV(p, err, errRC, vl )) != kOkDtRC )
1834 1984
     return rc;
1835 1985
 
1836 1986
   return kOkDtRC;
1837 1987
 }
1838 1988
 
1839
-cmDtRC_t  cmDataListAppend(    cmData_t* p, ... )
1989
+cmDtRC_t  cmDataListAppend(    cmData_t* p, cmErr_t* err, cmRC_t errRC, ... )
1840 1990
 {
1841 1991
   va_list vl;  
1842
-  va_start(vl,p);
1843
-  cmDtRC_t rc = cmDataListAppendV(p,vl); 
1992
+  va_start(vl,errRC);
1993
+  cmDtRC_t rc = cmDataListAppendV(p,err,errRC,vl); 
1844 1994
   va_end(vl);
1845 1995
   return rc;
1846 1996
 }
@@ -1929,7 +2079,6 @@ const cmChar_t* cmDataRecdKeyLabel( cmData_t* p, unsigned index )
1929 2079
 {
1930 2080
   cmData_t* kp = cmDataRecdKey(p,index);
1931 2081
   const cmChar_t* label = NULL;
1932
-  // BUG BUG BUG - test return value
1933 2082
   cmDataConstStr(kp,&label);
1934 2083
   return label;
1935 2084
 }
@@ -1957,7 +2106,7 @@ cmData_t* cmDataRecdAppendPair( cmData_t* p, cmData_t* pair )
1957 2106
 }
1958 2107
 
1959 2108
 
1960
-cmDtRC_t  _cmDataRecdParseInputV(cmData_t* parent, unsigned idFl, va_list vl )
2109
+cmDtRC_t  _cmDataRecdParseInputV(cmData_t* parent, cmErr_t* err, cmRC_t errRC, unsigned idFl, va_list vl )
1961 2110
 {
1962 2111
   assert( parent != NULL && parent->cid == kRecordDtId && parent->tid == kStructDtId );
1963 2112
   bool      contFl = true;
@@ -1981,7 +2130,7 @@ cmDtRC_t  _cmDataRecdParseInputV(cmData_t* parent, unsigned idFl, va_list vl )
1981 2130
       break;
1982 2131
 
1983 2132
     // parse the field data
1984
-    if((rc =_cmDataParseArgV( NULL, vl, &vp )) != kOkDtRC )
2133
+    if((rc =_cmDataParseArgV( NULL, err, errRC, vl, &vp )) != kOkDtRC )
1985 2134
     {
1986 2135
       contFl = false;
1987 2136
     }
@@ -1989,18 +2138,18 @@ cmDtRC_t  _cmDataRecdParseInputV(cmData_t* parent, unsigned idFl, va_list vl )
1989 2138
     {
1990 2139
       // create the field pair
1991 2140
       if( idFl )
1992
-        cmDataPairAllocId(parent,id,vp);
2141
+        rc = cmDataPairAllocId(parent,id,vp,NULL);
1993 2142
       else
1994
-        cmDataPairAllocLabel(parent,label,vp);
2143
+        rc = cmDataPairAllocLabel(parent,label,vp,NULL);
1995 2144
     }
1996 2145
   }
1997 2146
   return rc;
1998 2147
 }
1999 2148
 
2000
-cmData_t*       cmDataRecdAllocLabelV( cmData_t* parent, va_list vl )
2149
+cmData_t*       cmDataRecdAllocLabelV( cmData_t* parent, cmErr_t* err, cmRC_t errRC, va_list vl )
2001 2150
 {
2002 2151
   cmData_t* p = cmDataRecdAlloc(parent);
2003
-  cmDtRC_t rc = _cmDataRecdParseInputV(p, false, vl );
2152
+  cmDtRC_t rc = _cmDataRecdParseInputV(p, err, errRC, false, vl );
2004 2153
   if( rc != kOkDtRC )
2005 2154
   {
2006 2155
     cmDataFree(p);
@@ -2009,19 +2158,19 @@ cmData_t*       cmDataRecdAllocLabelV( cmData_t* parent, va_list vl )
2009 2158
   return p;
2010 2159
 }
2011 2160
 
2012
-cmData_t*       cmDataRecdAllocLabelA( cmData_t* parent, ... )
2161
+cmData_t*       cmDataRecdAllocLabelA( cmData_t* parent, cmErr_t* err, cmRC_t errRC, ... )
2013 2162
 {
2014 2163
   va_list vl;
2015
-  va_start(vl,parent);
2016
-  cmData_t* p = cmDataRecdAllocLabelV(parent,vl);
2164
+  va_start(vl,errRC);
2165
+  cmData_t* p = cmDataRecdAllocLabelV(parent,err,errRC,vl);
2017 2166
   va_end(vl);
2018 2167
   return p;
2019 2168
 }
2020 2169
 
2021
-cmData_t*       cmDataRecdAllocIdV( cmData_t* parent, va_list vl )
2170
+cmData_t*       cmDataRecdAllocIdV( cmData_t* parent, cmErr_t* err, cmRC_t errRC, va_list vl )
2022 2171
 {
2023 2172
   cmData_t* p = cmDataRecdAlloc(parent);
2024
-  cmDtRC_t rc = _cmDataRecdParseInputV(p, true, vl );
2173
+  cmDtRC_t rc = _cmDataRecdParseInputV(p, err, errRC, true, vl );
2025 2174
   if( rc != kOkDtRC )
2026 2175
   {
2027 2176
     cmDataFree(p);
@@ -2030,11 +2179,11 @@ cmData_t*       cmDataRecdAllocIdV( cmData_t* parent, va_list vl )
2030 2179
   return p;
2031 2180
 }
2032 2181
 
2033
-cmData_t*       cmDataRecdAllocIdA( cmData_t* parent, ... )
2182
+cmData_t*       cmDataRecdAllocIdA( cmData_t* parent, cmErr_t* err, cmRC_t errRC, ... )
2034 2183
 {
2035 2184
   va_list vl;
2036
-  va_start(vl,parent);
2037
-  cmData_t* p = cmDataRecdAllocIdV(parent,vl);
2185
+  va_start(vl,errRC);
2186
+  cmData_t* p = cmDataRecdAllocIdV(parent,err,errRC,vl);
2038 2187
   va_end(vl);
2039 2188
   return p;
2040 2189
 }
@@ -2141,6 +2290,10 @@ cmDtRC_t _cmDataRecdParseV(cmData_t* p, bool idFl, cmErr_t* err, unsigned errRC,
2141 2290
           case kNullDtId:
2142 2291
             break;
2143 2292
 
2293
+          case kBoolDtId:
2294
+            rc0 = cmDataGetBool(np,(bool*)v);
2295
+            break;
2296
+
2144 2297
           case kUCharDtId: 
2145 2298
             rc0 = cmDataGetUChar(np,(unsigned char*)v);
2146 2299
             break;
@@ -2207,6 +2360,7 @@ cmDtRC_t _cmDataRecdParseV(cmData_t* p, bool idFl, cmErr_t* err, unsigned errRC,
2207 2360
             case kNullDtId:
2208 2361
               break;
2209 2362
 
2363
+            case kBoolDtId:
2210 2364
             case kUCharDtId: 
2211 2365
             case kCharDtId:
2212 2366
             case kUShortDtId:
@@ -2342,6 +2496,7 @@ char* _cmDataSerializeWrite( cmData_t* np, char* dp, const char* ep )
2342 2496
   switch( np->tid )
2343 2497
   {
2344 2498
     case kNullDtId:   break;
2499
+    case kBoolDtId:   *((bool*)dp)           = cmDataBool(np);   dp+=sizeof(bool);           break;
2345 2500
     case kUCharDtId:  *((unsigned char*)dp)  = cmDataUChar(np);  dp+=sizeof(unsigned char);  break;
2346 2501
     case kCharDtId:   *((char*)dp)           = cmDataChar(np);   dp+=sizeof(char);           break;
2347 2502
     case kUShortDtId: *((unsigned short*)dp) = cmDataUShort(np); dp+=sizeof(unsigned short); break;
@@ -2653,7 +2808,13 @@ cmDtRC_t _cmDataParserOpenPair( cmDataParserCtx_t* c )
2653 2808
   if( cmDataNewNull(NULL,0,&nnp) != kOkDtRC )
2654 2809
     return rc;
2655 2810
 
2656
-  cmData_t* pnp = cmDataPairAllocLabelN( c->cnp, cmLexTokenText(c->p->lexH), cmLexTokenCharCount(c->p->lexH), nnp );
2811
+  cmData_t* pnp = NULL;
2812
+
2813
+  if((rc = cmDataPairAllocLabelN( c->cnp, cmLexTokenText(c->p->lexH), cmLexTokenCharCount(c->p->lexH), nnp, &pnp )) != kOkDtRC )
2814
+  {
2815
+    cmDataFree(nnp);
2816
+    return rc;
2817
+  }
2657 2818
 
2658 2819
   // store the current node
2659 2820
   if((rc = _cmDpPushStack(c,c->cnp)) != kOkDtRC )
@@ -3050,6 +3211,7 @@ void     _cmDataPrint( const cmData_t* p, cmRpt_t* rpt, unsigned indent )
3050 3211
       switch(p->tid)
3051 3212
       {
3052 3213
         case kNullDtId:       cmRptPrintf(rpt,"<null>"); break;
3214
+        case kBoolDtId:       cmRptPrintf(rpt,"%i", cmDtBool(p));   break;
3053 3215
         case kUCharDtId:      cmRptPrintf(rpt,"%c ",cmDtUChar(p));  break;
3054 3216
         case kCharDtId:       cmRptPrintf(rpt,"%c ",cmDtChar(p));   break;
3055 3217
         case kUShortDtId:     cmRptPrintf(rpt,"%i ",cmDtUShort(p)); break;
@@ -3070,6 +3232,7 @@ void     _cmDataPrint( const cmData_t* p, cmRpt_t* rpt, unsigned indent )
3070 3232
       {
3071 3233
         switch(p->tid)
3072 3234
         {
3235
+          case kBoolDtId:   parr(rpt,"%i ", cmDtBoolArray(p), p->cnt ); break;
3073 3236
           case kUCharDtId:  parr(rpt,"%c ", cmDtCharArray(p), p->cnt ); break;
3074 3237
           case kCharDtId:   parr(rpt,"%c ", cmDtCharArray(p), p->cnt ); break;
3075 3238
           case kUShortDtId: parr(rpt,"%i ", cmDtUShortArray(p), p->cnt ); break;
@@ -3182,30 +3345,31 @@ void     cmDataTest( cmCtx_t* ctx )
3182 3345
   
3183 3346
   float farr[] = { 1.23, 45.6, 7.89 };
3184 3347
 
3185
-  cmDataParserTest(ctx);
3186
-  return;
3348
+  if( cmDataParserTest(ctx) != kOkDtRC )
3349
+    return;
3187 3350
 
3188
-  cmData_t* d0 = cmDataRecdAllocLabelA(NULL,
3189
-    "name",kScalarDtId, kStrDtId,"This is a string.",
3190
-    "id",  kScalarDtId, kUIntDtId,    21,
3191
-    "real",kScalarDtId, kFloatDtId, 1.23,
3192
-    "arr", kArrayDtId,  kFloatDtId, farr, 3,
3351
+  cmData_t* d0 = cmDataRecdAllocLabelA(NULL,&ctx->err,0,
3352
+    "name", kStrDtId,"This is a string.",
3353
+    "id",  kUIntDtId,    21,
3354
+    "real",kFloatDtId, 1.23,
3355
+    "arr", kArrayDtId |  kFloatDtId, farr, 3,
3193 3356
     NULL);
3194 3357
   
3195
-  cmDataPrint(d0,&ctx->rpt);
3196
-  cmDataFree(d0);
3197
-
3198
-  cmData_t* d1 = NULL;
3199
-  cmDataListAllocA(NULL,&d1,
3200
-    kScalarDtId, kUIntDtId, 53,
3201
-    kScalarDtId, kStrDtId, "Blah blah",
3202
-    kArrayDtId, kFloatDtId, farr, 3,
3358
+  //cmDataPrint(d0,&ctx->rpt);
3359
+ 
3360
+
3361
+ cmData_t* d1 = NULL;
3362
+  cmDataListAllocA(NULL,&ctx->err,0,&d1,
3363
+    kUIntDtId, 53,
3364
+    kStrDtId, "Blah blah",
3365
+    kArrayDtId | kFloatDtId, farr, 3,
3366
+    kRecordDtId, d0, 
3203 3367
     kInvalidCntDtId );
3204 3368
 
3205 3369
 
3206 3370
   cmDataPrint(d1,&ctx->rpt);
3207 3371
   cmDataFree(d1);
3208
-
3372
+ 
3209 3373
 
3210 3374
 
3211 3375
   cmRptPrintf(&ctx->rpt,"Done!.\n");

+ 107
- 63
cmData.h 파일 보기

@@ -68,60 +68,67 @@ extern "C" {
68 68
   {
69 69
     kInvalidTypeDtId,// 0
70 70
     kNullDtId,       // 1 the data object exists but it has no data
71
-    kUCharDtId,      // 2
72
-    kCharDtId,       // 3
73
-    kUShortDtId,     // 4 
74
-    kShortDtId,      // 5
75
-    kUIntDtId,       // 6
76
-    kIntDtId,        // 7
77
-    kULongDtId,      // 8
78
-    kLongDtId,       // 9
79
-    kFloatDtId,      // 10 
80
-    kDoubleDtId,     // 11 
81
-    kStrDtId,        // 12 zero terminated string
82
-    kBlobDtId,       // 13 application defined raw memory object
83
-    kStructDtId,      // 14 node is a pair,list, or recd
84
-
85
-    kOptArgDtFl = 0x10000000
71
+    kBoolDtId,       // 2
72
+    kUCharDtId,      // 3
73
+    kCharDtId,       // 4
74
+    kUShortDtId,     // 5 
75
+    kShortDtId,      // 6
76
+    kUIntDtId,       // 7
77
+    kIntDtId,        // 8
78
+    kULongDtId,      // 9
79
+    kLongDtId,       // 10
80
+    kFloatDtId,      // 11 
81
+    kDoubleDtId,     // 12 
82
+    kStrDtId,        // 13 zero terminated string
83
+    kBlobDtId,       // 14 application defined raw memory object
84
+    kStructDtId,     // 15 node is a pair,list, or recd
85
+
86 86
   } cmDataTypeId_t;
87 87
 
88 88
 
89 89
   typedef enum
90 90
   {
91
-    kInvalidCntDtId, // 0 
92
-    kScalarDtId,     // 1
93
-    kArrayDtId,      // 2
94
-    kPairDtId,       // 3
95
-    kListDtId,       // 4
96
-    kRecordDtId      // 5
91
+    kInvalidCntDtId  = kInvalidTypeDtId,
92
+    kScalarDtId      = 0x00100000,      
93
+    kArrayDtId       = 0x00200000,      
94
+    kPairDtId        = 0x00400000,      
95
+    kListDtId        = 0x00800000,      
96
+    kRecordDtId      = 0x01000000,      
97
+    kContainerDtMask = 0x01f00000,
98
+
99
+   
97 100
   } cmDataContainerId_t;
98 101
 
99 102
   enum
100 103
   {
101
-    kNoFlagsDtFl = 0x00,
104
+    kNoFlagsDtFl    = 0x00,
105
+
106
+    kOptArgDtFl     = 0x02000000, 
102 107
 
103 108
     // Indicate that the memory used by the data object
104 109
     // was dynamically allocated and should be released
105 110
     // by cmDataFree().
106
-    kFreeObjDtFl   = 0x01,
111
+    kFreeObjDtFl    = 0x04000000,
107 112
 
108 113
     // Indicate that the memory used by strings, blobs 
109 114
     // and arrays should be freed by cmDataFree().
110
-    kFreeValueDtFl = 0x02, 
115
+    kFreeValueDtFl  = 0x08000000, 
111 116
 
112 117
     // Indicate that the value of the object cannot be changed.
113 118
     // (but the object could be reassigned as a new type).
114
-    kConstValueDtFl = 0x04,
119
+    kConstValueDtFl = 0x10000000,
115 120
 
116 121
     // Indicate that the type of the object cannot be changed.
117 122
     // (but the value may be changed).
118
-    kConstObjDtFl  = 0x08,
123
+    kConstObjDtFl   = 0x20000000,
119 124
 
120 125
     // Indicate that the array or string should not be 
121 126
     // internally reallocated but rather the source pointer
122 127
     // should be taken as the new value of the object.
123
-    kNoCopyDtFl = 0x10, 
128
+    kNoCopyDtFl     = 0x40000000, 
129
+
124 130
 
131
+    kFlagsDtMask    = 0x7e000000
125 132
 
126 133
   };
127 134
 
@@ -136,6 +143,7 @@ extern "C" {
136 143
     kInvalidDtShort = 0xffff,
137 144
     kInvalidDtInt   = 0xffffffff,
138 145
     kInvalidDtLong  = kInvalidDtInt,
146
+    kInvalidDtBool  = kInvalidDtInt
139 147
   };
140 148
 
141 149
 
@@ -150,6 +158,7 @@ extern "C" {
150 158
 
151 159
     union
152 160
     {
161
+      bool              b;
153 162
       char              c;
154 163
       unsigned char    uc;
155 164
       short             s;
@@ -214,6 +223,7 @@ extern "C" {
214 223
 
215 224
   // Type specific
216 225
   cmDtRC_t cmDataNewNull(     cmData_t* parent, unsigned flags,                   cmData_t** ref );
226
+  cmDtRC_t cmDataNewBool(     cmData_t* parent, unsigned flags, bool v,           cmData_t** ref );
217 227
   cmDtRC_t cmDataNewChar(     cmData_t* parent, unsigned flags, char v,           cmData_t** ref );
218 228
   cmDtRC_t cmDataNewUChar(    cmData_t* parent, unsigned flags, unsigned char v,  cmData_t** ref );
219 229
   cmDtRC_t cmDataNewShort(    cmData_t* parent, unsigned flags, short v,          cmData_t** ref );
@@ -241,6 +251,7 @@ extern "C" {
241 251
   cmDtRC_t  cmDataSetScalarValue( cmData_t* d, cmDataTypeId_t tid, void* vp, unsigned byteCnt, unsigned flags );
242 252
   
243 253
   cmDtRC_t cmDataSetNull(      cmData_t* p );
254
+  cmDtRC_t cmDataSetBool(      cmData_t* p, bool v );
244 255
   cmDtRC_t cmDataSetChar(      cmData_t* p, char v );
245 256
   cmDtRC_t cmDataSetUChar(     cmData_t* p, unsigned char v );
246 257
   cmDtRC_t cmDataSetShort(     cmData_t* p, short v );
@@ -260,6 +271,7 @@ extern "C" {
260 271
 
261 272
   // Get the value of an object. No conversion is applied the
262 273
   // type must match exactly or an error is generated.
274
+  cmDtRC_t cmDataBool(      const cmData_t* p, bool* v );
263 275
   cmDtRC_t cmDataChar(      const cmData_t* p, char* v );
264 276
   cmDtRC_t cmDataUChar(     const cmData_t* p, unsigned char* v );
265 277
   cmDtRC_t cmDataShort(     const cmData_t* p, short* v );
@@ -282,6 +294,7 @@ extern "C" {
282 294
   // application, that one of the kInvalidDtXXX is not in fact a legal return value.
283 295
   // These function are simple wrappers around calls to cmDataXXX() and
284 296
   // therefore do NOT do any type conversion.
297
+  bool           cmDtBool(      const cmData_t* p );
285 298
   char           cmDtChar(      const cmData_t* p );
286 299
   unsigned char  cmDtUChar(     const cmData_t* p );
287 300
   short          cmDtShort(     const cmData_t* p );
@@ -298,6 +311,7 @@ extern "C" {
298 311
   const void*    cmDtConstBlob( const cmData_t* p, unsigned* byteCntRef );
299 312
 
300 313
   // Get the value of an object with conversion.
314
+  cmDtRC_t cmDataGetBool(      const cmData_t* p, bool* v );
301 315
   cmDtRC_t cmDataGetChar(      const cmData_t* p, char* v );
302 316
   cmDtRC_t cmDataGetUChar(     const cmData_t* p, unsigned char* v );
303 317
   cmDtRC_t cmDataGetShort(     const cmData_t* p, short* v );
@@ -316,6 +330,7 @@ extern "C" {
316 330
   // application that one of the kInvalidDtXXX is not in fact a legal return value.
317 331
   // These function are simple wrappers around calls to cmDataGetXXX() and
318 332
   // therefore do type conversion.
333
+  bool           cmDtGetBool(      const cmData_t* p );
319 334
   char           cmDtGetChar(      const cmData_t* p );
320 335
   unsigned char  cmDtGetUChar(     const cmData_t* p );
321 336
   short          cmDtGetShort(     const cmData_t* p );
@@ -359,6 +374,7 @@ extern "C" {
359 374
   // the data object is no longer valid.
360 375
   cmDtRC_t cmDataNewArray(  cmData_t* parent, cmDataTypeId_t tid, void* vp, unsigned eleCnt, unsigned flags, cmData_t** ref );
361 376
 
377
+  cmDtRC_t cmDataNewBoolArray(     cmData_t* parent, bool* v,           unsigned eleCnt, unsigned flags, cmData_t** ref );
362 378
   cmDtRC_t cmDataNewCharArray(     cmData_t* parent, char* v,           unsigned eleCnt, unsigned flags, cmData_t** ref );
363 379
   cmDtRC_t cmDataNewUCharArray(    cmData_t* parent, unsigned char* v,  unsigned eleCnt, unsigned flags, cmData_t** ref );
364 380
   cmDtRC_t cmDataNewShortArray(    cmData_t* parent, short* v,          unsigned eleCnt, unsigned flags, cmData_t** ref );
@@ -384,6 +400,7 @@ extern "C" {
384 400
   cmDtRC_t cmDataSetArrayValue(  cmData_t* dt, cmDataTypeId_t tid, void* vp, unsigned eleCnt, unsigned flags );
385 401
 
386 402
   // Type sepctific set array functions.
403
+  cmDtRC_t cmDataSetBoolArray(   cmData_t* d, bool* v,           unsigned eleCnt, unsigned flags );
387 404
   cmDtRC_t cmDataSetCharArray(   cmData_t* d, char* v,           unsigned eleCnt, unsigned flags );
388 405
   cmDtRC_t cmDataSetUCharArray(  cmData_t* d, unsigned char* v,  unsigned eleCnt, unsigned flags );
389 406
   cmDtRC_t cmDataSetShortArray(  cmData_t* d, short* v,          unsigned eleCnt, unsigned flags );
@@ -403,6 +420,7 @@ extern "C" {
403 420
   // Get a pointer to the base of an array. 
404 421
   // The type must match exactly or an error is generated.
405 422
   // Use cmDataEleCount() to determine the number of elements in the array.
423
+  cmDtRC_t cmDataBoolArray(      const cmData_t* d, bool** v );  
406 424
   cmDtRC_t cmDataCharArray(      const cmData_t* d, char** v );
407 425
   cmDtRC_t cmDataUCharArray(     const cmData_t* d, unsigned char** v );
408 426
   cmDtRC_t cmDataShortArray(     const cmData_t* d, short** v );
@@ -416,6 +434,7 @@ extern "C" {
416 434
 
417 435
   // This group of functions is a wrapper around calls to the same named
418 436
   // cmDataXXXArray() functions above. On error they return NULL.
437
+  bool*           cmDtBoolArray(      const cmData_t* d );
419 438
   char*           cmDtCharArray(      const cmData_t* d );
420 439
   unsigned char*  cmDtUCharArray(     const cmData_t* d );
421 440
   short*          cmDtShortArray(     const cmData_t* d );
@@ -453,10 +472,10 @@ extern "C" {
453 472
   cmData_t* cmDataReplace( cmData_t* dst, cmData_t* src );
454 473
 
455 474
   // Return the count of child nodes.
456
-  // 1. Array nodes have one child per array element.
457
-  // 2. List nodes have one child pair.
458
-  // 3. Pair nodes have two children.
459
-  // 4. Leaf nodes have 0 children.
475
+  // Scalars and arrays have no children.
476
+  // Pairs have 2 children.
477
+  // Lists have one child per element.
478
+  // Records have one child per pair.
460 479
   unsigned  cmDataChildCount( const cmData_t* p );
461 480
 
462 481
   // Returns the ith child of 'p'.
@@ -513,14 +532,14 @@ extern "C" {
513 532
   cmData_t* cmDataPairMake(       cmData_t* parent, cmData_t* p, cmData_t* key, cmData_t* value );
514 533
 
515 534
   // Dynamically allocate a pair node. Both the key and value nodes are reallocated.
516
-  cmData_t* cmDataPairAlloc(      cmData_t* parent, const cmData_t* key,  const cmData_t* value );
535
+  cmRC_t cmDataPairAlloc(      cmData_t* parent, const cmData_t* key,  const cmData_t* value, cmData_t** ref );
517 536
 
518 537
   // Dynamically allocate the id but link (w/o realloc) the value.
519
-  cmData_t* cmDataPairAllocId(    cmData_t* parent, unsigned  keyId,       cmData_t* value );
538
+  cmRC_t cmDataPairAllocId(    cmData_t* parent, unsigned  keyId,       cmData_t* value, cmData_t** ref );
520 539
 
521 540
   // Dynamically allocate the label but link (w/o realloc) the value.
522
-  cmData_t* cmDataPairAllocLabelN(cmData_t* parent, const cmChar_t* label, unsigned charCnt, cmData_t* value);
523
-  cmData_t* cmDataPairAllocLabel( cmData_t* parent, const cmChar_t* label, cmData_t* value );
541
+  cmRC_t cmDataPairAllocLabelN(cmData_t* parent, const cmChar_t* label, unsigned charCnt, cmData_t* value, cmData_t** ref);
542
+  cmRC_t cmDataPairAllocLabel( cmData_t* parent, const cmChar_t* label, cmData_t* value, cmData_t** ref );
524 543
 
525 544
   //----------------------------------------------------------------------------
526 545
   // List related functions
@@ -536,22 +555,34 @@ extern "C" {
536 555
   cmData_t* cmDataListMake(  cmData_t* parent, cmData_t* p );
537 556
   cmData_t* cmDataListAlloc( cmData_t* parent);
538 557
 
539
-
540
-  // Var-args fmt:
541
-  // <contId> {<typeId>} <value> {<cnt>}
542
-  // scalar types: <value> is literal,<cnt>   is not included
543
-  //     null has no <value> or <cnt>
558
+  // Dynamically allocate a new list object and fill it with values 
559
+  // using a variable argument list.
560
+  //
561
+  // 1) Var-args fmt:
562
+  // <typeId> {<value>} {<cnt>}
563
+  //
564
+  // 2) <typeId> is formed by OR-ing one of the container type flags with a 
565
+  // data type id.  (e.g. kArrayDtId | kIntDtId).  Note that if no
566
+  // container is given then the type is assumed to be scalar.
567
+  //
568
+  // scalar types: <value> is literal, <cnt> should not be included
569
+  //               null scalar object should not include <value> or <cnt>
544 570
   // array  types: <value> is pointer,<cnt>   is element count
545
-  // struct types: <value> is cmData_t, <typeId> and <cnt> is not included
546
-  // Indicate the end of argument list by setting  <typeId> to kInvalidDtId. 
547
-  // The memory for array based data types is dynamically allocated.
548
-  cmRC_t cmDataListAllocV(cmData_t* parent, cmData_t** ref, va_list vl );
549
-  cmRC_t  cmDataListAllocA(cmData_t* parent,  cmData_t** ref, ... );
571
+  // struct types: <value> is cmData_t pointer,  <cnt> should not be included.
572
+  //               The struct object is appended to the child list of parent.
573
+  //
574
+  // 3) Indicate the end of argument list by setting  <typeId> to kInvalidDtId. 
575
+  // 4) Scalar and array objects will be dynamically allocated.
576
+  // 5) Data attribute flags (kXXXDtFl) make also be OR-ed into the <typeId>.
577
+  // 6) Data attribute flags will only be used with scalar and array object and
578
+  // will be ignored for all other object types.
579
+  cmRC_t  cmDataListAllocV( cmData_t* parent,  cmErr_t* err, cmRC_t errRC, cmData_t** ref, va_list vl );
580
+  cmRC_t  cmDataListAllocA( cmData_t* parent,  cmErr_t* err, cmRC_t errRC, cmData_t** ref, ... );
550 581
   
551 582
   // Returns a ptr to 'ele'.
552 583
   cmData_t* cmDataListAppendEle( cmData_t* p, cmData_t* ele );
553
-  cmDtRC_t  cmDataListAppendV(   cmData_t* p, va_list vl );
554
-  cmDtRC_t  cmDataListAppend(    cmData_t* p, ... );
584
+  cmDtRC_t  cmDataListAppendV(   cmData_t* p, cmErr_t* err, cmRC_t errRC, va_list vl );
585
+  cmDtRC_t  cmDataListAppend(    cmData_t* p, cmErr_t* err, cmRC_t errRC, ... );
555 586
 
556 587
   // Return  'p'.
557 588
   cmData_t* cmDataListInsertEle( cmData_t* p, unsigned index, cmData_t* ele );
@@ -572,9 +603,11 @@ extern "C" {
572 603
   cmData_t*       cmDataRecdValueFromId(    cmData_t* p, unsigned id );
573 604
   cmData_t*       cmDataRecdValueFromLabel( cmData_t* p, const cmChar_t* label );
574 605
 
575
-  // Return the ith key
606
+  // Return the ith key or NULL if it does not exist.
576 607
   cmData_t*       cmDataRecdKey(      cmData_t* p, unsigned index );
608
+  // Returns cmInvalidId if the ith key does not exist or is not an integer.
577 609
   unsigned        cmDataRecdKeyId(    cmData_t* p, unsigned index );
610
+  // Return NULL if the ith key does not exist or is not a string.
578 611
   const cmChar_t* cmDataRecdKeyLabel( cmData_t* p, unsigned index );
579 612
   
580 613
   cmData_t*       cmDataRecdMake( cmData_t* parent, cmData_t* p );
@@ -585,20 +618,24 @@ extern "C" {
585 618
   // reallocation or duplicattion takes place.
586 619
   cmData_t*       cmDataRecdAppendPair( cmData_t* p, cmData_t* pair );
587 620
 
588
-
589
-  // Var-args format:
590
-  // <label|id> {<cid>} <typeId>  <value> {<cnt>}
591
-  // scalar types: <value> is literal,<cnt> is not included
592
-  // null   type: has no <value> or <cnt>
593
-  // ptr    types: <value> is pointer,  <cnt> is element count
594
-  // struct types: <value> is cmData_t, <cnt> is not included
595
-  // Indicate the end of argument list by setting  <typeId> to kInvalidDtId. 
596
-  // The memory for array based data types is dynamically allocated.
597
-  cmData_t*       cmDataRecdAllocLabelV( cmData_t* parent, va_list vl );
598
-  cmData_t*       cmDataRecdAllocLabelA( cmData_t* parent, ... );
599
-
600
-  cmData_t*       cmDataRecdAllocIdV( cmData_t* parent, va_list vl );
601
-  cmData_t*       cmDataRecdAllocIdA( cmData_t* parent, ... );
621
+  // Dynamically allocate a new record object and fill it with values 
622
+  // using a variable argument list.
623
+  // 
624
+  // 1) Var-args format:
625
+  //   <label|id>  <value>
626
+  //   
627
+  //  The <label|id> arg. gives the record pair label and the <value>
628
+  //  argument list gives the pair value.
629
+  //
630
+  // 2) The <value> argument has the same syntax as the cmDataListAllocLabelV()
631
+  //    call.
632
+  // 3) The cmDataRecdAllocLabelV() arg. list should be terminated with NULL.
633
+  //    The cmDataRecdAllocIdV() arg. list should be terminated with 'kInvalidDtId'.
634
+  cmData_t*       cmDataRecdAllocLabelV( cmData_t* parent, cmErr_t* err, cmRC_t errRC, va_list vl );
635
+  cmData_t*       cmDataRecdAllocLabelA( cmData_t* parent, cmErr_t* err, cmRC_t errRC, ... );
636
+
637
+  cmData_t*       cmDataRecdAllocIdV( cmData_t* parent, cmErr_t* err, cmRC_t errRC, va_list vl );
638
+  cmData_t*       cmDataRecdAllocIdA( cmData_t* parent, cmErr_t* err, cmRC_t errRC, ... );
602 639
   
603 640
   // Extract the data in a record to C variables.
604 641
   // Var-args format:
@@ -621,11 +658,18 @@ extern "C" {
621 658
   cmDtRC_t cmDataRecdParseIdV(   cmData_t* p, cmErr_t* err, unsigned errRC, va_list vl );
622 659
   cmDtRC_t cmDataRecdParseId(    cmData_t* p, cmErr_t* err, unsigned errRC, ... );
623 660
   
661
+  //----------------------------------------------------------------------------
662
+  // Serialization related functions
663
+  //
664
+
624 665
   unsigned cmDataSerializeByteCount( const cmData_t* p );
625 666
   cmDtRC_t cmDataSerialize(   const cmData_t* p, void* buf, unsigned bufByteCnt );
626 667
   cmDtRC_t cmDataDeserialize( const void* buf, unsigned bufByteCnt, cmData_t** pp );
627 668
 
628
-  //-----------------------------------------------------------------------------
669
+  //----------------------------------------------------------------------------
670
+  // Text to Data related functions
671
+  //
672
+
629 673
   typedef cmHandle_t cmDataParserH_t;
630 674
   extern cmDataParserH_t cmDataParserNullHandle;
631 675
 

Loading…
취소
저장