aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/relocation.h2
-rw-r--r--lib/relocation.c22
-rw-r--r--tests/template.c15
-rw-r--r--tests/test_relocation_replace_text.c26
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