String String::substr(int start, int length /* = 0x7FFFFFFF */, bool nullable /* = false */) const { StringSlice r = slice(); // string_substr_check() will update start & length to a legal range. if (string_substr_check(r.len, start, length)) { return String(r.ptr + start, length, CopyString); } return nullable ? String() : String("", 0, CopyString); }
Variant f_strcspn(CStrRef str1, CStrRef str2, int start /* = 0 */, int length /* = 0x7FFFFFFF */) { const char *s1 = str1; const char *s2 = str2; int s1_len = str1.size(); int s2_len = str2.size(); if (!string_substr_check(s1_len, start, length)) { return false; } s1 += start; for (int pos = 0; pos < length; ++pos) { if (memchr(s2, *(s1++), s2_len) != NULL) return pos; } return length; }