Эх сурвалжийг харах

SCDString_char_insert function

Aaro Saila 1 сар өмнө
parent
commit
c382df4b83

+ 1 - 0
include/scufcont/DString.h

@@ -52,5 +52,6 @@ void SCDString_split_arr_free(SCDString **const arr, const size_t arr_len);
 ScufContResult SCDString_char_mod(SCDString *const dstr, const size_t at, const char ch);
 ScufContResult SCDString_char_remove_no_resize(SCDString *const dstr, const size_t at);
 ScufContResult SCDString_char_remove(SCDString *const dstr, const size_t at);
+ScufContResult SCDString_char_insert(SCDString *const dstr, const size_t at, const char ch);
 
 #endif // SCUFCONT_DSTRING_H_

+ 19 - 0
src/DString.c

@@ -267,3 +267,22 @@ ScufContResult SCDString_char_remove(SCDString *const dstr, const size_t at) {
 
     return SCUFCONT_SUCCESS;
 }
+
+ScufContResult SCDString_char_insert(SCDString *const dstr, const size_t at, const char ch) {
+    if (at > dstr->len) {
+        return SCUFCONT_OUT_OF_BOUNDS;
+    }
+
+    ScufContResult res = SCDString_reserve(dstr, dstr->len + 2);
+    if (res != SCUFCONT_SUCCESS) {
+        return res;
+    }
+
+    const size_t move_block_size = at == dstr->len ? 1 : dstr->len - at;
+    memmove(&dstr->data[at] + 1, &dstr->data[at], move_block_size);
+
+    dstr->data[at] = ch;
+    dstr->len++;
+
+    return SCUFCONT_SUCCESS;
+}

+ 32 - 0
tests/cmocka/DString_tests.c

@@ -239,6 +239,37 @@ void test_SCDString_char_remove(void **state) {
     SCDString_free(&dstr);
 }
 
+void test_SCDString_char_insert(void **state) {
+    (void) state;
+
+    SCDString dstr;
+    assert_true(SCDString_alloc(&dstr, "World", strlen("World")) == SCUFCONT_SUCCESS);
+    assert_string_equal(SCDString_c_str(&dstr), "World");
+    assert_uint_equal(dstr.len, strlen("World"));
+
+    assert_true(SCDString_char_insert(&dstr, 0, 'H') == SCUFCONT_SUCCESS);
+    assert_string_equal(SCDString_c_str(&dstr), "HWorld");
+    assert_uint_equal(dstr.len, strlen("HWorld"));
+
+    assert_true(SCDString_char_insert(&dstr, 1, ' ') == SCUFCONT_SUCCESS);
+    assert_string_equal(SCDString_c_str(&dstr), "H World");
+    assert_uint_equal(dstr.len, strlen("H World"));
+
+    assert_true(SCDString_char_insert(&dstr, 1, 'i') == SCUFCONT_SUCCESS);
+    assert_string_equal(SCDString_c_str(&dstr), "Hi World");
+    assert_uint_equal(dstr.len, strlen("Hi World"));
+
+    assert_true(SCDString_char_insert(&dstr, dstr.len, '!') == SCUFCONT_SUCCESS);
+    assert_string_equal(SCDString_c_str(&dstr), "Hi World!");
+    assert_uint_equal(dstr.len, strlen("Hi World!"));
+
+    assert_true(SCDString_char_insert(&dstr, 8, 's') == SCUFCONT_SUCCESS);
+    assert_string_equal(SCDString_c_str(&dstr), "Hi Worlds!");
+    assert_uint_equal(dstr.len, strlen("Hi Worlds!"));
+
+    SCDString_free(&dstr);
+}
+
 int DString_tests_run(void) {
     const struct CMUnitTest tests[] = {
         cmocka_unit_test(test_SCDString_alloc),
@@ -253,6 +284,7 @@ int DString_tests_run(void) {
         cmocka_unit_test(test_SCDString_split),
         cmocka_unit_test(test_SCDString_char_mod),
         cmocka_unit_test(test_SCDString_char_remove),
+        cmocka_unit_test(test_SCDString_char_insert),
     };
 
     return cmocka_run_group_tests_name("DString", tests, NULL, NULL);