%% options copyright owner = Dirk Krause copyright year = 2015-xxxx license = bsd %% header /** @file 32 bit character decoding. CRT on Windows: Not used. */ #ifndef DK4CONF_H_INCLUDED #include "dk4conf.h" #endif #ifndef DK4TYPES_H_INCLUDED #include "dk4types.h" #endif /** Decoder structure to build a 32 bit character from 4 4 4 4 bytes. */ typedef struct { dk4_c32_t val; /**< Value constructed from the bytes. */ int msb; /**< Flag: First byte is MSB. */ int nb; /**< Number of next byte. */ } dk4_c32_byte_decoder_t; #ifdef __cplusplus extern "C" { #endif /** Initialize the decoder. @param ptr Decoder to initialize. @param msb Flag: Most significant byte first. */ void dk4c32_decoder_init(dk4_c32_byte_decoder_t *ptr, int msb); /** Add one byte to the decoder. @param ptr @param inbyte @return DK4_EDSTM_ACCEPT if the byte was added to the internal decoder state (no action necessary) or DK4_EDSTM_FINISHED if one output was finished (use dk4c32_decoder_get() to obtain the value). */ int dk4c32_decoder_add(dk4_c32_byte_decoder_t *ptr, unsigned char inbyte); /** Retrieve output value. @param ptr Decoder to retrieve value from. @return Output produced by the decoder. */ dk4_c32_t dk4c32_decoder_get(dk4_c32_byte_decoder_t *ptr); /** Check whether the decoder is empty (nothing is stored in the internal state). @param ptr Decoder to check. @return 1 on success (decoder empty), 0 otherwise. */ int dk4c32_decoder_is_empty(dk4_c32_byte_decoder_t *ptr); #ifdef __cplusplus } #endif %% module #include "dk4c32.h" #ifndef DK4EDSTM_H_INCLUDED #include "dk4edstm.h" #endif #if DK4_HAVE_STDLIB_H #ifndef STDLIB_H_INCLUDED #include #define STDLIB_H_INCLUDED 1 #endif #else #ifndef STDIO_H_INCLUDED #include #define STDIO_H_INCLUDED 1 #endif #endif void dk4c32_decoder_init(dk4_c32_byte_decoder_t *ptr, int msb) { if (NULL != ptr) { ptr->val = (dk4_c32_t)0UL; ptr->msb = msb; ptr->nb = 0; } } int dk4c32_decoder_add(dk4_c32_byte_decoder_t *ptr, unsigned char inbyte) { int back = DK4_EDSTM_ERROR; if (NULL != ptr) { switch (ptr->nb) { case 3: { if (ptr->msb) { ptr->val |= (dkC32(0x000000FF) & ((dk4_c32_t)inbyte)); } else { ptr->val |= (dkC32(0xFF000000) & (((dk4_c32_t)inbyte) << 24)); } ptr->nb = 0; back = DK4_EDSTM_FINISHED; } break; case 2: { if (ptr->msb) { ptr->val |= (dkC32(0x0000FF00) & (((dk4_c32_t)inbyte) << 8)); } else { ptr->val |= (dkC32(0x00FF0000) & (((dk4_c32_t)inbyte) << 16)); } ptr->nb = 3; back = DK4_EDSTM_ACCEPT; } break; case 1: { if (ptr->msb) { ptr->val |= (dkC32(0x00FF0000) & (((dk4_c32_t)inbyte) << 16)); } else { ptr->val |= (dkC32(0x0000FF00) & (((dk4_c32_t)inbyte) << 8)); } ptr->nb = 2; back = DK4_EDSTM_ACCEPT; } break; default: { if (ptr->msb) { ptr->val = (dkC32(0xFF000000) & (((dk4_c32_t)inbyte) << 24)); } else { ptr->val = (dkC32(0x000000FF) & ((dk4_c32_t)inbyte)); } ptr->nb = 1; back = DK4_EDSTM_ACCEPT; } break; } } return back; } dk4_c32_t dk4c32_decoder_get(dk4_c32_byte_decoder_t *ptr) { dk4_c32_t back = (dk4_c32_t)0UL; if (NULL != ptr) { back = ptr->val; } return back; } int dk4c32_decoder_is_empty(dk4_c32_byte_decoder_t *ptr) { int back = 0; if (NULL != ptr) { if (0 == ptr->nb) { back = 1; } } return back; }