aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/extlib.h4
-rw-r--r--src/extstring.c37
-rw-r--r--src/memset_s.c1
-rw-r--r--tests/test.c83
4 files changed, 84 insertions, 41 deletions
diff --git a/src/extlib.h b/src/extlib.h
index 80c79d0..b12ddbf 100644
--- a/src/extlib.h
+++ b/src/extlib.h
@@ -62,5 +62,7 @@ char *strupr(char *s);
char *trim (char *s, int *rem_front, int *rem_back);
/// Match string s for old and replace it with string replace
- char *replace_str (char *s, char *old, char *replace);
+char *replace_str (char *s, char *old, char *replace);
+/// Join an array of strings into one string
+char *join_str (char **s, size_t len, char delim);
diff --git a/src/extstring.c b/src/extstring.c
index 8b82bb3..fc3cb45 100644
--- a/src/extstring.c
+++ b/src/extstring.c
@@ -11,14 +11,14 @@
char *
strlwr (char *s)
{
- unsigned char *p = (unsigned char *) s;
+ unsigned char *p = (unsigned char *) s;
- while (*p) {
- *p = tolower ((unsigned char)*p);
- p++;
- }
+ while (*p) {
+ *p = tolower ((unsigned char)*p);
+ p++;
+ }
- return s;
+ return s;
}
char *
@@ -27,8 +27,8 @@ strupr (char *s)
unsigned char *p = (unsigned char *) s;
while (*p) {
- *p = toupper ((unsigned char)*p);
- p++;
+ *p = toupper ((unsigned char)*p);
+ p++;
}
return s;
@@ -62,8 +62,8 @@ trim (char *s, int *rem_front, int *rem_back)
char *
replace_str (char *s,
- char *old,
- char *replace)
+ char *old,
+ char *replace)
{
char* result;
int i, cnt = 0;
@@ -93,3 +93,20 @@ replace_str (char *s,
result[i] = '\0';
return result;
};
+
+char *
+join_str (char **s, size_t len, char delim)
+{
+ char *ret = strdup (s[0]);
+ size_t ret_len = sizeof (char) * len + strlen (ret);
+
+ for (int i = 1; i < len; i++) {
+ char *ret_tmp = realloc (ret, ret_len + strlen (s[i]) + 1);
+ ret_len += strlen (s[i]) + 1;
+ if (ret_tmp != NULL)
+ ret = ret_tmp;
+ sprintf (ret, "%s%c%s", ret, delim, s[i]);
+ }
+
+ return ret;
+}
diff --git a/src/memset_s.c b/src/memset_s.c
index 039be20..8b4d342 100644
--- a/src/memset_s.c
+++ b/src/memset_s.c
@@ -9,7 +9,6 @@
errno_t
memset_s(void *s, rsize_t smax, int c, rsize_t n)
{
- puts ("memset");
volatile unsigned char *dest = (unsigned char *) s;
errno_t ret = EINVAL;
rsize_t limit = n < smax ? n : smax;
diff --git a/tests/test.c b/tests/test.c
index b58dfe4..0b19f97 100644
--- a/tests/test.c
+++ b/tests/test.c
@@ -23,6 +23,7 @@ test_malloc_free_secure (size_t size)
int
test_fcopy()
{
+ int errno = 0;
char *buf_a;
char *buf_b;
size_t len_a;
@@ -38,74 +39,91 @@ test_fcopy()
fcopy (file_test_a, file_test_b);
fclose (file_test_b);
- if (memcmp(buf_a, buf_b, len_a) != 0) {
- free_secure ((void**)&buf_a, len_a);
- free_secure ((void **)&buf_b, len_b);
- return 1;
- }
+ if (memcmp(buf_a, buf_b, len_a) != 0)
+ errno = 1;
+
free_secure ((void**)&buf_a, len_a);
free_secure ((void **)&buf_b, len_b);
- return 0;
+ return errno;
}
int
test_strlwr_strupr ()
{
-
+ int errno = 0;
char *test_string = strdup ("hello");
char *uppr_string = strupr (test_string);
char *lower_string = strlwr (uppr_string);
- if (strcmp (uppr_string, "HELLO") != 0) {
- free_secure ((void **)&test_string, strlen (test_string));
- return 1;
- }
- if (strcmp (lower_string, "hello") != 0) {
- free_secure ((void **)&test_string, strlen (test_string));
- return 2;
- }
+ if (strcmp (uppr_string, "HELLO") != 0)
+ errno = 1;
+
+ if (strcmp (lower_string, "hello") != 0)
+ errno = 2;
+
+ EXIT:
free_secure ((void **)&test_string, strlen (test_string));
- return 0;
+ return errno;
}
int
test_trim()
{
#undef free
+ int errno = 0;
char *test_string = strdup ("\t\thi\t\t");
int rem_front = 0;
int rem_back = 0;
char *trimmed_string = trim (test_string, &rem_front, &rem_back);
if (strstr (trimmed_string, "\t") != NULL) {
- free (trimmed_string-rem_front);
- free_secure ((void**)&test_string, strlen (test_string));
- return 1;
+ errno = 1;
+ goto EXIT;
}
if (rem_front != 2 && rem_back != 2) {
- free (trimmed_string-rem_front);
- free_secure ((void**)&test_string, strlen (test_string));
- return 2;
+ errno = 2;
+ goto EXIT;
}
+
+ EXIT:
free (trimmed_string-rem_front);
free_secure ((void**)&test_string, strlen (test_string));
- return 0;
+ return errno;
}
int
test_replace_str ()
{
+ int errno = 0;
char *test_string = strdup ("replace world!");
char *replaced_string = replace_str (test_string, "replace", "hello");
- if (strcmp (replaced_string, "hello world!") != 0) {
- free_secure ((void**)&test_string, strlen (test_string));
- free_secure ((void**)&replaced_string, strlen (replaced_string));
- return 1;
- }
+ if (strcmp (replaced_string, "hello world!") != 0)
+ errno = 1;
+
free_secure ((void**)&test_string, strlen (test_string));
free_secure ((void**)&replaced_string, strlen (replaced_string));
- return 0;
+ return errno;
}
+int
+test_join_str ()
+{
+ int errno = 0;
+ char **test_string = malloc (sizeof (char*) * 4);
+ for (int i = 0; i < 3; i++)
+ test_string [i] = strdup ("hello");
+
+ char *joined_string = join_str (test_string, 3, ' ');
+
+ if (strcmp (joined_string, "hello hello hello") != 0)
+ errno = 1;
+
+ free_secure ((void**)&test_string[0], strlen (test_string[0]));
+ free_secure ((void**)&test_string[1], strlen (test_string[1]));
+ free_secure ((void**)&test_string[2], strlen (test_string[2]));
+ free (test_string);
+ free_secure ((void**)&joined_string, strlen (joined_string));
+ return errno;
+}
int
main (void)
@@ -147,5 +165,12 @@ main (void)
printf ("Test Case 5: test_replace_str -- SUCCESS\n\n");
else
printf ("Test Case 5: test_replace_str -- FAILED %d\n\n", test_5_result);
+
+ printf ("Test Case 6: test_join_str -- join_str\n");
+ int test_6_result = test_join_str();
+ if (test_6_result == 0)
+ printf ("Test Case 6: test_join_str -- SUCCESS\n\n");
+ else
+ printf ("Test Case 6: test_join_str -- FAILED %d\n\n", test_6_result);
return 0;
}