DecoderChannel.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930
  1. /*
  2. * Copyright (C) 2007-2018 Siemens AG
  3. *
  4. * This program is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU Lesser General Public License as published
  6. * by the Free Software Foundation, either version 3 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU Lesser General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Lesser General Public License
  15. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. /*******************************************************************
  18. *
  19. * @author Daniel.Peintner.EXT@siemens.com
  20. * @version 2017-03-02
  21. * @contact Richard.Kuntschke@siemens.com
  22. *
  23. * <p>Code generated by EXIdizer</p>
  24. * <p>Schema: V2G_CI_MsgDef.xsd</p>
  25. *
  26. *
  27. ********************************************************************/
  28. #include "DecoderChannel.h"
  29. #include "EXIConfig.h"
  30. #include "EXIOptions.h"
  31. #include "BitInputStream.h"
  32. #include "EXITypes.h"
  33. #include "MethodsBag.h"
  34. /*#include "v2gEXICoder.h"*/
  35. #include "ErrorCodes.h"
  36. #if MEMORY_ALLOCATION == DYNAMIC_ALLOCATION
  37. #include "DynamicMemory.h"
  38. #endif /* DYNAMIC_ALLOCATION */
  39. #ifndef DECODER_CHANNEL_C
  40. #define DECODER_CHANNEL_C
  41. /* unsigned long == 64 bits, 10 * 7bits = 70 bits */
  42. #define MAX_OCTETS_FOR_UNSIGNED_INTEGER_64 10
  43. /* unsigned int == 32 bits, 5 * 7bits = 35 bits */
  44. #define MAX_OCTETS_FOR_UNSIGNED_INTEGER_32 5
  45. /* buffer for reading (arbitrary) large integer values */
  46. static uint8_t maskedOctets[MAX_OCTETS_FOR_UNSIGNED_INTEGER_64];
  47. static int _decodeUnsignedInteger(bitstream_t* stream, exi_integer_t* iv, int negative) {
  48. int errn = 0;
  49. int i = 0;
  50. uint8_t b;
  51. int k;
  52. do {
  53. /* Read the next octet */
  54. errn = decode(stream, &b);
  55. if (errn == 0) {
  56. if(i < MAX_OCTETS_FOR_UNSIGNED_INTEGER_64) {
  57. /* the 7 least significant bits hold the actual value */
  58. maskedOctets[i++] = (b & 127);
  59. } else {
  60. errn = EXI_UNSUPPORTED_INTEGER_VALUE;
  61. }
  62. }
  63. } while( errn == 0 && b >= 128 ); /* no more octets ? */
  64. if ( errn == 0 ) {
  65. /* For negative values, the Unsigned Integer holds the
  66. * magnitude of the value minus 1 */
  67. switch(i) {
  68. case 1: /* 7 bits */
  69. if (negative) {
  70. iv->val.int8 = (int8_t)(-( b + 1));
  71. iv->type = EXI_INTEGER_8;
  72. } else {
  73. iv->val.uint8 = b;
  74. iv->type = EXI_UNSIGNED_INTEGER_8;
  75. }
  76. break;
  77. case 2: /* 14 bits */
  78. iv->val.uint16 = 0;
  79. for (k = i-1; k >= 0 ; k--) {
  80. iv->val.uint16 = (uint16_t)((iv->val.uint16 << 7) | maskedOctets[k]);
  81. }
  82. if (negative) {
  83. iv->val.int16 = (int16_t)( -( iv->val.uint16 + 1 ));
  84. iv->type = EXI_INTEGER_16;
  85. } else {
  86. iv->type = EXI_UNSIGNED_INTEGER_16;
  87. }
  88. break;
  89. case 3: /* 21 bits */
  90. case 4: /* 28 bits */
  91. iv->val.uint32 = 0;
  92. for (k = i-1; k >= 0 ; k--) {
  93. iv->val.uint32 = (iv->val.uint32 << 7) | maskedOctets[k];
  94. }
  95. if (negative) {
  96. iv->val.int32 = (-(int32_t)(iv->val.uint32 + 1));
  97. if (iv->val.int32 <= INT16_MAX && iv->val.int32 >= INT16_MIN ) {
  98. iv->type = EXI_INTEGER_16;
  99. } else {
  100. iv->type = EXI_INTEGER_32;
  101. }
  102. } else {
  103. if (iv->val.uint32 <= UINT16_MAX) {
  104. iv->type = EXI_UNSIGNED_INTEGER_16;
  105. } else {
  106. iv->type = EXI_UNSIGNED_INTEGER_32;
  107. }
  108. }
  109. break;
  110. case 5: /* 35 bits */
  111. case 6: /* 42 bits */
  112. case 7: /* 49 bits */
  113. case 8: /* 56 bits */
  114. case 9: /* 63 bits */
  115. case 10: /* 70 bits */
  116. iv->val.uint64 = 0;
  117. for (k = i-1; k >= 0 ; k--) {
  118. iv->val.uint64 = (iv->val.uint64 << 7) | maskedOctets[k];
  119. }
  120. if (negative) {
  121. if (i > 9) {
  122. /* too large */
  123. return EXI_UNSUPPORTED_INTEGER_VALUE;
  124. }
  125. iv->val.int64 = (-(int64_t)(iv->val.uint64 + 1));
  126. if (iv->val.int64 <= INT32_MAX && iv->val.int64 >= INT32_MIN ) {
  127. iv->type = EXI_INTEGER_32;
  128. } else {
  129. iv->type = EXI_INTEGER_64;
  130. }
  131. } else {
  132. if (iv->val.uint64 <= UINT32_MAX) {
  133. iv->type = EXI_UNSIGNED_INTEGER_32;
  134. /* iv->val.uint32 = iv->val.uint64;*/
  135. } else {
  136. iv->type = EXI_UNSIGNED_INTEGER_64;
  137. }
  138. }
  139. break;
  140. default:
  141. errn = EXI_UNSUPPORTED_INTEGER_VALUE;
  142. break;
  143. }
  144. }
  145. return errn;
  146. }
  147. int decodeUnsignedInteger(bitstream_t* stream, exi_integer_t* iv) {
  148. return _decodeUnsignedInteger(stream, iv, 0);
  149. }
  150. int decodeUnsignedInteger16(bitstream_t* stream, uint16_t* uint16) {
  151. unsigned int mShift = 0;
  152. int errn = 0;
  153. uint8_t b = 0;
  154. *uint16 = 0;
  155. do {
  156. /* 1. Read the next octet */
  157. errn = decode(stream, &b);
  158. /* 2. Multiply the value of the unsigned number represented by the 7
  159. * least significant
  160. * bits of the octet by the current multiplier and add the result to
  161. * the current value */
  162. *uint16 = (uint16_t)(*uint16 + ((b & 127) << mShift));
  163. /* 3. Multiply the multiplier by 128 */
  164. mShift += 7;
  165. /* 4. If the most significant bit of the octet was 1, go back to step 1 */
  166. } while (errn == 0 && (b >> 7) == 1);
  167. return errn;
  168. }
  169. int decodeUnsignedInteger32(bitstream_t* stream, uint32_t* uint32) {
  170. /* 0XXXXXXX ... 1XXXXXXX 1XXXXXXX */
  171. unsigned int mShift = 0;
  172. int errn = 0;
  173. uint8_t b = 0;
  174. *uint32 = 0;
  175. do {
  176. /* 1. Read the next octet */
  177. errn = decode(stream, &b);
  178. /* 2. Multiply the value of the unsigned number represented by the 7
  179. * least significant
  180. * bits of the octet by the current multiplier and add the result to
  181. * the current value */
  182. *uint32 += (uint32_t)((b & 127) << mShift);
  183. /* 3. Multiply the multiplier by 128 */
  184. mShift += 7;
  185. /* 4. If the most significant bit of the octet was 1, go back to step 1 */
  186. } while (errn == 0 && (b >> 7) == 1);
  187. return errn;
  188. }
  189. int decodeUnsignedIntegerSizeT(bitstream_t* stream, size_t* sizeT) {
  190. int errn = 0;
  191. /* TODO is there a better way to detect the actual size of size_t */
  192. if(SIZE_MAX == UINT16_MAX) {
  193. /* 16bit */
  194. uint16_t uint16;
  195. errn = decodeUnsignedInteger16(stream, &uint16);
  196. if(errn == 0) {
  197. *sizeT = (size_t)uint16;
  198. }
  199. } else if(SIZE_MAX == UINT32_MAX) {
  200. /* 32bit */
  201. uint32_t uint32;
  202. errn = decodeUnsignedInteger32(stream, &uint32);
  203. if(errn == 0) {
  204. *sizeT = (size_t)uint32;
  205. }
  206. } else {
  207. /* 64bit */
  208. uint64_t uint64;
  209. errn = decodeUnsignedInteger64(stream, &uint64);
  210. if(errn == 0) {
  211. *sizeT = (size_t)uint64;
  212. }
  213. }
  214. return errn;
  215. }
  216. /**
  217. * Decode an arbitrary precision non negative integer using a sequence of
  218. * octets. The most significant bit of the last octet is set to zero to
  219. * indicate sequence termination. Only seven bits per octet are used to
  220. * store the integer's value.
  221. */
  222. int decodeUnsignedInteger64(bitstream_t* stream, uint64_t* uint64) {
  223. unsigned int mShift = 0;
  224. int errn = 0;
  225. uint8_t b;
  226. *uint64 = 0L;
  227. do {
  228. errn = decode(stream, &b);
  229. *uint64 += ((uint64_t) (b & 127)) << mShift;
  230. mShift += 7;
  231. } while (errn == 0 && (b >> 7) == 1);
  232. return errn;
  233. }
  234. void _reverseArray(uint8_t *array, int number) {
  235. int x, t;
  236. number--;
  237. for(x = 0; x < number; x ++, number --) {
  238. t = array[x];
  239. array[x] = array[number];
  240. array[number] = t;
  241. }
  242. }
  243. /**
  244. * Decode an arbitrary precision non negative integer using a sequence of
  245. * octets. The most significant bit of the last octet is set to zero to
  246. * indicate sequence termination. Only seven bits per octet are used to
  247. * store the integer's value.
  248. */
  249. int decodeUnsignedIntegerBig(bitstream_t* stream, size_t size, uint8_t* data, size_t* len) {
  250. int errn = 0;
  251. uint8_t b = 0;
  252. unsigned int mShift1 = 0;
  253. unsigned int mShift2 = 0;
  254. unsigned int mShift3 = 0;
  255. unsigned int mShift4 = 0;
  256. unsigned int nBytesRead = 0;
  257. unsigned int nBitsAvailable = 0;
  258. uint64_t uint64_1 = 0;
  259. uint64_t uint64_2 = 0;
  260. uint64_t uint64_3 = 0;
  261. uint64_t uint64_4 = 0;
  262. *len = 0;
  263. do {
  264. errn = decode(stream, &b);
  265. nBytesRead++;
  266. nBitsAvailable += 7;
  267. if(nBytesRead <= 8) {
  268. uint64_1 += ((uint64_t) (b & 127)) << mShift1;
  269. mShift1 += 7;
  270. } else if(nBytesRead <= 16) {
  271. uint64_2 += ((uint64_t) (b & 127)) << mShift2;
  272. mShift2 += 7;
  273. } else if(nBytesRead <= 24) {
  274. uint64_3 += ((uint64_t) (b & 127)) << mShift3;
  275. mShift3 += 7;
  276. } else if(nBytesRead <= 32) {
  277. uint64_4 += ((uint64_t) (b & 127)) << mShift4;
  278. mShift4 += 7;
  279. } else {
  280. return -1; // too large
  281. }
  282. } while (errn == 0 && (b >> 7) == 1);
  283. // shift actual data into array
  284. if(uint64_4 != 0) {
  285. // 7 octets for uint64_1
  286. data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 1
  287. uint64_1 >>= 8;
  288. data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 2
  289. uint64_1 >>= 8;
  290. data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 3
  291. uint64_1 >>= 8;
  292. data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 4
  293. uint64_1 >>= 8;
  294. data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 5
  295. uint64_1 >>= 8;
  296. data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 6
  297. uint64_1 >>= 8;
  298. data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 7
  299. // 7 octets for uint64_2
  300. data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 1
  301. uint64_2 >>= 8;
  302. data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 2
  303. uint64_2 >>= 8;
  304. data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 3
  305. uint64_2 >>= 8;
  306. data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 4
  307. uint64_2 >>= 8;
  308. data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 5
  309. uint64_2 >>= 8;
  310. data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 6
  311. uint64_2 >>= 8;
  312. data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 7
  313. // 7 octets for uint64_3
  314. data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); // 1
  315. uint64_3 >>= 8;
  316. data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); // 2
  317. uint64_3 >>= 8;
  318. data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); // 3
  319. uint64_3 >>= 8;
  320. data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); // 4
  321. uint64_3 >>= 8;
  322. data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); // 5
  323. uint64_3 >>= 8;
  324. data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); // 6
  325. uint64_3 >>= 8;
  326. data[(*len)++] = (uint8_t)(uint64_3 & 0xFF); // 7
  327. // remaining octets of uint64_4
  328. while (uint64_4 != 0 && errn == 0) {
  329. data[(*len)++] = uint64_4 & 0xFF;
  330. uint64_4 >>= 8;
  331. }
  332. } else if(uint64_3 != 0) {
  333. // 7 octets for uint64_1
  334. data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 1
  335. uint64_1 >>= 8;
  336. data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 2
  337. uint64_1 >>= 8;
  338. data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 3
  339. uint64_1 >>= 8;
  340. data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 4
  341. uint64_1 >>= 8;
  342. data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 5
  343. uint64_1 >>= 8;
  344. data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 6
  345. uint64_1 >>= 8;
  346. data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 7
  347. // 7 octets for uint64_2
  348. data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 1
  349. uint64_2 >>= 8;
  350. data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 2
  351. uint64_2 >>= 8;
  352. data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 3
  353. uint64_2 >>= 8;
  354. data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 4
  355. uint64_2 >>= 8;
  356. data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 5
  357. uint64_2 >>= 8;
  358. data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 6
  359. uint64_2 >>= 8;
  360. data[(*len)++] = (uint8_t)(uint64_2 & 0xFF); // 7
  361. // remaining octets of uint64_3
  362. while (uint64_3 != 0 && errn == 0) {
  363. data[(*len)++] = uint64_3 & 0xFF;
  364. uint64_3 >>= 8;
  365. }
  366. } else if(uint64_2 != 0) {
  367. // 7 octets for uint64_1
  368. data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 1
  369. uint64_1 >>= 8;
  370. data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 2
  371. uint64_1 >>= 8;
  372. data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 3
  373. uint64_1 >>= 8;
  374. data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 4
  375. uint64_1 >>= 8;
  376. data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 5
  377. uint64_1 >>= 8;
  378. data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 6
  379. uint64_1 >>= 8;
  380. data[(*len)++] = (uint8_t)(uint64_1 & 0xFF); // 7
  381. // remaining octets of uint64_2
  382. while (uint64_2 != 0 && errn == 0) {
  383. data[(*len)++] = uint64_2 & 0xFF;
  384. uint64_2 >>= 8;
  385. }
  386. } else if(uint64_1 != 0) {
  387. while (uint64_1 != 0 && errn == 0) {
  388. data[(*len)++] = uint64_1 & 0xFF;
  389. uint64_1 >>= 8;
  390. }
  391. }
  392. _reverseArray(data, *len);
  393. return errn;
  394. }
  395. int decodeInteger(bitstream_t* stream, exi_integer_t* iv) {
  396. int b;
  397. int errn = decodeBoolean(stream, &b);
  398. if (errn == 0) {
  399. errn = _decodeUnsignedInteger(stream, iv, b);
  400. }
  401. return errn;
  402. }
  403. /**
  404. * Decode an arbitrary precision integer using a sign bit followed by a
  405. * sequence of octets. The most significant bit of the last octet is set to
  406. * zero to indicate sequence termination. Only seven bits per octet are used
  407. * to store the integer's value.
  408. */
  409. int decodeInteger16(bitstream_t* stream, int16_t* int16) {
  410. int b;
  411. uint16_t uint16;
  412. int errn = decodeBoolean(stream, &b);
  413. if (errn == 0) {
  414. if (b) {
  415. /* For negative values, the Unsigned Integer holds the
  416. * magnitude of the value minus 1 */
  417. errn = decodeUnsignedInteger16(stream, &uint16);
  418. *int16 = (int16_t)(-(uint16 + 1));
  419. } else {
  420. /* positive */
  421. errn = decodeUnsignedInteger16(stream, &uint16);
  422. *int16 = (int16_t)(uint16);
  423. }
  424. }
  425. return errn;
  426. }
  427. /**
  428. * Decode an arbitrary precision integer using a sign bit followed by a
  429. * sequence of octets. The most significant bit of the last octet is set to
  430. * zero to indicate sequence termination. Only seven bits per octet are used
  431. * to store the integer's value.
  432. */
  433. int decodeInteger32(bitstream_t* stream, int32_t* int32) {
  434. int b;
  435. uint32_t uint32;
  436. int errn = decodeBoolean(stream, &b);
  437. if (errn == 0) {
  438. if (b) {
  439. /* For negative values, the Unsigned Integer holds the
  440. * magnitude of the value minus 1 */
  441. errn = decodeUnsignedInteger32(stream, &uint32);
  442. *int32 = (-(int32_t)(uint32 + 1));
  443. } else {
  444. /* positive */
  445. errn = decodeUnsignedInteger32(stream, &uint32);
  446. *int32 = (int32_t)(uint32);
  447. }
  448. }
  449. return errn;
  450. }
  451. /**
  452. * Decode an arbitrary precision integer using a sign bit followed by a
  453. * sequence of octets. The most significant bit of the last octet is set to
  454. * zero to indicate sequence termination. Only seven bits per octet are used
  455. * to store the integer's value.
  456. */
  457. int decodeInteger64(bitstream_t* stream, int64_t* int64) {
  458. int b;
  459. uint64_t uint64;
  460. int errn = decodeBoolean(stream, &b);
  461. if (errn == 0) {
  462. if (b) {
  463. /* For negative values, the Unsigned Integer holds the
  464. * magnitude of the value minus 1 */
  465. errn = decodeUnsignedInteger64(stream, &uint64);
  466. *int64 = (-(int64_t)(uint64 + 1));
  467. } else {
  468. /* positive */
  469. errn = decodeUnsignedInteger64(stream, &uint64);
  470. *int64 = (int64_t)(uint64);
  471. }
  472. }
  473. return errn;
  474. }
  475. /**
  476. * Decode an arbitrary precision integer using a sign bit followed by a
  477. * sequence of octets. The most significant bit of the last octet is set to
  478. * zero to indicate sequence termination. Only seven bits per octet are used
  479. * to store the integer's value.
  480. */
  481. int decodeIntegerBig(bitstream_t* stream, int* negative, size_t size, uint8_t* data, size_t* len) {
  482. int errn = decodeBoolean(stream, negative);
  483. if (errn == 0) {
  484. if (*negative) {
  485. /* For negative values, the Unsigned Integer holds the
  486. * magnitude of the value minus 1 */
  487. } else {
  488. /* positive */
  489. }
  490. errn = decodeUnsignedIntegerBig(stream, size, data, len);
  491. }
  492. return errn;
  493. }
  494. /**
  495. * Decode a Float datatype as two consecutive Integers.
  496. * The first Integer represents the mantissa of the floating point
  497. * number and the second Integer represents the base-10 exponent
  498. * of the floating point number.
  499. */
  500. int decodeFloat(bitstream_t* stream, exi_float_me_t* f) {
  501. int errn = decodeInteger64(stream, &f->mantissa);
  502. if (errn == 0) {
  503. errn = decodeInteger16(stream, &f->exponent);
  504. }
  505. return errn;
  506. }
  507. /**
  508. * Decode a decimal represented as a Boolean sign followed by two Unsigned
  509. * Integers. A sign value of zero (0) is used to represent positive Decimal
  510. * values and a sign value of one (1) is used to represent negative Decimal
  511. * values The first Integer represents the integral portion of the Decimal
  512. * value. The second positive integer represents the fractional portion of
  513. * the decimal with the digits in reverse order to preserve leading zeros.
  514. */
  515. int decodeDecimal(bitstream_t* stream, exi_decimal_t* d) {
  516. int errn = decodeBoolean(stream, &d->negative);
  517. if (errn == 0) {
  518. errn = decodeUnsignedInteger(stream, &d->integral);
  519. if (errn == 0) {
  520. errn = decodeUnsignedInteger(stream, &d->reverseFraction);
  521. }
  522. }
  523. return errn;
  524. }
  525. /**
  526. * Decode a sequence of characters for a given length.
  527. */
  528. int decodeStringOnly(bitstream_t* stream, size_t len, exi_string_t* s) {
  529. int errn = 0;
  530. unsigned int extraChar = 0;
  531. #if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
  532. extraChar = 1; /* null terminator */
  533. #endif /* STRING_REPRESENTATION_ASCII */
  534. if ( (len + extraChar) > s->size) {
  535. #if MEMORY_ALLOCATION == STATIC_ALLOCATION
  536. errn = EXI_ERROR_OUT_OF_STRING_BUFFER;
  537. #endif /* STATIC_ALLOCATION */
  538. #if MEMORY_ALLOCATION == DYNAMIC_ALLOCATION
  539. if(s->size > 0) {
  540. errn = exiFreeDynamicStringMemory(s);
  541. if(errn) {
  542. return errn;
  543. }
  544. }
  545. errn = exiAllocateDynamicStringMemory(s, (len + extraChar)); /*s->len*/
  546. #endif /* DYNAMIC_ALLOCATION */
  547. }
  548. if(errn == 0) {
  549. errn = decodeCharacters(stream, len, s->characters, s->size);
  550. s->len = len;
  551. }
  552. return errn;
  553. }
  554. /**
  555. * Decode a length prefixed sequence of characters.
  556. */
  557. int decodeString(bitstream_t* stream, exi_string_t* s) {
  558. int errn = decodeUnsignedIntegerSizeT(stream, &s->len);
  559. if (errn == 0) {
  560. errn = decodeStringOnly(stream, s->len, s);
  561. }
  562. return errn;
  563. }
  564. /**
  565. * Decode a sequence of characters according to a given length.
  566. * Each character is represented by its UCS [ISO/IEC 10646]
  567. * code point encoded as an Unsigned Integer
  568. */
  569. int decodeCharacters(bitstream_t* stream, size_t len, exi_string_character_t* chars, size_t charsSize) {
  570. unsigned int i;
  571. int errn = 0;
  572. unsigned int extraChar = 0;
  573. #if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
  574. extraChar = 1; /* null terminator */
  575. #endif /* STRING_REPRESENTATION_ASCII */
  576. if ( (len + extraChar) > charsSize) {
  577. errn = EXI_ERROR_OUT_OF_STRING_BUFFER;
  578. return errn;
  579. }
  580. #if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
  581. uint8_t b;
  582. for (i = 0; i < len && errn == 0; i++) {
  583. errn = decode(stream, &b);
  584. if(b < 128) {
  585. chars[i] = (exi_string_character_t)b;
  586. } else {
  587. errn = EXI_ERROR_STRINGVALUES_CHARACTER;
  588. }
  589. }
  590. /* null terminator \0 */
  591. chars[i] = '\0';
  592. #endif /* STRING_REPRESENTATION_ASCII */
  593. #if STRING_REPRESENTATION == STRING_REPRESENTATION_UCS
  594. for (i = 0; i < len && errn == 0; i++) {
  595. errn = decodeUnsignedInteger32(stream, &chars[i]);
  596. }
  597. #endif /* STRING_REPRESENTATION_UCS */
  598. return errn;
  599. }
  600. int decodeRCSCharacters(bitstream_t* stream, size_t len, exi_string_character_t* chars, size_t charsSize, size_t rcsCodeLength, size_t rcsSize, const exi_string_character_t rcsSet[]) {
  601. unsigned int i;
  602. int errn = 0;
  603. uint32_t uint32;
  604. unsigned int extraChar = 0;
  605. #if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
  606. uint8_t b;
  607. extraChar = 1; /* null terminator */
  608. #endif /* STRING_REPRESENTATION_ASCII */
  609. if ( (len + extraChar) > charsSize) {
  610. errn = EXI_ERROR_OUT_OF_STRING_BUFFER;
  611. return errn;
  612. }
  613. for (i = 0; i < len && errn == 0; i++) {
  614. errn = decodeNBitUnsignedInteger(stream, rcsCodeLength, &uint32);
  615. if(errn == 0) {
  616. if ( uint32 == rcsSize ) {
  617. /* RCS deviation */
  618. #if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
  619. errn = decode(stream, &b);
  620. if(b < 128) {
  621. chars[i] = (exi_string_character_t)b;
  622. } else {
  623. errn = EXI_ERROR_STRINGVALUES_CHARACTER;
  624. }
  625. #endif /* STRING_REPRESENTATION_ASCII */
  626. #if STRING_REPRESENTATION == STRING_REPRESENTATION_UCS
  627. errn = decodeUnsignedInteger32(stream, &chars[i]);
  628. #endif /* STRING_REPRESENTATION_UCS */
  629. } else {
  630. /* RCS match */
  631. #if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
  632. chars[i] = rcsSet[uint32];
  633. #endif /* STRING_REPRESENTATION_ASCII */
  634. #if STRING_REPRESENTATION == STRING_REPRESENTATION_UCS
  635. chars[i] = rcsSet[uint32];
  636. #endif /* STRING_REPRESENTATION_UCS */
  637. }
  638. }
  639. }
  640. return errn;
  641. }
  642. /**
  643. * Decode a binary value as a length-prefixed sequence of octets.
  644. */
  645. int decodeBinary(bitstream_t* stream, exi_bytes_t* bytes) {
  646. int errn = decodeUnsignedIntegerSizeT(stream, &bytes->len);
  647. if (errn == 0) {
  648. if (bytes->len > bytes->size) {
  649. #if MEMORY_ALLOCATION == STATIC_ALLOCATION
  650. errn = EXI_ERROR_OUT_OF_BYTE_BUFFER;
  651. #endif /* STATIC_ALLOCATION */
  652. #if MEMORY_ALLOCATION == DYNAMIC_ALLOCATION
  653. errn = exiFreeDynamicBinaryMemory(bytes);
  654. if(errn == 0) {
  655. errn = exiAllocateDynamicBinaryMemory(bytes, bytes->len);
  656. }
  657. #endif /* DYNAMIC_ALLOCATION */
  658. }
  659. errn = decodeBytes(stream, bytes->len, bytes->data);
  660. }
  661. return errn;
  662. }
  663. int decodeBytes(bitstream_t* stream, size_t len, uint8_t* data) {
  664. unsigned int i;
  665. int errn = 0;
  666. uint8_t b = 0;
  667. for (i = 0; i < len && errn == 0; i++) {
  668. errn = decode(stream, &b);
  669. data[i] = (uint8_t)b;
  670. }
  671. return errn;
  672. }
  673. /**
  674. * Decode Date-Time as sequence of values representing the individual
  675. * components of the Date-Time.
  676. */
  677. int decodeDateTime(bitstream_t* stream, exi_datetime_type_t type, exi_datetime_t* datetime) {
  678. int errn = 0;
  679. datetime->type = type;
  680. datetime->year = 0;
  681. datetime->monthDay = 0;
  682. datetime->time = 0;
  683. datetime->presenceFractionalSecs = 0;
  684. datetime->fractionalSecs = 0;
  685. datetime->presenceTimezone = 0;
  686. datetime->timezone = 0;
  687. switch (type) {
  688. case EXI_DATETIME_GYEAR: /* Year, [Time-Zone] */
  689. errn = decodeInteger32(stream, &datetime->year);
  690. if (errn == 0) {
  691. datetime->year += DATETIME_YEAR_OFFSET;
  692. }
  693. break;
  694. case EXI_DATETIME_GYEARMONTH: /* Year, MonthDay, [TimeZone] */
  695. case EXI_DATETIME_DATE:
  696. errn = decodeInteger32(stream, &datetime->year);
  697. if (errn == 0) {
  698. datetime->year += DATETIME_YEAR_OFFSET;
  699. errn = decodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_MONTHDAY, &datetime->monthDay);
  700. }
  701. break;
  702. case EXI_DATETIME_DATETIME: /* Year, MonthDay, Time, [FractionalSecs], [TimeZone] */
  703. /* e.g. "0001-01-01T00:00:00.111+00:33" */
  704. errn = decodeInteger32(stream, &datetime->year);
  705. if (errn == 0) {
  706. datetime->year += DATETIME_YEAR_OFFSET;
  707. errn = decodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_MONTHDAY, &datetime->monthDay);
  708. if (errn != 0) {
  709. break;
  710. }
  711. }
  712. /* no break */
  713. case EXI_DATETIME_TIME: /* Time, [FractionalSecs], [TimeZone] */
  714. /* e.g. "12:34:56.135" */
  715. errn = decodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_TIME, &datetime->time);
  716. if (errn == 0) {
  717. errn = decodeBoolean(stream, &datetime->presenceFractionalSecs);
  718. if (errn == 0) {
  719. if (datetime->presenceFractionalSecs) {
  720. errn = decodeUnsignedInteger32(stream, &datetime->fractionalSecs);
  721. }
  722. }
  723. }
  724. break;
  725. case EXI_DATETIME_GMONTH: /* MonthDay, [TimeZone] */
  726. /* e.g. "--12" */
  727. case EXI_DATETIME_GMONTHDAY: /* MonthDay, [TimeZone] */
  728. /* e.g. "--01-28" */
  729. case EXI_DATETIME_GDAY: /* MonthDay, [TimeZone] */
  730. /* "---16" */
  731. errn = decodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_MONTHDAY, &datetime->monthDay );
  732. break;
  733. default:
  734. errn = EXI_UNSUPPORTED_DATETIME_TYPE;
  735. break;
  736. }
  737. if(errn == 0) {
  738. errn = decodeBoolean(stream, &datetime->presenceTimezone );
  739. if (errn == 0 && datetime->presenceTimezone) {
  740. errn = decodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_TIMEZONE, &datetime->timezone);
  741. datetime->timezone -= DATETIME_TIMEZONE_OFFSET_IN_MINUTES;
  742. }
  743. }
  744. return errn;
  745. }
  746. int decode(bitstream_t* stream, uint8_t* b) {
  747. #if EXI_OPTION_ALIGNMENT == BIT_PACKED
  748. uint32_t bb;
  749. int errn = readBits(stream, 8, &bb);
  750. if (errn == 0) {
  751. if (bb > 256) {
  752. errn = EXI_ERROR_UNEXPECTED_BYTE_VALUE;
  753. } else {
  754. *b = (uint8_t)bb;
  755. }
  756. }
  757. return errn;
  758. #endif /* EXI_OPTION_ALIGNMENT == BIT_PACKED */
  759. #if EXI_OPTION_ALIGNMENT == BYTE_ALIGNMENT
  760. int errn = 0;
  761. #if EXI_STREAM == BYTE_ARRAY
  762. if ( (*stream->pos) < stream->size ) {
  763. *b = stream->data[(*stream->pos)++];
  764. } else {
  765. errn = EXI_ERROR_INPUT_STREAM_EOF;
  766. }
  767. #endif /* EXI_STREAM == BYTE_ARRAY */
  768. #if EXI_STREAM == FILE_STREAM
  769. *b = (uint8_t)(getc(stream->file));
  770. /* EOF cannot be used, 0xFF valid value */
  771. if ( feof(stream->file) || ferror(stream->file) ) {
  772. errn = EXI_ERROR_INPUT_STREAM_EOF;
  773. }
  774. #endif /* EXI_STREAM == FILE_STREAM */
  775. return errn;
  776. #endif /* EXI_OPTION_ALIGNMENT == BYTE_ALIGNMENT */
  777. }
  778. int decodeBoolean(bitstream_t* stream, int* b) {
  779. #if EXI_OPTION_ALIGNMENT == BIT_PACKED
  780. uint32_t ub;
  781. int errn = readBits(stream, 1, &ub);
  782. *b = (ub == 0) ? 0 : 1;
  783. return errn;
  784. #endif /* EXI_OPTION_ALIGNMENT == BIT_PACKED */
  785. #if EXI_OPTION_ALIGNMENT == BYTE_ALIGNMENT
  786. uint8_t bb;
  787. int errn = decode(stream, &bb);
  788. *b = (bb == 0) ? 0 : 1;
  789. return errn;
  790. #endif /* EXI_OPTION_ALIGNMENT == BYTE_ALIGNMENT */
  791. }
  792. /**
  793. * Decodes and returns an n-bit unsigned integer using the minimum number of
  794. * bytes required for n bits.
  795. */
  796. int decodeNBitUnsignedInteger(bitstream_t* stream, size_t nbits, uint32_t* uint32) {
  797. #if EXI_OPTION_ALIGNMENT == BIT_PACKED
  798. int errn = 0;
  799. if (nbits == 0) {
  800. *uint32 = 0;
  801. } else {
  802. errn= readBits(stream, nbits, uint32);
  803. }
  804. return errn;
  805. #endif /* EXI_OPTION_ALIGNMENT == BIT_PACKED */
  806. #if EXI_OPTION_ALIGNMENT == BYTE_ALIGNMENT
  807. size_t bitsRead = 0;
  808. uint8_t b;
  809. int errn = 0;
  810. *uint32 = 0;
  811. while (errn == 0 && bitsRead < nbits) {
  812. errn = decode(stream, &b);
  813. *uint32 = *uint32 + (uint32_t)(b << bitsRead);
  814. bitsRead = (bitsRead + 8);
  815. }
  816. return errn;
  817. #endif /* EXI_OPTION_ALIGNMENT == BYTE_ALIGNMENT */
  818. }
  819. #endif