OSDN Git Service

Allow for redefinition of user defs.
authorSimon Forman <sforman@hushmail.com>
Thu, 9 Feb 2023 07:20:35 +0000 (23:20 -0800)
committerSimon Forman <sforman@hushmail.com>
Thu, 9 Feb 2023 07:20:35 +0000 (23:20 -0800)
And some protection for inscribe, empty quotes or quotes that do not
have a symbol at the first item are just consumed without affecting the
user defs.

Because the Gperf wordlist is checked before the user defs hash the
inscribe command cannot overwrite the commands defined in the wordlist.

implementations/C/joy.c

index eab72cf..eb37401 100644 (file)
@@ -768,11 +768,12 @@ add_user_def(char *name, JoyList body)
 {
        struct user_def *s;
        HASH_FIND_STR(user_defs, name, s);
-       if (s) return; /* no overwrite */
-       s = GC_malloc(sizeof *s);
-       s->name = name;
+       if (!s) {
+               s = GC_malloc(sizeof *s);
+               s->name = name;
+               HASH_ADD_KEYPTR(hh, user_defs, s->name, strlen(s->name), s);
+       }
        s->body = body;
-       HASH_ADD_KEYPTR(hh, user_defs, s->name, strlen(s->name), s);
 }
 
 
@@ -780,6 +781,8 @@ void
 inscribe(JoyListPtr stack, __attribute__((unused)) JoyListPtr expression)
 {
        JoyList quote = pop_list(stack);
+       if (!quote) return;
+       if (joySymbol != quote->head->kind) return;
        add_user_def(quote->head->value.symbol, quote->tail);
 }