#include #include #include #include "strops.hpp" bool strops_prefix(const char *pre, const char *str) { return strncmp(pre, str, strlen(pre)) == 0; } size_t strops_copy(char *dst, const char *src, size_t size) { size_t srclen; size --; srclen = strlen(src); if (srclen > size) srclen = size; memcpy(dst, src, srclen); dst[srclen] = '\0'; return (srclen); } char* strops_stristr(char* haystack, char* needle) { do { const char* h = haystack; const char* n = needle; while (tolower((unsigned char) *h) == tolower((unsigned char ) *n) && *n) { h++; n++; } if (*n == 0) { return (char *) haystack; } } while (*haystack++); return 0; } void strops_replace(char *buf, size_t buf_size, const char *search, const char *replace) { size_t search_len = strlen(search); size_t replace_len = strlen(replace); char *r = buf; // read pointer char *w = buf; // write pointer while (*r && (w - buf) < (signed int)(buf_size - 1)) { if (strncmp(r, search, search_len) == 0) { // Ensure space size_t remaining = buf_size - (w - buf) - 1; size_t copy_len = (replace_len < remaining) ? replace_len : remaining; size_t skip_size = search_len; if (replace_len > search_len) { memmove(w+replace_len, w+search_len, remaining - replace_len); skip_size = replace_len; } memcpy(w, replace, copy_len); w += copy_len; r += skip_size; } else { *w++ = *r++; } } *w = '\0'; // terminate } void strops_replace_int32(char *buf, size_t buf_size, const char *search, int32_t number) { char num_buf[200]; snprintf(num_buf, 200, "%d", number); strops_replace(buf, buf_size, search, num_buf); } void strops_replace_int64(char *buf, size_t buf_size, const char *search, int64_t number) { char num_buf[200]; snprintf(num_buf, 200, "%lld", number); strops_replace(buf, buf_size, search, num_buf); } void strops_replace_float(char *buf, size_t buf_size, const char *search, float number, int decimals) { char num_buf[200]; snprintf(num_buf, 200, "%.*f", decimals, number); strops_replace(buf, buf_size, search, num_buf); }