calldata.h 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  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. inline bool calldata_getchar (calldata_t data, const char *name, char *val)
  57. {
  58. return calldata_getdata(data, name, val, sizeof(*val));
  59. }
  60. inline bool calldata_getuchar (calldata_t data, const char *name,
  61. unsigned char *val)
  62. {
  63. return calldata_getdata(data, name, val, sizeof(*val));
  64. }
  65. inline bool calldata_getshort (calldata_t data, const char *name, short *val)
  66. {
  67. return calldata_getdata(data, name, val, sizeof(*val));
  68. }
  69. inline bool calldata_getushort(calldata_t data, const char *name,
  70. unsigned short *val)
  71. {
  72. return calldata_getdata(data, name, val, sizeof(*val));
  73. }
  74. inline bool calldata_getint (calldata_t data, const char *name, int *val)
  75. {
  76. return calldata_getdata(data, name, val, sizeof(*val));
  77. }
  78. inline bool calldata_getuint (calldata_t data, const char *name,
  79. unsigned int *val)
  80. {
  81. return calldata_getdata(data, name, val, sizeof(*val));
  82. }
  83. inline bool calldata_getlong (calldata_t data, const char *name, long *val)
  84. {
  85. return calldata_getdata(data, name, val, sizeof(*val));
  86. }
  87. inline bool calldata_getulong (calldata_t data, const char *name,
  88. unsigned long *val)
  89. {
  90. return calldata_getdata(data, name, val, sizeof(*val));
  91. }
  92. inline bool calldata_getint8 (calldata_t data, const char *name, int8_t *val)
  93. {
  94. return calldata_getdata(data, name, val, sizeof(*val));
  95. }
  96. inline bool calldata_getuint8 (calldata_t data, const char *name, uint8_t *val)
  97. {
  98. return calldata_getdata(data, name, val, sizeof(*val));
  99. }
  100. inline bool calldata_getint16 (calldata_t data, const char *name, int8_t *val)
  101. {
  102. return calldata_getdata(data, name, val, sizeof(*val));
  103. }
  104. inline bool calldata_getuint16(calldata_t data, const char *name, uint8_t *val)
  105. {
  106. return calldata_getdata(data, name, val, sizeof(*val));
  107. }
  108. inline bool calldata_getint32 (calldata_t data, const char *name, int32_t *val)
  109. {
  110. return calldata_getdata(data, name, val, sizeof(*val));
  111. }
  112. inline bool calldata_getuint32(calldata_t data, const char *name, uint32_t *val)
  113. {
  114. return calldata_getdata(data, name, val, sizeof(*val));
  115. }
  116. inline bool calldata_getint64 (calldata_t data, const char *name, int64_t *val)
  117. {
  118. return calldata_getdata(data, name, val, sizeof(*val));
  119. }
  120. inline bool calldata_getuint64(calldata_t data, const char *name, uint64_t *val)
  121. {
  122. return calldata_getdata(data, name, val, sizeof(*val));
  123. }
  124. inline bool calldata_getfloat (calldata_t data, const char *name, long *val)
  125. {
  126. return calldata_getdata(data, name, val, sizeof(*val));
  127. }
  128. inline bool calldata_getdouble(calldata_t data, const char *name, long *val)
  129. {
  130. return calldata_getdata(data, name, val, sizeof(*val));
  131. }
  132. inline bool calldata_getbool (calldata_t data, const char *name, bool *val)
  133. {
  134. return calldata_getdata(data, name, val, sizeof(*val));
  135. }
  136. inline bool calldata_getsize (calldata_t data, const char *name, size_t *val)
  137. {
  138. return calldata_getdata(data, name, val, sizeof(*val));
  139. }
  140. inline bool calldata_getptr (calldata_t data, const char *name, void **ptr)
  141. {
  142. return calldata_getdata(data, name, ptr, sizeof(*ptr));
  143. }
  144. EXPORT bool calldata_getstring(calldata_t data, const char *name,
  145. const char **str);
  146. /* ------------------------------------------------------------------------- */
  147. static void calldata_setchar (calldata_t data, const char *name, char val)
  148. {
  149. calldata_setdata(data, name, &val, sizeof(val));
  150. }
  151. inline void calldata_setuchar (calldata_t data, const char *name,
  152. unsigned char val)
  153. {
  154. calldata_setdata(data, name, &val, sizeof(val));
  155. }
  156. inline void calldata_setshort (calldata_t data, const char *name, short val)
  157. {
  158. calldata_setdata(data, name, &val, sizeof(val));
  159. }
  160. inline void calldata_setushort(calldata_t data, const char *name,
  161. unsigned short val)
  162. {
  163. calldata_setdata(data, name, &val, sizeof(val));
  164. }
  165. inline void calldata_setint (calldata_t data, const char *name, int val)
  166. {
  167. calldata_setdata(data, name, &val, sizeof(val));
  168. }
  169. inline void calldata_setuint (calldata_t data, const char *name,
  170. unsigned int val)
  171. {
  172. calldata_setdata(data, name, &val, sizeof(val));
  173. }
  174. inline void calldata_setlong (calldata_t data, const char *name, long val)
  175. {
  176. calldata_setdata(data, name, &val, sizeof(val));
  177. }
  178. inline void calldata_setulong (calldata_t data, const char *name,
  179. unsigned long val)
  180. {
  181. calldata_setdata(data, name, &val, sizeof(val));
  182. }
  183. inline void calldata_setint8 (calldata_t data, const char *name, int8_t val)
  184. {
  185. calldata_setdata(data, name, &val, sizeof(val));
  186. }
  187. inline void calldata_setuint8 (calldata_t data, const char *name, uint8_t val)
  188. {
  189. calldata_setdata(data, name, &val, sizeof(val));
  190. }
  191. inline void calldata_setint16 (calldata_t data, const char *name, int8_t val)
  192. {
  193. calldata_setdata(data, name, &val, sizeof(val));
  194. }
  195. inline void calldata_setuint16(calldata_t data, const char *name, uint8_t val)
  196. {
  197. calldata_setdata(data, name, &val, sizeof(val));
  198. }
  199. inline void calldata_setint32 (calldata_t data, const char *name, int32_t val)
  200. {
  201. calldata_setdata(data, name, &val, sizeof(val));
  202. }
  203. inline void calldata_setuint32(calldata_t data, const char *name, uint32_t val)
  204. {
  205. calldata_setdata(data, name, &val, sizeof(val));
  206. }
  207. inline void calldata_setint64 (calldata_t data, const char *name, int64_t val)
  208. {
  209. calldata_setdata(data, name, &val, sizeof(val));
  210. }
  211. inline void calldata_setuint64(calldata_t data, const char *name, uint64_t val)
  212. {
  213. calldata_setdata(data, name, &val, sizeof(val));
  214. }
  215. inline void calldata_setfloat (calldata_t data, const char *name, long val)
  216. {
  217. calldata_setdata(data, name, &val, sizeof(val));
  218. }
  219. inline void calldata_setdouble(calldata_t data, const char *name, long val)
  220. {
  221. calldata_setdata(data, name, &val, sizeof(val));
  222. }
  223. inline void calldata_setbool (calldata_t data, const char *name, bool val)
  224. {
  225. calldata_setdata(data, name, &val, sizeof(val));
  226. }
  227. inline void calldata_setsize (calldata_t data, const char *name, size_t val)
  228. {
  229. calldata_setdata(data, name, &val, sizeof(val));
  230. }
  231. inline void calldata_setptr (calldata_t data, const char *name, void *ptr)
  232. {
  233. calldata_setdata(data, name, &ptr, sizeof(ptr));
  234. }
  235. inline void calldata_setstring(calldata_t data, const char *name,
  236. const char *str)
  237. {
  238. if (str)
  239. calldata_setdata(data, name, str, strlen(str)+1);
  240. else
  241. calldata_setdata(data, name, NULL, 0);
  242. }
  243. #ifdef __cplusplus
  244. }
  245. #endif