Skip to content

Commit 4b157aa

Browse files
committed
Add find varients to bytearray
1 parent 9cdf5e1 commit 4b157aa

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

py/objarray.c

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,70 @@ STATIC mp_obj_t array_extend(mp_obj_t self_in, mp_obj_t arg_in) {
400400
STATIC MP_DEFINE_CONST_FUN_OBJ_2(array_extend_obj, array_extend);
401401
#endif
402402

403+
#if MICROPY_PY_BUILTINS_BYTEARRAY
404+
STATIC mp_obj_t buffer_finder(size_t n_args, const mp_obj_t *args, int direction, bool is_index) {
405+
mp_check_self(MP_OBJ_IS_TYPE(args[0], &mp_type_bytearray));
406+
const mp_obj_type_t *self_type = mp_obj_get_type(args[0]);
407+
408+
mp_buffer_info_t haystack_bufinfo;
409+
mp_get_buffer_raise(args[0], &haystack_bufinfo, MP_BUFFER_READ);
410+
411+
mp_buffer_info_t needle_bufinfo;
412+
mp_get_buffer_raise(args[1], &needle_bufinfo, MP_BUFFER_READ);
413+
414+
if (mp_binary_get_size('@', needle_bufinfo.typecode, NULL) != 1) {
415+
const qstr src_name = mp_obj_get_type(args[1])->name;
416+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
417+
translate("'%q' object is not bytes-like"),
418+
src_name));
419+
}
420+
421+
const byte *start = haystack_bufinfo.buf;
422+
const byte *end = haystack_bufinfo.buf + haystack_bufinfo.len;
423+
if (n_args >= 3 && args[2] != mp_const_none) {
424+
start += mp_get_index(self_type, haystack_bufinfo.len, args[2], true);
425+
}
426+
if (n_args >= 4 && args[3] != mp_const_none) {
427+
end = haystack_bufinfo.buf + mp_get_index(self_type, haystack_bufinfo.len, args[3], true);
428+
}
429+
430+
const byte *p = NULL;
431+
if (end >= start) {
432+
p = find_subbytes(start, end - start, needle_bufinfo.buf, needle_bufinfo.len, direction);
433+
}
434+
435+
if (p == NULL) {
436+
if (is_index) {
437+
mp_raise_ValueError(translate("substring not found"));
438+
} else {
439+
return MP_OBJ_NEW_SMALL_INT(-1);
440+
}
441+
}
442+
return MP_OBJ_NEW_SMALL_INT(p - (const byte*) haystack_bufinfo.buf);
443+
}
444+
445+
STATIC mp_obj_t buffer_find(size_t n_args, const mp_obj_t *args) {
446+
return buffer_finder(n_args, args, 1, false);
447+
}
448+
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(buffer_find_obj, 2, 4, buffer_find);
449+
450+
STATIC mp_obj_t buffer_rfind(size_t n_args, const mp_obj_t *args) {
451+
return buffer_finder(n_args, args, -1, false);
452+
}
453+
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(buffer_rfind_obj, 2, 4, buffer_rfind);
454+
455+
STATIC mp_obj_t buffer_index(size_t n_args, const mp_obj_t *args) {
456+
return buffer_finder(n_args, args, 1, true);
457+
}
458+
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(buffer_index_obj, 2, 4, buffer_index);
459+
460+
STATIC mp_obj_t buffer_rindex(size_t n_args, const mp_obj_t *args) {
461+
return buffer_finder(n_args, args, -1, true);
462+
}
463+
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(buffer_rindex_obj, 2, 4, buffer_rindex);
464+
465+
#endif
466+
403467
STATIC mp_obj_t array_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj_t value) {
404468
if (value == MP_OBJ_NULL) {
405469
// delete item
@@ -580,6 +644,12 @@ STATIC MP_DEFINE_CONST_DICT(array_locals_dict, array_locals_dict_table);
580644
STATIC const mp_rom_map_elem_t bytearray_locals_dict_table[] = {
581645
{ MP_ROM_QSTR(MP_QSTR_append), MP_ROM_PTR(&array_append_obj) },
582646
{ MP_ROM_QSTR(MP_QSTR_extend), MP_ROM_PTR(&array_extend_obj) },
647+
648+
{ MP_ROM_QSTR(MP_QSTR_find), MP_ROM_PTR(&buffer_find_obj) },
649+
{ MP_ROM_QSTR(MP_QSTR_rfind), MP_ROM_PTR(&buffer_rfind_obj) },
650+
{ MP_ROM_QSTR(MP_QSTR_index), MP_ROM_PTR(&buffer_index_obj) },
651+
{ MP_ROM_QSTR(MP_QSTR_rindex), MP_ROM_PTR(&buffer_rindex_obj) },
652+
583653
#if MICROPY_CPYTHON_COMPAT
584654
{ MP_ROM_QSTR(MP_QSTR_decode), MP_ROM_PTR(&array_decode_obj) },
585655
#endif

0 commit comments

Comments
 (0)