cmData.h/c : Many minor changes and bug fixes.

This commit is contained in:
kevin 2013-12-01 22:41:16 -05:00
parent af002db879
commit 033681c8b4
2 changed files with 665 additions and 247 deletions

800
cmData.c

File diff suppressed because it is too large Load Diff

112
cmData.h
View File

@ -7,7 +7,7 @@ extern "C" {
/* /*
TODO: TODO:
0) Figure out a error handling scheme that does not rely on 0) Figure out an error handling scheme that does not rely on
a global errno. This is not useful in multi-thread environments. a global errno. This is not useful in multi-thread environments.
It might be ok to go with an 'all errors are fatal' model It might be ok to go with an 'all errors are fatal' model
(except in the var-args functions). (except in the var-args functions).
@ -55,6 +55,10 @@ extern "C" {
kCvtErrDtRC, kCvtErrDtRC,
kInvalidContDtRC, kInvalidContDtRC,
kInvalidTypeDtRC, kInvalidTypeDtRC,
kMissingFieldDtRC,
kLexFailDtRC,
kParseStackFailDtRC,
kSyntaxErrDtRC,
kEolDtRC kEolDtRC
}; };
@ -76,7 +80,9 @@ extern "C" {
kDoubleDtId, // 11 kDoubleDtId, // 11
kStrDtId, // 12 zero terminated string kStrDtId, // 12 zero terminated string
kBlobDtId, // 13 application defined raw memory object kBlobDtId, // 13 application defined raw memory object
kStructDtId // 14 node is a pair,list, or recd kStructDtId, // 14 node is a pair,list, or recd
kOptArgDtFl = 0x10000000
} cmDataTypeId_t; } cmDataTypeId_t;
@ -119,6 +125,19 @@ extern "C" {
}; };
// The kInvalidDtXXX constants are used to indicate an error when returned
// from the cmDtXXX() functions below.
#define kInvalidDtFloat FLT_MAX
#define kInvalidDtDouble DBL_MAX
enum
{
kInvalidDtChar = 0xff,
kInvalidDtShort = 0xffff,
kInvalidDtInt = 0xffffffff,
kInvalidDtLong = kInvalidDtInt,
};
typedef struct cmData_str typedef struct cmData_str
{ {
@ -146,19 +165,6 @@ extern "C" {
void* vp; void* vp;
/*
char* cp;
unsigned char* ucp;
short* sp;
unsigned short* usp;
int* ip;
unsigned int* uip;
long* lp;
unsigned long* ulp;
float* fp;
double* dp;
*/
struct cmData_str* child; // first child (list,record,pair) struct cmData_str* child; // first child (list,record,pair)
} u; } u;
@ -266,8 +272,30 @@ extern "C" {
cmDtRC_t cmDataDouble( const cmData_t* p, double* v ); cmDtRC_t cmDataDouble( const cmData_t* p, double* v );
cmDtRC_t cmDataStr( const cmData_t* p, cmChar_t** v ); cmDtRC_t cmDataStr( const cmData_t* p, cmChar_t** v );
cmDtRC_t cmDataConstStr( const cmData_t* p, const cmChar_t** v ); cmDtRC_t cmDataConstStr( const cmData_t* p, const cmChar_t** v );
cmDtRC_t cmDataBlob( const cmData_t* p, cmChar_t** v, unsigned* byteCntRef ); cmDtRC_t cmDataBlob( const cmData_t* p, void** v, unsigned* byteCntRef );
cmDtRC_t cmDataConstBlob( const cmData_t* p, const cmChar_t** v, unsigned* byteCntRef ); cmDtRC_t cmDataConstBlob( const cmData_t* p, const void** v, unsigned* byteCntRef );
// Functions in this group which return pointers will return NULL
// on error. The other function indicate an error by returning
// kInvalidDtXXX depending on their type.
// Note that there is no guarantee, except as determined by the
// application, that one of the kInvalidDtXXX is not in fact a legal return value.
// These function are simple wrappers around calls to cmDataXXX() and
// therefore do NOT do any type conversion.
char cmDtChar( const cmData_t* p );
unsigned char cmDtUChar( const cmData_t* p );
short cmDtShort( const cmData_t* p );
unsigned short cmDtUShort( const cmData_t* p );
int cmDtInt( const cmData_t* p );
unsigned cmDtUInt( const cmData_t* p );
long cmDtLong( const cmData_t* p );
unsigned long cmDtULong( const cmData_t* p );
float cmDtFloat( const cmData_t* p );
double cmDtDouble( const cmData_t* p );
char* cmDtStr( const cmData_t* p );
const char* cmDtConstStr( const cmData_t* p );
void* cmDtBlob( const cmData_t* p, unsigned* byteCntRef );
const void* cmDtConstBlob( const cmData_t* p, unsigned* byteCntRef );
// Get the value of an object with conversion. // Get the value of an object with conversion.
cmDtRC_t cmDataGetChar( const cmData_t* p, char* v ); cmDtRC_t cmDataGetChar( const cmData_t* p, char* v );
@ -281,6 +309,23 @@ extern "C" {
cmDtRC_t cmDataGetFloat( const cmData_t* p, float* v ); cmDtRC_t cmDataGetFloat( const cmData_t* p, float* v );
cmDtRC_t cmDataGetDouble( const cmData_t* p, double* v ); cmDtRC_t cmDataGetDouble( const cmData_t* p, double* v );
// Functions in this group which return pointers will return NULL
// on error. The other function indicate an error by returning
// kInvalidDtXXX depending on their type.
// Note that there is no guarantee, except as determined by the
// application that one of the kInvalidDtXXX is not in fact a legal return value.
// These function are simple wrappers around calls to cmDataGetXXX() and
// therefore do type conversion.
char cmDtGetChar( const cmData_t* p );
unsigned char cmDtGetUChar( const cmData_t* p );
short cmDtGetShort( const cmData_t* p );
unsigned short cmDtGetUShort( const cmData_t* p );
int cmDtGetInt( const cmData_t* p );
unsigned cmDtGetUInt( const cmData_t* p );
long cmDtGetLong( const cmData_t* p );
unsigned long cmDtGetULong( const cmData_t* p );
float cmDtGetFloat( const cmData_t* p );
double cmDtGetDouble( const cmData_t* p );
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// Array related functions // Array related functions
@ -368,8 +413,19 @@ extern "C" {
cmDtRC_t cmDataULongArray( const cmData_t* d, unsigned long** v ); cmDtRC_t cmDataULongArray( const cmData_t* d, unsigned long** v );
cmDtRC_t cmDataFloatArray( const cmData_t* d, float** v ); cmDtRC_t cmDataFloatArray( const cmData_t* d, float** v );
cmDtRC_t cmDataDoubleArray( const cmData_t* d, double** v ); cmDtRC_t cmDataDoubleArray( const cmData_t* d, double** v );
cmDtRC_t cmDataStrArray( const cmData_t* d, cmChar_t*** v );
cmDtRC_t cmDataConstStrArray( const cmData_t* d, const cmChar_t*** v ); // This group of functions is a wrapper around calls to the same named
// cmDataXXXArray() functions above. On error they return NULL.
char* cmDtCharArray( const cmData_t* d );
unsigned char* cmDtUCharArray( const cmData_t* d );
short* cmDtShortArray( const cmData_t* d );
unsigned short* cmDtUShortArray( const cmData_t* d );
int* cmDtIntArray( const cmData_t* d );
unsigned* cmDtUIntArray( const cmData_t* d );
long* cmDtLongArray( const cmData_t* d );
unsigned long* cmDtULongArray( const cmData_t* d );
float* cmDtFloatArray( const cmData_t* d );
double* cmDtDoubleArray( const cmData_t* d );
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// Structure related functions // Structure related functions
@ -454,17 +510,17 @@ extern "C" {
// Create a pair value by assigning a key and value to 'p'. // Create a pair value by assigning a key and value to 'p'.
// 'p' is unlinked and freed prior to the key value assignment. // 'p' is unlinked and freed prior to the key value assignment.
// 'key' and 'value' are simply linked in they are not duplicated or reallocated. // 'key' and 'value' are simply linked in they are not duplicated or reallocated.
cmData_t* cmDataMakePair( cmData_t* parent, cmData_t* p, cmData_t* key, cmData_t* value ); cmData_t* cmDataPairMake( cmData_t* parent, cmData_t* p, cmData_t* key, cmData_t* value );
// Dynamically allocate a pair node. Both the key and value nodes are reallocated. // Dynamically allocate a pair node. Both the key and value nodes are reallocated.
cmData_t* cmDataAllocPair( cmData_t* parent, const cmData_t* key, const cmData_t* value ); cmData_t* cmDataPairAlloc( cmData_t* parent, const cmData_t* key, const cmData_t* value );
// Dynamically allocate the id but link (w/o realloc) the value. // Dynamically allocate the id but link (w/o realloc) the value.
cmData_t* cmDataAllocPairId( cmData_t* parent, unsigned keyId, cmData_t* value ); cmData_t* cmDataPairAllocId( cmData_t* parent, unsigned keyId, cmData_t* value );
// Dynamically allocate the label but link (w/o realloc) the value. // Dynamically allocate the label but link (w/o realloc) the value.
cmData_t* cmDataAllocPairLabelN(cmData_t* parent, const cmChar_t* label, unsigned charCnt, cmData_t* value); cmData_t* cmDataPairAllocLabelN(cmData_t* parent, const cmChar_t* label, unsigned charCnt, cmData_t* value);
cmData_t* cmDataAllocPairLabel( cmData_t* parent, const cmChar_t* label, cmData_t* value ); cmData_t* cmDataPairAllocLabel( cmData_t* parent, const cmChar_t* label, cmData_t* value );
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// List related functions // List related functions
@ -476,6 +532,7 @@ extern "C" {
// Return the ith element in the list. // Return the ith element in the list.
cmData_t* cmDataListEle( cmData_t* p, unsigned index ); cmData_t* cmDataListEle( cmData_t* p, unsigned index );
//
cmData_t* cmDataListMake( cmData_t* parent, cmData_t* p ); cmData_t* cmDataListMake( cmData_t* parent, cmData_t* p );
cmData_t* cmDataListAlloc( cmData_t* parent); cmData_t* cmDataListAlloc( cmData_t* parent);
@ -544,9 +601,14 @@ extern "C" {
cmData_t* cmDataRecdAllocIdA( cmData_t* parent, ... ); cmData_t* cmDataRecdAllocIdA( cmData_t* parent, ... );
// Extract the data in a record to C variables. // Extract the data in a record to C variables.
// Var-args format:
// (label | id) <cid> <typeId> <ptr> {cnt_ptr}
// The var-args list must be NULL terminated. // The var-args list must be NULL terminated.
// The <'id' | 'label'> identify a pair. // The <'id' | 'label'> identify a pair.
// The <cid> indicates the type of the target container.
// The <typeId> indicates the C type of 'pointer'. // The <typeId> indicates the C type of 'pointer'.
// If <cid> is kArrayDtId then the <cnt_ptr} must be include to receive the
// count of elements in the array.
// The actual field type must be convertable into this pointer type or the // The actual field type must be convertable into this pointer type or the
// function will fail. // function will fail.
// 'err' is an application supplied error object to be used if a required // 'err' is an application supplied error object to be used if a required
@ -565,7 +627,7 @@ extern "C" {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
typedef cmHandle_t cmDataParserH_t; typedef cmHandle_t cmDataParserH_t;
//static cmDataParserH_t cmDataParserNullHandle; extern cmDataParserH_t cmDataParserNullHandle;
cmDtRC_t cmDataParserCreate( cmCtx_t* ctx, cmDataParserH_t* hp ); cmDtRC_t cmDataParserCreate( cmCtx_t* ctx, cmDataParserH_t* hp );
cmDtRC_t cmDataParserDestroy( cmDataParserH_t* hp ); cmDtRC_t cmDataParserDestroy( cmDataParserH_t* hp );