aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libssh/misc.h1
-rw-r--r--src/misc.c50
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_ */
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 */
+}
+
/** @} */