From 35216e7254d76bdf5b03ae79ba10e4d3dbf74256 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Tue, 10 Dec 2019 18:29:18 +0100 Subject: misc: Add ssh_strreplace() Pair-Programmed-With: Sahana Prasad Signed-Off-by: Sahana Prasad Signed-Off-By: Andreas Schneider Reviewed-by: Jakub Jelen --- src/misc.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) (limited to 'src') diff --git a/src/misc.c b/src/misc.c index bedf18e8..affb3eb4 100644 --- a/src/misc.c +++ b/src/misc.c @@ -1786,4 +1786,54 @@ err: return -1; } +/** + * @internal + * + * @brief Finds the first occurence of a patterm in a string and replaces it. + * + * @param[in] src Source string containing the patern to be replaced. + * @param[in] pattern Pattern to be replaced in the source string. + * Note: this function replaces the first occurence of pattern only. + * @param[in] replace String to be replaced is stored in replace. + * + * @returns src_replaced a pointer that points to the replaced string. + * NULL if allocation fails. + */ +char *ssh_strreplace(char *src, const char *pattern, const char *replace) +{ + char *p = NULL; + char *src_replaced = NULL; + size_t len_replaced; + + if (pattern == NULL || replace == NULL) { + return src; + } + + if ((p = strstr(src, pattern)) != NULL) { + size_t offset = p - src; + size_t len = strlen(src); + size_t pattern_len = strlen(pattern); + size_t replace_len = strlen(replace); + + if (replace_len != pattern_len) { + len_replaced = strlen(src) + replace_len - pattern_len + 1; + } else { + len_replaced = strlen(src) + 1; + } + + src_replaced = (char *)malloc(len_replaced); + + if (src_replaced == NULL) { + return NULL; + } + + memset(src_replaced, 0, len_replaced); + memcpy(src_replaced, src, offset); + memcpy(src_replaced + offset, replace, replace_len); + memcpy(src_replaced + offset + replace_len, src + offset + pattern_len, len - offset - pattern_len); + } + + return src_replaced; /* free in the caller */ +} + /** @} */ -- cgit v1.2.3