From ac7d855e4e8202d99867cf6be3101bba5dd13001 Mon Sep 17 00:00:00 2001 From: daniel-Jones Date: Tue, 16 Oct 2018 21:30:18 +1030 Subject: added function to replace strings in memory as well, added an example to main.c --- replace.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'replace.c') diff --git a/replace.c b/replace.c index 1860d9e..dcfd1ed 100644 --- a/replace.c +++ b/replace.c @@ -37,6 +37,14 @@ getfilelength(FILE *fp) return retval; } +void +replaceappendchar(char *dest, char ch) +{ + int len = strlen(dest); + dest[len] = ch; + dest[len+1] = '\0'; +} + int replaceinfile(char *originalfile, char *destinationfile, char *placeholder, char *replacement) { @@ -78,3 +86,41 @@ replaceinfile(char *originalfile, char *destinationfile, char *placeholder, char free(filebuffer); return 1; } + +char * +replaceinmemory(char *src, char *placeholder, char *replacement) +{ + /* + * replace every placeholder with replacement in source src + * return pointer to string, NULL if no placement found + * user must free the returned memory + */ + char *dest = NULL; + size_t destsize; + char *substr = strstr(src, placeholder); + if (!substr) + return NULL; + /* initial dest size if only one placeholder exists */ + destsize = (strlen(src)-strlen(placeholder))+strlen(replacement+1); + dest = malloc(destsize); + if (!dest) + return NULL; + dest[0] = '\0'; /* junk in memory, we need [0] to be null for strlen() later */ + for (size_t i = 0; i < strlen(src); i++) + { + if (i == (substr-src)) + { + i += strlen(placeholder); + substr++; + substr = strstr(substr, placeholder); + if (substr) + { + destsize = (destsize-strlen(placeholder))+strlen(replacement)+1; + dest = realloc(dest, destsize); + } + strcat(dest, replacement); + } + replaceappendchar(dest, src[i]); + } + return dest; +} -- cgit v1.2.3