libcm is a C development framework with an emphasis on audio signal processing applications.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

cmData.h 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. #ifndef cmData_h
  2. #define cmData_h
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6. enum
  7. {
  8. kOkDtRC = cmOkRC,
  9. kCvtErrDtRC
  10. };
  11. enum
  12. {
  13. kInvalidDtChar = 0xff,
  14. kInvalidDtUChar = 0xff,
  15. kInvalidDtShort = 0xffff,
  16. kInvalidDtUShort = 0xffff,
  17. kInvalidDtInt = 0xffffffff,
  18. kInvalidDtUInt = 0xffffffff,
  19. kInvalidDtLong = 0xffffffff,
  20. kInvalidDtULong = 0xffffffff,
  21. };
  22. typedef enum
  23. {
  24. kInvalidDtId,
  25. kNullDtId,
  26. kUCharDtId,
  27. kCharDtId,
  28. kUShortDtId,
  29. kShortDtId,
  30. kUIntDtId,
  31. kIntDtId,
  32. kULongDtId,
  33. kLongDtId,
  34. kFloatDtId,
  35. kDoubleDtId,
  36. kStrDtId,
  37. kConstStrDtId,
  38. kMinPtrDtId,
  39. kUCharPtrDtId = kMinPtrDtId, // cnt=array element count
  40. kCharPtrDtId,
  41. kUShortPtrDtId,
  42. kShortPtrDtId,
  43. kUIntPtrDtId,
  44. kIntPtrDtId,
  45. kULongPtrDtId,
  46. kLongPtrDtId,
  47. kFloatPtrDtId,
  48. kDoublePtrDtId,
  49. kVoidPtrDtId,
  50. kMaxPtrDtId = kVoidPtrDtId,
  51. kMinStructDtId,
  52. kListDtId = kMinStructDtId, // children nodes are array elements, cnt=child count
  53. kPairDtId, // key/value pairs, cnt=2, first child is key, second is value
  54. kRecordDtId, // children nodes are pairs, cnt=pair count
  55. kMaxStructDtId
  56. } cmDataFmtId_t;
  57. enum
  58. {
  59. kDynObjDtFl = 0x01, // object was dynamically allocated
  60. kDynPtrDtFl = 0x02 // ptr array was dynamically allocated
  61. };
  62. typedef struct cmData_str
  63. {
  64. cmDataFmtId_t tid; // data format id
  65. unsigned flags; //
  66. struct cmData_str* parent; // this childs parent
  67. struct cmData_str* sibling; // this childs sibling
  68. unsigned allocCnt; // allocated count
  69. unsigned cnt; // actual count
  70. union
  71. {
  72. char c;
  73. unsigned char uc;
  74. short s;
  75. unsigned short us;
  76. int i;
  77. unsigned int ui;
  78. long l;
  79. unsigned long ul;
  80. float f;
  81. double d;
  82. cmChar_t* z;
  83. const cmChar_t* cz;
  84. void* vp;
  85. char* cp;
  86. unsigned char* ucp;
  87. short* sp;
  88. unsigned short* usp;
  89. int* ip;
  90. unsigned int* uip;
  91. long* lp;
  92. unsigned long* ulp;
  93. float* fp;
  94. double* dp;
  95. struct cmData_str* child; // first child (array,record,pair)
  96. } u;
  97. } cmData_t;
  98. typedef unsigned cmDtRC_t;
  99. // Get the value of an object without conversion.
  100. // The data type id must match the return type or the
  101. // conversion must be an automatic C conversion.
  102. char cmDataChar( const cmData_t* p );
  103. unsigned char cmDataUChar( const cmData_t* p );
  104. short cmDataShort( const cmData_t* p );
  105. unsigned short cmDataUShort( const cmData_t* p );
  106. int cmDataInt( const cmData_t* p );
  107. unsigned int cmDataUInt( const cmData_t* p );
  108. long cmDataLong( const cmData_t* p );
  109. unsigned long cmDataULong( const cmData_t* p );
  110. float cmDataFloat( const cmData_t* p );
  111. double cmDataDouble( const cmData_t* p );
  112. cmChar_t* cmDataStr( const cmData_t* p );
  113. const cmChar_t* cmDataConstStr( const cmData_t* p );
  114. void* cmDataVoidPtr( const cmData_t* p );
  115. char* cmDataCharPtr( const cmData_t* p );
  116. unsigned char* cmDataUCharPtr( const cmData_t* p );
  117. short* cmDataShortPtr( const cmData_t* p );
  118. unsigned short* cmDataUShortPtr( const cmData_t* p );
  119. int* cmDataIntPtr( const cmData_t* p );
  120. unsigned int* cmDataUIntPtr( const cmData_t* p );
  121. long* cmDataLongPtr( const cmData_t* p );
  122. unsigned long* cmDataULongPtr( const cmData_t* p );
  123. float* cmDataFloatPtr( const cmData_t* p );
  124. double* cmDataDoublePtr( const cmData_t* p );
  125. // Get the value of an object with conversion.
  126. char cmDataGetChar( const cmData_t* p );
  127. unsigned char cmDataGetUChar( const cmData_t* p );
  128. short cmDataGetShort( const cmData_t* p );
  129. unsigned short cmDataGetUShort( const cmData_t* p );
  130. int cmDataGetInt( const cmData_t* p );
  131. unsigned int cmDataGetUInt( const cmData_t* p );
  132. long cmDataGetLong( const cmData_t* p );
  133. unsigned long cmDataGetULong( const cmData_t* p );
  134. float cmDataGetFloat( const cmData_t* p );
  135. double cmDataGetDouble( const cmData_t* p );
  136. cmChar_t* cmDataGetStr( const cmData_t* p );
  137. const cmChar_t* cmDataGetConstStr( const cmData_t* p );
  138. void* cmDataGetVoidPtr( const cmData_t* p );
  139. char* cmDataGetCharPtr( const cmData_t* p );
  140. unsigned char* cmDataGetUCharPtr( const cmData_t* p );
  141. short* cmDataGetShortPtr( const cmData_t* p );
  142. unsigned short* cmDataGetUShortPtr( const cmData_t* p );
  143. int* cmDataGetIntPtr( const cmData_t* p );
  144. unsigned int* cmDataGetUIntPtr( const cmData_t* p );
  145. long* cmDataGetLongPtr( const cmData_t* p );
  146. unsigned long* cmDataGetULongPtr( const cmData_t* p );
  147. float* cmDataGetFloatPtr( const cmData_t* p );
  148. double* cmDataGetDoublePtr( const cmData_t* p );
  149. // Set the value of an existing data object.
  150. cmData_t* cmDataSetChar( cmData_t* p, char v );
  151. cmData_t* cmDataSetUChar( cmData_t* p, unsigned char v );
  152. cmData_t* cmDataSetShort( cmData_t* p, short v );
  153. cmData_t* cmDataSetUShort( cmData_t* p, unsigned short v );
  154. cmData_t* cmDataSetInt( cmData_t* p, int v );
  155. cmData_t* cmDataSetUInt( cmData_t* p, unsigned int v );
  156. cmData_t* cmDataSetLong( cmData_t* p, long v );
  157. cmData_t* cmDataSetULong( cmData_t* p, unsigned long v );
  158. cmData_t* cmDataSetFloat( cmData_t* p, float v );
  159. cmData_t* cmDataSetDouble( cmData_t* p, double v );
  160. cmData_t* cmDataSetStr( cmData_t* p, cmChar_t* s );
  161. cmData_t* cmDataSetConstStr( cmData_t* p, const cmChar_t* s );
  162. // Set the value of an existing data object to an external array.
  163. // The array is not copied.
  164. cmData_t* cmDataSetVoidPtr( cmData_t* p, void* vp, unsigned cnt );
  165. cmData_t* cmDataSetCharPtr( cmData_t* p, char* vp, unsigned cnt );
  166. cmData_t* cmDataSetUCharPtr( cmData_t* p, unsigned char* vp, unsigned cnt );
  167. cmData_t* cmDataSetShortPtr( cmData_t* p, short* vp, unsigned cnt );
  168. cmData_t* cmDataSetUShortPtr( cmData_t* p, unsigned short* vp, unsigned cnt );
  169. cmData_t* cmDataSetIntPtr( cmData_t* p, int* vp, unsigned cnt );
  170. cmData_t* cmDataSetUIntPtr( cmData_t* p, unsigned int* vp, unsigned cnt );
  171. cmData_t* cmDataSetLongPtr( cmData_t* p, long* vp, unsigned cnt );
  172. cmData_t* cmDataSetULongPtr( cmData_t* p, unsigned long* vp, unsigned cnt );
  173. cmData_t* cmDataSetFloatPtr( cmData_t* p, float* vp, unsigned cnt );
  174. cmData_t* cmDataSetDoublePtr( cmData_t* p, double* vp, unsigned cnt );
  175. // Set the value of an existing array based data object.
  176. // Allocate the internal array and copy the array into it.
  177. cmData_t* cmDataSetStrAlloc( cmData_t* p, const cmChar_t* s );
  178. cmData_t* cmDataSetConstStrAlloc( cmData_t* p, const cmChar_t* s );
  179. cmData_t* cmDataSetVoidAllocPtr( cmData_t* p, const void* vp, unsigned cnt );
  180. cmData_t* cmDataSetCharAllocPtr( cmData_t* p, const char* vp, unsigned cnt );
  181. cmData_t* cmDataSetUCharAllocPtr( cmData_t* p, const unsigned char* vp, unsigned cnt );
  182. cmData_t* cmDataSetShortAllocPtr( cmData_t* p, const short* vp, unsigned cnt );
  183. cmData_t* cmDataSetUShortAllocPtr( cmData_t* p, const unsigned short* vp, unsigned cnt );
  184. cmData_t* cmDataSetIntAllocPtr( cmData_t* p, const int* vp, unsigned cnt );
  185. cmData_t* cmDataSetUIntAllocPtr( cmData_t* p, const unsigned int* vp, unsigned cnt );
  186. cmData_t* cmDataSetLongAllocPtr( cmData_t* p, const long* vp, unsigned cnt );
  187. cmData_t* cmDataSetULongAllocPtr( cmData_t* p, const unsigned long* vp, unsigned cnt );
  188. cmData_t* cmDataSetFloatAllocPtr( cmData_t* p, const float* vp, unsigned cnt );
  189. cmData_t* cmDataSetDoubleAllocPtr( cmData_t* p, const double* vp, unsigned cnt );
  190. // Dynamically allocate a data object and set it's value.
  191. cmData_t* cmDataAllocChar( char v );
  192. cmData_t* cmDataAllocUChar( unsigned char v );
  193. cmData_t* cmDataAllocShort( short v );
  194. cmData_t* cmDataAllocUShort( unsigned short v );
  195. cmData_t* cmDataAllocInt( int v );
  196. cmData_t* cmDataAllocUInt( unsigned int v );
  197. cmData_t* cmDataAllocLong( long v );
  198. cmData_t* cmDataAllocULong( unsigned long v );
  199. cmData_t* cmDataAllocFloat( float v );
  200. cmData_t* cmDataAllocDouble( double v );
  201. cmData_t* cmDataAllocStr( cmChar_t* str );
  202. cmData_t* cmDataAllocConstStr( const cmChar_t* str );
  203. // Dynamically allocate a data object and set its array value to an external
  204. // array. The data is not copied.
  205. cmData_t* cmDataAllocVoidPtr( const void* v, unsigned cnt );
  206. cmData_t* cmDataAllocCharPtr( const char* v, unsigned cnt );
  207. cmData_t* cmDataAllocUCharPtr( const unsigned char* v, unsigned cnt );
  208. cmData_t* cmDataAllocShortPtr( const short* v, unsigned cnt );
  209. cmData_t* cmDataAllocUShortPtr( const unsigned short* v, unsigned cnt );
  210. cmData_t* cmDataAllocIntPtr( const int* v, unsigned cnt );
  211. cmData_t* cmDataAllocUIntPtr( const unsigned int* v, unsigned cnt );
  212. cmData_t* cmDataAllocLongPtr( const long* v, unsigned cnt );
  213. cmData_t* cmDataAllocULongPtr( const unsigned long* v, unsigned cnt );
  214. cmData_t* cmDataAllocFloatPtr( const float* v, unsigned cnt );
  215. cmData_t* cmDataAllocDoublePtr( const double* v, unsigned cnt );
  216. // Dynamically allocate a data object and its array value.
  217. // v[cnt] is copied into the allocated array.
  218. cmData_t* cmDataVoidAllocPtr( const void* v, unsigned cnt );
  219. cmData_t* cmDataCharAllocPtr( const char* v, unsigned cnt );
  220. cmData_t* cmDataUCharAllocPtr( const unsigned char* v, unsigned cnt );
  221. cmData_t* cmDataShortAllocPtr( const short* v, unsigned cnt );
  222. cmData_t* cmDataUShortAllocPtr( const unsigned short* v, unsigned cnt );
  223. cmData_t* cmDataIntAllocPtr( const int* v, unsigned cnt );
  224. cmData_t* cmDataUIntAllocPtr( const unsigned int* v, unsigned cnt );
  225. cmData_t* cmDataLongAllocPtr( const long* v, unsigned cnt );
  226. cmData_t* cmDataULongAllocPtr( const unsigned long* v, unsigned cnt );
  227. cmData_t* cmDataFloatAllocPtr( const float* v, unsigned cnt );
  228. cmData_t* cmDataDoubleAllocPtr( const double* v, unsigned cnt );
  229. //----------------------------------------------------------------------------
  230. // Structure related functions
  231. //
  232. // Unlink 'p' from its parents and siblings.
  233. cmData_t* cmDataUnlink( cmData_t* p );
  234. unsigned cmDataChildCount( cmData_t* p );
  235. cmData_t* cmDataChild( cmData_t* p, unsigned index );
  236. cmData_t* cmDataPrependChild(cmData_t* parent, cmData_t* parent );
  237. cmData_t* cmDataAppendChild( cmData_t* parent, cmData_t* child );
  238. cmData_t* cmDataInsertChild( cmData_t* parent, cmData_t* child, unsigned index );
  239. //----------------------------------------------------------------------------
  240. // Pair related functions
  241. //
  242. // Get the key/value of a pair
  243. cmData_t* cmDataPairKey( cmData_t* p );
  244. cmData_t* cmDataPairValue( cmData_t* p );
  245. // Set the key or value of an existing pair node.
  246. cmData_t* cmDataPairSetValue( cmData_t* p, cmData_t* value );
  247. cmData_t* cmDataPairAllocValue( cmData_t* p, const cmData_t* value );
  248. cmData_t* cmDataPairSetKey( cmData_t* p, cmData_t* key );
  249. cmData_t* cmDataPairSetKeyId( cmData_t* p, unsigned id );
  250. cmData_t* cmDataPairSetKeyLabel( cmData_t* p, const cmChar_t* label );
  251. cmData_t* cmDataPairAllocKey( cmData_t* p, const cmData_t* key );
  252. // Dynamically allocate a pair node
  253. cmData_t* cmDataAllocPair( cmData_t* parent, const cmData_t* key, const cmData_t* value );
  254. cmData_t* cmDataAllocPairId( cmData_t* parent, unsigned keyId, cmData_t* value );
  255. cmData_t* cmDataAllocPairLabel( cmData_t* parent, const cmChar_t label, cmData_t* value );
  256. //----------------------------------------------------------------------------
  257. // List related functions
  258. //
  259. // Return the count of ele's in the list.
  260. cmData_t* cmDataListCount( const cmData_t* p );
  261. // Return the ith element in the list.
  262. cmData_t* cmDataListEle( const cmData_t* p, unsigned index );
  263. cmData_t* cmDataListMake( cmData_t* parent, cmData_t* p );
  264. cmData_t* cmDataListAlloc( cmData_t* parent);
  265. // Var-args fmt:
  266. // <typeId> <value> {<cnt>}
  267. // scalar types: <value> is literal,<cnt> is not included
  268. // ptr types: <value> is pointer,<cnt> is element count
  269. // struct types: <value> is cmData_t, <cnt> is not included
  270. cmData_t* cmDataListAllocV(cmData_t* parent, va_list vl );
  271. cmData_t* cmDataListAllocA(cmData_t* parent, ... );
  272. cmData_t* cmDataListAppendEle( cmData_t* p, cmData_t* ele );
  273. cmData_t* cmDataListAppendEleN(cmData_t* p, cmData_t* ele[], unsigned n );
  274. cmDtRC_t cmDataListAppendV( cmData_t* p, va_list vl );
  275. cmDtRC_t cmDataListAppend( cmData_t* p, ... );
  276. cmData_t* cmDataListInsertEle( cmData_t* p, unsigned index, cmData_t* ele );
  277. cmData_t* cmDataListInsertEleN(cmData_t* p, cmData_t* ele[], unsigned n );
  278. cmDtRC_t cmDataListInsertV( cmData_t* p, va_list vl );
  279. cmDtRC_t cmDataListInsert( cmData_t* p, unsigned index, ... );
  280. cmData_t* cmDataListUnlink( cmData_t* p, unsigned index );
  281. cmData_t* cmDataListFree( cmData_t* p, unsigned index );
  282. //----------------------------------------------------------------------------
  283. // Record related functions
  284. //
  285. // Return count of pairs.
  286. cmData_t* cmDataRecdCount( const cmData_t* p );
  287. // Return the ith pair.
  288. cmData_t* cmDataRecdEle( const cmData_t* p, unsigned index );
  289. // Return the ith value.
  290. cmData_t* cmDataRecdValue( const cmData_t* p, unsigned index );
  291. // Return the ith key
  292. cmData_t* cmDataRecdKey( const cmData_t* p, unsigned index );
  293. unsigned cmDataRecdKeyId( const cmData_t* p, unsigned index );
  294. const cmChar_t* cmDataRecdKeyLabel( const cmData_t* p, unsigned index );
  295. cmData_t* cmRecdMake( cmData_t* p );
  296. cmData_t* cmRecdAlloc();
  297. void cmDataFree( cmData_t* p );
  298. unsigned cmDataSerializeByteCount( const cmData_t* p );
  299. cmDtRC_t cmDataSerialize( const cmData_t* p, void* buf, unsigned bufByteCnt );
  300. cmDtRC_t cmDataDeserialize( const void* buf, unsigned bufByteCnt, cmData_t** pp );
  301. void cmDataPrint( const cmData_t* p, cmRpt_t* rpt );
  302. void cmDataTest( cmCtx_t* ctx );
  303. #ifdef __cplusplus
  304. }
  305. #endif
  306. #endif