Allow for redefinition of user defs.

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.
This commit is contained in:
Simon Forman
2023-02-08 23:20:35 -08:00
parent 35d8ed498f
commit 8016fd697a
+7 -4
View File
@@ -768,11 +768,12 @@ add_user_def(char *name, JoyList body)
{ {
struct user_def *s; struct user_def *s;
HASH_FIND_STR(user_defs, name, s); HASH_FIND_STR(user_defs, name, s);
if (s) return; /* no overwrite */ if (!s) {
s = GC_malloc(sizeof *s); s = GC_malloc(sizeof *s);
s->name = name; s->name = name;
HASH_ADD_KEYPTR(hh, user_defs, s->name, strlen(s->name), s);
}
s->body = body; 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) inscribe(JoyListPtr stack, __attribute__((unused)) JoyListPtr expression)
{ {
JoyList quote = pop_list(stack); JoyList quote = pop_list(stack);
if (!quote) return;
if (joySymbol != quote->head->kind) return;
add_user_def(quote->head->value.symbol, quote->tail); add_user_def(quote->head->value.symbol, quote->tail);
} }