diff options
author | Andreas Schneider <asn@cryptomilk.org> | 2019-12-10 18:29:18 +0100 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2019-12-20 14:35:18 +0100 |
commit | 35216e7254d76bdf5b03ae79ba10e4d3dbf74256 (patch) | |
tree | 90d00cd7e2c0ad40fd28694d0f769f8cdb1a1249 | |
parent | 5317ebf0fcf927e45a4c7a8c322357179dd87f2f (diff) | |
download | libssh-35216e7254d76bdf5b03ae79ba10e4d3dbf74256.tar.gz libssh-35216e7254d76bdf5b03ae79ba10e4d3dbf74256.tar.xz libssh-35216e7254d76bdf5b03ae79ba10e4d3dbf74256.zip |
misc: Add ssh_strreplace()
Pair-Programmed-With: Sahana Prasad <sahana@redhat.com>
Signed-Off-by: Sahana Prasad <sahana@redhat.com>
Signed-Off-By: Andreas Schneider <asn@cryptomilk.org>
Reviewed-by: Jakub Jelen <jjelen@redhat.com>
-rw-r--r-- | include/libssh/misc.h | 1 | ||||
-rw-r--r-- | src/misc.c | 50 |
2 files changed, 51 insertions, 0 deletions
diff --git a/include/libssh/misc.h b/include/libssh/misc.h index 4c25a54a..efac4445 100644 --- a/include/libssh/misc.h +++ b/include/libssh/misc.h @@ -98,4 +98,5 @@ int ssh_quote_file_name(const char *file_name, char *buf, size_t buf_len); int ssh_newline_vis(const char *string, char *buf, size_t buf_len); int ssh_tmpname(char *template); +char *ssh_strreplace(char *src, const char *pattern, const char *repl); #endif /* MISC_H_ */ @@ -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 */ +} + /** @} */ |