server/src/common/util/language.c
Enno Rehling 32bc84c970 * Prefix im CR repariert.
* RACE_ADJUSTMENT korrekt deaktiviert.
* Schiffe werden nur noch beschädigt, wenn der Kampf für sie relevant war.
* Erneute Reparatur für Regionen ohne demand.
* KÄMPFE HELFE NICHT repariert.
* Setzen des Kampfzaubers ohne Stufenangabe setzt die Stufe auf 0 (=max)
* Übersetzung des HP-Status im Report
* Teilübersetzung der Spionage-Reports.
* locale_string() liefert auf NULL wieder NULL zurück (statt crash).
2002-02-06 08:06:02 +00:00

195 lines
4.1 KiB
C

/* vi: set ts=2:
*
*
* Eressea PB(E)M host Copyright (C) 1998-2000
* Christian Schlittchen (corwin@amber.kn-bremen.de)
* Katja Zedel (katze@felidae.kn-bremen.de)
* Henning Peters (faroul@beyond.kn-bremen.de)
* Enno Rehling (enno@eressea-pbem.de)
* Ingo Wilken (Ingo.Wilken@informatik.uni-oldenburg.de)
*
* This program may not be used, modified or distributed without
* prior permission by the authors of Eressea.
*/
#include <config.h>
#include "language.h"
#include "log.h"
#include "goodies.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#define SMAXHASH 512
/** importing **/
struct locale {
struct locale * next;
unsigned int hashkey;
const char * name;
struct locale_string {
unsigned int hashkey;
struct locale_string * nexthash;
char * str;
char * key;
} * strings[SMAXHASH];
};
locale * default_locale;
static locale * locales;
unsigned int
locale_hashkey(const locale * lang)
{
assert(lang);
return lang->hashkey;
}
locale *
find_locale(const char * name)
{
unsigned int hkey = hashstring(name);
locale * l = locales;
while (l && l->hashkey!=hkey) l=l->next;
return l;
}
locale *
make_locale(const char * name)
{
unsigned int hkey = hashstring(name);
locale * l = calloc(sizeof(locale), 1);
#ifndef NDEBUG
locale * lp = locales;
while (lp && lp->hashkey!=hkey) lp=lp->next;
assert(lp == NULL);
#endif
l->hashkey = hkey;
l->name = strdup(name);
l->next = locales;
locales = l;
if (default_locale==NULL) default_locale = l;
return l;
}
static FILE * s_debug = NULL;
void
debug_language(const char * log)
{
s_debug = fopen(log, "w+");
}
const char *
locale_getstring(const locale * lang, const char * key)
{
unsigned int hkey = hashstring(key);
unsigned int id = hkey % SMAXHASH;
struct locale_string * find;
assert(lang);
if (key==NULL || *key==0) return NULL;
find = lang->strings[id];
while (find) {
if (find->hashkey == hkey && !strcmp(key, find->key)) return find->str;
find = find->nexthash;
}
return NULL;
}
const char *
locale_string(const locale * lang, const char * key)
{
if (key==NULL) return NULL;
else {
unsigned int hkey = hashstring(key);
unsigned int id = hkey % SMAXHASH;
struct locale_string * find;
if (key == NULL || *key==0) return NULL;
if (lang == NULL) return key;
find = lang->strings[id];
while (find) {
if (find->hashkey == hkey && !strcmp(key, find->key)) break;
find = find->nexthash;
}
if (!find) {
const char * s = key;
log_warning(("missing translation for \"%s\" in locale %s\n", key, lang->name));
if (lang!=default_locale) {
s = locale_string(default_locale, key);
}
if (s_debug) {
fprintf(s_debug, "%s;%s;%s\n", key, lang->name, s);
fflush(s_debug);
locale_setstring((struct locale*)lang, key, s);
}
return s;
}
return find->str;
}
}
void
locale_setstring(locale * lang, const char * key, const char * value)
{
int nval = atoi(key);
unsigned int hkey = nval?nval:hashstring(key);
unsigned int id = hkey % SMAXHASH;
struct locale_string * find;
assert(lang);
find = lang->strings[id];
while (find) {
if (find->hashkey==hkey && !strcmp(key, find->key)) break;
find=find->nexthash;
}
if (!find) {
find = calloc(1, sizeof(struct locale_string));
find->nexthash = lang->strings[id];
lang->strings[id] = find;
find->hashkey = hkey;
find->key = strdup(key);
find->str = strdup(value);
}
else assert(!strcmp(find->str, value) || !"duplicate string for key");
}
const char *
locale_name(const locale * lang)
{
assert(lang);
return lang->name;
}
const char *
reverse_lookup(const locale * lang, const char * str)
{
int i;
assert(lang);
if (lang!=NULL) {
for (i=0;i!=SMAXHASH;++i) {
struct locale_string * ls;
for (ls=lang->strings[i];ls;ls=ls->nexthash) {
if (strcasecmp(ls->key, str)==0) return ls->key;
if (strcasecmp(ls->str, str)==0) return ls->key;
}
}
}
return str;
}
const char *
mkname(const char * space, const char * name)
{
static char zBuffer[128];
if (space && *space) {
sprintf(zBuffer, "%s::%s", space, name);
} else {
strcpy(zBuffer, name);
}
return zBuffer;
}