Quellcode durchsuchen

support split_str

lyon vor 3 Jahren
Ursprung
Commit
fd910ea086

+ 18 - 11
package/PikaStdLib/PikaStdData_String.c

@@ -251,19 +251,26 @@ PikaObj* PikaStdData_String_split(PikaObj* self, char* s) {
     Args buffs = {0};
     char* str = strsCopy(&buffs, obj_getStr(self, "str"));
 
-    char sign = s[0];
-    int token_num = strCountSign(str, sign) + 1;
+    /* split str with s by strstr() */
 
-    for (int i = 0; i < token_num; i++) {
-        char* token = strsPopToken(&buffs, &str, sign);
-        /* 用 arg_set<type> 的 api 创建 arg */
-        Arg* token_arg = arg_newStr(token);
-        /* 添加到 list 对象 */
-        PikaStdData_List_append(list, token_arg);
-        /* 销毁 arg */
-        arg_deinit(token_arg);
+    size_t spliter_len = strGetSize(s);
+    char* p = str;
+    while (1) {
+        char* q = strstr(p, s);
+        if (q == NULL) {
+            break;
+        }
+        *q = '\0';
+        Arg* arg_item = arg_newStr(p);
+        PikaStdData_List_append(list, arg_item);
+        arg_deinit(arg_item);
+        p = q + spliter_len;
+    }
+    if (*p != '\0') {
+        Arg* arg_item = arg_newStr(p);
+        PikaStdData_List_append(list, arg_item);
+        arg_deinit(arg_item);
     }
-
     strsDeinit(&buffs);
     return list;
 }

+ 18 - 11
port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdData_String.c

@@ -251,19 +251,26 @@ PikaObj* PikaStdData_String_split(PikaObj* self, char* s) {
     Args buffs = {0};
     char* str = strsCopy(&buffs, obj_getStr(self, "str"));
 
-    char sign = s[0];
-    int token_num = strCountSign(str, sign) + 1;
+    /* split str with s by strstr() */
 
-    for (int i = 0; i < token_num; i++) {
-        char* token = strsPopToken(&buffs, &str, sign);
-        /* 用 arg_set<type> 的 api 创建 arg */
-        Arg* token_arg = arg_newStr(token);
-        /* 添加到 list 对象 */
-        PikaStdData_List_append(list, token_arg);
-        /* 销毁 arg */
-        arg_deinit(token_arg);
+    size_t spliter_len = strGetSize(s);
+    char* p = str;
+    while (1) {
+        char* q = strstr(p, s);
+        if (q == NULL) {
+            break;
+        }
+        *q = '\0';
+        Arg* arg_item = arg_newStr(p);
+        PikaStdData_List_append(list, arg_item);
+        arg_deinit(arg_item);
+        p = q + spliter_len;
+    }
+    if (*p != '\0') {
+        Arg* arg_item = arg_newStr(p);
+        PikaStdData_List_append(list, arg_item);
+        arg_deinit(arg_item);
     }
-
     strsDeinit(&buffs);
     return list;
 }

+ 20 - 0
test/string-test.cpp

@@ -130,6 +130,26 @@ TEST(string, split) {
     EXPECT_EQ(pikaMemNow(), 0);
 }
 
+TEST(string, split_str) {
+    /* init */
+    pikaMemInfo.heapUsedMax = 0;
+    PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
+    /* run */
+    obj_run(pikaMain,
+            "s = PikaStdData.String('aabbcc')\n"
+            "tokens = s.split('bb')\n"
+            "for item in tokens:\n"
+            "    print(item)\n"
+            "\n");
+    /* collect */
+    /* assert */
+    EXPECT_STREQ(log_buff[0], "cc\r\n");
+    EXPECT_STREQ(log_buff[1], "aa\r\n");
+    /* deinit */
+    obj_deinit(pikaMain);
+    EXPECT_EQ(pikaMemNow(), 0);
+}
+
 TEST(string, strip) {
     /* init */
     pikaMemInfo.heapUsedMax = 0;