From d098c6bf852eacb4e364dd8f5dfce1a472795ff9 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Sat, 24 May 2014 22:46:51 +0300 Subject: [PATCH] objstr: Implement .endswith(). --- py/objstr.c | 13 +++++++++++++ py/qstrdefs.h | 1 + tests/basics/string_endswith.py | 11 +++++++++++ 3 files changed, 25 insertions(+) create mode 100644 tests/basics/string_endswith.py diff --git a/py/objstr.c b/py/objstr.c index 61fda12a3f..323f329575 100644 --- a/py/objstr.c +++ b/py/objstr.c @@ -619,6 +619,17 @@ STATIC mp_obj_t str_startswith(uint n_args, const mp_obj_t *args) { return MP_BOOL(memcmp(str + index_val, prefix, prefix_len) == 0); } +STATIC mp_obj_t str_endswith(uint n_args, const mp_obj_t *args) { + GET_STR_DATA_LEN(args[0], str, str_len); + GET_STR_DATA_LEN(args[1], suffix, suffix_len); + assert(n_args == 2); + + if (suffix_len > str_len) { + return mp_const_false; + } + return MP_BOOL(memcmp(str + (str_len - suffix_len), suffix, suffix_len) == 0); +} + enum { LSTRIP, RSTRIP, STRIP }; STATIC mp_obj_t str_uni_strip(int type, uint n_args, const mp_obj_t *args) { @@ -1541,6 +1552,7 @@ 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_VAR_BETWEEN(str_rsplit_obj, 1, 3, str_rsplit); STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_startswith_obj, 2, 3, str_startswith); +STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_endswith_obj, 2, 3, str_endswith); STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_strip_obj, 1, 2, str_strip); STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_lstrip_obj, 1, 2, str_lstrip); STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_rstrip_obj, 1, 2, str_rstrip); @@ -1565,6 +1577,7 @@ STATIC const mp_map_elem_t str_locals_dict_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR_split), (mp_obj_t)&str_split_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_rsplit), (mp_obj_t)&str_rsplit_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_startswith), (mp_obj_t)&str_startswith_obj }, + { MP_OBJ_NEW_QSTR(MP_QSTR_endswith), (mp_obj_t)&str_endswith_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_strip), (mp_obj_t)&str_strip_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_lstrip), (mp_obj_t)&str_lstrip_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_rstrip), (mp_obj_t)&str_rstrip_obj }, diff --git a/py/qstrdefs.h b/py/qstrdefs.h index cffb64d5ef..1081d04410 100644 --- a/py/qstrdefs.h +++ b/py/qstrdefs.h @@ -239,6 +239,7 @@ Q(rindex) Q(split) Q(rsplit) Q(startswith) +Q(endswith) Q(replace) Q(partition) Q(rpartition) diff --git a/tests/basics/string_endswith.py b/tests/basics/string_endswith.py new file mode 100644 index 0000000000..078ee6dba5 --- /dev/null +++ b/tests/basics/string_endswith.py @@ -0,0 +1,11 @@ +print("foobar".endswith("bar")) +print("foobar".endswith("baR")) +print("foobar".endswith("bar1")) +print("foobar".endswith("foobar")) +print("foobar".endswith("")) + +#print("1foobar".startswith("foo", 1)) +#print("1foo".startswith("foo", 1)) +#print("1foo".startswith("1foo", 1)) +#print("1fo".startswith("foo", 1)) +#print("1fo".startswith("foo", 10))