aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/misc.c50
1 files changed, 50 insertions, 0 deletions
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 */
+}
+
/** @} */