Parcourir la source

cmData.h/c : Addd cmDataRecdParseXXX() functions. Added beginning

modifications to include function which report errors without using
the global variable _cmDataErrNo.
master
kpl il y a 10 ans
Parent
révision
55fe26deb2
2 fichiers modifiés avec 210 ajouts et 9 suppressions
  1. 175
    4
      cmData.c
  2. 35
    5
      cmData.h

+ 175
- 4
cmData.c Voir le fichier

@@ -1730,7 +1730,7 @@ cmData_t* cmRecdAppendPair( cmData_t* p, cmData_t* pair )
1730 1730
 }
1731 1731
 
1732 1732
 
1733
-cmDtRC_t  _cmDataRecdParseV(cmData_t* parent, unsigned idFl, va_list vl )
1733
+cmDtRC_t  _cmDataRecdParseInputV(cmData_t* parent, unsigned idFl, va_list vl )
1734 1734
 {
1735 1735
   assert( parent != NULL && parent->tid == kRecordDtId );
1736 1736
   bool      contFl = true;
@@ -1750,7 +1750,7 @@ cmDtRC_t  _cmDataRecdParseV(cmData_t* parent, unsigned idFl, va_list vl )
1750 1750
       label = va_arg(vl,const char*);  // text field label identifier
1751 1751
     
1752 1752
     // validate the field identifier
1753
-    if( id==kInvalidDtId || label==NULL )
1753
+    if( id==kInvalidDtId && label==NULL )
1754 1754
       break;
1755 1755
 
1756 1756
     // parse the field data
@@ -1773,7 +1773,7 @@ cmDtRC_t  _cmDataRecdParseV(cmData_t* parent, unsigned idFl, va_list vl )
1773 1773
 cmData_t*       cmDataRecdAllocLabelV( cmData_t* parent, va_list vl )
1774 1774
 {
1775 1775
   cmData_t* p = cmRecdAlloc(parent);
1776
-  cmDtRC_t rc = _cmDataRecdParseV(p, false, vl );
1776
+  cmDtRC_t rc = _cmDataRecdParseInputV(p, false, vl );
1777 1777
   if( rc != kOkDtRC )
1778 1778
   {
1779 1779
     cmDataFree(p);
@@ -1794,7 +1794,7 @@ cmData_t*       cmDataRecdAllocLabelA( cmData_t* parent, ... )
1794 1794
 cmData_t*       cmDataRecdAllocIdV( cmData_t* parent, va_list vl )
1795 1795
 {
1796 1796
   cmData_t* p = cmRecdAlloc(parent);
1797
-  cmDtRC_t rc = _cmDataRecdParseV(p, true, vl );
1797
+  cmDtRC_t rc = _cmDataRecdParseInputV(p, true, vl );
1798 1798
   if( rc != kOkDtRC )
1799 1799
   {
1800 1800
     cmDataFree(p);
@@ -1812,6 +1812,177 @@ cmData_t*       cmDataRecdAllocIdA( cmData_t* parent, ... )
1812 1812
   return p;
1813 1813
 }
1814 1814
 
1815
+cmDtRC_t _cmDataRecdParseV(cmData_t* p, bool idFl, cmErr_t* err, va_list vl )
1816
+{
1817
+  bool      contFl = true;
1818
+  cmDtRC_t  rc     = kOkDtRC;
1819
+  
1820
+  while( contFl )
1821
+  {
1822
+    unsigned    id;
1823
+    const char* label;
1824
+
1825
+    // parse the field idenfier
1826
+    if( idFl )
1827
+      id    = va_arg(vl,unsigned);     // numeric field identifier
1828
+    else
1829
+      label = va_arg(vl,const char*);  // text field label identifier
1830
+   
1831
+    // validate the field identifier
1832
+    if( id==kInvalidDtId && label==NULL )
1833
+      break;
1834
+
1835
+    cmDataFmtId_t typeId = va_arg(vl,unsigned);
1836
+    void*         v      = va_arg(vl,void*);
1837
+    cmData_t*     np     = NULL;
1838
+
1839
+    if( idFl )
1840
+      np = cmDataRecdValueFromLabel( p, label );
1841
+    else
1842
+      np = cmDataRecdValueFromId( p, id );
1843
+
1844
+    switch(typeId)
1845
+    {
1846
+      case kNullDtId:
1847
+        break;
1848
+
1849
+      case kUCharDtId: 
1850
+        *((unsigned char*)v) = cmDataGetUChar(np);
1851
+        break;
1852
+
1853
+      case kCharDtId:
1854
+        *((char*)v) = cmDataGetChar(np);
1855
+        break;
1856
+
1857
+      case kUShortDtId:
1858
+        *((unsigned short*)v) = cmDataGetUShort(np);
1859
+        break;
1860
+
1861
+      case kShortDtId:
1862
+        *((short*)v) = cmDataGetShort(np);
1863
+        break;
1864
+
1865
+      case kUIntDtId:
1866
+        *((unsigned int*)v) = cmDataGetUInt(np);        
1867
+        break;
1868
+
1869
+      case kIntDtId:
1870
+        *((int*)v) = cmDataGetInt(np);
1871
+        break;
1872
+
1873
+      case kULongDtId:
1874
+        *((unsigned long*)v) = cmDataGetULong(np);
1875
+        break;
1876
+
1877
+      case kLongDtId:
1878
+        *((long*)v) = cmDataGetLong(np);
1879
+        break;
1880
+
1881
+      case kFloatDtId:
1882
+        *((float*)v) = cmDataGetFloat(np);
1883
+        break;
1884
+
1885
+      case kDoubleDtId:
1886
+        *((double*)v) = cmDataGetDouble(np);
1887
+        break;
1888
+
1889
+      case kStrDtId:
1890
+        *((char**)v) = cmDataGetStr(np);
1891
+        break;
1892
+
1893
+      case kConstStrDtId:
1894
+        *((const char**)v) = cmDataGetConstStr(np);        
1895
+        break;
1896
+
1897
+      case kUCharPtrDtId: 
1898
+        *((unsigned char**)v) = cmDataGetUCharPtr(np);
1899
+        break;
1900
+
1901
+      case kCharPtrDtId:
1902
+        *((char**)v) = cmDataGetCharPtr(np);
1903
+        break;
1904
+
1905
+      case kUShortPtrDtId:
1906
+        *((unsigned short**)v) = cmDataGetUShortPtr(np);
1907
+        break;
1908
+
1909
+      case kShortPtrDtId:
1910
+        *((short**)v) = cmDataGetShortPtr(np);
1911
+        break;
1912
+
1913
+      case kUIntPtrDtId:
1914
+        *((unsigned int**)v) = cmDataGetUIntPtr(np);        
1915
+        break;
1916
+
1917
+      case kIntPtrDtId:
1918
+        *((int**)v) = cmDataGetIntPtr(np);
1919
+        break;
1920
+
1921
+      case kULongPtrDtId:
1922
+        *((unsigned long**)v) = cmDataGetULongPtr(np);
1923
+        break;
1924
+
1925
+      case kLongPtrDtId:
1926
+        *((long**)v) = cmDataGetLongPtr(np);
1927
+        break;
1928
+
1929
+      case kFloatPtrDtId:
1930
+        *((float**)v) = cmDataGetFloatPtr(np);
1931
+        break;
1932
+
1933
+      case kDoublePtrDtId:
1934
+        *((double**)v) = cmDataGetDoublePtr(np);
1935
+        break;
1936
+
1937
+      case kVoidPtrDtId:
1938
+        *((void**)v) = cmDataGetDoublePtr(np);
1939
+        break;
1940
+
1941
+      case kListDtId:
1942
+      case kPairDtId:
1943
+      case kRecordDtId:
1944
+        if( np->tid != typeId )
1945
+         _cmDataSetError(kCvtErrDtRC);
1946
+        else
1947
+          *(cmData_t**)v = np;
1948
+        break;
1949
+
1950
+      default:
1951
+        _cmDataSetError(kVarArgErrDtRC);
1952
+        assert(0);
1953
+    }
1954
+    
1955
+  }
1956
+
1957
+  return rc;
1958
+}
1959
+
1960
+cmDtRC_t cmDataRecdParseLabelV(cmData_t* p, cmErr_t* err, va_list vl )
1961
+{ return _cmDataRecdParseV(p,false,err,vl); }
1962
+
1963
+cmDtRC_t cmDataRecdParseLabel(cmData_t* p, cmErr_t* err, ... )
1964
+{
1965
+  va_list vl;
1966
+  va_start(vl,err);
1967
+  cmDtRC_t rc = cmDataRecdParseLabelV(p,err,vl);
1968
+  va_end(vl);
1969
+  return rc;
1970
+}
1971
+
1972
+cmDtRC_t cmDataRecdParseIdV(cmData_t* p, cmErr_t* err, va_list vl )
1973
+{ return _cmDataRecdParseV(p,true,err,vl); }
1974
+
1975
+cmDtRC_t cmDataRecdParseId(cmData_t* p, cmErr_t* err, ... )
1976
+{
1977
+  va_list vl;
1978
+  va_start(vl,err);
1979
+  cmDtRC_t rc = cmDataRecdParseIdV(p,err,vl);
1980
+  va_end(vl);
1981
+  return rc;
1982
+}
1983
+
1984
+
1985
+
1815 1986
 //----------------------------------------------------------------------------  
1816 1987
 unsigned cmDataSerializeByteCount( const cmData_t* p )
1817 1988
 {

+ 35
- 5
cmData.h Voir le fichier

@@ -205,6 +205,31 @@ extern "C" {
205 205
 
206 206
 
207 207
   // Get the value of an object with conversion.
208
+  cmDtRC_t cmDataGetCharE(      const cmData_t* p, char* v );
209
+  cmDtRC_t cmDataGetUCharE(     const cmData_t* p, unsigned char* v );
210
+  cmDtRC_t cmDataGetShortE(     const cmData_t* p, short* v );
211
+  cmDtRC_t cmDataGetUShortE(    const cmData_t* p, unsigned short* v );
212
+  cmDtRC_t cmDataGetIntE(       const cmData_t* p, int* v );
213
+  cmDtRC_t cmDataGetUIntE(      const cmData_t* p, unsigned int* v );
214
+  cmDtRC_t cmDataGetLongE(      const cmData_t* p, long* v );
215
+  cmDtRC_t cmDataGetULongE(     const cmData_t* p, unsigned long* v );
216
+  cmDtRC_t cmDataGetFloatE(     const cmData_t* p, float* v );
217
+  cmDtRC_t cmDataGetDoubleE(    const cmData_t* p, double* v );
218
+  cmDtRC_t cmDataGetStrE(       const cmData_t* p, char** v );
219
+  cmDtRC_t cmDataGetConstStrE(  const cmData_t* p, const char** v );
220
+  cmDtRC_t cmDataGetVoidPtrE(   const cmData_t* p, void** v );
221
+  cmDtRC_t cmDataGetCharPtrE(   const cmData_t* p, char** v );
222
+  cmDtRC_t cmDataGetUCharPtrE(  const cmData_t* p, unsigned char** v );
223
+  cmDtRC_t cmDataGetShortPtrE(  const cmData_t* p, short** v );
224
+  cmDtRC_t cmDataGetUShortPtrE( const cmData_t* p, unsigned short** v );
225
+  cmDtRC_t cmDataGetIntPtrE(    const cmData_t* p, int** v );
226
+  cmDtRC_t cmDataGetUIntPtrE(   const cmData_t* p, unsigned int** v );
227
+  cmDtRC_t cmDataGetLongPtrE(   const cmData_t* p, long** v );
228
+  cmDtRC_t cmDataGetULongPtrE(  const cmData_t* p, unsigned long** v );
229
+  cmDtRC_t cmDataGetFloatPtrE(  const cmData_t* p, float** v );
230
+  cmDtRC_t cmDataGetDoublePtrE( const cmData_t* p, double** v );
231
+
232
+  // Get the value of an object with conversion.
208 233
   char            cmDataGetChar(      const cmData_t* p );
209 234
   unsigned char   cmDataGetUChar(     const cmData_t* p );
210 235
   short           cmDataGetShort(     const cmData_t* p );
@@ -230,6 +255,7 @@ extern "C" {
230 255
   double*         cmDataGetDoublePtr( const cmData_t* p );
231 256
 
232 257
 
258
+
233 259
   // Set the value of an existing scalar data object.
234 260
   cmData_t* cmDataSetNull(       cmData_t* p );
235 261
   cmData_t* cmDataSetChar(      cmData_t* p, char v );
@@ -479,9 +505,9 @@ extern "C" {
479 505
 
480 506
   // Var-args fmt:
481 507
   // <label|id> <typeId>  <value> {<cnt>}
482
-  // scalar types: <value> is literal,<cnt>   is not included
483
-  //     null has no <value> or <cnt>
484
-  // ptr    types: <value> is pointer,<cnt>   is element count
508
+  // scalar types: <value> is literal,<cnt> is not included
509
+  // null   type  has no <value> or <cnt>
510
+  // ptr    types: <value> is pointer,  <cnt> is element count
485 511
   // struct types: <value> is cmData_t, <cnt> is not included
486 512
   // Indicate the end of argument list by setting  <typeId> to kInvalidDtId. 
487 513
   // The memory for array based data types is dynamically allocated.
@@ -491,8 +517,12 @@ extern "C" {
491 517
   cmData_t*       cmDataRecdAllocIdV( cmData_t* parent, va_list vl );
492 518
   cmData_t*       cmDataRecdAllocIdA( cmData_t* parent, ... );
493 519
   
494
-
495
-
520
+  // Extract the data in a record to C variables.
521
+  // <label|id> <typeId> <pointer>
522
+  cmDtRC_t cmDataRecdParseLabelV(cmData_t* p, cmErr_t* err, va_list vl );
523
+  cmDtRC_t cmDataRecdParseLabel( cmData_t* p, cmErr_t* err, ... );
524
+  cmDtRC_t cmDataRecdParseIdV(   cmData_t* p, cmErr_t* err, va_list vl );
525
+  cmDtRC_t cmDataRecdParseId(    cmData_t* p, cmErr_t* err, ... );
496 526
   
497 527
   unsigned cmDataSerializeByteCount( const cmData_t* p );
498 528
   cmDtRC_t cmDataSerialize( const cmData_t* p, void* buf, unsigned bufByteCnt );

Chargement…
Annuler
Enregistrer