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 | |
parent | e5f87affc755245d3984b84547816e3d03b8f30a (diff) | |
download | spmc-06da826131ba1c5e28731fc9bae975fc21b13da1.tar.gz |
Test replace_text (#13)
* Add test boilerplate
* Add replace_text test
* Redo replace_text
-rw-r--r-- | include/relocation.h | 2 | ||||
-rw-r--r-- | lib/relocation.c | 22 | ||||
-rw-r--r-- | tests/template.c | 15 | ||||
-rw-r--r-- | tests/test_relocation_replace_text.c | 26 |
4 files changed, 55 insertions, 10 deletions
diff --git a/include/relocation.h b/include/relocation.h index 23b0dc9..01a7c6d 100644 --- a/include/relocation.h +++ b/include/relocation.h @@ -14,7 +14,7 @@ typedef struct { int relocate(const char *filename, const char *_oldstr, const char *_newstr); void relocate_root(const char *destroot, const char *baseroot); -int replace_text(char *data, const char *_spattern, const char *_sreplacement); +ssize_t replace_text(char *data, const char *_spattern, const char *_sreplacement); int file_replace_text(char *filename, const char *spattern, const char *sreplacement); RelocationEntry **prefixes_read(const char *filename); void prefixes_free(RelocationEntry **entry); 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; } /** diff --git a/tests/template.c b/tests/template.c new file mode 100644 index 0000000..17e7e7c --- /dev/null +++ b/tests/template.c @@ -0,0 +1,15 @@ +#include "spm.h" +#include "framework.h" + +const char *testFmt = "returned '%s', expected '%s'\n"; +struct TestCase testCase[] = { + {}, +}; +size_t numCases = sizeof(testCase) / sizeof(struct TestCase); + +int main(int argc, char *argv[]) { + for (size_t i = 0; i < numCases; i++) { + // myassert() + } + return 0; +}
\ No newline at end of file diff --git a/tests/test_relocation_replace_text.c b/tests/test_relocation_replace_text.c new file mode 100644 index 0000000..c0dc42f --- /dev/null +++ b/tests/test_relocation_replace_text.c @@ -0,0 +1,26 @@ +#include "spm.h" +#include "framework.h" + +const char *testFmt = "case '%s': returned '%s', expected '%s'\n"; +struct TestCase testCase[] = { + {.caseValue.sptr = "This is a test... Happy friend.", .arg[0].sptr = "...", .arg[1].sptr = ".", .truthValue.sptr = "This is a test. Happy friend."}, + {.caseValue.sptr = "This is a test... Happy friend.", .arg[0].sptr = "test", .arg[1].sptr = "win", .truthValue.sptr = "This is a win... Happy friend."}, + {.caseValue.sptr = "This is a test... Happy friend.", .arg[0].sptr = "This is a test", .arg[1].sptr = "Meow cat", .truthValue.sptr = "Meow cat... Happy friend."}, + {.caseValue.sptr = "This is a test... Happy friend.", .arg[0].sptr = "T", .arg[1].sptr = "#", .truthValue.sptr = "#his is a test... Happy friend."}, + {.caseValue.sptr = "This is a test... Happy friend.", .arg[0].sptr = "", .arg[1].sptr = "#", .truthValue.sptr = "This is a test... Happy friend."}, + {.caseValue.sptr = "This is a test... Happy friend.", .arg[0].sptr = "#", .arg[1].sptr = "", .truthValue.sptr = "This is a test... Happy friend."}, + {.caseValue.sptr = "This is a test... Happy friend.", .arg[0].sptr = "", .arg[1].sptr = "", .truthValue.sptr = "This is a test... Happy friend."}, +}; +size_t numCases = sizeof(testCase) / sizeof(struct TestCase); + +int main(int argc, char *argv[]) { + for (size_t i = 0; i < numCases; i++) { + char *caseValue = strdup(testCase[i].caseValue.sptr); + + replace_text(caseValue, testCase[i].arg[0].sptr, testCase[i].arg[1].sptr); + myassert(strcmp(caseValue, testCase[i].truthValue.sptr) == 0, testFmt, testCase[i].caseValue.sptr, caseValue, testCase[i].truthValue.sptr); + + free(caseValue); + } + return 0; +}
\ No newline at end of file |