浏览代码

SCDString_replace_c_str. Renamed SCDString_resize_to_fit -> SCDString_shrink_to_fit.

Aaro Saila 3 周之前
父节点
当前提交
7814910993
共有 3 个文件被更改,包括 59 次插入 和 5 次删除
  1. 14 1
      include/scufcont/DString.h
  2. 29 4
      src/DString.c
  3. 16 0
      tests/cmocka/DString_tests.c

+ 14 - 1
include/scufcont/DString.h

@@ -38,6 +38,7 @@ ScufContResult SCDString_alloc_copy(SCDString *const dstr, const SCDString *cons
 ScufContResult SCDString_reserve(SCDString *const dstr, const size_t new_capacity);
 
 void SCDString_free(SCDString *const dstr);
+void SCDString_shrink_to_fit(SCDString *const dstr);
 
 /**
   @param dst Must have been allocated with one of the allocation functions.
@@ -107,7 +108,7 @@ ScufContResult SCDString_char_mod(SCDString *const dstr, const size_t at, const
   @return SCUFCONT_OUT_OF_BOUNDS
   @return SCUFCONT_SUCCESS
 */
-ScufContResult SCDString_char_remove_no_resize(SCDString *const dstr, const size_t at);
+ScufContResult SCDString_char_remove_no_shrink(SCDString *const dstr, const size_t at);
 
 /**
   @return SCUFCONT_OUT_OF_BOUNDS
@@ -122,4 +123,16 @@ 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);
 
+/**
+  @return SCUFCONT_OUT_OF_MEMORY
+  @return SCUFCONT_SUCCESS
+*/
+ScufContResult SCDString_replace_c_str_no_shrink(SCDString *const dstr, const char *str, const size_t str_len);
+
+/**
+  @return SCUFCONT_OUT_OF_MEMORY
+  @return SCUFCONT_SUCCESS
+*/
+ScufContResult SCDString_replace_c_str(SCDString *const dstr, const char *str, const size_t str_len);
+
 #endif // SCUFCONT_DSTRING_H_

+ 29 - 4
src/DString.c

@@ -45,7 +45,7 @@ void SCDString_free(SCDString *const dstr) {
     dstr->capacity = 0;
 }
 
-void SCDString_resize_to_fit(SCDString *const dstr) {
+void SCDString_shrink_to_fit(SCDString *const dstr) {
     if (dstr->capacity > dstr->len + 1) {
         dstr->capacity = dstr->len + 1;
         dstr->data = (char *) realloc(dstr->data, dstr->capacity);
@@ -248,7 +248,7 @@ ScufContResult SCDString_char_mod(SCDString *const dstr, const size_t at, const
     return SCUFCONT_SUCCESS;
 }
 
-ScufContResult SCDString_char_remove_no_resize(SCDString *const dstr, const size_t at) {
+ScufContResult SCDString_char_remove_no_shrink(SCDString *const dstr, const size_t at) {
     if (at > dstr->len - 1) {
         return SCUFCONT_OUT_OF_BOUNDS;
     }
@@ -259,12 +259,12 @@ ScufContResult SCDString_char_remove_no_resize(SCDString *const dstr, const size
 }
 
 ScufContResult SCDString_char_remove(SCDString *const dstr, const size_t at) {
-    const ScufContResult res = SCDString_char_remove_no_resize(dstr, at);
+    const ScufContResult res = SCDString_char_remove_no_shrink(dstr, at);
     if (res != SCUFCONT_SUCCESS) {
         return res;
     }
 
-    SCDString_resize_to_fit(dstr);
+    SCDString_shrink_to_fit(dstr);
 
     return SCUFCONT_SUCCESS;
 }
@@ -287,3 +287,28 @@ ScufContResult SCDString_char_insert(SCDString *const dstr, const size_t at, con
 
     return SCUFCONT_SUCCESS;
 }
+
+ScufContResult SCDString_replace_c_str_no_shrink(SCDString *const dstr, const char *str, const size_t str_len) {
+    if (dstr->capacity < str_len + 1) {
+        const ScufContResult res = SCDString_reserve(dstr, str_len + 1);
+        if (res != SCUFCONT_SUCCESS) {
+            return res;
+        }
+    }
+
+    memcpy(dstr->data, str, str_len);
+    dstr->len = str_len;
+
+    return SCUFCONT_SUCCESS;
+}
+
+ScufContResult SCDString_replace_c_str(SCDString *const dstr, const char *str, const size_t str_len) {
+    const ScufContResult res = SCDString_replace_c_str_no_shrink(dstr, str, str_len);
+    if (res != SCUFCONT_SUCCESS) {
+        return res;
+    }
+
+    SCDString_shrink_to_fit(dstr);
+
+    return SCUFCONT_SUCCESS;
+}

+ 16 - 0
tests/cmocka/DString_tests.c

@@ -287,6 +287,21 @@ void test_SCDString_char_insert(void **state) {
     SCDString_free(&dstr);
 }
 
+void test_SCDString_replace_c_str(void **state) {
+    (void) state;
+
+    SCDString dstr;
+    assert_true(SCDString_alloc(&dstr, "Hello", strlen("Hello")) == SCUFCONT_SUCCESS);
+    assert_string_equal(SCDString_c_str(&dstr), "Hello");
+    assert_uint_equal(dstr.len, 5);
+
+    assert_true(SCDString_replace_c_str(&dstr, "World!", strlen("World!")) == SCUFCONT_SUCCESS);
+    assert_string_equal(SCDString_c_str(&dstr), "World!");
+    assert_uint_equal(dstr.len, 6);
+
+    SCDString_free(&dstr);
+}
+
 int DString_tests_run(void) {
     const struct CMUnitTest tests[] = {
         cmocka_unit_test(test_SCDString_alloc),
@@ -303,6 +318,7 @@ int DString_tests_run(void) {
         cmocka_unit_test(test_SCDString_char_mod),
         cmocka_unit_test(test_SCDString_char_remove),
         cmocka_unit_test(test_SCDString_char_insert),
+        cmocka_unit_test(test_SCDString_replace_c_str),
     };
 
     return cmocka_run_group_tests_name("DString", tests, NULL, NULL);