]> git.lizzy.rs Git - nothing.git/commitdiff
Replace Tokens with Strings
authorrexim <reximkut@gmail.com>
Sat, 21 Dec 2019 18:13:12 +0000 (01:13 +0700)
committerrexim <reximkut@gmail.com>
Sat, 4 Jan 2020 17:08:51 +0000 (00:08 +0700)
src/system/s.h
src/ui/console.c

index f79ae00165b7292580629c081ccf05b1f87888f1..2b3c3566524b277d7072010715648a9b04361550 100644 (file)
@@ -89,4 +89,21 @@ String trim(String input)
     return trim_end(trim_begin(input));
 }
 
+static inline
+String chop_word(String *input)
+{
+    trace_assert(input);
+
+    *input = trim_begin(*input);
+
+    size_t i = 0;
+    while (i < input->count && !isspace(input->data[i]))
+        i++;
+
+    String result = string(i, input->data);
+    input->data += i;
+    input->count -= i;
+    return result;
+}
+
 #endif  // S_H_
index 909189561b6b792f4b5d9bb94e8264fd110ba882..9b1458c4c5ffe560b94e6b43fbf54aa95e1d2ce5 100644 (file)
 #define CONSOLE_FOREGROUND (rgba(0.80f, 0.80f, 0.80f, CONSOLE_ALPHA))
 #define CONSOLE_ERROR (rgba(0.80f, 0.50f, 0.50f, CONSOLE_ALPHA))
 
-typedef struct {
-    const char *begin;
-    const char *end;
-} Token;
-
-
-static inline
-Token token(const char *begin, const char *end)
-{
-    Token t = {begin, end};
-    return t;
-}
-
-static inline
-int token_equals_str(Token t, const char *s)
-{
-    trace_assert(t.begin <= t.end);
-    size_t n1 = (size_t) (t.end - t.begin);
-    size_t n2 = strlen(s);
-    if (n1 != n2) return 0;
-    return memcmp(t.begin, s, n1) == 0;
-}
-
-static inline
-Token token_nt(const char *s)
-{
-    return token(s, s + strlen(s));
-}
-
-static inline
-void ltrim(Token *t)
-{
-    while (t->begin < t->end && isspace(*t->begin)) {
-        t->begin++;
-    }
-}
-
-static inline
-Token chop_word(Token *t)
-{
-    ltrim(t);
-    const char *end = t->begin;
-    while (end < t->end && !isspace(*end)) {
-        end++;
-    }
-    Token result = token(t->begin, end);
-    t->begin = end;
-    return result;
-}
-
 struct Console
 {
     Lt *lt;
@@ -146,10 +96,10 @@ static int console_eval_input(Console *console)
 {
     const char *input_text = edit_field_as_text(console->edit_field);
 
-    Token input = token_nt(input_text);
-    Token command = chop_word(&input);
+    String input = string_nt(input_text);
+    String command = chop_word(&input);
 
-    if (token_equals_str(command, "")) {
+    if (string_equal(command, STRING_LIT(""))) {
         edit_field_clean(console->edit_field);
         return 0;
     }
@@ -162,18 +112,18 @@ static int console_eval_input(Console *console)
         return -1;
     }
 
-    if (token_equals_str(command, "load")) {
-        Token level = chop_word(&input);
+    if (string_equal(command, STRING_LIT("load"))) {
+        String level = chop_word(&input);
         console_log_push_line(console->console_log, "Loading level:", NULL, CONSOLE_FOREGROUND);
-        console_log_push_line(console->console_log, level.begin, level.end, CONSOLE_FOREGROUND);
+        console_log_push_line(console->console_log, level.data, level.data + level.count, CONSOLE_FOREGROUND);
         char level_name[256];
         memset(level_name, 0, 256);
-        memcpy(level_name, level.begin, min_size_t((size_t)(level.end - level.begin), 255));
+        memcpy(level_name, level.data, min_size_t(level.count, 255));
 
         if (game_load_level(console->game, level_name) < 0) {
             console_log_push_line(console->console_log, "Could not load level", NULL, CONSOLE_ERROR);
         }
-    } else if (token_equals_str(command, "menu")) {
+    } else if (string_equal(command, STRING_LIT("menu"))) {
         console_log_push_line(console->console_log, "Loading menu", NULL, CONSOLE_FOREGROUND);
         game_switch_state(console->game, GAME_STATE_LEVEL_PICKER);
     } else {