MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

replaceAll, trimStart, trimEnd

+113 -1
+1 -1
meson.build
··· 74 74 build_date = run_command('date', '+%Y-%m-%d', check: true).stdout().strip() 75 75 76 76 version_conf = configuration_data() 77 - version_conf.set('ANT_VERSION', '0.1.1.6') 77 + version_conf.set('ANT_VERSION', '0.1.1.7') 78 78 version_conf.set('ANT_GIT_HASH', git_hash) 79 79 version_conf.set('ANT_BUILD_DATE', build_date) 80 80
+112
src/ant.c
··· 455 455 static jsval_t builtin_string_startsWith(struct js *js, jsval_t *args, int nargs); 456 456 static jsval_t builtin_string_endsWith(struct js *js, jsval_t *args, int nargs); 457 457 static jsval_t builtin_string_replace(struct js *js, jsval_t *args, int nargs); 458 + static jsval_t builtin_string_replaceAll(struct js *js, jsval_t *args, int nargs); 458 459 static jsval_t builtin_string_template(struct js *js, jsval_t *args, int nargs); 459 460 static jsval_t builtin_string_charCodeAt(struct js *js, jsval_t *args, int nargs); 460 461 static jsval_t builtin_string_toLowerCase(struct js *js, jsval_t *args, int nargs); 461 462 static jsval_t builtin_string_toUpperCase(struct js *js, jsval_t *args, int nargs); 462 463 static jsval_t builtin_string_trim(struct js *js, jsval_t *args, int nargs); 464 + static jsval_t builtin_string_trimStart(struct js *js, jsval_t *args, int nargs); 465 + static jsval_t builtin_string_trimEnd(struct js *js, jsval_t *args, int nargs); 463 466 static jsval_t builtin_string_repeat(struct js *js, jsval_t *args, int nargs); 464 467 static jsval_t builtin_string_padStart(struct js *js, jsval_t *args, int nargs); 465 468 static jsval_t builtin_string_padEnd(struct js *js, jsval_t *args, int nargs); ··· 12169 12172 } 12170 12173 } 12171 12174 12175 + static jsval_t builtin_string_replaceAll(struct js *js, jsval_t *args, int nargs) { 12176 + jsval_t str = js->this_val; 12177 + if (vtype(str) != T_STR) return js_mkerr(js, "replaceAll called on non-string"); 12178 + if (nargs < 2) return str; 12179 + 12180 + jsval_t search = args[0]; 12181 + jsval_t replacement = args[1]; 12182 + 12183 + if (vtype(search) != T_STR) return js_mkerr(js, "replaceAll requires string search pattern"); 12184 + if (vtype(replacement) != T_STR) return js_mkerr(js, "replaceAll requires string replacement"); 12185 + 12186 + jsoff_t str_len, str_off = vstr(js, str, &str_len); 12187 + const char *str_ptr = (char *) &js->mem[str_off]; 12188 + 12189 + jsoff_t search_len, search_off = vstr(js, search, &search_len); 12190 + const char *search_ptr = (char *) &js->mem[search_off]; 12191 + 12192 + jsoff_t repl_len, repl_off = vstr(js, replacement, &repl_len); 12193 + const char *repl_ptr = (char *) &js->mem[repl_off]; 12194 + 12195 + if (search_len == 0) { 12196 + // Empty search string: insert replacement between each character 12197 + size_t total_len = str_len + (str_len + 1) * repl_len; 12198 + char *result = (char *)ANT_GC_MALLOC(total_len + 1); 12199 + if (!result) return js_mkerr(js, "oom"); 12200 + 12201 + size_t pos = 0; 12202 + memcpy(result + pos, repl_ptr, repl_len); 12203 + pos += repl_len; 12204 + for (jsoff_t i = 0; i < str_len; i++) { 12205 + result[pos++] = str_ptr[i]; 12206 + memcpy(result + pos, repl_ptr, repl_len); 12207 + pos += repl_len; 12208 + } 12209 + jsval_t ret = js_mkstr(js, result, pos); 12210 + ANT_GC_FREE(result); 12211 + return ret; 12212 + } 12213 + 12214 + // Count occurrences first 12215 + jsoff_t count = 0; 12216 + for (jsoff_t i = 0; i <= str_len - search_len; i++) { 12217 + if (memcmp(str_ptr + i, search_ptr, search_len) == 0) { 12218 + count++; 12219 + i += search_len - 1; 12220 + } 12221 + } 12222 + 12223 + if (count == 0) return str; 12224 + 12225 + // Calculate result length 12226 + size_t result_total = str_len - (count * search_len) + (count * repl_len); 12227 + char *result = (char *)ANT_GC_MALLOC(result_total + 1); 12228 + if (!result) return js_mkerr(js, "oom"); 12229 + 12230 + size_t result_pos = 0; 12231 + jsoff_t str_pos = 0; 12232 + 12233 + while (str_pos <= str_len - search_len) { 12234 + if (memcmp(str_ptr + str_pos, search_ptr, search_len) == 0) { 12235 + memcpy(result + result_pos, repl_ptr, repl_len); 12236 + result_pos += repl_len; 12237 + str_pos += search_len; 12238 + } else { 12239 + result[result_pos++] = str_ptr[str_pos++]; 12240 + } 12241 + } 12242 + 12243 + // Copy remaining characters 12244 + while (str_pos < str_len) { 12245 + result[result_pos++] = str_ptr[str_pos++]; 12246 + } 12247 + 12248 + jsval_t ret = js_mkstr(js, result, result_pos); 12249 + ANT_GC_FREE(result); 12250 + return ret; 12251 + } 12252 + 12172 12253 static jsval_t builtin_string_template(struct js *js, jsval_t *args, int nargs) { 12173 12254 jsval_t str = js->this_val; 12174 12255 if (vtype(str) != T_STR) return js_mkerr(js, "template called on non-string"); ··· 12302 12383 while (end > start && is_space(str_ptr[end - 1])) end--; 12303 12384 12304 12385 return js_mkstr(js, str_ptr + start, end - start); 12386 + } 12387 + 12388 + static jsval_t builtin_string_trimStart(struct js *js, jsval_t *args, int nargs) { 12389 + (void) args; (void) nargs; 12390 + jsval_t str = js->this_val; 12391 + if (vtype(str) != T_STR) return js_mkerr(js, "trimStart called on non-string"); 12392 + 12393 + jsoff_t str_len, str_off = vstr(js, str, &str_len); 12394 + const char *str_ptr = (char *) &js->mem[str_off]; 12395 + 12396 + jsoff_t start = 0; 12397 + while (start < str_len && is_space(str_ptr[start])) start++; 12398 + 12399 + return js_mkstr(js, str_ptr + start, str_len - start); 12400 + } 12401 + 12402 + static jsval_t builtin_string_trimEnd(struct js *js, jsval_t *args, int nargs) { 12403 + (void) args; (void) nargs; 12404 + jsval_t str = js->this_val; 12405 + if (vtype(str) != T_STR) return js_mkerr(js, "trimEnd called on non-string"); 12406 + 12407 + jsoff_t str_len, str_off = vstr(js, str, &str_len); 12408 + const char *str_ptr = (char *) &js->mem[str_off]; 12409 + 12410 + jsoff_t end = str_len; 12411 + while (end > 0 && is_space(str_ptr[end - 1])) end--; 12412 + 12413 + return js_mkstr(js, str_ptr, end); 12305 12414 } 12306 12415 12307 12416 static jsval_t builtin_string_repeat(struct js *js, jsval_t *args, int nargs) { ··· 14751 14860 setprop(js, string_proto, js_mkstr(js, "startsWith", 10), js_mkfun(builtin_string_startsWith)); 14752 14861 setprop(js, string_proto, js_mkstr(js, "endsWith", 8), js_mkfun(builtin_string_endsWith)); 14753 14862 setprop(js, string_proto, js_mkstr(js, "replace", 7), js_mkfun(builtin_string_replace)); 14863 + setprop(js, string_proto, js_mkstr(js, "replaceAll", 10), js_mkfun(builtin_string_replaceAll)); 14754 14864 setprop(js, string_proto, js_mkstr(js, "template", 8), js_mkfun(builtin_string_template)); 14755 14865 setprop(js, string_proto, js_mkstr(js, "charCodeAt", 10), js_mkfun(builtin_string_charCodeAt)); 14756 14866 setprop(js, string_proto, js_mkstr(js, "toLowerCase", 11), js_mkfun(builtin_string_toLowerCase)); 14757 14867 setprop(js, string_proto, js_mkstr(js, "toUpperCase", 11), js_mkfun(builtin_string_toUpperCase)); 14758 14868 setprop(js, string_proto, js_mkstr(js, "trim", 4), js_mkfun(builtin_string_trim)); 14869 + setprop(js, string_proto, js_mkstr(js, "trimStart", 9), js_mkfun(builtin_string_trimStart)); 14870 + setprop(js, string_proto, js_mkstr(js, "trimEnd", 7), js_mkfun(builtin_string_trimEnd)); 14759 14871 setprop(js, string_proto, js_mkstr(js, "repeat", 6), js_mkfun(builtin_string_repeat)); 14760 14872 setprop(js, string_proto, js_mkstr(js, "padStart", 8), js_mkfun(builtin_string_padStart)); 14761 14873 setprop(js, string_proto, js_mkstr(js, "padEnd", 6), js_mkfun(builtin_string_padEnd));