Skip to content

Commit 07ffe2b

Browse files
gh-156: Make STRIP treat remove as substring, not chars list.
1 parent 32a63ca commit 07ffe2b

1 file changed

Lines changed: 34 additions & 18 deletions

File tree

src/builtins.c

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5733,27 +5733,43 @@ static Value builtin_strip(Interpreter* interp, Value* args, int argc, Expr** ar
57335733
EXPECT_STR(args[0], "STRIP", interp, line, col);
57345734
EXPECT_STR(args[1], "STRIP", interp, line, col);
57355735

5736-
const char* s = args[0].as.s;
5737-
const char* chars = args[1].as.s;
5738-
size_t len = strlen(s);
5739-
5740-
// Find start
5741-
size_t start = 0;
5742-
while (start < len && strchr(chars, s[start]) != NULL) {
5743-
start++;
5736+
const char* haystack = args[0].as.s;
5737+
const char* needle = args[1].as.s;
5738+
5739+
size_t needle_len = strlen(needle);
5740+
size_t haystack_len = strlen(haystack);
5741+
5742+
if (needle_len == 0) {
5743+
return value_str(haystack);
57445744
}
5745-
5746-
// Find end
5747-
size_t end = len;
5748-
while (end > start && strchr(chars, s[end - 1]) != NULL) {
5749-
end--;
5745+
5746+
// Count non-overlapping occurrences of needle
5747+
size_t count = 0;
5748+
const char* p = haystack;
5749+
while ((p = strstr(p, needle)) != NULL) {
5750+
count++;
5751+
p += needle_len;
57505752
}
5751-
5752-
size_t result_len = end - start;
5753+
5754+
if (count == 0) {
5755+
return value_str(haystack);
5756+
}
5757+
5758+
// New length after removing all occurrences (replacement = "")
5759+
size_t result_len = haystack_len - count * needle_len;
57535760
char* result = malloc(result_len + 1);
5754-
memcpy(result, s + start, result_len);
5755-
result[result_len] = '\0';
5756-
5761+
char* dst = result;
5762+
p = haystack;
5763+
const char* prev = haystack;
5764+
5765+
while ((p = strstr(prev, needle)) != NULL) {
5766+
size_t before = (size_t)(p - prev);
5767+
memcpy(dst, prev, before);
5768+
dst += before;
5769+
prev = p + needle_len;
5770+
}
5771+
strcpy(dst, prev);
5772+
57575773
Value v = value_str(result);
57585774
free(result);
57595775
return v;

0 commit comments

Comments
 (0)