diff options
author | Damien George <damien.p.george@gmail.com> | 2014-04-09 20:44:37 +0100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2014-04-09 20:44:37 +0100 |
commit | 038fd52faa5aee18d85278b7f8a1832464e0cf2d (patch) | |
tree | cfd81244385163d8a3e306a39339698b9fea4c25 | |
parent | 5589db88c7e5c1a715343be4bb0d83817f3de905 (diff) | |
parent | 3d9a39e211ed98033b6d6fcda5d0771bfb25dc46 (diff) | |
download | micropython-038fd52faa5aee18d85278b7f8a1832464e0cf2d.tar.gz micropython-038fd52faa5aee18d85278b7f8a1832464e0cf2d.zip |
Merge branch 'str-index' of github.com:xbe/micropython into xbe-str-index
-rw-r--r-- | py/objstr.c | 26 | ||||
-rw-r--r-- | py/qstrdefs.h | 1 | ||||
-rw-r--r-- | tests/basics/string_index.py | 78 | ||||
-rw-r--r-- | tests/basics/string_rindex.py | 78 |
4 files changed, 178 insertions, 5 deletions
diff --git a/py/objstr.c b/py/objstr.c index 14f32459d1..519ff464d6 100644 --- a/py/objstr.c +++ b/py/objstr.c @@ -438,7 +438,7 @@ STATIC mp_obj_t str_split(uint n_args, const mp_obj_t *args) { return res; } -STATIC mp_obj_t str_finder(uint n_args, const mp_obj_t *args, machine_int_t direction) { +STATIC mp_obj_t str_finder(uint n_args, const mp_obj_t *args, machine_int_t direction, bool is_index) { assert(2 <= n_args && n_args <= 4); assert(MP_OBJ_IS_STR(args[0])); assert(MP_OBJ_IS_STR(args[1])); @@ -458,7 +458,11 @@ STATIC mp_obj_t str_finder(uint n_args, const mp_obj_t *args, machine_int_t dire const byte *p = find_subbytes(haystack + start, end - start, needle, needle_len, direction); if (p == NULL) { // not found - return MP_OBJ_NEW_SMALL_INT(-1); + if (is_index) { + nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "substring not found")); + } else { + return MP_OBJ_NEW_SMALL_INT(-1); + } } else { // found return MP_OBJ_NEW_SMALL_INT(p - haystack); @@ -466,11 +470,19 @@ STATIC mp_obj_t str_finder(uint n_args, const mp_obj_t *args, machine_int_t dire } STATIC mp_obj_t str_find(uint n_args, const mp_obj_t *args) { - return str_finder(n_args, args, 1); + return str_finder(n_args, args, 1, false); } STATIC mp_obj_t str_rfind(uint n_args, const mp_obj_t *args) { - return str_finder(n_args, args, -1); + return str_finder(n_args, args, -1, false); +} + +STATIC mp_obj_t str_index(uint n_args, const mp_obj_t *args) { + return str_finder(n_args, args, 1, true); +} + +STATIC mp_obj_t str_rindex(uint n_args, const mp_obj_t *args) { + return str_finder(n_args, args, -1, true); } // TODO: (Much) more variety in args @@ -1125,7 +1137,7 @@ STATIC mp_obj_t str_replace(uint n_args, const mp_obj_t *args) { } } - // if max_rep is still 0 by this point we will need to do all possible replacements + // if max_rep is still -1 by this point we will need to do all possible replacements // check argument types @@ -1304,6 +1316,8 @@ STATIC machine_int_t str_get_buffer(mp_obj_t self_in, buffer_info_t *bufinfo, in STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_find_obj, 2, 4, str_find); STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_rfind_obj, 2, 4, str_rfind); +STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_index_obj, 2, 4, str_index); +STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_rindex_obj, 2, 4, str_rindex); STATIC MP_DEFINE_CONST_FUN_OBJ_2(str_join_obj, str_join); STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_split_obj, 1, 3, str_split); STATIC MP_DEFINE_CONST_FUN_OBJ_2(str_startswith_obj, str_startswith); @@ -1317,6 +1331,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(str_rpartition_obj, str_rpartition); STATIC const mp_map_elem_t str_locals_dict_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR_find), (mp_obj_t)&str_find_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_rfind), (mp_obj_t)&str_rfind_obj }, + { MP_OBJ_NEW_QSTR(MP_QSTR_index), (mp_obj_t)&str_index_obj }, + { MP_OBJ_NEW_QSTR(MP_QSTR_rindex), (mp_obj_t)&str_rindex_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_join), (mp_obj_t)&str_join_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_split), (mp_obj_t)&str_split_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_startswith), (mp_obj_t)&str_startswith_obj }, diff --git a/py/qstrdefs.h b/py/qstrdefs.h index 0c2c032f29..342160bbc7 100644 --- a/py/qstrdefs.h +++ b/py/qstrdefs.h @@ -183,6 +183,7 @@ Q(union) Q(update) Q(find) Q(rfind) +Q(rindex) Q(split) Q(startswith) Q(replace) diff --git a/tests/basics/string_index.py b/tests/basics/string_index.py new file mode 100644 index 0000000000..31f6900e6c --- /dev/null +++ b/tests/basics/string_index.py @@ -0,0 +1,78 @@ +print("hello world".index("ll")) +print("hello world".index("ll", None)) +print("hello world".index("ll", 1)) +print("hello world".index("ll", 1, None)) +print("hello world".index("ll", None, None)) +print("hello world".index("ll", 1, -1)) + +try: + print("hello world".index("ll", 1, 1)) +except ValueError: + print("Raised ValueError") +else: + print("Did not raise ValueError") + +try: + print("hello world".index("ll", 1, 2)) +except ValueError: + print("Raised ValueError") +else: + print("Did not raise ValueError") + +try: + print("hello world".index("ll", 1, 3)) +except ValueError: + print("Raised ValueError") +else: + print("Did not raise ValueError") + +print("hello world".index("ll", 1, 4)) +print("hello world".index("ll", 1, 5)) +print("hello world".index("ll", -100)) +print("0000".index('0')) +print("0000".index('0', 0)) +print("0000".index('0', 1)) +print("0000".index('0', 2)) +print("0000".index('0', 3)) + +try: + print("0000".index('0', 4)) +except ValueError: + print("Raised ValueError") +else: + print("Did not raise ValueError") + +try: + print("0000".index('0', 5)) +except ValueError: + print("Raised ValueError") +else: + print("Did not raise ValueError") + +try: + print("0000".index('-1', 3)) +except ValueError: + print("Raised ValueError") +else: + print("Did not raise ValueError") + +try: + print("0000".index('1', 3)) +except ValueError: + print("Raised ValueError") +else: + print("Did not raise ValueError") + +try: + print("0000".index('1', 4)) +except ValueError: + print("Raised ValueError") +else: + print("Did not raise ValueError") + +try: + print("0000".index('1', 5)) +except ValueError: + print("Raised ValueError") +else: + print("Did not raise ValueError") diff --git a/tests/basics/string_rindex.py b/tests/basics/string_rindex.py new file mode 100644 index 0000000000..25acd37f6f --- /dev/null +++ b/tests/basics/string_rindex.py @@ -0,0 +1,78 @@ +print("hello world".rindex("ll")) +print("hello world".rindex("ll", None)) +print("hello world".rindex("ll", 1)) +print("hello world".rindex("ll", 1, None)) +print("hello world".rindex("ll", None, None)) +print("hello world".rindex("ll", 1, -1)) + +try: + print("hello world".rindex("ll", 1, 1)) +except ValueError: + print("Raised ValueError") +else: + print("Did not raise ValueError") + +try: + print("hello world".rindex("ll", 1, 2)) +except ValueError: + print("Raised ValueError") +else: + print("Did not raise ValueError") + +try: + print("hello world".rindex("ll", 1, 3)) +except ValueError: + print("Raised ValueError") +else: + print("Did not raise ValueError") + +print("hello world".rindex("ll", 1, 4)) +print("hello world".rindex("ll", 1, 5)) +print("hello world".rindex("ll", -100)) +print("0000".rindex('0')) +print("0000".rindex('0', 0)) +print("0000".rindex('0', 1)) +print("0000".rindex('0', 2)) +print("0000".rindex('0', 3)) + +try: + print("0000".rindex('0', 4)) +except ValueError: + print("Raised ValueError") +else: + print("Did not raise ValueError") + +try: + print("0000".rindex('0', 5)) +except ValueError: + print("Raised ValueError") +else: + print("Did not raise ValueError") + +try: + print("0000".rindex('-1', 3)) +except ValueError: + print("Raised ValueError") +else: + print("Did not raise ValueError") + +try: + print("0000".rindex('1', 3)) +except ValueError: + print("Raised ValueError") +else: + print("Did not raise ValueError") + +try: + print("0000".rindex('1', 4)) +except ValueError: + print("Raised ValueError") +else: + print("Did not raise ValueError") + +try: + print("0000".rindex('1', 5)) +except ValueError: + print("Raised ValueError") +else: + print("Did not raise ValueError") |