cmDspSys.h/c:Initial add of cmDspRsrcWriteString() and check of cmJsonIsModified() in cmDspSysUnload().

This commit is contained in:
kevin 2013-05-22 15:16:11 -07:00
parent c3643ef133
commit f1dc68364a
2 changed files with 133 additions and 23 deletions

View File

@ -480,13 +480,13 @@ cmDspRC_t cmDspSysUnload( cmDspSysH_t h )
// finalize the pgm specific JSON tree // finalize the pgm specific JSON tree
if( cmJsonIsValid(p->ctx.rsrcJsH)) if( cmJsonIsValid(p->ctx.rsrcJsH))
{ {
//if( cmJsonWrite(p->ctx.rsrcJsH, cmJsonRoot(p->ctx.rsrcJsH), p->rsrcFn ) != kOkJsRC ) // if the JSON tree has been modified.
// rc = cmErrMsg(&p->err,kJsonFailDspRC,"JSON file write failed on '%s'.",cmStringNullGuard(p->rsrcFn)); if( cmJsonIsModified(p->ctx.rsrcJsH) )
//else if( cmJsonWrite(p->ctx.rsrcJsH, cmJsonRoot(p->ctx.rsrcJsH), p->rsrcFn ) != kOkJsRC )
//{ rc = cmErrMsg(&p->err,kJsonFailDspRC,"JSON resource file write failed on '%s'.",cmStringNullGuard(p->rsrcFn));
if( cmJsonFinalize(&p->ctx.rsrcJsH) != kOkJsRC ) if( cmJsonFinalize(&p->ctx.rsrcJsH) != kOkJsRC )
rc = cmErrMsg(&p->err,kJsonFailDspRC,"Resource JSON finalization failed."); rc = cmErrMsg(&p->err,kJsonFailDspRC,"Resource JSON finalization failed.");
//}
} }
// release the JSON file name // release the JSON file name
@ -1850,6 +1850,51 @@ cmDspRC_t _cmDspRsrcPath( cmDspSysH_t h, cmChar_t** pathPtr, va_list vl )
return rc; return rc;
} }
cmDspRC_t _cmDspRsrcWritePath( cmDspSysH_t h, cmChar_t** pathStrRef, cmChar_t** varStrRef, va_list vl )
{
unsigned i;
cmDspRC_t rc = kOkDspRC;;
cmDsp_t* p = _cmDspHandleToPtr(h);
cmChar_t* path = NULL;
unsigned maxArgCnt = 10;
cmChar_t* prevStr = NULL;
*pathStrRef = NULL;
*varStrRef = NULL;
for(i=0; i<maxArgCnt; ++i )
{
cmChar_t* str;
if((str = va_arg(vl,cmChar_t* )) == NULL )
break;
if( prevStr != NULL )
path = cmTextAppendSS(path,"/");
path = cmTextAppendSS(path,prevStr);
prevStr = str;
}
if( i >= maxArgCnt )
{
rc = cmErrMsg(&p->err,kJsonFailDspRC,"A resource path, beginning with '%25s', does not contain a terminating NULL.", cmStringNullGuard(path) );
goto errLabel;
}
// duplicate the string onto the program linked heap
if( path != NULL )
*pathStrRef = cmLhAllocStr( cmDspSysLHeap(h), path);
*varStrRef = prevStr;
errLabel:
cmMemFree(path);
return rc;
}
cmDspRC_t cmDspRsrcBoolV( cmDspSysH_t h, bool* vp, va_list vl ) cmDspRC_t cmDspRsrcBoolV( cmDspSysH_t h, bool* vp, va_list vl )
{ {
assert(vp != NULL); assert(vp != NULL);
@ -1861,7 +1906,9 @@ cmDspRC_t cmDspRsrcBoolV( cmDspSysH_t h, bool* vp, va_list vl )
return rc; return rc;
if((rc = cmJsonPathToBool( cmDspSysPgmRsrcHandle(h), NULL, NULL, path, vp )) != kOkJsRC ) if((rc = cmJsonPathToBool( cmDspSysPgmRsrcHandle(h), NULL, NULL, path, vp )) != kOkJsRC )
return cmErrMsg(&p->err,kJsonFailDspRC,"'bool' resource not found at path:'%s'.",cmStringNullGuard(path)); rc = cmErrMsg(&p->err,kJsonFailDspRC,"'bool' resource not found at path:'%s'.",cmStringNullGuard(path));
cmLhFree(cmDspSysLHeap(h),path);
return rc; return rc;
} }
@ -1877,7 +1924,9 @@ cmDspRC_t cmDspRsrcIntV( cmDspSysH_t h, int* vp, va_list vl )
return rc; return rc;
if((rc = cmJsonPathToInt( cmDspSysPgmRsrcHandle(h), NULL, NULL, path, vp )) != kOkJsRC ) if((rc = cmJsonPathToInt( cmDspSysPgmRsrcHandle(h), NULL, NULL, path, vp )) != kOkJsRC )
return cmErrMsg(&p->err,kJsonFailDspRC,"'int' resource not found at path:'%s'.",cmStringNullGuard(path)); rc = cmErrMsg(&p->err,kJsonFailDspRC,"'int' resource not found at path:'%s'.",cmStringNullGuard(path));
cmLhFree(cmDspSysLHeap(h),path);
return rc; return rc;
} }
@ -1893,7 +1942,9 @@ cmDspRC_t cmDspRsrcUIntV( cmDspSysH_t h, unsigned* vp, va_list vl )
return rc; return rc;
if((rc = cmJsonPathToUInt( cmDspSysPgmRsrcHandle(h), NULL, NULL, path, vp )) != kOkJsRC ) if((rc = cmJsonPathToUInt( cmDspSysPgmRsrcHandle(h), NULL, NULL, path, vp )) != kOkJsRC )
return cmErrMsg(&p->err,kJsonFailDspRC,"'uint' resource not found at path:'%s'.",cmStringNullGuard(path)); rc = cmErrMsg(&p->err,kJsonFailDspRC,"'uint' resource not found at path:'%s'.",cmStringNullGuard(path));
cmLhFree(cmDspSysLHeap(h),path);
return rc; return rc;
} }
@ -1909,7 +1960,9 @@ cmDspRC_t cmDspRsrcDblV( cmDspSysH_t h, double* vp, va_list vl )
return rc; return rc;
if((rc = cmJsonPathToReal( cmDspSysPgmRsrcHandle(h), NULL, NULL, path, vp )) != kOkJsRC ) if((rc = cmJsonPathToReal( cmDspSysPgmRsrcHandle(h), NULL, NULL, path, vp )) != kOkJsRC )
return cmErrMsg(&p->err,kJsonFailDspRC,"'real' resource not found at path:'%s'.",cmStringNullGuard(path)); rc = cmErrMsg(&p->err,kJsonFailDspRC,"'real' resource not found at path:'%s'.",cmStringNullGuard(path));
cmLhFree(cmDspSysLHeap(h),path);
return rc; return rc;
} }
@ -1926,10 +1979,12 @@ cmDspRC_t cmDspRsrcRealV( cmDspSysH_t h, cmReal_t* vp, va_list vl )
return rc; return rc;
if((rc = cmJsonPathToReal( cmDspSysPgmRsrcHandle(h), NULL, NULL, path, &dval )) != kOkJsRC ) if((rc = cmJsonPathToReal( cmDspSysPgmRsrcHandle(h), NULL, NULL, path, &dval )) != kOkJsRC )
return cmErrMsg(&p->err,kJsonFailDspRC,"'real' resource not found at path:'%s'.",cmStringNullGuard(path)); rc = cmErrMsg(&p->err,kJsonFailDspRC,"'real' resource not found at path:'%s'.",cmStringNullGuard(path));
else
*vp = dval; *vp = dval;
cmLhFree(cmDspSysLHeap(h),path);
return rc; return rc;
} }
@ -1944,7 +1999,9 @@ cmDspRC_t cmDspRsrcStringV( cmDspSysH_t h, const cmChar_t** vp, va_list vl )
return rc; return rc;
if((rc = cmJsonPathToString( cmDspSysPgmRsrcHandle(h), NULL, NULL, path, vp )) != kOkJsRC ) if((rc = cmJsonPathToString( cmDspSysPgmRsrcHandle(h), NULL, NULL, path, vp )) != kOkJsRC )
return cmErrMsg(&p->err,kJsonFailDspRC,"'string' resource not found at path:'%s'.",cmStringNullGuard(path)); rc = cmErrMsg(&p->err,kJsonFailDspRC,"'string' resource not found at path:'%s'.",cmStringNullGuard(path));
cmLhFree(cmDspSysLHeap(h),path);
return rc; return rc;
} }
@ -1961,9 +2018,12 @@ cmDspRC_t cmDspRsrcArrayCountV( cmDspSysH_t h, unsigned *n, va_list vl )
return rc; return rc;
if((rc = cmJsonPathToArray( cmDspSysPgmRsrcHandle(h), NULL, NULL, path, &np )) != kOkJsRC ) if((rc = cmJsonPathToArray( cmDspSysPgmRsrcHandle(h), NULL, NULL, path, &np )) != kOkJsRC )
return cmErrMsg(&p->err,kJsonFailDspRC,"'array' resource not found at path:'%s'.",cmStringNullGuard(path)); rc = cmErrMsg(&p->err,kJsonFailDspRC,"'array' resource not found at path:'%s'.",cmStringNullGuard(path));
else
*n = cmJsonChildCount(np); *n = cmJsonChildCount(np);
cmLhFree(cmDspSysLHeap(h),path);
return rc; return rc;
} }
@ -1979,13 +2039,16 @@ cmDspRC_t _cmDspRsrcArrayV( cmDspSysH_t h, unsigned* np, cmJsonNode_t** npp, cmC
return rc; return rc;
if((rc = cmJsonPathToArray( jsH, NULL, NULL, path, npp )) != kOkJsRC ) if((rc = cmJsonPathToArray( jsH, NULL, NULL, path, npp )) != kOkJsRC )
return cmErrMsg(&p->err,kJsonFailDspRC,"'array' resource not found at path:'%s'.",cmStringNullGuard(path)); rc = cmErrMsg(&p->err,kJsonFailDspRC,"'array' resource not found at path:'%s'.",cmStringNullGuard(path));
else
if((*np = cmJsonChildCount(*npp)) == 0 ) {
return rc; if((*np = cmJsonChildCount(*npp)) != 0 )
*pathPtrPtr = path; *pathPtrPtr = path;
}
cmLhFree(cmDspSysLHeap(h),path);
return rc; return rc;
} }
@ -2012,6 +2075,8 @@ cmDspRC_t cmDspRsrcBoolArrayV( cmDspSysH_t h, unsigned* np, bool** vpp, va_lis
*vpp = vp; *vpp = vp;
*np = n; *np = n;
cmLhFree(cmDspSysLHeap(h),path);
return rc; return rc;
} }
@ -2038,6 +2103,8 @@ cmDspRC_t cmDspRsrcIntArrayV( cmDspSysH_t h, unsigned* np, int** vpp, va_list
*vpp = vp; *vpp = vp;
*np = n; *np = n;
cmLhFree(cmDspSysLHeap(h),path);
return rc; return rc;
} }
@ -2064,6 +2131,8 @@ cmDspRC_t cmDspRsrcUIntArrayV( cmDspSysH_t h, unsigned* np, unsigned** vpp, va_
*vpp = vp; *vpp = vp;
*np = n; *np = n;
cmLhFree(cmDspSysLHeap(h),path);
return rc; return rc;
} }
@ -2090,8 +2159,9 @@ cmDspRC_t cmDspRsrcDblArrayV( cmDspSysH_t h, unsigned* np, double** vpp, va_lis
*vpp = vp; *vpp = vp;
*np = n; *np = n;
return rc; cmLhFree(cmDspSysLHeap(h),path);
return rc;
} }
cmDspRC_t cmDspRsrcRealArrayV( cmDspSysH_t h, unsigned* np, cmReal_t** vpp, va_list vl ) cmDspRC_t cmDspRsrcRealArrayV( cmDspSysH_t h, unsigned* np, cmReal_t** vpp, va_list vl )
@ -2122,6 +2192,8 @@ cmDspRC_t cmDspRsrcRealArrayV( cmDspSysH_t h, unsigned* np, cmReal_t** vpp, va_
*vpp = vp; *vpp = vp;
*np = n; *np = n;
cmLhFree(cmDspSysLHeap(h),path);
return rc; return rc;
} }
@ -2148,6 +2220,8 @@ cmDspRC_t cmDspRsrcStringArrayV(cmDspSysH_t h, unsigned* np, const cmChar_t*** v
*vpp = vp; *vpp = vp;
*np = n; *np = n;
cmLhFree(cmDspSysLHeap(h),path);
return rc; return rc;
} }
@ -2258,3 +2332,37 @@ cmDspRC_t cmDspRsrcStringArray( cmDspSysH_t h, unsigned* np, const cmChar_t*** v
va_end(vl); va_end(vl);
return rc; return rc;
} }
cmDspRC_t cmDspRsrcWriteStringV( cmDspSysH_t h, const cmChar_t* v, va_list vl )
{
cmDsp_t* p = _cmDspHandleToPtr(h);
cmChar_t* pathStr = NULL;
cmChar_t* varStr = NULL;
cmJsonH_t jsH = cmDspSysPgmRsrcHandle(h);
cmJsonNode_t* parentObjNodePtr = NULL;
cmDspRC_t rc;
if((rc = _cmDspRsrcWritePath(h,&pathStr,&varStr,vl)) != kOkDspRC )
goto errLabel;
if((parentObjNodePtr = cmJsonFindPathValue( jsH, pathStr, cmJsonRoot(jsH), kPairTId )) == NULL )
rc = cmErrMsg(&p->err,kJsonFailDspRC,"The parent object '%s' for variable '%s' could not be found.",cmStringNullGuard(pathStr),cmStringNullGuard(varStr));
if( cmJsonInsertOrReplacePairString( jsH, parentObjNodePtr, varStr, kStringTId, v ) != kOkJsRC )
rc = cmErrMsg(&p->err,kJsonFailDspRC,"Write 'string' resource value failed for path '%s' and variable '%s'",cmStringNullGuard(pathStr),cmStringNullGuard(varStr));
errLabel:
if( pathStr != NULL )
cmLhFree(cmDspSysLHeap(h),pathStr);
return rc;
}
cmDspRC_t cmDspRsrcWriteString( cmDspSysH_t h, const cmChar_t* v, ... )
{
va_list vl;
va_start(vl,v);
cmDspRC_t rc = cmDspRsrcWriteStringV(h,v,vl);
va_end(vl);
return rc;
}

