From 1c1ab113103e1a2ebcb7edf3a47f826428f8e124 Mon Sep 17 00:00:00 2001 From: Stone Tickle Date: Wed, 13 Oct 2021 09:47:52 -0500 Subject: [PATCH] extract string.split() --- include/lang/object.h | 5 +---- include/lang/string.h | 7 +++---- include/lang/types.h | 8 ++++++++ src/functions/string.c | 27 +++------------------------ src/lang/string.c | 29 +++++++++++++++++++++++++++++ 5 files changed, 44 insertions(+), 32 deletions(-) create mode 100644 include/lang/types.h diff --git a/include/lang/object.h b/include/lang/object.h index 0e21cb6c..5e406c52 100644 --- a/include/lang/object.h +++ b/include/lang/object.h @@ -2,13 +2,12 @@ #define MUON_LANG_OBJECT_H #include -#include -#include #include #include "compilers.h" #include "iterator.h" #include "lang/string.h" +#include "lang/types.h" enum obj_type { obj_any, // used for argument type checking @@ -47,8 +46,6 @@ enum obj_type { ARG_TYPE_ARRAY_OF = 1 << 20, }; -typedef uint32_t obj; - enum tgt_type { tgt_executable, tgt_library diff --git a/include/lang/string.h b/include/lang/string.h index 5539a2a2..1df75900 100644 --- a/include/lang/string.h +++ b/include/lang/string.h @@ -1,8 +1,7 @@ #ifndef MUON_LANG_STRING_H #define MUON_LANG_STRING_H -#include -#include +#include "lang/types.h" struct workspace; @@ -20,8 +19,6 @@ struct str { _Static_assert(sizeof(struct str) == 16, ""); -typedef uint32_t str; - bool wk_str_unescape(char *buf, uint32_t len, const struct str *ss, uint32_t *r); bool wk_str_has_null(const struct str *ss); @@ -45,4 +42,6 @@ bool wk_str_startswith(const struct str *ss, const struct str *pre); str wk_strcat(struct workspace *wk, str s1, str s2); bool wk_str_to_i(const struct str *ss, int64_t *res); + +obj wk_str_split(struct workspace *wk, const struct str *ss, const struct str *split); #endif diff --git a/include/lang/types.h b/include/lang/types.h new file mode 100644 index 00000000..f28b931f --- /dev/null +++ b/include/lang/types.h @@ -0,0 +1,8 @@ +#ifndef MUON_LANG_TYPES_H +#define MUON_LANG_TYPES_H +#include +#include + +typedef uint32_t obj; +typedef uint32_t str; +#endif diff --git a/src/functions/string.c b/src/functions/string.c index 6e78a7c6..1042b4ce 100644 --- a/src/functions/string.c +++ b/src/functions/string.c @@ -238,32 +238,11 @@ func_split(struct workspace *wk, uint32_t rcvr, uint32_t args_node, uint32_t *ob return false; } - uint32_t i, start = 0, s_id; + const struct str *split = ao[0].set ? get_str(wk, ao[0].val) : &WKSTR(" "), + *ss = get_str(wk, rcvr); - const struct str *split = ao[0].set ? get_str(wk, ao[0].val) : &WKSTR(" "); - - make_obj(wk, obj, obj_array); - - const struct str* ss = get_str(wk, rcvr); - for (i = 0; i < ss->len; ++i) { - struct str slice = { .s = &ss->s[i], .len = ss->len - i }; - - if (wk_str_startswith(&slice, split)) { - make_obj(wk, &s_id, obj_string)->dat.str = - wk_str_pushn(wk, &ss->s[start], i - start); - - obj_array_push(wk, *obj, s_id); - - start = i + split->len; - i += split->len - 1; - } - } - - make_obj(wk, &s_id, obj_string)->dat.str = - wk_str_pushn(wk, &ss->s[start], i - start); - - obj_array_push(wk, *obj, s_id); + *obj = wk_str_split(wk, ss, split); return true; } diff --git a/src/lang/string.c b/src/lang/string.c index ce24374a..7c23988f 100644 --- a/src/lang/string.c +++ b/src/lang/string.c @@ -299,3 +299,32 @@ wk_str_to_i(const struct str *ss, int64_t *res) return true; } + +obj +wk_str_split(struct workspace *wk, const struct str *ss, const struct str *split) +{ + obj res; + make_obj(wk, &res, obj_array); + + uint32_t i, start = 0; + obj s; + + for (i = 0; i < ss->len; ++i) { + struct str slice = { .s = &ss->s[i], .len = ss->len - i }; + + if (wk_str_startswith(&slice, split)) { + make_obj(wk, &s, obj_string)->dat.str = wk_str_pushn(wk, &ss->s[start], i - start); + + obj_array_push(wk, res, s); + + start = i + split->len; + i += split->len - 1; + } + } + + make_obj(wk, &s, obj_string)->dat.str = + wk_str_pushn(wk, &ss->s[start], i - start); + + obj_array_push(wk, res, s); + return res; +} -- 2.38.5