attr_container.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986
  1. /*
  2. * Copyright (C) 2019 Intel Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #include "bi-inc/attr_container.h"
  6. typedef union jvalue {
  7. bool z;
  8. int8_t i8;
  9. uint8_t u8;
  10. int16_t i16;
  11. uint16_t u16;
  12. int32_t i32;
  13. uint32_t u32;
  14. int64_t i64;
  15. uint64_t u64;
  16. float f;
  17. double d;
  18. } jvalue;
  19. static inline int16_t
  20. get_int16(const char *buf)
  21. {
  22. int16_t ret;
  23. bh_memcpy_s(&ret, sizeof(int16_t), buf, sizeof(int16_t));
  24. return ret;
  25. }
  26. static inline uint16_t
  27. get_uint16(const char *buf)
  28. {
  29. uint16_t ret;
  30. bh_memcpy_s(&ret, sizeof(uint16_t), buf, sizeof(uint16_t));
  31. return ret;
  32. }
  33. static inline int32_t
  34. get_int32(const char *buf)
  35. {
  36. int32_t ret;
  37. bh_memcpy_s(&ret, sizeof(int32_t), buf, sizeof(int32_t));
  38. return ret;
  39. }
  40. static inline uint32_t
  41. get_uint32(const char *buf)
  42. {
  43. uint32_t ret;
  44. bh_memcpy_s(&ret, sizeof(uint32_t), buf, sizeof(uint32_t));
  45. return ret;
  46. }
  47. static inline int64_t
  48. get_int64(const char *buf)
  49. {
  50. int64_t ret;
  51. bh_memcpy_s(&ret, sizeof(int64_t), buf, sizeof(int64_t));
  52. return ret;
  53. }
  54. static inline uint64_t
  55. get_uint64(const char *buf)
  56. {
  57. uint64_t ret;
  58. bh_memcpy_s(&ret, sizeof(uint64_t), buf, sizeof(uint64_t));
  59. return ret;
  60. }
  61. static inline void
  62. set_int16(char *buf, int16_t v)
  63. {
  64. bh_memcpy_s(buf, sizeof(int16_t), &v, sizeof(int16_t));
  65. }
  66. static inline void
  67. set_uint16(char *buf, uint16_t v)
  68. {
  69. bh_memcpy_s(buf, sizeof(uint16_t), &v, sizeof(uint16_t));
  70. }
  71. static inline void
  72. set_int32(char *buf, int32_t v)
  73. {
  74. bh_memcpy_s(buf, sizeof(int32_t), &v, sizeof(int32_t));
  75. }
  76. static inline void
  77. set_uint32(char *buf, uint32_t v)
  78. {
  79. bh_memcpy_s(buf, sizeof(uint32_t), &v, sizeof(uint32_t));
  80. }
  81. static inline void
  82. set_int64(char *buf, int64_t v)
  83. {
  84. bh_memcpy_s(buf, sizeof(int64_t), &v, sizeof(int64_t));
  85. }
  86. static inline void
  87. set_uint64(char *buf, uint64_t v)
  88. {
  89. bh_memcpy_s(buf, sizeof(uint64_t), &v, sizeof(uint64_t));
  90. }
  91. char *
  92. attr_container_get_attr_begin(const attr_container_t *attr_cont,
  93. uint32_t *p_total_length, uint16_t *p_attr_num)
  94. {
  95. char *p = (char *)attr_cont->buf;
  96. uint16_t str_len, attr_num;
  97. uint32_t total_length;
  98. /* skip total length */
  99. total_length = get_uint32(p);
  100. p += sizeof(uint32_t);
  101. if (!total_length)
  102. return NULL;
  103. /* tag length */
  104. str_len = get_uint16(p);
  105. p += sizeof(uint16_t);
  106. if (!str_len)
  107. return NULL;
  108. /* tag content */
  109. p += str_len;
  110. if ((uint32_t)(p - attr_cont->buf) >= total_length)
  111. return NULL;
  112. /* attribute num */
  113. attr_num = get_uint16(p);
  114. p += sizeof(uint16_t);
  115. if ((uint32_t)(p - attr_cont->buf) >= total_length)
  116. return NULL;
  117. if (p_total_length)
  118. *p_total_length = total_length;
  119. if (p_attr_num)
  120. *p_attr_num = attr_num;
  121. /* first attribute */
  122. return p;
  123. }
  124. static char *
  125. attr_container_get_attr_next(const char *curr_attr)
  126. {
  127. char *p = (char *)curr_attr;
  128. uint8_t type;
  129. /* key length and key */
  130. p += sizeof(uint16_t) + get_uint16(p);
  131. type = *p++;
  132. /* Byte type to Boolean type */
  133. if (type >= ATTR_TYPE_BYTE && type <= ATTR_TYPE_BOOLEAN) {
  134. p += 1 << (type & 3);
  135. return p;
  136. }
  137. /* String type */
  138. else if (type == ATTR_TYPE_STRING) {
  139. p += sizeof(uint16_t) + get_uint16(p);
  140. return p;
  141. }
  142. /* ByteArray type */
  143. else if (type == ATTR_TYPE_BYTEARRAY) {
  144. p += sizeof(uint32_t) + get_uint32(p);
  145. return p;
  146. }
  147. return NULL;
  148. }
  149. static const char *
  150. attr_container_find_attr(const attr_container_t *attr_cont, const char *key)
  151. {
  152. uint32_t total_length;
  153. uint16_t str_len, attr_num, i;
  154. const char *p = attr_cont->buf;
  155. if (!key)
  156. return NULL;
  157. if (!(p = attr_container_get_attr_begin(attr_cont, &total_length,
  158. &attr_num)))
  159. return NULL;
  160. for (i = 0; i < attr_num; i++) {
  161. /* key length */
  162. if (!(str_len = get_uint16(p)))
  163. return NULL;
  164. if (str_len == strlen(key) + 1
  165. && memcmp(p + sizeof(uint16_t), key, str_len) == 0) {
  166. if ((uint32_t)(p + sizeof(uint16_t) + str_len - attr_cont->buf)
  167. >= total_length)
  168. return NULL;
  169. return p;
  170. }
  171. if (!(p = attr_container_get_attr_next(p)))
  172. return NULL;
  173. }
  174. return NULL;
  175. }
  176. char *
  177. attr_container_get_attr_end(const attr_container_t *attr_cont)
  178. {
  179. uint32_t total_length;
  180. uint16_t attr_num, i;
  181. char *p;
  182. if (!(p = attr_container_get_attr_begin(attr_cont, &total_length,
  183. &attr_num)))
  184. return NULL;
  185. for (i = 0; i < attr_num; i++)
  186. if (!(p = attr_container_get_attr_next(p)))
  187. return NULL;
  188. return p;
  189. }
  190. static char *
  191. attr_container_get_msg_end(attr_container_t *attr_cont)
  192. {
  193. char *p = attr_cont->buf;
  194. return p + get_uint32(p);
  195. }
  196. uint16_t
  197. attr_container_get_attr_num(const attr_container_t *attr_cont)
  198. {
  199. uint16_t str_len;
  200. /* skip total length */
  201. const char *p = attr_cont->buf + sizeof(uint32_t);
  202. str_len = get_uint16(p);
  203. /* skip tag length and tag */
  204. p += sizeof(uint16_t) + str_len;
  205. /* attribute num */
  206. return get_uint16(p);
  207. }
  208. static void
  209. attr_container_inc_attr_num(attr_container_t *attr_cont)
  210. {
  211. uint16_t str_len, attr_num;
  212. /* skip total length */
  213. char *p = attr_cont->buf + sizeof(uint32_t);
  214. str_len = get_uint16(p);
  215. /* skip tag length and tag */
  216. p += sizeof(uint16_t) + str_len;
  217. /* attribute num */
  218. attr_num = get_uint16(p) + 1;
  219. set_uint16(p, attr_num);
  220. }
  221. attr_container_t *
  222. attr_container_create(const char *tag)
  223. {
  224. attr_container_t *attr_cont;
  225. int length, tag_length;
  226. char *p;
  227. tag_length = tag ? strlen(tag) + 1 : 1;
  228. length = offsetof(attr_container_t, buf) +
  229. /* total length + tag length + tag + reserved 100 bytes */
  230. sizeof(uint32_t) + sizeof(uint16_t) + tag_length + 100;
  231. if (!(attr_cont = attr_container_malloc(length))) {
  232. attr_container_printf(
  233. "Create attr_container failed: allocate memory failed.\r\n");
  234. return NULL;
  235. }
  236. memset(attr_cont, 0, length);
  237. p = attr_cont->buf;
  238. /* total length */
  239. set_uint32(p, length - offsetof(attr_container_t, buf));
  240. p += 4;
  241. /* tag length, tag */
  242. set_uint16(p, tag_length);
  243. p += 2;
  244. if (tag)
  245. bh_memcpy_s(p, tag_length, tag, tag_length);
  246. return attr_cont;
  247. }
  248. void
  249. attr_container_destroy(const attr_container_t *attr_cont)
  250. {
  251. if (attr_cont)
  252. attr_container_free((char *)attr_cont);
  253. }
  254. static bool
  255. check_set_attr(attr_container_t **p_attr_cont, const char *key)
  256. {
  257. uint32_t flags;
  258. if (!p_attr_cont || !*p_attr_cont || !key || strlen(key) == 0) {
  259. attr_container_printf(
  260. "Set attribute failed: invalid input arguments.\r\n");
  261. return false;
  262. }
  263. flags = get_uint32((char *)*p_attr_cont);
  264. if (flags & ATTR_CONT_READONLY_SHIFT) {
  265. attr_container_printf(
  266. "Set attribute failed: attribute container is readonly.\r\n");
  267. return false;
  268. }
  269. return true;
  270. }
  271. bool
  272. attr_container_set_attr(attr_container_t **p_attr_cont, const char *key,
  273. int type, const void *value, int value_length)
  274. {
  275. attr_container_t *attr_cont, *attr_cont1;
  276. uint16_t str_len;
  277. uint32_t total_length, attr_len;
  278. char *p, *p1, *attr_end, *msg_end, *attr_buf;
  279. if (!check_set_attr(p_attr_cont, key)) {
  280. return false;
  281. }
  282. attr_cont = *p_attr_cont;
  283. p = attr_cont->buf;
  284. total_length = get_uint32(p);
  285. if (!(attr_end = attr_container_get_attr_end(attr_cont))) {
  286. attr_container_printf("Set attr failed: get attr end failed.\r\n");
  287. return false;
  288. }
  289. msg_end = attr_container_get_msg_end(attr_cont);
  290. /* key len + key + '\0' + type */
  291. attr_len = sizeof(uint16_t) + strlen(key) + 1 + 1;
  292. if (type >= ATTR_TYPE_BYTE && type <= ATTR_TYPE_BOOLEAN)
  293. attr_len += 1 << (type & 3);
  294. else if (type == ATTR_TYPE_STRING)
  295. attr_len += sizeof(uint16_t) + value_length;
  296. else if (type == ATTR_TYPE_BYTEARRAY)
  297. attr_len += sizeof(uint32_t) + value_length;
  298. if (!(p = attr_buf = attr_container_malloc(attr_len))) {
  299. attr_container_printf("Set attr failed: allocate memory failed.\r\n");
  300. return false;
  301. }
  302. /* Set the attr buf */
  303. str_len = (uint16_t)(strlen(key) + 1);
  304. set_uint16(p, str_len);
  305. p += sizeof(uint16_t);
  306. bh_memcpy_s(p, str_len, key, str_len);
  307. p += str_len;
  308. *p++ = type;
  309. if (type >= ATTR_TYPE_BYTE && type <= ATTR_TYPE_BOOLEAN)
  310. bh_memcpy_s(p, 1 << (type & 3), value, 1 << (type & 3));
  311. else if (type == ATTR_TYPE_STRING) {
  312. set_uint16(p, value_length);
  313. p += sizeof(uint16_t);
  314. bh_memcpy_s(p, value_length, value, value_length);
  315. }
  316. else if (type == ATTR_TYPE_BYTEARRAY) {
  317. set_uint32(p, value_length);
  318. p += sizeof(uint32_t);
  319. bh_memcpy_s(p, value_length, value, value_length);
  320. }
  321. if ((p = (char *)attr_container_find_attr(attr_cont, key))) {
  322. /* key found */
  323. p1 = attr_container_get_attr_next(p);
  324. if (p1 - p == attr_len) {
  325. bh_memcpy_s(p, attr_len, attr_buf, attr_len);
  326. attr_container_free(attr_buf);
  327. return true;
  328. }
  329. if ((uint32_t)(p1 - p + msg_end - attr_end) >= attr_len) {
  330. memmove(p, p1, attr_end - p1);
  331. bh_memcpy_s(p + (attr_end - p1), attr_len, attr_buf, attr_len);
  332. attr_container_free(attr_buf);
  333. return true;
  334. }
  335. total_length += attr_len + 100;
  336. if (!(attr_cont1 = attr_container_malloc(offsetof(attr_container_t, buf)
  337. + total_length))) {
  338. attr_container_printf(
  339. "Set attr failed: allocate memory failed.\r\n");
  340. attr_container_free(attr_buf);
  341. return false;
  342. }
  343. bh_memcpy_s(attr_cont1, p - (char *)attr_cont, attr_cont,
  344. p - (char *)attr_cont);
  345. bh_memcpy_s((char *)attr_cont1 + (unsigned)(p - (char *)attr_cont),
  346. attr_end - p1, p1, attr_end - p1);
  347. bh_memcpy_s((char *)attr_cont1 + (unsigned)(p - (char *)attr_cont)
  348. + (unsigned)(attr_end - p1),
  349. attr_len, attr_buf, attr_len);
  350. p = attr_cont1->buf;
  351. set_uint32(p, total_length);
  352. *p_attr_cont = attr_cont1;
  353. /* Free original buffer */
  354. attr_container_free(attr_cont);
  355. attr_container_free(attr_buf);
  356. return true;
  357. }
  358. else {
  359. /* key not found */
  360. if ((uint32_t)(msg_end - attr_end) >= attr_len) {
  361. bh_memcpy_s(attr_end, msg_end - attr_end, attr_buf, attr_len);
  362. attr_container_inc_attr_num(attr_cont);
  363. attr_container_free(attr_buf);
  364. return true;
  365. }
  366. total_length += attr_len + 100;
  367. if (!(attr_cont1 = attr_container_malloc(offsetof(attr_container_t, buf)
  368. + total_length))) {
  369. attr_container_printf(
  370. "Set attr failed: allocate memory failed.\r\n");
  371. attr_container_free(attr_buf);
  372. return false;
  373. }
  374. bh_memcpy_s(attr_cont1, attr_end - (char *)attr_cont, attr_cont,
  375. attr_end - (char *)attr_cont);
  376. bh_memcpy_s((char *)attr_cont1
  377. + (unsigned)(attr_end - (char *)attr_cont),
  378. attr_len, attr_buf, attr_len);
  379. attr_container_inc_attr_num(attr_cont1);
  380. p = attr_cont1->buf;
  381. set_uint32(p, total_length);
  382. *p_attr_cont = attr_cont1;
  383. /* Free original buffer */
  384. attr_container_free(attr_cont);
  385. attr_container_free(attr_buf);
  386. return true;
  387. }
  388. return false;
  389. }
  390. bool
  391. attr_container_set_short(attr_container_t **p_attr_cont, const char *key,
  392. short value)
  393. {
  394. return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_SHORT, &value,
  395. 2);
  396. }
  397. bool
  398. attr_container_set_int16(attr_container_t **p_attr_cont, const char *key,
  399. int16_t value)
  400. {
  401. return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_INT16, &value,
  402. 2);
  403. }
  404. bool
  405. attr_container_set_int(attr_container_t **p_attr_cont, const char *key,
  406. int value)
  407. {
  408. return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_INT, &value, 4);
  409. }
  410. bool
  411. attr_container_set_int32(attr_container_t **p_attr_cont, const char *key,
  412. int32_t value)
  413. {
  414. return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_INT32, &value,
  415. 4);
  416. }
  417. bool
  418. attr_container_set_uint32(attr_container_t **p_attr_cont, const char *key,
  419. uint32_t value)
  420. {
  421. return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_UINT32, &value,
  422. 4);
  423. }
  424. bool
  425. attr_container_set_int64(attr_container_t **p_attr_cont, const char *key,
  426. int64_t value)
  427. {
  428. return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_INT64, &value,
  429. 8);
  430. }
  431. bool
  432. attr_container_set_uint64(attr_container_t **p_attr_cont, const char *key,
  433. uint64_t value)
  434. {
  435. return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_UINT64, &value,
  436. 8);
  437. }
  438. bool
  439. attr_container_set_byte(attr_container_t **p_attr_cont, const char *key,
  440. int8_t value)
  441. {
  442. return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_BYTE, &value, 1);
  443. }
  444. bool
  445. attr_container_set_int8(attr_container_t **p_attr_cont, const char *key,
  446. int8_t value)
  447. {
  448. return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_INT8, &value, 1);
  449. }
  450. bool
  451. attr_container_set_uint8(attr_container_t **p_attr_cont, const char *key,
  452. uint8_t value)
  453. {
  454. return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_UINT8, &value,
  455. 1);
  456. }
  457. bool
  458. attr_container_set_uint16(attr_container_t **p_attr_cont, const char *key,
  459. uint16_t value)
  460. {
  461. return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_UINT16, &value,
  462. 2);
  463. }
  464. bool
  465. attr_container_set_float(attr_container_t **p_attr_cont, const char *key,
  466. float value)
  467. {
  468. return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_FLOAT, &value,
  469. 4);
  470. }
  471. bool
  472. attr_container_set_double(attr_container_t **p_attr_cont, const char *key,
  473. double value)
  474. {
  475. return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_DOUBLE, &value,
  476. 8);
  477. }
  478. bool
  479. attr_container_set_bool(attr_container_t **p_attr_cont, const char *key,
  480. bool value)
  481. {
  482. int8_t value1 = value ? 1 : 0;
  483. return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_BOOLEAN, &value1,
  484. 1);
  485. }
  486. bool
  487. attr_container_set_string(attr_container_t **p_attr_cont, const char *key,
  488. const char *value)
  489. {
  490. if (!value) {
  491. attr_container_printf("Set attr failed: invald input arguments.\r\n");
  492. return false;
  493. }
  494. return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_STRING, value,
  495. strlen(value) + 1);
  496. }
  497. bool
  498. attr_container_set_bytearray(attr_container_t **p_attr_cont, const char *key,
  499. const int8_t *value, unsigned length)
  500. {
  501. if (!value) {
  502. attr_container_printf("Set attr failed: invald input arguments.\r\n");
  503. return false;
  504. }
  505. return attr_container_set_attr(p_attr_cont, key, ATTR_TYPE_BYTEARRAY, value,
  506. length);
  507. }
  508. static const char *
  509. attr_container_get_attr(const attr_container_t *attr_cont, const char *key)
  510. {
  511. const char *attr_addr;
  512. if (!attr_cont || !key) {
  513. attr_container_printf(
  514. "Get attribute failed: invalid input arguments.\r\n");
  515. return NULL;
  516. }
  517. if (!(attr_addr = attr_container_find_attr(attr_cont, key))) {
  518. attr_container_printf("Get attribute failed: lookup key failed.\r\n");
  519. return NULL;
  520. }
  521. /* key len + key + '\0' */
  522. return attr_addr + 2 + strlen(key) + 1;
  523. }
  524. #define TEMPLATE_ATTR_BUF_TO_VALUE(attr, key, var_name) \
  525. do { \
  526. jvalue val; \
  527. const char *addr = attr_container_get_attr(attr, key); \
  528. uint8_t type; \
  529. if (!addr) \
  530. return 0; \
  531. val.i64 = 0; \
  532. type = *(uint8_t *)addr++; \
  533. switch (type) { \
  534. case ATTR_TYPE_BYTE: /* = ATTR_TYPE_INT8 */ \
  535. case ATTR_TYPE_SHORT: /* = ATTR_TYPE_INT16 */ \
  536. case ATTR_TYPE_INT: /* = ATTR_TYPE_INT32 */ \
  537. case ATTR_TYPE_INT64: \
  538. case ATTR_TYPE_UINT8: \
  539. case ATTR_TYPE_UINT16: \
  540. case ATTR_TYPE_UINT32: \
  541. case ATTR_TYPE_UINT64: \
  542. case ATTR_TYPE_FLOAT: \
  543. case ATTR_TYPE_DOUBLE: \
  544. case ATTR_TYPE_BOOLEAN: \
  545. bh_memcpy_s(&val, sizeof(val.var_name), addr, \
  546. 1 << (type & 3)); \
  547. break; \
  548. case ATTR_TYPE_STRING: \
  549. { \
  550. unsigned len = get_uint16(addr); \
  551. addr += 2; \
  552. if (len > sizeof(val.var_name)) \
  553. len = sizeof(val.var_name); \
  554. bh_memcpy_s(&val.var_name, sizeof(val.var_name), addr, len); \
  555. break; \
  556. } \
  557. case ATTR_TYPE_BYTEARRAY: \
  558. { \
  559. unsigned len = get_uint32(addr); \
  560. addr += 4; \
  561. if (len > sizeof(val.var_name)) \
  562. len = sizeof(val.var_name); \
  563. bh_memcpy_s(&val.var_name, sizeof(val.var_name), addr, len); \
  564. break; \
  565. } \
  566. default: \
  567. bh_assert(0); \
  568. break; \
  569. } \
  570. return val.var_name; \
  571. } while (0)
  572. short
  573. attr_container_get_as_short(const attr_container_t *attr_cont, const char *key)
  574. {
  575. TEMPLATE_ATTR_BUF_TO_VALUE(attr_cont, key, i16);
  576. }
  577. int16_t
  578. attr_container_get_as_int16(const attr_container_t *attr_cont, const char *key)
  579. {
  580. return (int16_t)attr_container_get_as_short(attr_cont, key);
  581. }
  582. int
  583. attr_container_get_as_int(const attr_container_t *attr_cont, const char *key)
  584. {
  585. TEMPLATE_ATTR_BUF_TO_VALUE(attr_cont, key, i32);
  586. }
  587. int32_t
  588. attr_container_get_as_int32(const attr_container_t *attr_cont, const char *key)
  589. {
  590. return (int32_t)attr_container_get_as_int(attr_cont, key);
  591. }
  592. uint32_t
  593. attr_container_get_as_uint32(const attr_container_t *attr_cont, const char *key)
  594. {
  595. return (uint32_t)attr_container_get_as_int(attr_cont, key);
  596. }
  597. int64_t
  598. attr_container_get_as_int64(const attr_container_t *attr_cont, const char *key)
  599. {
  600. TEMPLATE_ATTR_BUF_TO_VALUE(attr_cont, key, i64);
  601. }
  602. uint64_t
  603. attr_container_get_as_uint64(const attr_container_t *attr_cont, const char *key)
  604. {
  605. return (uint64_t)attr_container_get_as_int64(attr_cont, key);
  606. }
  607. int8_t
  608. attr_container_get_as_byte(const attr_container_t *attr_cont, const char *key)
  609. {
  610. TEMPLATE_ATTR_BUF_TO_VALUE(attr_cont, key, i8);
  611. }
  612. int8_t
  613. attr_container_get_as_int8(const attr_container_t *attr_cont, const char *key)
  614. {
  615. return attr_container_get_as_byte(attr_cont, key);
  616. }
  617. uint8_t
  618. attr_container_get_as_uint8(const attr_container_t *attr_cont, const char *key)
  619. {
  620. return (uint8_t)attr_container_get_as_byte(attr_cont, key);
  621. }
  622. uint16_t
  623. attr_container_get_as_uint16(const attr_container_t *attr_cont, const char *key)
  624. {
  625. return (uint16_t)attr_container_get_as_short(attr_cont, key);
  626. }
  627. float
  628. attr_container_get_as_float(const attr_container_t *attr_cont, const char *key)
  629. {
  630. TEMPLATE_ATTR_BUF_TO_VALUE(attr_cont, key, f);
  631. }
  632. double
  633. attr_container_get_as_double(const attr_container_t *attr_cont, const char *key)
  634. {
  635. TEMPLATE_ATTR_BUF_TO_VALUE(attr_cont, key, d);
  636. }
  637. bool
  638. attr_container_get_as_bool(const attr_container_t *attr_cont, const char *key)
  639. {
  640. TEMPLATE_ATTR_BUF_TO_VALUE(attr_cont, key, z);
  641. }
  642. const int8_t *
  643. attr_container_get_as_bytearray(const attr_container_t *attr_cont,
  644. const char *key, unsigned *array_length)
  645. {
  646. const char *addr = attr_container_get_attr(attr_cont, key);
  647. uint8_t type;
  648. uint32_t length;
  649. if (!addr)
  650. return NULL;
  651. if (!array_length) {
  652. attr_container_printf("Get attribute failed: invalid input arguments.");
  653. return NULL;
  654. }
  655. type = *(uint8_t *)addr++;
  656. switch (type) {
  657. case ATTR_TYPE_BYTE: /* = ATTR_TYPE_INT8 */
  658. case ATTR_TYPE_SHORT: /* = ATTR_TYPE_INT16 */
  659. case ATTR_TYPE_INT: /* = ATTR_TYPE_INT32 */
  660. case ATTR_TYPE_INT64:
  661. case ATTR_TYPE_UINT8:
  662. case ATTR_TYPE_UINT16:
  663. case ATTR_TYPE_UINT32:
  664. case ATTR_TYPE_UINT64:
  665. case ATTR_TYPE_FLOAT:
  666. case ATTR_TYPE_DOUBLE:
  667. case ATTR_TYPE_BOOLEAN:
  668. length = 1 << (type & 3);
  669. break;
  670. case ATTR_TYPE_STRING:
  671. length = get_uint16(addr);
  672. addr += 2;
  673. break;
  674. case ATTR_TYPE_BYTEARRAY:
  675. length = get_uint32(addr);
  676. addr += 4;
  677. break;
  678. default:
  679. return NULL;
  680. }
  681. *array_length = length;
  682. return (const int8_t *)addr;
  683. }
  684. char *
  685. attr_container_get_as_string(const attr_container_t *attr_cont, const char *key)
  686. {
  687. unsigned array_length;
  688. return (char *)attr_container_get_as_bytearray(attr_cont, key,
  689. &array_length);
  690. }
  691. const char *
  692. attr_container_get_tag(const attr_container_t *attr_cont)
  693. {
  694. return attr_cont ? attr_cont->buf + sizeof(uint32_t) + sizeof(uint16_t)
  695. : NULL;
  696. }
  697. bool
  698. attr_container_contain_key(const attr_container_t *attr_cont, const char *key)
  699. {
  700. if (!attr_cont || !key || !strlen(key)) {
  701. attr_container_printf(
  702. "Check contain key failed: invalid input arguments.\r\n");
  703. return false;
  704. }
  705. return attr_container_find_attr(attr_cont, key) ? true : false;
  706. }
  707. unsigned int
  708. attr_container_get_serialize_length(const attr_container_t *attr_cont)
  709. {
  710. const char *p;
  711. if (!attr_cont) {
  712. attr_container_printf("Get container serialize length failed: invalid "
  713. "input arguments.\r\n");
  714. return 0;
  715. }
  716. p = attr_cont->buf;
  717. return sizeof(uint16_t) + get_uint32(p);
  718. }
  719. bool
  720. attr_container_serialize(char *buf, const attr_container_t *attr_cont)
  721. {
  722. const char *p;
  723. uint16_t flags;
  724. uint32_t length;
  725. if (!buf || !attr_cont) {
  726. attr_container_printf(
  727. "Container serialize failed: invalid input arguments.\r\n");
  728. return false;
  729. }
  730. p = attr_cont->buf;
  731. length = sizeof(uint16_t) + get_uint32(p);
  732. bh_memcpy_s(buf, length, attr_cont, length);
  733. /* Set readonly */
  734. flags = get_uint16((const char *)attr_cont);
  735. set_uint16(buf, flags | (1 << ATTR_CONT_READONLY_SHIFT));
  736. return true;
  737. }
  738. bool
  739. attr_container_is_constant(const attr_container_t *attr_cont)
  740. {
  741. uint16_t flags;
  742. if (!attr_cont) {
  743. attr_container_printf(
  744. "Container check const: invalid input arguments.\r\n");
  745. return false;
  746. }
  747. flags = get_uint16((const char *)attr_cont);
  748. return (flags & (1 << ATTR_CONT_READONLY_SHIFT)) ? true : false;
  749. }
  750. void
  751. attr_container_dump(const attr_container_t *attr_cont)
  752. {
  753. uint32_t total_length;
  754. uint16_t attr_num, i, type;
  755. const char *p, *tag, *key;
  756. jvalue value;
  757. if (!attr_cont)
  758. return;
  759. tag = attr_container_get_tag(attr_cont);
  760. if (!tag)
  761. return;
  762. attr_container_printf("Attribute container dump:\n");
  763. attr_container_printf("Tag: %s\n", tag);
  764. p = attr_container_get_attr_begin(attr_cont, &total_length, &attr_num);
  765. if (!p)
  766. return;
  767. attr_container_printf("Attribute list:\n");
  768. for (i = 0; i < attr_num; i++) {
  769. key = p + 2;
  770. /* Skip key len and key */
  771. p += 2 + get_uint16(p);
  772. type = *p++;
  773. attr_container_printf(" key: %s", key);
  774. switch (type) {
  775. case ATTR_TYPE_BYTE: /* = ATTR_TYPE_INT8 */
  776. bh_memcpy_s(&value.i8, 1, p, 1);
  777. attr_container_printf(", type: byte, value: 0x%x\n",
  778. value.i8 & 0xFF);
  779. p++;
  780. break;
  781. case ATTR_TYPE_SHORT: /* = ATTR_TYPE_INT16 */
  782. bh_memcpy_s(&value.i16, sizeof(int16_t), p, sizeof(int16_t));
  783. attr_container_printf(", type: short, value: 0x%x\n",
  784. value.i16 & 0xFFFF);
  785. p += 2;
  786. break;
  787. case ATTR_TYPE_INT: /* = ATTR_TYPE_INT32 */
  788. bh_memcpy_s(&value.i32, sizeof(int32_t), p, sizeof(int32_t));
  789. attr_container_printf(", type: int, value: 0x%x\n", value.i32);
  790. p += 4;
  791. break;
  792. case ATTR_TYPE_INT64:
  793. bh_memcpy_s(&value.i64, sizeof(int64_t), p, sizeof(int64_t));
  794. attr_container_printf(", type: int64, value: 0x%llx\n",
  795. (long long unsigned int)(value.i64));
  796. p += 8;
  797. break;
  798. case ATTR_TYPE_UINT8:
  799. bh_memcpy_s(&value.u8, 1, p, 1);
  800. attr_container_printf(", type: uint8, value: 0x%x\n", value.u8);
  801. p++;
  802. break;
  803. case ATTR_TYPE_UINT16:
  804. bh_memcpy_s(&value.u16, sizeof(uint16_t), p, sizeof(uint16_t));
  805. attr_container_printf(", type: uint16, value: 0x%x\n",
  806. value.u16);
  807. p += 2;
  808. break;
  809. case ATTR_TYPE_UINT32:
  810. bh_memcpy_s(&value.u32, sizeof(uint32_t), p, sizeof(uint32_t));
  811. attr_container_printf(", type: uint32, value: 0x%x\n",
  812. value.u32);
  813. p += 4;
  814. break;
  815. case ATTR_TYPE_UINT64:
  816. bh_memcpy_s(&value.u64, sizeof(uint64_t), p, sizeof(uint64_t));
  817. attr_container_printf(", type: int64, value: 0x%llx\n",
  818. (long long unsigned int)(value.u64));
  819. p += 8;
  820. break;
  821. case ATTR_TYPE_FLOAT:
  822. bh_memcpy_s(&value.f, sizeof(float), p, sizeof(float));
  823. attr_container_printf(", type: float, value: %f\n", value.f);
  824. p += 4;
  825. break;
  826. case ATTR_TYPE_DOUBLE:
  827. bh_memcpy_s(&value.d, sizeof(double), p, sizeof(double));
  828. attr_container_printf(", type: double, value: %f\n", value.d);
  829. p += 8;
  830. break;
  831. case ATTR_TYPE_BOOLEAN:
  832. bh_memcpy_s(&value.z, 1, p, 1);
  833. attr_container_printf(", type: bool, value: 0x%x\n", value.z);
  834. p++;
  835. break;
  836. case ATTR_TYPE_STRING:
  837. attr_container_printf(", type: string, value: %s\n",
  838. p + sizeof(uint16_t));
  839. p += sizeof(uint16_t) + get_uint16(p);
  840. break;
  841. case ATTR_TYPE_BYTEARRAY:
  842. attr_container_printf(", type: byte array, length: %d\n",
  843. get_uint32(p));
  844. p += sizeof(uint32_t) + get_uint32(p);
  845. break;
  846. default:
  847. bh_assert(0);
  848. break;
  849. }
  850. }
  851. attr_container_printf("\n");
  852. }