123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930 |
- #include "DecoderChannel.h"
- #include "EXIConfig.h"
- #include "EXIOptions.h"
- #include "BitInputStream.h"
- #include "EXITypes.h"
- #include "MethodsBag.h"
- #include "ErrorCodes.h"
- #if MEMORY_ALLOCATION == DYNAMIC_ALLOCATION
- #include "DynamicMemory.h"
- #endif
- #ifndef DECODER_CHANNEL_C
- #define DECODER_CHANNEL_C
- #define MAX_OCTETS_FOR_UNSIGNED_INTEGER_64 10
- #define MAX_OCTETS_FOR_UNSIGNED_INTEGER_32 5
- static uint8_t maskedOctets[MAX_OCTETS_FOR_UNSIGNED_INTEGER_64];
- static int _decodeUnsignedInteger(bitstream_t* stream, exi_integer_t* iv, int negative) {
- int errn = 0;
- int i = 0;
- uint8_t b;
- int k;
- do {
-
- errn = decode(stream, &b);
- if (errn == 0) {
- if(i < MAX_OCTETS_FOR_UNSIGNED_INTEGER_64) {
-
- maskedOctets[i++] = (b & 127);
- } else {
- errn = EXI_UNSUPPORTED_INTEGER_VALUE;
- }
- }
- } while( errn == 0 && b >= 128 );
- if ( errn == 0 ) {
-
- switch(i) {
- case 1:
- if (negative) {
- iv->val.int8 = (int8_t)(-( b + 1));
- iv->type = EXI_INTEGER_8;
- } else {
- iv->val.uint8 = b;
- iv->type = EXI_UNSIGNED_INTEGER_8;
- }
- break;
- case 2:
- iv->val.uint16 = 0;
- for (k = i-1; k >= 0 ; k--) {
- iv->val.uint16 = (uint16_t)((iv->val.uint16 << 7) | maskedOctets[k]);
- }
- if (negative) {
- iv->val.int16 = (int16_t)( -( iv->val.uint16 + 1 ));
- iv->type = EXI_INTEGER_16;
- } else {
- iv->type = EXI_UNSIGNED_INTEGER_16;
- }
- break;
- case 3:
- case 4:
- iv->val.uint32 = 0;
- for (k = i-1; k >= 0 ; k--) {
- iv->val.uint32 = (iv->val.uint32 << 7) | maskedOctets[k];
- }
- if (negative) {
- iv->val.int32 = (-(int32_t)(iv->val.uint32 + 1));
- if (iv->val.int32 <= INT16_MAX && iv->val.int32 >= INT16_MIN ) {
- iv->type = EXI_INTEGER_16;
- } else {
- iv->type = EXI_INTEGER_32;
- }
- } else {
- if (iv->val.uint32 <= UINT16_MAX) {
- iv->type = EXI_UNSIGNED_INTEGER_16;
- } else {
- iv->type = EXI_UNSIGNED_INTEGER_32;
- }
- }
- break;
- case 5:
- case 6:
- case 7:
- case 8:
- case 9:
- case 10:
- iv->val.uint64 = 0;
- for (k = i-1; k >= 0 ; k--) {
- iv->val.uint64 = (iv->val.uint64 << 7) | maskedOctets[k];
- }
- if (negative) {
- if (i > 9) {
-
- return EXI_UNSUPPORTED_INTEGER_VALUE;
- }
- iv->val.int64 = (-(int64_t)(iv->val.uint64 + 1));
- if (iv->val.int64 <= INT32_MAX && iv->val.int64 >= INT32_MIN ) {
- iv->type = EXI_INTEGER_32;
- } else {
- iv->type = EXI_INTEGER_64;
- }
- } else {
- if (iv->val.uint64 <= UINT32_MAX) {
- iv->type = EXI_UNSIGNED_INTEGER_32;
-
- } else {
- iv->type = EXI_UNSIGNED_INTEGER_64;
- }
- }
- break;
- default:
- errn = EXI_UNSUPPORTED_INTEGER_VALUE;
- break;
- }
- }
- return errn;
- }
- int decodeUnsignedInteger(bitstream_t* stream, exi_integer_t* iv) {
- return _decodeUnsignedInteger(stream, iv, 0);
- }
- int decodeUnsignedInteger16(bitstream_t* stream, uint16_t* uint16) {
- unsigned int mShift = 0;
- int errn = 0;
- uint8_t b = 0;
- *uint16 = 0;
- do {
-
- errn = decode(stream, &b);
-
- *uint16 = (uint16_t)(*uint16 + ((b & 127) << mShift));
-
- mShift += 7;
-
- } while (errn == 0 && (b >> 7) == 1);
- return errn;
- }
- int decodeUnsignedInteger32(bitstream_t* stream, uint32_t* uint32) {
-
- unsigned int mShift = 0;
- int errn = 0;
- uint8_t b = 0;
- *uint32 = 0;
- do {
-
- errn = decode(stream, &b);
-
- *uint32 += (uint32_t)((b & 127) << mShift);
-
- mShift += 7;
-
- } while (errn == 0 && (b >> 7) == 1);
- return errn;
- }
- int decodeUnsignedIntegerSizeT(bitstream_t* stream, size_t* sizeT) {
- int errn = 0;
-
- if(SIZE_MAX == UINT16_MAX) {
-
- uint16_t uint16;
- errn = decodeUnsignedInteger16(stream, &uint16);
- if(errn == 0) {
- *sizeT = (size_t)uint16;
- }
- } else if(SIZE_MAX == UINT32_MAX) {
-
- uint32_t uint32;
- errn = decodeUnsignedInteger32(stream, &uint32);
- if(errn == 0) {
- *sizeT = (size_t)uint32;
- }
- } else {
-
- uint64_t uint64;
- errn = decodeUnsignedInteger64(stream, &uint64);
- if(errn == 0) {
- *sizeT = (size_t)uint64;
- }
- }
- return errn;
- }
- int decodeUnsignedInteger64(bitstream_t* stream, uint64_t* uint64) {
- unsigned int mShift = 0;
- int errn = 0;
- uint8_t b;
- *uint64 = 0L;
- do {
- errn = decode(stream, &b);
- *uint64 += ((uint64_t) (b & 127)) << mShift;
- mShift += 7;
- } while (errn == 0 && (b >> 7) == 1);
- return errn;
- }
- void _reverseArray(uint8_t *array, int number) {
- int x, t;
- number--;
- for(x = 0; x < number; x ++, number --) {
- t = array[x];
- array[x] = array[number];
- array[number] = t;
- }
- }
- int decodeUnsignedIntegerBig(bitstream_t* stream, size_t size, uint8_t* data, size_t* len) {
- int errn = 0;
- uint8_t b = 0;
- unsigned int mShift1 = 0;
- unsigned int mShift2 = 0;
- unsigned int mShift3 = 0;
- unsigned int mShift4 = 0;
- unsigned int nBytesRead = 0;
- unsigned int nBitsAvailable = 0;
- uint64_t uint64_1 = 0;
- uint64_t uint64_2 = 0;
- uint64_t uint64_3 = 0;
- uint64_t uint64_4 = 0;
- *len = 0;
- do {
- errn = decode(stream, &b);
- nBytesRead++;
- nBitsAvailable += 7;
- if(nBytesRead <= 8) {
- uint64_1 += ((uint64_t) (b & 127)) << mShift1;
- mShift1 += 7;
- } else if(nBytesRead <= 16) {
- uint64_2 += ((uint64_t) (b & 127)) << mShift2;
- mShift2 += 7;
- } else if(nBytesRead <= 24) {
- uint64_3 += ((uint64_t) (b & 127)) << mShift3;
- mShift3 += 7;
- } else if(nBytesRead <= 32) {
- uint64_4 += ((uint64_t) (b & 127)) << mShift4;
- mShift4 += 7;
- } else {
- return -1;
- }
- } while (errn == 0 && (b >> 7) == 1);
-
- if(uint64_4 != 0) {
-
- data[(*len)++] = (uint8_t)(uint64_1 & 0xFF);
- uint64_1 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_1 & 0xFF);
- uint64_1 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_1 & 0xFF);
- uint64_1 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_1 & 0xFF);
- uint64_1 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_1 & 0xFF);
- uint64_1 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_1 & 0xFF);
- uint64_1 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_1 & 0xFF);
-
- data[(*len)++] = (uint8_t)(uint64_2 & 0xFF);
- uint64_2 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_2 & 0xFF);
- uint64_2 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_2 & 0xFF);
- uint64_2 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_2 & 0xFF);
- uint64_2 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_2 & 0xFF);
- uint64_2 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_2 & 0xFF);
- uint64_2 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_2 & 0xFF);
-
- data[(*len)++] = (uint8_t)(uint64_3 & 0xFF);
- uint64_3 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_3 & 0xFF);
- uint64_3 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_3 & 0xFF);
- uint64_3 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_3 & 0xFF);
- uint64_3 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_3 & 0xFF);
- uint64_3 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_3 & 0xFF);
- uint64_3 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_3 & 0xFF);
-
- while (uint64_4 != 0 && errn == 0) {
- data[(*len)++] = uint64_4 & 0xFF;
- uint64_4 >>= 8;
- }
- } else if(uint64_3 != 0) {
-
- data[(*len)++] = (uint8_t)(uint64_1 & 0xFF);
- uint64_1 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_1 & 0xFF);
- uint64_1 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_1 & 0xFF);
- uint64_1 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_1 & 0xFF);
- uint64_1 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_1 & 0xFF);
- uint64_1 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_1 & 0xFF);
- uint64_1 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_1 & 0xFF);
-
- data[(*len)++] = (uint8_t)(uint64_2 & 0xFF);
- uint64_2 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_2 & 0xFF);
- uint64_2 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_2 & 0xFF);
- uint64_2 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_2 & 0xFF);
- uint64_2 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_2 & 0xFF);
- uint64_2 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_2 & 0xFF);
- uint64_2 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_2 & 0xFF);
-
- while (uint64_3 != 0 && errn == 0) {
- data[(*len)++] = uint64_3 & 0xFF;
- uint64_3 >>= 8;
- }
- } else if(uint64_2 != 0) {
-
- data[(*len)++] = (uint8_t)(uint64_1 & 0xFF);
- uint64_1 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_1 & 0xFF);
- uint64_1 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_1 & 0xFF);
- uint64_1 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_1 & 0xFF);
- uint64_1 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_1 & 0xFF);
- uint64_1 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_1 & 0xFF);
- uint64_1 >>= 8;
- data[(*len)++] = (uint8_t)(uint64_1 & 0xFF);
-
- while (uint64_2 != 0 && errn == 0) {
- data[(*len)++] = uint64_2 & 0xFF;
- uint64_2 >>= 8;
- }
- } else if(uint64_1 != 0) {
- while (uint64_1 != 0 && errn == 0) {
- data[(*len)++] = uint64_1 & 0xFF;
- uint64_1 >>= 8;
- }
- }
- _reverseArray(data, *len);
- return errn;
- }
- int decodeInteger(bitstream_t* stream, exi_integer_t* iv) {
- int b;
- int errn = decodeBoolean(stream, &b);
- if (errn == 0) {
- errn = _decodeUnsignedInteger(stream, iv, b);
- }
- return errn;
- }
- int decodeInteger16(bitstream_t* stream, int16_t* int16) {
- int b;
- uint16_t uint16;
- int errn = decodeBoolean(stream, &b);
- if (errn == 0) {
- if (b) {
-
- errn = decodeUnsignedInteger16(stream, &uint16);
- *int16 = (int16_t)(-(uint16 + 1));
- } else {
-
- errn = decodeUnsignedInteger16(stream, &uint16);
- *int16 = (int16_t)(uint16);
- }
- }
- return errn;
- }
- int decodeInteger32(bitstream_t* stream, int32_t* int32) {
- int b;
- uint32_t uint32;
- int errn = decodeBoolean(stream, &b);
- if (errn == 0) {
- if (b) {
-
- errn = decodeUnsignedInteger32(stream, &uint32);
- *int32 = (-(int32_t)(uint32 + 1));
- } else {
-
- errn = decodeUnsignedInteger32(stream, &uint32);
- *int32 = (int32_t)(uint32);
- }
- }
- return errn;
- }
- int decodeInteger64(bitstream_t* stream, int64_t* int64) {
- int b;
- uint64_t uint64;
- int errn = decodeBoolean(stream, &b);
- if (errn == 0) {
- if (b) {
-
- errn = decodeUnsignedInteger64(stream, &uint64);
- *int64 = (-(int64_t)(uint64 + 1));
- } else {
-
- errn = decodeUnsignedInteger64(stream, &uint64);
- *int64 = (int64_t)(uint64);
- }
- }
- return errn;
- }
- int decodeIntegerBig(bitstream_t* stream, int* negative, size_t size, uint8_t* data, size_t* len) {
- int errn = decodeBoolean(stream, negative);
- if (errn == 0) {
- if (*negative) {
-
- } else {
-
- }
- errn = decodeUnsignedIntegerBig(stream, size, data, len);
- }
- return errn;
- }
- int decodeFloat(bitstream_t* stream, exi_float_me_t* f) {
- int errn = decodeInteger64(stream, &f->mantissa);
- if (errn == 0) {
- errn = decodeInteger16(stream, &f->exponent);
- }
- return errn;
- }
- int decodeDecimal(bitstream_t* stream, exi_decimal_t* d) {
- int errn = decodeBoolean(stream, &d->negative);
- if (errn == 0) {
- errn = decodeUnsignedInteger(stream, &d->integral);
- if (errn == 0) {
- errn = decodeUnsignedInteger(stream, &d->reverseFraction);
- }
- }
- return errn;
- }
- int decodeStringOnly(bitstream_t* stream, size_t len, exi_string_t* s) {
- int errn = 0;
- unsigned int extraChar = 0;
- #if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
- extraChar = 1;
- #endif
- if ( (len + extraChar) > s->size) {
- #if MEMORY_ALLOCATION == STATIC_ALLOCATION
- errn = EXI_ERROR_OUT_OF_STRING_BUFFER;
- #endif
- #if MEMORY_ALLOCATION == DYNAMIC_ALLOCATION
- if(s->size > 0) {
- errn = exiFreeDynamicStringMemory(s);
- if(errn) {
- return errn;
- }
- }
- errn = exiAllocateDynamicStringMemory(s, (len + extraChar));
- #endif
- }
- if(errn == 0) {
- errn = decodeCharacters(stream, len, s->characters, s->size);
- s->len = len;
- }
- return errn;
- }
- int decodeString(bitstream_t* stream, exi_string_t* s) {
- int errn = decodeUnsignedIntegerSizeT(stream, &s->len);
- if (errn == 0) {
- errn = decodeStringOnly(stream, s->len, s);
- }
- return errn;
- }
- int decodeCharacters(bitstream_t* stream, size_t len, exi_string_character_t* chars, size_t charsSize) {
- unsigned int i;
- int errn = 0;
- unsigned int extraChar = 0;
- #if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
- extraChar = 1;
- #endif
- if ( (len + extraChar) > charsSize) {
- errn = EXI_ERROR_OUT_OF_STRING_BUFFER;
- return errn;
- }
- #if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
- uint8_t b;
- for (i = 0; i < len && errn == 0; i++) {
- errn = decode(stream, &b);
- if(b < 128) {
- chars[i] = (exi_string_character_t)b;
- } else {
- errn = EXI_ERROR_STRINGVALUES_CHARACTER;
- }
- }
-
- chars[i] = '\0';
- #endif
- #if STRING_REPRESENTATION == STRING_REPRESENTATION_UCS
- for (i = 0; i < len && errn == 0; i++) {
- errn = decodeUnsignedInteger32(stream, &chars[i]);
- }
- #endif
- return errn;
- }
- 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[]) {
- unsigned int i;
- int errn = 0;
- uint32_t uint32;
- unsigned int extraChar = 0;
- #if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
- uint8_t b;
- extraChar = 1;
- #endif
- if ( (len + extraChar) > charsSize) {
- errn = EXI_ERROR_OUT_OF_STRING_BUFFER;
- return errn;
- }
- for (i = 0; i < len && errn == 0; i++) {
- errn = decodeNBitUnsignedInteger(stream, rcsCodeLength, &uint32);
- if(errn == 0) {
- if ( uint32 == rcsSize ) {
-
- #if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
- errn = decode(stream, &b);
- if(b < 128) {
- chars[i] = (exi_string_character_t)b;
- } else {
- errn = EXI_ERROR_STRINGVALUES_CHARACTER;
- }
- #endif
- #if STRING_REPRESENTATION == STRING_REPRESENTATION_UCS
- errn = decodeUnsignedInteger32(stream, &chars[i]);
- #endif
- } else {
-
- #if STRING_REPRESENTATION == STRING_REPRESENTATION_ASCII
- chars[i] = rcsSet[uint32];
- #endif
- #if STRING_REPRESENTATION == STRING_REPRESENTATION_UCS
- chars[i] = rcsSet[uint32];
- #endif
- }
- }
- }
- return errn;
- }
- int decodeBinary(bitstream_t* stream, exi_bytes_t* bytes) {
- int errn = decodeUnsignedIntegerSizeT(stream, &bytes->len);
- if (errn == 0) {
- if (bytes->len > bytes->size) {
- #if MEMORY_ALLOCATION == STATIC_ALLOCATION
- errn = EXI_ERROR_OUT_OF_BYTE_BUFFER;
- #endif
- #if MEMORY_ALLOCATION == DYNAMIC_ALLOCATION
- errn = exiFreeDynamicBinaryMemory(bytes);
- if(errn == 0) {
- errn = exiAllocateDynamicBinaryMemory(bytes, bytes->len);
- }
- #endif
- }
- errn = decodeBytes(stream, bytes->len, bytes->data);
- }
- return errn;
- }
- int decodeBytes(bitstream_t* stream, size_t len, uint8_t* data) {
- unsigned int i;
- int errn = 0;
- uint8_t b = 0;
- for (i = 0; i < len && errn == 0; i++) {
- errn = decode(stream, &b);
- data[i] = (uint8_t)b;
- }
- return errn;
- }
- int decodeDateTime(bitstream_t* stream, exi_datetime_type_t type, exi_datetime_t* datetime) {
- int errn = 0;
- datetime->type = type;
- datetime->year = 0;
- datetime->monthDay = 0;
- datetime->time = 0;
- datetime->presenceFractionalSecs = 0;
- datetime->fractionalSecs = 0;
- datetime->presenceTimezone = 0;
- datetime->timezone = 0;
- switch (type) {
- case EXI_DATETIME_GYEAR:
- errn = decodeInteger32(stream, &datetime->year);
- if (errn == 0) {
- datetime->year += DATETIME_YEAR_OFFSET;
- }
- break;
- case EXI_DATETIME_GYEARMONTH:
- case EXI_DATETIME_DATE:
- errn = decodeInteger32(stream, &datetime->year);
- if (errn == 0) {
- datetime->year += DATETIME_YEAR_OFFSET;
- errn = decodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_MONTHDAY, &datetime->monthDay);
- }
- break;
- case EXI_DATETIME_DATETIME:
-
- errn = decodeInteger32(stream, &datetime->year);
- if (errn == 0) {
- datetime->year += DATETIME_YEAR_OFFSET;
- errn = decodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_MONTHDAY, &datetime->monthDay);
- if (errn != 0) {
- break;
- }
- }
-
- case EXI_DATETIME_TIME:
-
- errn = decodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_TIME, &datetime->time);
- if (errn == 0) {
- errn = decodeBoolean(stream, &datetime->presenceFractionalSecs);
- if (errn == 0) {
- if (datetime->presenceFractionalSecs) {
- errn = decodeUnsignedInteger32(stream, &datetime->fractionalSecs);
- }
- }
- }
- break;
- case EXI_DATETIME_GMONTH:
-
- case EXI_DATETIME_GMONTHDAY:
-
- case EXI_DATETIME_GDAY:
-
- errn = decodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_MONTHDAY, &datetime->monthDay );
- break;
- default:
- errn = EXI_UNSUPPORTED_DATETIME_TYPE;
- break;
- }
- if(errn == 0) {
- errn = decodeBoolean(stream, &datetime->presenceTimezone );
- if (errn == 0 && datetime->presenceTimezone) {
- errn = decodeNBitUnsignedInteger(stream, DATETIME_NUMBER_BITS_TIMEZONE, &datetime->timezone);
- datetime->timezone -= DATETIME_TIMEZONE_OFFSET_IN_MINUTES;
- }
- }
- return errn;
- }
- int decode(bitstream_t* stream, uint8_t* b) {
- #if EXI_OPTION_ALIGNMENT == BIT_PACKED
- uint32_t bb;
- int errn = readBits(stream, 8, &bb);
- if (errn == 0) {
- if (bb > 256) {
- errn = EXI_ERROR_UNEXPECTED_BYTE_VALUE;
- } else {
- *b = (uint8_t)bb;
- }
- }
- return errn;
- #endif
- #if EXI_OPTION_ALIGNMENT == BYTE_ALIGNMENT
- int errn = 0;
- #if EXI_STREAM == BYTE_ARRAY
- if ( (*stream->pos) < stream->size ) {
- *b = stream->data[(*stream->pos)++];
- } else {
- errn = EXI_ERROR_INPUT_STREAM_EOF;
- }
- #endif
- #if EXI_STREAM == FILE_STREAM
- *b = (uint8_t)(getc(stream->file));
-
- if ( feof(stream->file) || ferror(stream->file) ) {
- errn = EXI_ERROR_INPUT_STREAM_EOF;
- }
- #endif
- return errn;
- #endif
- }
- int decodeBoolean(bitstream_t* stream, int* b) {
- #if EXI_OPTION_ALIGNMENT == BIT_PACKED
- uint32_t ub;
- int errn = readBits(stream, 1, &ub);
- *b = (ub == 0) ? 0 : 1;
- return errn;
- #endif
- #if EXI_OPTION_ALIGNMENT == BYTE_ALIGNMENT
- uint8_t bb;
- int errn = decode(stream, &bb);
- *b = (bb == 0) ? 0 : 1;
- return errn;
- #endif
- }
- int decodeNBitUnsignedInteger(bitstream_t* stream, size_t nbits, uint32_t* uint32) {
- #if EXI_OPTION_ALIGNMENT == BIT_PACKED
- int errn = 0;
- if (nbits == 0) {
- *uint32 = 0;
- } else {
- errn= readBits(stream, nbits, uint32);
- }
- return errn;
- #endif
- #if EXI_OPTION_ALIGNMENT == BYTE_ALIGNMENT
- size_t bitsRead = 0;
- uint8_t b;
- int errn = 0;
- *uint32 = 0;
- while (errn == 0 && bitsRead < nbits) {
- errn = decode(stream, &b);
- *uint32 = *uint32 + (uint32_t)(b << bitsRead);
- bitsRead = (bitsRead + 8);
- }
- return errn;
- #endif
- }
- #endif
|