Sfoglia il codice sorgente

SCDString functions for trimming whitespace.

Aaro Saila 1 settimana fa
parent
commit
71ee7386f0
3 ha cambiato i file con 57 aggiunte e 0 eliminazioni
  1. 10 0
      include/scufcont/DString.h
  2. 30 0
      src/DString.c
  3. 17 0
      tests/cmocka/DString_tests.c

+ 10 - 0
include/scufcont/DString.h

@@ -48,6 +48,12 @@ void SCDString_shrink_to_fit(SCDString *const dstr);
 */
 ScufContResult SCDString_copy(const SCDString *const src, SCDString *const dst);
 
+/**
+  @return SCUFCONT_OUT_OF_BOUNDS
+  @return SCUFCONT_SUCCESS
+*/
+ScufContResult SCDString_at(const SCDString *const dstr, const size_t i);
+
 bool SCDString_equal(const SCDString *const s1, const SCDString *s2);
 bool SCDString_equal_c_str(const SCDString *const s1, const char *s2);
 bool SCDString_equal_next_chars_c_str(
@@ -135,4 +141,8 @@ ScufContResult SCDString_replace_c_str_no_shrink(SCDString *const dstr, const ch
 */
 ScufContResult SCDString_replace_c_str(SCDString *const dstr, const char *str, const size_t str_len);
 
+void SCDString_trim_whitespace_leading(SCDString *const dstr);
+void SCDString_trim_whitespace_trailing(SCDString *const dstr);
+void SCDString_trim_whitespace(SCDString *const dstr);
+
 #endif // SCUFCONT_DSTRING_H_

+ 30 - 0
src/DString.c

@@ -2,6 +2,7 @@
 #include <stdbool.h>
 #include <stdlib.h>
 #include <string.h>
+#include <ctype.h>
 
 #include "scufcont/scufcont.h"
 #include "scufcont/DString.h"
@@ -66,6 +67,14 @@ ScufContResult SCDString_copy(const SCDString *const src, SCDString *const dst)
     return SCUFCONT_SUCCESS;
 }
 
+ScufContResult SCDString_at(const SCDString *const dstr, const size_t i) {
+    if (i > dstr->len - 1) {
+        return SCUFCONT_OUT_OF_BOUNDS;
+    }
+
+    return dstr->data[i];
+}
+
 bool SCDString_equal(const SCDString *const s1, const SCDString *const s2) {
     if (s1->data == NULL || s2->data == NULL) {
         return false;
@@ -312,3 +321,24 @@ ScufContResult SCDString_replace_c_str(SCDString *const dstr, const char *str, c
 
     return SCUFCONT_SUCCESS;
 }
+
+void SCDString_trim_whitespace_leading(SCDString *const dstr) {
+    while (isspace(dstr->data[0])) {
+        SCDString_char_remove_no_shrink(dstr, 0);
+    }
+
+    SCDString_shrink_to_fit(dstr);
+}
+
+void SCDString_trim_whitespace_trailing(SCDString *const dstr) {
+    while (isspace(dstr->data[dstr->len - 1])) {
+        SCDString_char_remove_no_shrink(dstr, dstr->len - 1);
+    }
+
+    SCDString_shrink_to_fit(dstr);
+}
+
+void SCDString_trim_whitespace(SCDString *const dstr) {
+    SCDString_trim_whitespace_leading(dstr);
+    SCDString_trim_whitespace_trailing(dstr);
+}

+ 17 - 0
tests/cmocka/DString_tests.c

@@ -302,6 +302,22 @@ void test_SCDString_replace_c_str(void **state) {
     SCDString_free(&dstr);
 }
 
+void test_SCDString_trim_whitespace(void **state) {
+    (void) state;
+
+    SCDString dstr;
+    const char *str = "    Hello World        ";
+    const size_t str_len = strlen(str);
+    assert_true(SCDString_alloc(&dstr, str, str_len) == SCUFCONT_SUCCESS);
+    assert_string_equal(SCDString_c_str(&dstr), str);
+    assert_uint_equal(dstr.len, str_len);
+
+    SCDString_trim_whitespace(&dstr);
+    assert_string_equal(SCDString_c_str(&dstr), "Hello World");
+
+    SCDString_free(&dstr);
+}
+
 int DString_tests_run(void) {
     const struct CMUnitTest tests[] = {
         cmocka_unit_test(test_SCDString_alloc),
@@ -319,6 +335,7 @@ int DString_tests_run(void) {
         cmocka_unit_test(test_SCDString_char_remove),
         cmocka_unit_test(test_SCDString_char_insert),
         cmocka_unit_test(test_SCDString_replace_c_str),
+        cmocka_unit_test(test_SCDString_trim_whitespace),
     };
 
     return cmocka_run_group_tests_name("DString", tests, NULL, NULL);