Browse Source

cmProc4.c: _cmScModulatorParse() now allows values from previous entries to

be automatically applied to subsequent entries. New entries must therefore
only fill in the fields which change.
master
kevin 11 years ago
parent
commit
83450bedc8
1 changed files with 162 additions and 3 deletions
  1. 162
    3
      cmProc4.c

+ 162
- 3
cmProc4.c View File

3499
   return rc;
3499
   return rc;
3500
 }
3500
 }
3501
 
3501
 
3502
-cmRC_t _cmScModulatorParse( cmScModulator* p, cmCtx_t* ctx, cmSymTblH_t stH, const cmChar_t* fn )
3502
+cmRC_t _cmScModulatorParse2( cmScModulator* p, cmCtx_t* ctx, cmSymTblH_t stH, const cmChar_t* fn )
3503
 {
3503
 {
3504
   cmRC_t        rc  = cmOkRC;
3504
   cmRC_t        rc  = cmOkRC;
3505
   cmJsonNode_t* jnp = NULL;
3505
   cmJsonNode_t* jnp = NULL;
3527
 
3527
 
3528
   for(i=0; i<entryCnt; ++i)
3528
   for(i=0; i<entryCnt; ++i)
3529
   {
3529
   {
3530
-    cmJsRC_t                jsRC;
3530
+    cmJsRC_t                 jsRC;
3531
     const char*              errLabelPtr = NULL;
3531
     const char*              errLabelPtr = NULL;
3532
     unsigned                 scLocIdx    = cmInvalidIdx;
3532
     unsigned                 scLocIdx    = cmInvalidIdx;
3533
     const cmChar_t*          modLabel    = NULL;
3533
     const cmChar_t*          modLabel    = NULL;
3613
   return rc;
3613
   return rc;
3614
 }
3614
 }
3615
 
3615
 
3616
+cmRC_t _cmScModulatorParse( cmScModulator* p, cmCtx_t* ctx, cmSymTblH_t stH, const cmChar_t* fn )
3617
+{
3618
+  cmRC_t        rc  = cmOkRC;
3619
+  cmJsonNode_t* jnp = NULL;
3620
+  cmJsonH_t     jsH = cmJsonNullHandle;
3621
+  unsigned      i   = cmInvalidIdx;
3622
+  unsigned      j   = cmInvalidIdx;
3623
+
3624
+  // read the JSON file
3625
+  if( cmJsonInitializeFromFile(&jsH, fn, ctx ) != kOkJsRC )
3626
+    return cmCtxRtCondition( &p->obj, cmInvalidArgRC, "JSON file parse failed on the modulator file: %s.",cmStringNullGuard(fn) );
3627
+
3628
+  jnp = cmJsonRoot(jsH);
3629
+
3630
+  // validate that the first child as an array
3631
+  if( jnp==NULL || ((jnp = cmJsonNodeMemberValue(jnp,"array")) == NULL) || cmJsonIsArray(jnp)==false )
3632
+  {
3633
+    rc = cmCtxRtCondition( &p->obj, cmInvalidArgRC, "Modulator file header syntax error in file:%s",cmStringNullGuard(fn) );
3634
+    goto errLabel;
3635
+  }
3636
+
3637
+  // allocate the entry array
3638
+  unsigned entryCnt = cmJsonChildCount(jnp);
3639
+  p->earray         = cmMemResizeZ(cmScModEntry_t,p->earray,entryCnt);
3640
+  p->en             = entryCnt;
3641
+
3642
+  unsigned        prvScLocIdx = cmInvalidIdx;
3643
+  const cmChar_t* prvModLabel   = NULL;
3644
+  const cmChar_t* prvVarLabel   = NULL;
3645
+  const cmChar_t* prvTypeLabel  = NULL;
3646
+  for(i=0; i<entryCnt; ++i)
3647
+  {
3648
+    cmJsRC_t                 jsRC;
3649
+    const char*              errLabelPtr = NULL;
3650
+    unsigned                 scLocIdx    = cmInvalidIdx;
3651
+    const cmChar_t*          modLabel    = NULL;
3652
+    const cmChar_t*          varLabel    = NULL;
3653
+    const cmChar_t*          typeLabel   = NULL;
3654
+    cmJsonNode_t*            onp         = cmJsonArrayElement(jnp,i);
3655
+    cmJsonNode_t*            dnp         = NULL;
3656
+    const _cmScModTypeMap_t* map         = NULL;
3657
+
3658
+    if((jsRC = cmJsonMemberValues( onp, &errLabelPtr, 
3659
+          "loc", kIntTId    | kOptArgJsFl, &scLocIdx,
3660
+          "mod", kStringTId | kOptArgJsFl, &modLabel,
3661
+          "var", kStringTId | kOptArgJsFl, &varLabel,
3662
+          "type",kStringTId | kOptArgJsFl, &typeLabel,
3663
+          NULL )) != kOkJsRC )
3664
+    {
3665
+      if( errLabelPtr == NULL )
3666
+        rc = cmCtxRtCondition( &p->obj, cmInvalidArgRC, "Error:%s on record at index %i in file:%s",errLabelPtr,i,cmStringNullGuard(fn) );
3667
+      else
3668
+        rc = cmCtxRtCondition( &p->obj, cmInvalidArgRC, "Synax error in Modulator record at index %i in file:%s",i,cmStringNullGuard(fn) );
3669
+      goto errLabel;
3670
+    }
3671
+
3672
+    // if the score location was not given use the previous score location
3673
+    if( scLocIdx == cmInvalidIdx )
3674
+      scLocIdx = prvScLocIdx;
3675
+    else
3676
+      prvScLocIdx = scLocIdx;
3677
+
3678
+    // if the mod label was not given use the previous one
3679
+    if( modLabel == NULL )
3680
+      modLabel = prvModLabel;
3681
+    else
3682
+      prvModLabel = modLabel;
3683
+
3684
+    if( modLabel == NULL )
3685
+    {
3686
+      rc = cmCtxRtCondition(&p->obj, cmInvalidArgRC, "No 'mod' label has been set in mod file '%s'.",cmStringNullGuard(fn));
3687
+      goto errLabel;
3688
+    }
3689
+
3690
+    // if the var label was not given use the previous one
3691
+    if( varLabel == NULL )
3692
+      varLabel = prvVarLabel;
3693
+    else
3694
+      prvVarLabel = varLabel;
3695
+
3696
+    if( varLabel == NULL )
3697
+    {
3698
+      rc = cmCtxRtCondition(&p->obj, cmInvalidArgRC, "No 'var' label has been set in mod file '%s'.",cmStringNullGuard(fn));
3699
+      goto errLabel;
3700
+    }
3701
+
3702
+    // if the type label was not given use the previous one 
3703
+    if( typeLabel == NULL )
3704
+      typeLabel = prvTypeLabel;
3705
+    else
3706
+      prvTypeLabel = typeLabel;
3707
+
3708
+    if( typeLabel == NULL )
3709
+    {
3710
+      rc = cmCtxRtCondition(&p->obj, cmInvalidArgRC, "No 'type' label has been set in mod file '%s'.",cmStringNullGuard(fn));
3711
+      goto errLabel;
3712
+    }
3713
+
3714
+    // validate the entry type label
3715
+    if((map = _cmScModTypeLabelToMap(typeLabel)) == NULL )
3716
+    {
3717
+      rc = cmCtxRtCondition( &p->obj, cmInvalidArgRC, "Unknown entry type '%s' in Modulator record at index %i in file:%s",cmStringNullGuard(typeLabel),i,cmStringNullGuard(fn) );
3718
+      goto errLabel;
3719
+    }
3720
+    
3721
+    unsigned modSymId = cmSymTblRegisterSymbol(stH,modLabel);
3722
+    unsigned varSymId = cmSymTblRegisterSymbol(stH,varLabel);
3723
+
3724
+    // the mod entry label must match the modulators label
3725
+    if( p->modSymId != modSymId )
3726
+    {
3727
+      --p->en;
3728
+        continue;
3729
+    } 
3730
+
3731
+    // get the count of the elmenets in the data array
3732
+    unsigned paramCnt = cmJsonChildCount(onp);
3733
+
3734
+    // fill the entry record and find or create the target var
3735
+    cmScModEntry_t* ep = _cmScModulatorInsertEntry(p,i,scLocIdx,modSymId,varSymId,map->typeId,paramCnt);
3736
+
3737
+    typedef struct
3738
+    {
3739
+      const cmChar_t* label;
3740
+      cmScModParam_t* param;
3741
+    } map_t;
3742
+
3743
+    // parse the var and parameter records
3744
+    map_t mapArray[] = 
3745
+    {
3746
+      { "min", &ep->min  },
3747
+      { "max", &ep->max  },
3748
+      { "rate",&ep->rate },
3749
+      { "val", &ep->beg },
3750
+      { "end", &ep->end },
3751
+      { "dur", &ep->dur },
3752
+      { NULL, NULL }
3753
+    };
3754
+
3755
+    unsigned j=0;
3756
+    for(j=0; mapArray[j].param!=NULL; ++j)
3757
+      if((dnp = cmJsonFindValue(jsH,mapArray[j].label, onp, kInvalidTId )) != NULL )
3758
+        if((rc = _cmScModulatorParseParam(p,stH,dnp,mapArray[j].param)) != cmOkRC )
3759
+          goto errLabel;    
3760
+  }
3761
+
3762
+ errLabel:
3763
+
3764
+  if( rc != cmOkRC )
3765
+    cmCtxRtCondition( &p->obj, cmInvalidArgRC, "Error parsing in Modulator 'data' record at index %i value index %i in file:%s",i,j,cmStringNullGuard(fn) );    
3766
+
3767
+
3768
+  // release the JSON tree
3769
+  if( cmJsonIsValid(jsH) )
3770
+    cmJsonFinalize(&jsH);
3771
+
3772
+  return rc;
3773
+}
3774
+
3775
+
3616
 cmRC_t  _cmScModulatorReset( cmScModulator* p, cmCtx_t* ctx, unsigned scLocIdx )
3776
 cmRC_t  _cmScModulatorReset( cmScModulator* p, cmCtx_t* ctx, unsigned scLocIdx )
3617
 {
3777
 {
3618
   cmRC_t rc = cmOkRC;
3778
   cmRC_t rc = cmOkRC;
4029
   }
4189
   }
4030
   
4190
   
4031
   return rc;
4191
   return rc;
4032
-
4033
 }
4192
 }

Loading…
Cancel
Save