server/src/keyword.c
Enno Rehling 90dd700487 BREED/PLANT/GROW are technically the same command, merge them.
The new parser makes this easy.
2015-01-04 15:11:49 +01:00

147 lines
2.9 KiB
C

#include <platform.h>
#include <kernel/config.h>
#include "keyword.h"
#include "util/language.h"
#include "util/umlaut.h"
#include <critbit.h>
#include <assert.h>
#include <string.h>
const char * keyword(keyword_t kwd)
{
static char result[KEYWORDSIZE]; // FIXME: static return value
if (!result[0]) {
strcpy(result, "keyword::");
}
strcpy(result + 9, keywords[kwd]);
return result;
}
static const char * keyword_key(int kwd) {
assert(kwd < MAXKEYWORDS && kwd >= 0);
return keyword((keyword_t)kwd);
}
void init_keyword(const struct locale *lang, keyword_t kwd, const char *str) {
void **tokens = get_translations(lang, UT_KEYWORDS);
struct critbit_tree **cb = (critbit_tree **)tokens;
add_translation(cb, str, (int)kwd);
}
void init_keywords(const struct locale *lang) {
init_translations(lang, UT_KEYWORDS, keyword_key, MAXKEYWORDS);
}
keyword_t findkeyword(const char *s) {
int i;
for (i = 0; i != MAXKEYWORDS; ++i) {
if (strcmp(s, keywords[i]) == 0) {
return (keyword_t)i;
}
}
return NOKEYWORD;
}
keyword_t get_keyword(const char *s, const struct locale *lang) {
keyword_t result = NOKEYWORD;
char buffer[64];
assert(lang);
assert(s);
while (*s == '@') ++s;
if (*s) {
char *str = transliterate(buffer, sizeof(buffer) - sizeof(int), s);
if (str) {
int i;
const void *match;
void **tokens = get_translations(lang, UT_KEYWORDS);
critbit_tree *cb = (critbit_tree *)*tokens;
if (cb && cb_find_prefix(cb, str, strlen(str), &match, 1, 0)) {
cb_get_kv(match, &i, sizeof(int));
result = (keyword_t)i;
return keyword_disabled(result) ? NOKEYWORD : result;
}
}
}
return NOKEYWORD;
}
static bool disabled_kwd[MAXKEYWORDS];
void enable_keyword(keyword_t kwd, bool enabled) {
assert(kwd < MAXKEYWORDS);
disabled_kwd[kwd] = !enabled;
}
bool keyword_disabled(keyword_t kwd) {
assert(kwd < MAXKEYWORDS);
return disabled_kwd[kwd];
}
const char *keywords[MAXKEYWORDS] = {
"//",
"banner",
"work",
"attack",
"steal",
"besiege",
"name",
"use",
"describe",
"enter",
"guard",
"message",
"end",
"ride",
"number",
"follow",
"research",
"give",
"help",
"combat",
"ready",
"buy",
"contact",
"teach",
"study",
"make",
"maketemp",
"move",
"password",
"recruit",
"reserve",
"route",
"sabotage",
"option",
"spy",
"quit",
"hide",
"carry",
"tax",
"entertain",
"sell",
"leave",
"forget",
"cast",
"show",
"destroy",
"grow",
"default",
"origin",
"email",
"piracy",
"group",
"sort",
"prefix",
"alliance",
"claim",
"promote",
"pay",
"loot",
};