void string_replace_all(std::string & s, const std::string & search, const std::string & replace) {
if (search.empty()) {
- return; // Avoid infinite loop if 'search' is an empty string
+ return;
}
+ std::string builder;
+ builder.reserve(s.length());
size_t pos = 0;
- while ((pos = s.find(search, pos)) != std::string::npos) {
- s.replace(pos, search.length(), replace);
- pos += replace.length();
- }
+ size_t last_pos = 0;
+ while ((pos = s.find(search, last_pos)) != std::string::npos) {
+ builder.append(s, last_pos, pos - last_pos);
+ builder.append(replace);
+ last_pos = pos + search.length();
+ }
+ builder.append(s, last_pos, std::string::npos);
+ s = std::move(builder);
}
void string_process_escapes(std::string & input) {
static void replace_all(std::string & s, const std::string & search, const std::string & replace) {
if (search.empty()) {
- return; // Avoid infinite loop if 'search' is an empty string
+ return;
}
+ std::string builder;
+ builder.reserve(s.length());
size_t pos = 0;
- while ((pos = s.find(search, pos)) != std::string::npos) {
- s.replace(pos, search.length(), replace);
- pos += replace.length();
- }
+ size_t last_pos = 0;
+ while ((pos = s.find(search, last_pos)) != std::string::npos) {
+ builder.append(s, last_pos, pos - last_pos);
+ builder.append(replace);
+ last_pos = pos + search.length();
+ }
+ builder.append(s, last_pos, std::string::npos);
+ s = std::move(builder);
}
static std::string gguf_kv_to_str(const struct gguf_context * ctx_gguf, int i) {
static void replace_all(std::string & s, const std::string & search, const std::string & replace) {
if (search.empty()) {
- return; // Avoid infinite loop if 'search' is an empty string
+ return;
}
+ std::string builder;
+ builder.reserve(s.length());
size_t pos = 0;
- while ((pos = s.find(search, pos)) != std::string::npos) {
- s.replace(pos, search.length(), replace);
- pos += replace.length();
+ size_t last_pos = 0;
+ while ((pos = s.find(search, last_pos)) != std::string::npos) {
+ builder.append(s, last_pos, pos - last_pos);
+ builder.append(replace);
+ last_pos = pos + search.length();
}
+ builder.append(s, last_pos, std::string::npos);
+ s = std::move(builder);
}