Browse Source

cmData.h/c : Initial debugging and testing of cmDataParser.

master
kpl 11 years ago
parent
commit
2e1c77f150
2 changed files with 126 additions and 111 deletions
  1. 120
    111
      cmData.c
  2. 6
    0
      cmData.h

+ 120
- 111
cmData.c View File

34
 
34
 
35
 void _cmDataFree( cmData_t* p )
35
 void _cmDataFree( cmData_t* p )
36
 {
36
 {
37
+  if( p == NULL )
38
+    return;
39
+
37
   if( cmDataIsStruct(p) )
40
   if( cmDataIsStruct(p) )
38
   {
41
   {
39
     cmData_t* cp = p->u.child;
42
     cmData_t* cp = p->u.child;
2391
 cmDtRC_t _cmDpSyntaxErrV( cmDataParserCtx_t* c, const cmChar_t* fmt, va_list vl )
2394
 cmDtRC_t _cmDpSyntaxErrV( cmDataParserCtx_t* c, const cmChar_t* fmt, va_list vl )
2392
 {
2395
 {
2393
   cmChar_t* s0 = NULL;
2396
   cmChar_t* s0 = NULL;
2397
+  cmChar_t* s1 = NULL;
2394
   s0 = cmTsVPrintfP(s0,fmt,vl);
2398
   s0 = cmTsVPrintfP(s0,fmt,vl);
2395
-  cmDtRC_t rc = cmErrMsg(&c->p->err,kSyntaxErrDtRC,"Syntax error on line %i. %s",cmLexCurrentLineNumber(c->p->lexH),cmStringNullGuard(s0));
2399
+  s1 = cmMemAllocStrN(cmLexTokenText(c->p->lexH),cmLexTokenCharCount(c->p->lexH));
2400
+  cmDtRC_t rc = cmErrMsg(&c->p->err,kSyntaxErrDtRC,"Syntax error on line %i column:%i token:'%s'. %s",cmLexCurrentLineNumber(c->p->lexH),cmLexCurrentColumnNumber(c->p->lexH),s1,cmStringNullGuard(s0));
2396
   cmMemFree(s0);
2401
   cmMemFree(s0);
2402
+  cmMemFree(s1);
2397
   return rc;
2403
   return rc;
2398
 }
2404
 }
2399
 
2405
 
2412
   if((vp = cmStackTop(c->p->stH)) == NULL )
2418
   if((vp = cmStackTop(c->p->stH)) == NULL )
2413
     return _cmDpSyntaxErr(c,"Stack underflow.");
2419
     return _cmDpSyntaxErr(c,"Stack underflow.");
2414
   
2420
   
2421
+  if( cmStackPop(c->p->stH,1) != kOkStRC )
2422
+    return _cmDpSyntaxErr(c,"Stack pop failed.");
2423
+
2415
   *pp = *(cmData_t**)vp;
2424
   *pp = *(cmData_t**)vp;
2416
 
2425
 
2426
+  //printf("pop: %p\n",*pp);
2427
+
2417
   return kOkDtRC;
2428
   return kOkDtRC;
2418
 }
2429
 }
2419
 
2430
 
2420
-cmDtRC_t _cmDpStoreArrayEle( cmDataParserCtx_t* c, void* dp, unsigned byteCnt )
2431
+cmDtRC_t _cmDpPushStack( cmDataParserCtx_t* c, cmData_t* np )
2421
 {
2432
 {
2422
-  char* vp = cmMemResize(char, c->cnp->u.vp, c->cnp->cnt+byteCnt);
2433
+  //printf("push:%p\n",np);
2434
+
2435
+  // store the current node
2436
+  if( cmStackPush(c->p->stH, &np, 1 ) != kOkStRC )
2437
+     return _cmDpSyntaxErr(c,"Parser stack push failed.");
2438
+ 
2439
+  return kOkDtRC;
2440
+}
2441
+
2442
+cmDtRC_t _cmDpStoreArrayEle( cmDataParserCtx_t* c, void* dp, unsigned eleByteCnt, unsigned tid )
2443
+{
2444
+  if( c->cnp->tid == kVoidPtrDtId )
2445
+    c->cnp->tid = tid;
2446
+  else
2447
+    if( c->cnp->tid != tid )
2448
+      return _cmDpSyntaxErr(c,"Mixed types were detected in an array list.");
2449
+
2450
+  unsigned newByteCnt = (c->cnp->cnt+1)*eleByteCnt;
2451
+  char* vp = cmMemResizeP(char, c->cnp->u.vp, newByteCnt);
2423
   
2452
   
2424
-  memcpy(vp + c->cnp->cnt,dp,byteCnt);
2453
+  memcpy(vp + c->cnp->cnt*eleByteCnt,dp,eleByteCnt);
2425
   c->cnp->u.vp = vp;
2454
   c->cnp->u.vp = vp;
2426
-  c->cnp->cnt += byteCnt;
2455
+  c->cnp->cnt += 1;
2427
   
2456
   
2428
   c->flags = kValueExpFl | kCommaExpFl;
2457
   c->flags = kValueExpFl | kCommaExpFl;
2429
 
2458
 
2432
 
2461
 
2433
 cmDtRC_t _cmDataParserOpenPair( cmDataParserCtx_t* c )
2462
 cmDtRC_t _cmDataParserOpenPair( cmDataParserCtx_t* c )
2434
 {
2463
 {
2464
+  cmDtRC_t rc = kOkDtRC;
2465
+
2435
   assert( c->cnp->tid == kRecordDtId );
2466
   assert( c->cnp->tid == kRecordDtId );
2436
 
2467
 
2468
+  // create a pair with a 'null' value which will be replaced when the pair's value is parsed
2437
   cmData_t* nnp = cmDataAllocNull(NULL);
2469
   cmData_t* nnp = cmDataAllocNull(NULL);
2438
   cmData_t* pnp = cmDataAllocPairLabelN( c->cnp, cmLexTokenText(c->p->lexH), cmLexTokenCharCount(c->p->lexH), nnp );
2470
   cmData_t* pnp = cmDataAllocPairLabelN( c->cnp, cmLexTokenText(c->p->lexH), cmLexTokenCharCount(c->p->lexH), nnp );
2439
 
2471
 
2440
   // store the current node
2472
   // store the current node
2441
-  if( cmStackPush(c->p->stH, &c->cnp, 1 ) != kOkStRC )
2442
-    return _cmDpSyntaxErr(c,"Parser stack push failed.");
2473
+  if((rc = _cmDpPushStack(c,c->cnp)) != kOkDtRC )
2474
+    return rc;
2443
 
2475
 
2444
   // make the new pair the current node
2476
   // make the new pair the current node
2445
   c->cnp = pnp;
2477
   c->cnp = pnp;
2447
   // pair openings must be followed by a colon.
2479
   // pair openings must be followed by a colon.
2448
   c->flags  = kColonExpFl;
2480
   c->flags  = kColonExpFl;
2449
  
2481
  
2450
-  return kOkDtRC;
2482
+  return rc;
2451
 }
2483
 }
2452
 
2484
 
2453
 cmDtRC_t _cmDataParserClosePair( cmDataParserCtx_t* c )
2485
 cmDtRC_t _cmDataParserClosePair( cmDataParserCtx_t* c )
2492
 
2524
 
2493
     default:
2525
     default:
2494
       rc = _cmDpSyntaxErr(c,"A '%s' value was found outside of a valid container.",typeLabel);
2526
       rc = _cmDpSyntaxErr(c,"A '%s' value was found outside of a valid container.",typeLabel);
2527
+
2528
+      // Free the new data node because it was not attached and will 
2529
+      // otherwise be lost
2530
+      cmDataFree(np);
2531
+      
2495
   }
2532
   }
2496
 
2533
 
2497
   c->flags |= kCommaExpFl;
2534
   c->flags |= kCommaExpFl;
2501
 
2538
 
2502
 cmDtRC_t _cmDataParserReal( cmDataParserCtx_t* c )
2539
 cmDtRC_t _cmDataParserReal( cmDataParserCtx_t* c )
2503
 {
2540
 {
2504
-  cmDtRC_t rc  = kOkDtRC;
2505
-  double   val = cmLexTokenDouble(c->p->lexH);
2541
+  cmDtRC_t rc      = kOkDtRC;
2542
+  bool     floatFl = cmLexTokenIsSinglePrecision(c->p->lexH);
2543
+  double   dval;
2544
+  float    fval;
2506
 
2545
 
2507
-  if( c->cnp->tid == kVoidPtrDtId )
2508
-    rc = _cmDpStoreArrayEle(c,&val,sizeof(val));
2546
+  if( floatFl )
2547
+    fval = cmLexTokenFloat(c->p->lexH);
2509
   else
2548
   else
2510
-    rc = _cmDpStoreValue(c,cmDataAllocDouble(NULL,val),"real");
2549
+    dval = cmLexTokenDouble(c->p->lexH);
2511
 
2550
 
2551
+  
2552
+  if( cmDataIsPtr(c->cnp) )
2553
+  {
2554
+    if( floatFl )
2555
+      rc = _cmDpStoreArrayEle(c,&fval,sizeof(fval),kFloatPtrDtId);
2556
+    else
2557
+      rc = _cmDpStoreArrayEle(c,&dval,sizeof(dval),kDoublePtrDtId);
2558
+  }
2559
+  else
2560
+  {
2561
+    cmData_t* np = floatFl ? cmDataAllocFloat(NULL,fval) : cmDataAllocDouble(NULL,dval);
2562
+    rc = _cmDpStoreValue(c,np,"real");
2563
+  }
2512
   return rc;
2564
   return rc;
2513
 }
2565
 }
2514
 
2566
 
2515
 cmDtRC_t _cmDataParserInt( cmDataParserCtx_t* c )
2567
 cmDtRC_t _cmDataParserInt( cmDataParserCtx_t* c )
2516
 {
2568
 {
2517
-  cmDtRC_t rc  = kOkDtRC;
2518
-  int      val = cmLexTokenInt(c->p->lexH);
2569
+  cmDtRC_t rc         = kOkDtRC;
2570
+  int      val        = cmLexTokenInt(c->p->lexH);
2571
+  bool     unsignedFl = cmLexTokenIsUnsigned(c->p->lexH);
2519
 
2572
 
2520
-  if( c->cnp->tid == kVoidPtrDtId )
2521
-    rc = _cmDpStoreArrayEle(c,&val,sizeof(val));
2573
+  if( cmDataIsPtr(c->cnp) )
2574
+    rc = _cmDpStoreArrayEle(c,&val,sizeof(val),unsignedFl ? kUIntPtrDtId : kIntPtrDtId);
2522
   else
2575
   else
2523
-    rc = _cmDpStoreValue(c,cmDataAllocInt(NULL,val),"int");
2576
+  {
2577
+    cmData_t* np = unsignedFl ? cmDataAllocUInt(NULL,val) : cmDataAllocInt(NULL,val);
2578
+    rc = _cmDpStoreValue(c,np,"int");
2579
+  }
2524
 
2580
 
2525
   return rc;
2581
   return rc;
2526
 }
2582
 }
2542
 
2598
 
2543
 cmDtRC_t _cmDataParserOpenRecd( cmDataParserCtx_t* c )
2599
 cmDtRC_t _cmDataParserOpenRecd( cmDataParserCtx_t* c )
2544
 {
2600
 {
2601
+  cmDtRC_t rc = kOkDtRC;
2602
+
2545
   // records are values - so we must be expecting a value
2603
   // records are values - so we must be expecting a value
2546
   if( cmIsFlag(c->flags,kValueExpFl) == false )
2604
   if( cmIsFlag(c->flags,kValueExpFl) == false )
2547
     return _cmDpSyntaxErr(c,"Unexpected '{'.");
2605
     return _cmDpSyntaxErr(c,"Unexpected '{'.");
2548
 
2606
 
2549
   // store the current node
2607
   // store the current node
2550
-  if( cmStackPush(c->p->stH, &c->cnp, 1 ) != kOkStRC )
2551
-    return _cmDpSyntaxErr(c,"Parser stack push failed.");
2608
+  if((rc = _cmDpPushStack(c,c->cnp)) != kOkDtRC )
2609
+    return rc;
2552
 
2610
 
2553
   // alloc a new record and make it the current node
2611
   // alloc a new record and make it the current node
2554
-  if( (c->cnp = cmDataRecdAlloc(c->cnp)) == NULL )
2612
+  if( (c->cnp = cmDataRecdAlloc(NULL)) == NULL )
2555
     return _cmDpSyntaxErr(c,"'recd' allocate failed.");
2613
     return _cmDpSyntaxErr(c,"'recd' allocate failed.");
2556
 
2614
 
2557
   // new records must be followed by an id token.
2615
   // new records must be followed by an id token.
2558
   c->flags = kIdExpFl;
2616
   c->flags = kIdExpFl;
2559
 
2617
 
2560
-  return kOkDtRC;
2618
+  return rc;
2561
 }
2619
 }
2562
 
2620
 
2563
-cmDtRC_t _cmDataParserCloseRecd( cmDataParserCtx_t* c )
2621
+cmDtRC_t _cmDataParserCloseContainer( cmDataParserCtx_t* c, const cmChar_t* typeLabelStr )
2564
 {
2622
 {
2565
   cmDtRC_t rc;
2623
   cmDtRC_t rc;
2566
 
2624
 
2567
-  // make the parent node the new curren node
2625
+  cmData_t* np = c->cnp;
2626
+
2627
+  // make the parent node the new current node
2568
   if((rc = _cmDpPopStack(c,&c->cnp)) != kOkDtRC )
2628
   if((rc = _cmDpPopStack(c,&c->cnp)) != kOkDtRC )
2569
     return rc;
2629
     return rc;
2570
 
2630
 
2571
-  switch( c->cnp->tid )
2572
-  {
2573
-    case kPairDtId:
2574
-      // if the parent node is a pair then close it
2575
-      rc = _cmDataParserClosePair(c);
2576
-      break;
2577
-
2578
-    case kListDtId:
2579
-      // parent node is a list - so expect another value
2580
-      c->flags = kValueExpFl;
2581
-      break;
2631
+  return _cmDpStoreValue(c,np,typeLabelStr);
2632
+}
2582
 
2633
 
2583
-    default:
2584
-      return _cmDpSyntaxErr(c,"'records' may only be contained in other records or heterogenous arrays.");
2585
-      
2586
-  }
2634
+cmDtRC_t _cmDataParserCloseRecd( cmDataParserCtx_t* c )
2635
+{
2636
+  assert( c->cnp->tid == kRecordDtId );
2587
 
2637
 
2588
-  c->flags |= kCommaExpFl;
2589
-    
2590
-  return rc;
2638
+  return _cmDataParserCloseContainer(c,"record");
2591
 }
2639
 }
2592
 
2640
 
2593
 cmDtRC_t _cmDataParserOpenList( cmDataParserCtx_t* c )
2641
 cmDtRC_t _cmDataParserOpenList( cmDataParserCtx_t* c )
2594
 {
2642
 {
2643
+  cmDtRC_t rc = kOkDtRC;
2644
+
2595
   // lists are values - so we must be expecting a value
2645
   // lists are values - so we must be expecting a value
2596
   if( cmIsFlag(c->flags,kValueExpFl) == false )
2646
   if( cmIsFlag(c->flags,kValueExpFl) == false )
2597
     return _cmDpSyntaxErr(c,"Unexpected '('.");
2647
     return _cmDpSyntaxErr(c,"Unexpected '('.");
2598
 
2648
 
2599
   // store the current node
2649
   // store the current node
2600
-  if( cmStackPush(c->p->stH, &c->cnp, 1 ) != kOkStRC )
2601
-    return _cmDpSyntaxErr(c,"Parser stack push failed.");
2650
+  if((rc = _cmDpPushStack(c,c->cnp)) != kOkDtRC )
2651
+    return rc;
2602
 
2652
 
2603
   // create a new list
2653
   // create a new list
2604
-  if( (c->cnp = cmDataListAlloc(c->cnp)) == NULL )
2654
+  if( (c->cnp = cmDataListAlloc(NULL)) == NULL )
2605
     return _cmDpSyntaxErr(c,"'list' allocate failed.");
2655
     return _cmDpSyntaxErr(c,"'list' allocate failed.");
2606
 
2656
 
2607
   // new lists must be followed by a value
2657
   // new lists must be followed by a value
2608
   c->flags = kValueExpFl;
2658
   c->flags = kValueExpFl;
2609
 
2659
 
2610
-  return kOkDtRC;
2660
+  return rc;
2611
 }
2661
 }
2612
 
2662
 
2613
 cmDtRC_t _cmDataParserCloseList( cmDataParserCtx_t* c )
2663
 cmDtRC_t _cmDataParserCloseList( cmDataParserCtx_t* c )
2614
 {
2664
 {
2615
-  cmDtRC_t rc;
2616
-
2617
-  // make the list's parent the current node
2618
-  if((rc = _cmDpPopStack(c,&c->cnp)) != kOkDtRC )
2619
-    return rc;
2620
-
2621
-  switch( c->cnp->tid )
2622
-  {
2623
-    case kPairDtId:
2624
-      // if the list's parent is a pair then close it
2625
-      rc = _cmDataParserClosePair(c);
2626
-      break;
2627
-
2628
-    case kListDtId:
2629
-      // the list's parent is another list so expect a value
2630
-      c->flags = kValueExpFl;
2631
-      break;
2632
-
2633
-    default:
2634
-      return _cmDpSyntaxErr(c,"'lists' may only be contained in other records or lists.");
2635
-      
2636
-  }
2637
-
2638
-  c->flags |= kCommaExpFl;
2639
-    
2640
-  return rc;
2665
+  assert( c->cnp->tid == kListDtId );
2666
+  return _cmDataParserCloseContainer(c,"list");
2641
 }
2667
 }
2642
 
2668
 
2643
 cmDtRC_t _cmDataParserOpenArray( cmDataParserCtx_t* c )
2669
 cmDtRC_t _cmDataParserOpenArray( cmDataParserCtx_t* c )
2644
 {
2670
 {
2671
+  cmDtRC_t rc = kOkDtRC;
2645
 
2672
 
2646
   // arrays are values - so we must be expecting a value
2673
   // arrays are values - so we must be expecting a value
2647
   if( cmIsFlag(c->flags,kValueExpFl) == false )
2674
   if( cmIsFlag(c->flags,kValueExpFl) == false )
2648
     return _cmDpSyntaxErr(c,"Unexpected '('.");
2675
     return _cmDpSyntaxErr(c,"Unexpected '('.");
2649
 
2676
 
2650
   // store the current node
2677
   // store the current node
2651
-  if( cmStackPush(c->p->stH, &c->cnp, 1 ) != kOkStRC )
2652
-    return _cmDpSyntaxErr(c,"Parser stack push failed.");
2678
+  if((rc = _cmDpPushStack(c,c->cnp)) != kOkDtRC )
2679
+    return rc;
2653
 
2680
 
2654
   // create a new array
2681
   // create a new array
2655
-  if( (c->cnp = cmDataSetVoidAllocPtr(c->cnp, NULL, 0 )) == NULL )
2682
+  if( (c->cnp = cmDataVoidAllocPtr(NULL, NULL, 0 )) == NULL )
2656
     return _cmDpSyntaxErr(c,"'array' allocate failed.");
2683
     return _cmDpSyntaxErr(c,"'array' allocate failed.");
2657
 
2684
 
2658
   // new arrays must be followed by a value
2685
   // new arrays must be followed by a value
2659
   c->flags = kValueExpFl;
2686
   c->flags = kValueExpFl;
2660
 
2687
 
2661
-  return kOkDtRC;
2688
+  return rc;
2662
 
2689
 
2663
 }
2690
 }
2664
 
2691
 
2665
 cmDtRC_t _cmDataParserCloseArray( cmDataParserCtx_t* c )
2692
 cmDtRC_t _cmDataParserCloseArray( cmDataParserCtx_t* c )
2666
 {
2693
 {
2667
-  cmDtRC_t rc;
2668
-  
2669
-  // make the arrays parent the current node
2670
-  if((rc = _cmDpPopStack(c,&c->cnp)) != kOkDtRC )
2671
-    return rc;
2694
+  assert( cmDataIsPtr(c->cnp) );
2672
 
2695
 
2673
-  switch( c->cnp->tid )
2674
-  {
2675
-    
2676
-    case kPairDtId:
2677
-      // the arrays parent is a pair - so close it
2678
-      rc = _cmDataParserClosePair(c);
2679
-      break;
2680
-      
2681
-    case kListDtId:
2682
-      // the arrays parent is a list - so expect a value
2683
-      c->flags = kValueExpFl;
2684
-      break;
2685
-
2686
-    default:
2687
-      return _cmDpSyntaxErr(c,"'arrays' may only be contained in other records or lists.");
2688
-      
2689
-  }
2690
-
2691
-  c->flags |= kCommaExpFl;
2692
-    
2693
-  return rc;
2696
+  return _cmDataParserCloseContainer(c,"array");
2694
 }
2697
 }
2695
 
2698
 
2696
 cmDtRC_t _cmDataParserOnColon( cmDataParserCtx_t* c )
2699
 cmDtRC_t _cmDataParserOnColon( cmDataParserCtx_t* c )
2726
   cmDataParser_t*   p  = _cmDataParserHandleToPtr(h);
2729
   cmDataParser_t*   p  = _cmDataParserHandleToPtr(h);
2727
   unsigned          tokenId;
2730
   unsigned          tokenId;
2728
   cmDataParserCtx_t ctx;
2731
   cmDataParserCtx_t ctx;
2729
-
2730
-  ctx.cnp   = NULL;  // current node ptr
2732
+  cmData_t*         root = cmDataRecdAlloc(NULL);
2733
+  ctx.cnp   = root;
2731
   ctx.p     = p;
2734
   ctx.p     = p;
2732
-  ctx.flags = kValueExpFl;
2735
+  ctx.flags = kIdExpFl;
2733
 
2736
 
2734
   if( cmLexSetTextBuffer(p->lexH,text,strlen(text)) != kOkLexRC )
2737
   if( cmLexSetTextBuffer(p->lexH,text,strlen(text)) != kOkLexRC )
2735
     return cmErrMsg(&p->err,kLexFailDtRC,"The data object lexer failed during reset.");
2738
     return cmErrMsg(&p->err,kLexFailDtRC,"The data object lexer failed during reset.");
2736
 
2739
 
2737
   cmStackClear(p->stH,false);
2740
   cmStackClear(p->stH,false);
2738
 
2741
 
2739
-  while((tokenId = cmLexGetNextToken(p->lexH)) != kEofLexTId )
2742
+  while(rc==kOkDtRC && (tokenId = cmLexGetNextToken(p->lexH)) != kEofLexTId )
2740
   {
2743
   {
2741
     switch(tokenId)
2744
     switch(tokenId)
2742
     {
2745
     {
2745
         break;
2748
         break;
2746
 
2749
 
2747
       case kIntLexTId:      // decimal integer
2750
       case kIntLexTId:      // decimal integer
2748
-        rc = _cmDataParserInt(&ctx);
2749
-        break;
2750
-
2751
       case kHexLexTId:      // hexidecimal integer
2751
       case kHexLexTId:      // hexidecimal integer
2752
         rc = _cmDataParserInt(&ctx);
2752
         rc = _cmDataParserInt(&ctx);
2753
         break;
2753
         break;
2759
 
2759
 
2760
       case kLCurlyLexTId:    // a new record is starting
2760
       case kLCurlyLexTId:    // a new record is starting
2761
         rc = _cmDataParserOpenRecd(&ctx);
2761
         rc = _cmDataParserOpenRecd(&ctx);
2762
-      break;
2762
+        break;
2763
 
2763
 
2764
       case kRCurlyLexTId:   // the current record is finished
2764
       case kRCurlyLexTId:   // the current record is finished
2765
         rc = _cmDataParserCloseRecd(&ctx);
2765
         rc = _cmDataParserCloseRecd(&ctx);
2806
 
2806
 
2807
   if( rc == kOkDtRC )
2807
   if( rc == kOkDtRC )
2808
     *pp = ctx.cnp;
2808
     *pp = ctx.cnp;
2809
+  else
2810
+  {
2811
+    if( ctx.cnp != root )
2812
+      cmDataUnlinkAndFree(ctx.cnp);
2809
 
2813
 
2814
+    cmDataUnlinkAndFree(root);
2815
+  }
2810
   return rc;
2816
   return rc;
2811
 }
2817
 }
2812
 
2818
 
2913
 
2919
 
2914
   const cmChar_t text[] =
2920
   const cmChar_t text[] =
2915
   {
2921
   {
2916
-    "{ f0:1.23 f1:\"hey\" "
2922
+    //0         1         2         3
2923
+    //0123456789012345678901234567890123 
2924
+    "f0:1.23 f1:\"hey\" f2:( a b c ) f3:[ 0f 1f 2f ]"
2925
+    //"f0:1.23 f1:\"hey\""
2917
   };
2926
   };
2918
 
2927
 
2919
   cmErrSetup(&err,&ctx->rpt,"Data Parser Tester");
2928
   cmErrSetup(&err,&ctx->rpt,"Data Parser Tester");

+ 6
- 0
cmData.h View File

544
   cmDtRC_t cmDataParserCreate( cmCtx_t* ctx, cmDataParserH_t* hp );
544
   cmDtRC_t cmDataParserCreate( cmCtx_t* ctx, cmDataParserH_t* hp );
545
   cmDtRC_t cmDataParserDestroy( cmDataParserH_t* hp );
545
   cmDtRC_t cmDataParserDestroy( cmDataParserH_t* hp );
546
   bool     cmDataParserIsValid( cmDataParserH_t h );
546
   bool     cmDataParserIsValid( cmDataParserH_t h );
547
+
548
+  // Parse a text representation into a 'record' type. 
549
+  // Note that the text is wrapped with implied curly braces 
550
+  // (e.g. "{ text }").  The contents of the text should therefore
551
+  // fit the record syntax (e.g. the first token should be a 
552
+  // 'pair' label.
547
   cmDtRC_t cmDataParserExec(   cmDataParserH_t  h, const cmChar_t* text, cmData_t** pp );
553
   cmDtRC_t cmDataParserExec(   cmDataParserH_t  h, const cmChar_t* text, cmData_t** pp );
548
   //-----------------------------------------------------------------------------
554
   //-----------------------------------------------------------------------------
549
   
555
   

Loading…
Cancel
Save