diff options
Diffstat (limited to 'py/binary.c')
-rw-r--r-- | py/binary.c | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/py/binary.c b/py/binary.c new file mode 100644 index 0000000000..a738dd62a9 --- /dev/null +++ b/py/binary.c @@ -0,0 +1,96 @@ +#include <stdlib.h> +#include <stdint.h> +#include <assert.h> + +#include "misc.h" +#include "mpconfig.h" +#include "qstr.h" +#include "obj.h" +#include "objint.h" +#include "binary.h" + +// Helpers to work with binary-encoded data + +mp_obj_t mp_binary_get_val(char typecode, void *p, int index) { + int val = 0; + switch (typecode) { + case 'b': + val = ((int8_t*)p)[index]; + break; + case BYTEARRAY_TYPECODE: + case 'B': + val = ((uint8_t*)p)[index]; + break; + case 'h': + val = ((int16_t*)p)[index]; + break; + case 'H': + val = ((uint16_t*)p)[index]; + break; + case 'i': + case 'l': + return mp_obj_new_int(((int32_t*)p)[index]); + case 'I': + case 'L': + return mp_obj_new_int_from_uint(((uint32_t*)p)[index]); +#if MICROPY_LONGINT_IMPL != MICROPY_LONGINT_IMPL_NONE + case 'q': + case 'Q': + // TODO: Explode API more to cover signedness + return mp_obj_new_int_from_ll(((long long*)p)[index]); +#endif +#if MICROPY_ENABLE_FLOAT + case 'f': + return mp_obj_new_float(((float*)p)[index]); + case 'd': + return mp_obj_new_float(((double*)p)[index]); +#endif + } + return MP_OBJ_NEW_SMALL_INT(val); +} + +void mp_binary_set_val(char typecode, void *p, int index, mp_obj_t val_in) { + machine_int_t val = 0; + if (MP_OBJ_IS_INT(val_in)) { + val = mp_obj_int_get(val_in); + } + + switch (typecode) { + case 'b': + ((int8_t*)p)[index] = val; + break; + case BYTEARRAY_TYPECODE: + case 'B': + val = ((uint8_t*)p)[index] = val; + break; + case 'h': + val = ((int16_t*)p)[index] = val; + break; + case 'H': + val = ((uint16_t*)p)[index] = val; + break; + case 'i': + case 'l': + ((int32_t*)p)[index] = val; + break; + case 'I': + case 'L': + ((uint32_t*)p)[index] = val; + break; +#if MICROPY_LONGINT_IMPL != MICROPY_LONGINT_IMPL_NONE + case 'q': + case 'Q': + assert(0); + ((long long*)p)[index] = val; + break; +#endif +#if MICROPY_ENABLE_FLOAT + case 'f': + ((float*)p)[index] = mp_obj_float_get(val_in); + break; + case 'd': + ((double*)p)[index] = mp_obj_float_get(val_in); + break; +#endif + } +} |