calldata.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  1. /*
  2. * Copyright (c) 2013 Hugh Bailey <[email protected]>
  3. *
  4. * Permission to use, copy, modify, and distribute this software for any
  5. * purpose with or without fee is hereby granted, provided that the above
  6. * copyright notice and this permission notice appear in all copies.
  7. *
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. #pragma once
  17. #include <string.h>
  18. #include "../util/c99defs.h"
  19. #include "../util/bmem.h"
  20. #ifdef __cplusplus
  21. extern "C" {
  22. #endif
  23. /*
  24. * Procedure call data structure
  25. *
  26. * This is used to store parameters (and return value) sent to/from signals,
  27. * procedures, and callbacks.
  28. */
  29. struct calldata {
  30. size_t size; /* size of the stack, in bytes */
  31. size_t capacity; /* capacity of the stack, in bytes */
  32. uint8_t *stack;
  33. };
  34. typedef struct calldata *calldata_t;
  35. static inline void calldata_init(struct calldata *data)
  36. {
  37. memset(data, 0, sizeof(struct calldata));
  38. }
  39. static inline void calldata_free(struct calldata *data)
  40. {
  41. bfree(data->stack);
  42. }
  43. /* NOTE: 'get' functions return true only if paramter exists, and is the
  44. * same size. They return false otherwise. */
  45. EXPORT bool calldata_getdata(calldata_t data, const char *name, void *out,
  46. size_t size);
  47. EXPORT void calldata_setdata(calldata_t data, const char *name, const void *in,
  48. size_t new_size);
  49. static inline void calldata_clear(struct calldata *data)
  50. {
  51. if (data->stack) {
  52. data->size = sizeof(size_t);
  53. *(size_t*)data->stack = 0;
  54. }
  55. }
  56. static inline bool calldata_getchar (calldata_t data, const char *name,
  57. char *val)
  58. {
  59. return calldata_getdata(data, name, val, sizeof(*val));
  60. }
  61. static inline bool calldata_getuchar (calldata_t data, const char *name,
  62. unsigned char *val)
  63. {
  64. return calldata_getdata(data, name, val, sizeof(*val));
  65. }
  66. static inline bool calldata_getshort (calldata_t data, const char *name,
  67. short *val)
  68. {
  69. return calldata_getdata(data, name, val, sizeof(*val));
  70. }
  71. static inline bool calldata_getushort(calldata_t data, const char *name,
  72. unsigned short *val)
  73. {
  74. return calldata_getdata(data, name, val, sizeof(*val));
  75. }
  76. static inline bool calldata_getint (calldata_t data, const char *name,
  77. int *val)
  78. {
  79. return calldata_getdata(data, name, val, sizeof(*val));
  80. }
  81. static inline bool calldata_getuint (calldata_t data, const char *name,
  82. unsigned int *val)
  83. {
  84. return calldata_getdata(data, name, val, sizeof(*val));
  85. }
  86. static inline bool calldata_getlong (calldata_t data, const char *name,
  87. long *val)
  88. {
  89. return calldata_getdata(data, name, val, sizeof(*val));
  90. }
  91. static inline bool calldata_getulong (calldata_t data, const char *name,
  92. unsigned long *val)
  93. {
  94. return calldata_getdata(data, name, val, sizeof(*val));
  95. }
  96. static inline bool calldata_getint8 (calldata_t data, const char *name,
  97. int8_t *val)
  98. {
  99. return calldata_getdata(data, name, val, sizeof(*val));
  100. }
  101. static inline bool calldata_getuint8 (calldata_t data, const char *name,
  102. uint8_t *val)
  103. {
  104. return calldata_getdata(data, name, val, sizeof(*val));
  105. }
  106. static inline bool calldata_getint16 (calldata_t data, const char *name,
  107. int8_t *val)
  108. {
  109. return calldata_getdata(data, name, val, sizeof(*val));
  110. }
  111. static inline bool calldata_getuint16(calldata_t data, const char *name,
  112. uint8_t *val)
  113. {
  114. return calldata_getdata(data, name, val, sizeof(*val));
  115. }
  116. static inline bool calldata_getint32 (calldata_t data, const char *name,
  117. int32_t *val)
  118. {
  119. return calldata_getdata(data, name, val, sizeof(*val));
  120. }
  121. static inline bool calldata_getuint32(calldata_t data, const char *name,
  122. uint32_t *val)
  123. {
  124. return calldata_getdata(data, name, val, sizeof(*val));
  125. }
  126. static inline bool calldata_getint64 (calldata_t data, const char *name,
  127. int64_t *val)
  128. {
  129. return calldata_getdata(data, name, val, sizeof(*val));
  130. }
  131. static inline bool calldata_getuint64(calldata_t data, const char *name,
  132. uint64_t *val)
  133. {
  134. return calldata_getdata(data, name, val, sizeof(*val));
  135. }
  136. static inline bool calldata_getfloat (calldata_t data, const char *name,
  137. float *val)
  138. {
  139. return calldata_getdata(data, name, val, sizeof(*val));
  140. }
  141. static inline bool calldata_getdouble(calldata_t data, const char *name,
  142. double *val)
  143. {
  144. return calldata_getdata(data, name, val, sizeof(*val));
  145. }
  146. static inline bool calldata_getbool (calldata_t data, const char *name,
  147. bool *val)
  148. {
  149. return calldata_getdata(data, name, val, sizeof(*val));
  150. }
  151. static inline bool calldata_getsize (calldata_t data, const char *name,
  152. size_t *val)
  153. {
  154. return calldata_getdata(data, name, val, sizeof(*val));
  155. }
  156. static inline bool calldata_getptr (calldata_t data, const char *name,
  157. void *p_ptr)
  158. {
  159. return calldata_getdata(data, name, p_ptr, sizeof(p_ptr));
  160. }
  161. EXPORT bool calldata_getstring(calldata_t data, const char *name,
  162. const char **str);
  163. /* ------------------------------------------------------------------------- */
  164. static inline char calldata_char(calldata_t data, const char *name)
  165. {
  166. char val;
  167. calldata_getchar(data, name, &val);
  168. return val;
  169. }
  170. static inline unsigned char calldata_uchar(calldata_t data, const char *name)
  171. {
  172. unsigned char val;
  173. calldata_getuchar(data, name, &val);
  174. return val;
  175. }
  176. static inline short calldata_short(calldata_t data, const char *name)
  177. {
  178. short val;
  179. calldata_getshort(data, name, &val);
  180. return val;
  181. }
  182. static inline unsigned short calldata_ushort(calldata_t data, const char *name)
  183. {
  184. unsigned short val;
  185. calldata_getushort(data, name, &val);
  186. return val;
  187. }
  188. static inline int calldata_int(calldata_t data, const char *name)
  189. {
  190. int val;
  191. calldata_getint(data, name, &val);
  192. return val;
  193. }
  194. static inline unsigned int calldata_uint(calldata_t data, const char *name)
  195. {
  196. unsigned int val;
  197. calldata_getuint(data, name, &val);
  198. return val;
  199. }
  200. static inline long calldata_long(calldata_t data, const char *name)
  201. {
  202. long val;
  203. calldata_getlong(data, name, &val);
  204. return val;
  205. }
  206. static inline unsigned long calldata_ulong(calldata_t data, const char *name)
  207. {
  208. unsigned long val;
  209. calldata_getulong(data, name, &val);
  210. return val;
  211. }
  212. static inline int8_t calldata_int8(calldata_t data, const char *name)
  213. {
  214. int8_t val;
  215. calldata_getint8(data, name, &val);
  216. return val;
  217. }
  218. static inline uint8_t calldata_uint8(calldata_t data, const char *name)
  219. {
  220. uint8_t val;
  221. calldata_getuint8(data, name, &val);
  222. return val;
  223. }
  224. static inline int8_t calldata_int16(calldata_t data, const char *name)
  225. {
  226. int8_t val;
  227. calldata_getint16(data, name, &val);
  228. return val;
  229. }
  230. static inline uint8_t calldata_uint16(calldata_t data, const char *name)
  231. {
  232. uint8_t val;
  233. calldata_getuint16(data, name, &val);
  234. return val;
  235. }
  236. static inline int32_t calldata_int32(calldata_t data, const char *name)
  237. {
  238. int32_t val;
  239. calldata_getint32(data, name, &val);
  240. return val;
  241. }
  242. static inline uint32_t calldata_uint32(calldata_t data, const char *name)
  243. {
  244. uint32_t val;
  245. calldata_getuint32(data, name, &val);
  246. return val;
  247. }
  248. static inline int64_t calldata_int64(calldata_t data, const char *name)
  249. {
  250. int64_t val;
  251. calldata_getint64(data, name, &val);
  252. return val;
  253. }
  254. static inline uint64_t calldata_uint64(calldata_t data, const char *name)
  255. {
  256. uint64_t val;
  257. calldata_getuint64(data, name, &val);
  258. return val;
  259. }
  260. static inline float calldata_float(calldata_t data, const char *name)
  261. {
  262. float val;
  263. calldata_getfloat(data, name, &val);
  264. return val;
  265. }
  266. static inline double calldata_double(calldata_t data, const char *name)
  267. {
  268. double val;
  269. calldata_getdouble(data, name, &val);
  270. return val;
  271. }
  272. static inline bool calldata_bool(calldata_t data, const char *name)
  273. {
  274. bool val;
  275. calldata_getbool(data, name, &val);
  276. return val;
  277. }
  278. static inline size_t calldata_size(calldata_t data, const char *name)
  279. {
  280. size_t val;
  281. calldata_getsize(data, name, &val);
  282. return val;
  283. }
  284. static inline void *calldata_ptr(calldata_t data, const char *name)
  285. {
  286. void *val;
  287. calldata_getptr(data, name, &val);
  288. return val;
  289. }
  290. static inline const char *calldata_string(calldata_t data, const char *name)
  291. {
  292. const char *val;
  293. calldata_getstring(data, name, &val);
  294. return val;
  295. }
  296. /* ------------------------------------------------------------------------- */
  297. static void calldata_setchar (calldata_t data, const char *name, char val)
  298. {
  299. calldata_setdata(data, name, &val, sizeof(val));
  300. }
  301. static inline void calldata_setuchar (calldata_t data, const char *name,
  302. unsigned char val)
  303. {
  304. calldata_setdata(data, name, &val, sizeof(val));
  305. }
  306. static inline void calldata_setshort (calldata_t data, const char *name,
  307. short val)
  308. {
  309. calldata_setdata(data, name, &val, sizeof(val));
  310. }
  311. static inline void calldata_setushort(calldata_t data, const char *name,
  312. unsigned short val)
  313. {
  314. calldata_setdata(data, name, &val, sizeof(val));
  315. }
  316. static inline void calldata_setint (calldata_t data, const char *name,
  317. int val)
  318. {
  319. calldata_setdata(data, name, &val, sizeof(val));
  320. }
  321. static inline void calldata_setuint (calldata_t data, const char *name,
  322. unsigned int val)
  323. {
  324. calldata_setdata(data, name, &val, sizeof(val));
  325. }
  326. static inline void calldata_setlong (calldata_t data, const char *name,
  327. long val)
  328. {
  329. calldata_setdata(data, name, &val, sizeof(val));
  330. }
  331. static inline void calldata_setulong (calldata_t data, const char *name,
  332. unsigned long val)
  333. {
  334. calldata_setdata(data, name, &val, sizeof(val));
  335. }
  336. static inline void calldata_setint8 (calldata_t data, const char *name,
  337. int8_t val)
  338. {
  339. calldata_setdata(data, name, &val, sizeof(val));
  340. }
  341. static inline void calldata_setuint8 (calldata_t data, const char *name,
  342. uint8_t val)
  343. {
  344. calldata_setdata(data, name, &val, sizeof(val));
  345. }
  346. static inline void calldata_setint16 (calldata_t data, const char *name,
  347. int8_t val)
  348. {
  349. calldata_setdata(data, name, &val, sizeof(val));
  350. }
  351. static inline void calldata_setuint16(calldata_t data, const char *name,
  352. uint8_t val)
  353. {
  354. calldata_setdata(data, name, &val, sizeof(val));
  355. }
  356. static inline void calldata_setint32 (calldata_t data, const char *name,
  357. int32_t val)
  358. {
  359. calldata_setdata(data, name, &val, sizeof(val));
  360. }
  361. static inline void calldata_setuint32(calldata_t data, const char *name,
  362. uint32_t val)
  363. {
  364. calldata_setdata(data, name, &val, sizeof(val));
  365. }
  366. static inline void calldata_setint64 (calldata_t data, const char *name,
  367. int64_t val)
  368. {
  369. calldata_setdata(data, name, &val, sizeof(val));
  370. }
  371. static inline void calldata_setuint64(calldata_t data, const char *name,
  372. uint64_t val)
  373. {
  374. calldata_setdata(data, name, &val, sizeof(val));
  375. }
  376. static inline void calldata_setfloat (calldata_t data, const char *name,
  377. float val)
  378. {
  379. calldata_setdata(data, name, &val, sizeof(val));
  380. }
  381. static inline void calldata_setdouble(calldata_t data, const char *name,
  382. double val)
  383. {
  384. calldata_setdata(data, name, &val, sizeof(val));
  385. }
  386. static inline void calldata_setbool (calldata_t data, const char *name,
  387. bool val)
  388. {
  389. calldata_setdata(data, name, &val, sizeof(val));
  390. }
  391. static inline void calldata_setsize (calldata_t data, const char *name,
  392. size_t val)
  393. {
  394. calldata_setdata(data, name, &val, sizeof(val));
  395. }
  396. static inline void calldata_setptr (calldata_t data, const char *name,
  397. void *ptr)
  398. {
  399. calldata_setdata(data, name, &ptr, sizeof(ptr));
  400. }
  401. static inline void calldata_setstring(calldata_t data, const char *name,
  402. const char *str)
  403. {
  404. if (str)
  405. calldata_setdata(data, name, str, strlen(str)+1);
  406. else
  407. calldata_setdata(data, name, NULL, 0);
  408. }
  409. #ifdef __cplusplus
  410. }
  411. #endif