@@ -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