server/src/keyword.c

138 lines
2.5 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>
static const char * keyword_key(int i)
{
assert(i<MAXKEYWORDS&& i>=0);
return mkname("keyword", keywords[i]);
}
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",
"fight",
"ready",
"buy",
"contact",
"teach",
"study",
"make",
"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",
"plant",
"alliance",
"claim",
"promote",
"pay",
};