cmJson.h/c:Added cmJsonIsModified().

This commit is contained in:
kevin 2013-05-22 15:12:04 -07:00
parent a9a615f94e
commit 6e8dc7208a
2 changed files with 41 additions and 73 deletions

106
cmJson.c
View File

@ -73,6 +73,7 @@ typedef struct
char* serialBufPtr; // serial buffer pointer
unsigned serialByteCnt; // count of bytes in serialBuf[]
bool reportErrPosnFl;// report the file posn of syntax errors
bool modifiedFl; // the tree has been modified since it was created.
} cmJs_t;
cmJsToken_t _cmJsTokenArray[] =
@ -321,6 +322,12 @@ cmJsRC_t cmJsonFinalize( cmJsonH_t* hp )
bool cmJsonIsValid( cmJsonH_t h )
{ return h.h != NULL; }
bool cmJsonIsModified( cmJsonH_t h )
{
cmJs_t* p = _cmJsonHandleToPtr(h);
return p->modifiedFl;
}
cmJsRC_t _cmJsonLinkInChild( cmJs_t* p, cmJsonNode_t* parentPtr, cmJsonNode_t* np )
{
cmJsRC_t rc = kOkJsRC;
@ -431,6 +438,9 @@ cmJsRC_t _cmJsonCreateNode( cmJs_t* p, cmJsonNode_t* parentPtr, unsigned newNode
p->rootPtr = np;
}
p->modifiedFl = true;
return rc;
}
@ -814,6 +824,7 @@ cmJsRC_t _cmJsonParse(cmJsonH_t h, const char* buf, unsigned bufCharCnt, const c
rc = _cmJsonSyntaxError( p, "The lexer failed: %s.", cmLexRcToMsg(cmLexErrorRC(p->lexH)));
p->reportErrPosnFl = false;
p->modifiedFl = false;
return rc;
}
@ -824,75 +835,6 @@ cmJsRC_t cmJsonParse( cmJsonH_t h, const char* buf, unsigned bufCharCn
cmJsRC_t cmJsonParseFile( cmJsonH_t h, const char* fn, cmJsonNode_t* altRootPtr )
{ return _cmJsonParse(h,NULL,0,fn,altRootPtr); }
/*
cmJsRC_t cmJsonParseFile( cmJsonH_t h, const char* fn )
{
cmJsRC_t rc = kOkJsRC;
FILE* fp = NULL;
cmJs_t* p = _cmJsonHandleToPtr(h);
unsigned n = 0;
char* textBuf = NULL;
assert( fn != NULL && p != NULL );
// open the file
if((fp = fopen(fn,"rb")) == NULL )
return _cmJsonError(p,kFileOpenErrJsRC,"Unable to open the file:'%s'.",fn);
// seek to the end
if( fseek(fp,0,SEEK_END) != 0 )
{
rc= _cmJsonError(p,kFileSeekErrJsRC,"Unable to seek to the end of '%s'.",fn);
goto errLabel;
}
// get the length of the file
if( (n=ftell(fp)) == 0 )
{
rc = _cmJsonError(p,kFileOpenErrJsRC,"The file '%s' appears to be empty.",fn);
goto errLabel;
}
// rewind the file
if( fseek(fp,0,SEEK_SET) != 0 )
{
rc = _cmJsonError(p,kFileSeekErrJsRC,"Unable to seek to the beginning of '%s'.",fn);
goto errLabel;
}
// allocate the text buffer
if((textBuf = cmMemAllocZ( char, n+1)) == NULL )
{
rc = _cmJsonError(p,kMemAllocErrJsRC,"Unable to allocate the text file buffer for:'%s'.",fn);
goto errLabel;
}
// read the file into the text buffer
if( fread(textBuf,n,1,fp) != 1 )
{
rc = _cmJsonError(p,kFileReadErrJsRC,"File read failed on:'%s'.",fn);
goto errLabel;
}
rc = cmJsonParse(h,textBuf,n,NULL);
errLabel:
// close the file
if( fclose(fp) != 0 )
{
rc = _cmJsonError(p,kFileCloseErrJsRC,"File close failed on:'%s'.",fn);
goto errLabel;
}
// free the buffer
if( textBuf != NULL )
cmMemFree(textBuf);
return rc;
}
*/
cmJsonNode_t* cmJsonRoot( cmJsonH_t h )
{
cmJs_t* p = _cmJsonHandleToPtr(h);
@ -1938,31 +1880,43 @@ cmJsRC_t cmJsonCreateBoolArray( cmJsonH_t h, cmJsonNode_t* parentPtr, uns
cmJsRC_t cmJsonSetInt( cmJsonH_t h, cmJsonNode_t* np, int ival )
{
cmJs_t* p = _cmJsonHandleToPtr(h);
if( np->typeId != kIntTId )
return _cmJsonError(_cmJsonHandleToPtr(h),kInvalidNodeTypeJsRC,"Cannot assign type 'int' to node type '%s'.",_cmJsonNodeTypeIdToLabel(np->typeId));
return _cmJsonError(p,kInvalidNodeTypeJsRC,"Cannot assign type 'int' to node type '%s'.",_cmJsonNodeTypeIdToLabel(np->typeId));
np->u.intVal = ival;
p->modifiedFl = true;
return kOkJsRC;
}
cmJsRC_t cmJsonSetReal( cmJsonH_t h, cmJsonNode_t * np, double rval )
{
cmJs_t* p = _cmJsonHandleToPtr(h);
if( np->typeId != kRealTId )
return _cmJsonError(_cmJsonHandleToPtr(h),kInvalidNodeTypeJsRC,"Cannot assign type 'real' to node type '%s'.",_cmJsonNodeTypeIdToLabel(np->typeId));
return _cmJsonError(p,kInvalidNodeTypeJsRC,"Cannot assign type 'real' to node type '%s'.",_cmJsonNodeTypeIdToLabel(np->typeId));
np->u.realVal = rval;
p->modifiedFl = true;
return kOkJsRC;
}
cmJsRC_t cmJsonSetBool( cmJsonH_t h, cmJsonNode_t * np, bool bval )
{
cmJs_t* p = _cmJsonHandleToPtr(h);
if( np->typeId == kTrueTId || np->typeId==kFalseTId )
return _cmJsonError(_cmJsonHandleToPtr(h),kInvalidNodeTypeJsRC,"Cannot assign type 'bool' to node type '%s'.",_cmJsonNodeTypeIdToLabel(np->typeId));
return _cmJsonError(p,kInvalidNodeTypeJsRC,"Cannot assign type 'bool' to node type '%s'.",_cmJsonNodeTypeIdToLabel(np->typeId));
np->u.boolVal = bval;
p->modifiedFl = true;
return kOkJsRC;
}
@ -1980,6 +1934,8 @@ cmJsRC_t cmJsonSetString( cmJsonH_t h, cmJsonNode_t* np, const char* sval )
else
return _cmJsonSetString(p,np,sval,sn);
p->modifiedFl = true;
return kOkJsRC;
}
@ -2331,9 +2287,13 @@ cmJsRC_t _cmJsonInsertOrReplacePair( cmJsonH_t h, cmJsonNode_t* objectNodePtr,
errLabel:
if( rc == kOkJsRC )
{
if( retNodePtrPtr != NULL )
*retNodePtrPtr = pairNodePtr;
p->modifiedFl = true;
}
return rc;
}
@ -2632,6 +2592,8 @@ cmJsRC_t _cmJsonRemoveNode( cmJs_t* p, cmJsonNode_t* np, bool freeFl, bool balan
*/
}
p->modifiedFl = true;
return kOkJsRC;
}

View File

@ -118,6 +118,12 @@ extern "C" {
// Returns true if 'h' is a valid cmJsonH_t handle.
bool cmJsonIsValid( cmJsonH_t h );
// Returns true if the tree has been modified since it was initialized.
// If changes to the tree are done directly on the nodes, rather than using
// the API functions, then this function may not indicate the actual
// modification state of the tree.
bool cmJsonIsModified( cmJsonH_t h );
// Build the internal tree by parsing a text buffer.
// altRootPtr is an optional alternate root ptr which can be used
// append to an existing tree. Set to altRootPtr to