View File

@ -57,7 +57,7 @@ extern "C" {
const cmChar_t* cmDspSysPresetGroupLabel( cmDspSysH_t h, unsigned groupIdx ); const cmChar_t* cmDspSysPresetGroupLabel( cmDspSysH_t h, unsigned groupIdx );
cmDspRC_t cmDspSysPresetGroupJsonList( cmDspSysH_t h, cmJsonH_t* jsHPtr ); cmDspRC_t cmDspSysPresetGroupJsonList( cmDspSysH_t h, cmJsonH_t* jsHPtr );
// A 'preset' is a collection of stored DSP instances and there variables. A preset belongs // A 'preset' is a collection of stored DSP instances and their variables. A preset belongs
// to a group. A given group may have multiple presets. Each preset represents a saved // to a group. A given group may have multiple presets. Each preset represents a saved
// instance/var state. // instance/var state.
unsigned cmDspSysPresetPresetCount( cmDspSysH_t h, unsigned groupIdx ); unsigned cmDspSysPresetPresetCount( cmDspSysH_t h, unsigned groupIdx );
@ -267,6 +267,8 @@ extern "C" {
cmDspRC_t cmDspRsrcStringArray( cmDspSysH_t h, unsigned* np, const cmChar_t*** vpp, ... ); cmDspRC_t cmDspRsrcStringArray( cmDspSysH_t h, unsigned* np, const cmChar_t*** vpp, ... );
cmDspRC_t cmDspRsrcWriteStringV( cmDspSysH_t h, const cmChar_t* v, va_list vl );
cmDspRC_t cmDspRsrcWriteString( cmDspSysH_t h, const cmChar_t* v, ... );
#ifdef __cplusplus #ifdef __cplusplus