diff options
author | Joseph Hunkeler <jhunkeler@users.noreply.github.com> | 2020-04-06 02:01:35 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-06 02:01:35 -0400 |
commit | 06da826131ba1c5e28731fc9bae975fc21b13da1 (patch) | |
tree | 751c4875cc9cdfedb5f74555c797b1b8e781dec4 /lib/relocation.c | |
parent | e5f87affc755245d3984b84547816e3d03b8f30a (diff) | |
download | spmc-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.c | 22 |
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; } /** |