From c18ef2a9dd921f2dc589623ed43dd72cab94d3a4 Mon Sep 17 00:00:00 2001
From: Paul Sokolovsky <pfalcon@users.sourceforge.net>
Date: Thu, 15 May 2014 21:18:34 +0300
Subject: [PATCH] objstr: startswith(): Accept optional "start" arg.

---
 py/objstr.c                       | 16 ++++++++++------
 tests/basics/string_startswith.py |  6 ++++++
 2 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/py/objstr.c b/py/objstr.c
index a16033806..dcf4de82d 100644
--- a/py/objstr.c
+++ b/py/objstr.c
@@ -606,13 +606,17 @@ STATIC mp_obj_t str_rindex(uint n_args, const mp_obj_t *args) {
 }
 
 // TODO: (Much) more variety in args
-STATIC mp_obj_t str_startswith(mp_obj_t self_in, mp_obj_t arg) {
-    GET_STR_DATA_LEN(self_in, str, str_len);
-    GET_STR_DATA_LEN(arg, prefix, prefix_len);
-    if (prefix_len > str_len) {
+STATIC mp_obj_t str_startswith(uint n_args, const mp_obj_t *args) {
+    GET_STR_DATA_LEN(args[0], str, str_len);
+    GET_STR_DATA_LEN(args[1], prefix, prefix_len);
+    uint index_val = 0;
+    if (n_args > 2) {
+        index_val = mp_get_index(&mp_type_str, str_len, args[2], true);
+    }
+    if (prefix_len + index_val > str_len) {
         return mp_const_false;
     }
-    return MP_BOOL(memcmp(str, prefix, prefix_len) == 0);
+    return MP_BOOL(memcmp(str + index_val, prefix, prefix_len) == 0);
 }
 
 enum { LSTRIP, RSTRIP, STRIP };
@@ -1536,7 +1540,7 @@ 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_VAR_BETWEEN(str_rsplit_obj, 1, 3, str_rsplit);
-STATIC MP_DEFINE_CONST_FUN_OBJ_2(str_startswith_obj, str_startswith);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_startswith_obj, 2, 3, str_startswith);
 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);
diff --git a/tests/basics/string_startswith.py b/tests/basics/string_startswith.py
index 99d653efb..5cf730c03 100644
--- a/tests/basics/string_startswith.py
+++ b/tests/basics/string_startswith.py
@@ -3,3 +3,9 @@ print("foobar".startswith("Foo"))
 print("foobar".startswith("foo1"))
 print("foobar".startswith("foobar"))
 print("foobar".startswith(""))
+
+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))
-- 
GitLab