aboutsummaryrefslogtreecommitdiff
path: root/lib/relocation.c
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@users.noreply.github.com>2020-04-06 02:01:35 -0400
committerGitHub <noreply@github.com>2020-04-06 02:01:35 -0400
commit06da826131ba1c5e28731fc9bae975fc21b13da1 (patch)
tree751c4875cc9cdfedb5f74555c797b1b8e781dec4 /lib/relocation.c
parente5f87affc755245d3984b84547816e3d03b8f30a (diff)
downloadspmc-06da826131ba1c5e28731fc9bae975fc21b13da1.tar.gz
Test replace_text (#13)
* Add test boilerplate * Add replace_text test * Redo replace_text
Diffstat (limited to 'lib/relocation.c')
-rw-r--r--lib/relocation.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/lib/relocation.c b/lib/relocation.c
index f22a25d..003b373 100644
--- a/lib/relocation.c
+++ b/lib/relocation.c
@@ -28,11 +28,15 @@ const char *METADATA_FILES[] = {
* @param sreplacement replacement string value
* @return success=0, error=-1
*/
-int replace_text(char *data, const char *spattern, const char *sreplacement) {
+ssize_t replace_text(char *data, const char *spattern, const char *sreplacement) {
if (data == NULL || spattern == NULL || sreplacement == NULL) {
return -1;
}
+ if (strlen(spattern) == 0 || strlen(sreplacement) == 0) {
+ return 0;
+ }
+
char *tmp = data;
size_t data_len = strlen(data);
size_t spattern_len = strlen(spattern);
@@ -43,19 +47,19 @@ int replace_text(char *data, const char *spattern, const char *sreplacement) {
return -1;
}
+ size_t count_replaced = 0;
while (*tmp != '\0') {
if (strncmp(tmp, spattern, spattern_len) == 0) {
- if (sreplacement_len == 1) {
- *tmp = *sreplacement;
- } else {
- memmove(tmp, sreplacement, sreplacement_len);
- memmove(tmp + sreplacement_len, tmp + spattern_len, data_len - spattern_len);
- memset(tmp + sreplacement_len + (data_len - spattern_len), '\0', 1);
- }
+ memcpy(tmp, sreplacement, sreplacement_len);
+ size_t tmp_len = strlen(tmp + sreplacement_len);
+ memmove(tmp + sreplacement_len, tmp + spattern_len, tmp_len);
+ count_replaced += (spattern_len - sreplacement_len);
}
tmp++;
}
- return 0;
+ char *end = data + data_len - count_replaced;
+ *end = '\0';
+ return count_replaced;
}
/**