summaryrefslogtreecommitdiffstatshomepage
path: root/extmod/modubinascii.c
diff options
context:
space:
mode:
Diffstat (limited to 'extmod/modubinascii.c')
-rw-r--r--extmod/modubinascii.c81
1 files changed, 13 insertions, 68 deletions
diff --git a/extmod/modubinascii.c b/extmod/modubinascii.c
index c0e2c587fd..49c8d1fb97 100644
--- a/extmod/modubinascii.c
+++ b/extmod/modubinascii.c
@@ -30,78 +30,21 @@
#include "py/runtime.h"
#include "py/binary.h"
+#include "py/objstr.h"
#if MICROPY_PY_UBINASCII
-STATIC mp_obj_t mod_binascii_hexlify(size_t n_args, const mp_obj_t *args) {
- // First argument is the data to convert.
- // Second argument is an optional separator to be used between values.
- const char *sep = NULL;
- mp_buffer_info_t bufinfo;
- mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_READ);
-
- // Code below assumes non-zero buffer length when computing size with
- // separator, so handle the zero-length case here.
- if (bufinfo.len == 0) {
- return mp_const_empty_bytes;
- }
-
- vstr_t vstr;
- size_t out_len = bufinfo.len * 2;
- if (n_args > 1) {
- // 1-char separator between hex numbers
- out_len += bufinfo.len - 1;
- sep = mp_obj_str_get_str(args[1]);
- }
- vstr_init_len(&vstr, out_len);
- byte *in = bufinfo.buf, *out = (byte *)vstr.buf;
- for (mp_uint_t i = bufinfo.len; i--;) {
- byte d = (*in >> 4);
- if (d > 9) {
- d += 'a' - '9' - 1;
- }
- *out++ = d + '0';
- d = (*in++ & 0xf);
- if (d > 9) {
- d += 'a' - '9' - 1;
- }
- *out++ = d + '0';
- if (sep != NULL && i != 0) {
- *out++ = *sep;
- }
- }
- return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
+#if MICROPY_PY_BUILTINS_BYTES_HEX
+STATIC mp_obj_t bytes_hex_as_bytes(size_t n_args, const mp_obj_t *args) {
+ return mp_obj_bytes_hex(n_args, args, &mp_type_bytes);
}
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_binascii_hexlify_obj, 1, 2, mod_binascii_hexlify);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(bytes_hex_as_bytes_obj, 1, 2, bytes_hex_as_bytes);
-STATIC mp_obj_t mod_binascii_unhexlify(mp_obj_t data) {
- mp_buffer_info_t bufinfo;
- mp_get_buffer_raise(data, &bufinfo, MP_BUFFER_READ);
-
- if ((bufinfo.len & 1) != 0) {
- mp_raise_ValueError(MP_ERROR_TEXT("odd-length string"));
- }
- vstr_t vstr;
- vstr_init_len(&vstr, bufinfo.len / 2);
- byte *in = bufinfo.buf, *out = (byte *)vstr.buf;
- byte hex_byte = 0;
- for (mp_uint_t i = bufinfo.len; i--;) {
- byte hex_ch = *in++;
- if (unichar_isxdigit(hex_ch)) {
- hex_byte += unichar_xdigit_value(hex_ch);
- } else {
- mp_raise_ValueError(MP_ERROR_TEXT("non-hex digit found"));
- }
- if (i & 1) {
- hex_byte <<= 4;
- } else {
- *out++ = hex_byte;
- hex_byte = 0;
- }
- }
- return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
+STATIC mp_obj_t bytes_fromhex_bytes(mp_obj_t data) {
+ return mp_obj_bytes_fromhex(MP_OBJ_FROM_PTR(&mp_type_bytes), data);
}
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_binascii_unhexlify_obj, mod_binascii_unhexlify);
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(bytes_fromhex_obj, bytes_fromhex_bytes);
+#endif
// If ch is a character in the base64 alphabet, and is not a pad character, then
// the corresponding integer between 0 and 63, inclusively, is returned.
@@ -242,8 +185,10 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_binascii_crc32_obj, 1, 2, mod_bin
STATIC const mp_rom_map_elem_t mp_module_binascii_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_ubinascii) },
- { MP_ROM_QSTR(MP_QSTR_hexlify), MP_ROM_PTR(&mod_binascii_hexlify_obj) },
- { MP_ROM_QSTR(MP_QSTR_unhexlify), MP_ROM_PTR(&mod_binascii_unhexlify_obj) },
+ #if MICROPY_PY_BUILTINS_BYTES_HEX
+ { MP_ROM_QSTR(MP_QSTR_hexlify), MP_ROM_PTR(&bytes_hex_as_bytes_obj) },
+ { MP_ROM_QSTR(MP_QSTR_unhexlify), MP_ROM_PTR(&bytes_fromhex_obj) },
+ #endif
{ MP_ROM_QSTR(MP_QSTR_a2b_base64), MP_ROM_PTR(&mod_binascii_a2b_base64_obj) },
{ MP_ROM_QSTR(MP_QSTR_b2a_base64), MP_ROM_PTR(&mod_binascii_b2a_base64_obj) },
#if MICROPY_PY_UBINASCII_CRC32