From 168f6df908f7217a56e493246237d069794cd8d5 Mon Sep 17 00:00:00 2001 From: Bobsson Date: Sun, 18 Mar 2018 17:09:38 -0400 Subject: [PATCH] Multiple keyword support (#46) * Support for multiple keywords in item commands * Free the new array so we don't leak memory --- src/handler.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/handler.c b/src/handler.c index e82be12..94e3d9a 100644 --- a/src/handler.c +++ b/src/handler.c @@ -81,7 +81,8 @@ int is_name(const char *str, const char *namelist) /* allow abbreviations */ #define WHITESPACE " \t" -int isname(const char *str, const char *namelist) +#define KEYWORDJOIN "_" +int isname_tok(const char *str, const char *namelist) { char *newlist; char *curtok; @@ -105,6 +106,34 @@ int isname(const char *str, const char *namelist) return 0; } + +int isname (const char *str, const char *namelist) +{ + char *strlist; + char *substr; + + if (!str || !*str || !namelist || !*namelist) + return 0; + + if (!strcmp (str, namelist)) /* the easy way */ + return 1; + + strlist = strdup(str); + for (substr = strtok(strlist, KEYWORDJOIN); substr; substr = strtok (NULL, KEYWORDJOIN)) + { + if (!substr) continue; + if (!isname_tok(substr, namelist)) + { + free(strlist); + return 0; + } + } + /* If we didn't fail, assume we succeded because every token was matched */ + free(strlist); + return 1; +} + + static void aff_apply_modify(struct char_data *ch, byte loc, sbyte mod, char *msg) { switch (loc) {