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
1 changed files with 7 additions and 4 deletions

View 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);
}