summaryrefslogtreecommitdiff
path: root/nasmlib.c
diff options
context:
space:
mode:
Diffstat (limited to 'nasmlib.c')
-rw-r--r--nasmlib.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/nasmlib.c b/nasmlib.c
index d70f6c24..538223f8 100644
--- a/nasmlib.c
+++ b/nasmlib.c
@@ -290,6 +290,86 @@ char *nasm_strsep(char **stringp, const char *delim)
}
#endif
+char *nasm_strrep(const char *str, const char *sub, char *lin, bool casesense)
+{
+ char *outline = lin;
+ char *temp1 = NULL;
+ char *temp2 = NULL;
+ char *l, *lp, *lt, *ls;
+ int count = 0;
+ int str_len, sub_len, lin_len;
+ int i, c;
+
+ str_len = strlen(str);
+ sub_len = strlen(sub);
+ lin_len = strlen(lin);
+
+ if ((str_len > 0) && (lin_len > 0)) {
+ if (casesense == false) {
+ l = nasm_strdup(lin);
+ for (i = 0; i < lin_len; i++) {
+ l[i] = (char)nasm_tolower_tab[(int)l[i]];
+ }
+ ls = nasm_strdup(str);
+ for (i = 0; i < str_len; i++) {
+ ls[i] = (char)nasm_tolower_tab[(int)ls[i]];
+ }
+ temp1 = l;
+ temp2 = ls;
+ } else {
+ l = lin;
+ ls = (char *)str;
+ }
+
+ lt = l;
+
+ do {
+ l = strstr(l, ls);
+ if (l != NULL) {
+ count ++;
+ l += str_len;
+ }
+ } while (l != NULL);
+
+ if (count > 0) {
+ i = (lin_len - (count * str_len));
+ i += (count * sub_len);
+ outline = nasm_zalloc(i);
+
+ l = lt;
+
+ for (i = 0; i < count; i ++) {
+ lp = l;
+ l = strstr(l, ls);
+ c = (lp - l);
+ if (c > 0) {
+ strncat(outline, lt, c);
+ }
+ strncat(outline, sub, sub_len);
+ l += str_len;
+ lt += str_len;
+ }
+
+ c = (l - lin);
+ if (c < lin_len) {
+ strcat(outline, lt);
+ }
+
+ if (temp2 != NULL) {
+ nasm_free(temp2);
+ }
+
+ if (temp1 != NULL) {
+ nasm_free(temp1);
+ }
+
+ nasm_free(lin);
+ }
+ }
+
+ return outline;
+}
+
#define lib_isnumchar(c) (nasm_isalnum(c) || (c) == '$' || (c) == '_')
#define numvalue(c) ((c)>='a' ? (c)-'a'+10 : (c)>='A' ? (c)-'A'+10 : (c)-'0')