forked from github/server
0f2f7f7b62
Ausführungszeit ist durch die beiden letzten Änderungen von 26:44 minuten auf 15:25 minuten gesunken, was schon ein echt spürbarer Fortschritt ist. Weitere Optimierungskandidaten: 19.80 116.74 116.74 8791 13.28 17.58 firstregion 11.56 184.90 68.16 7275 9.37 16.38 lastregion 7.28 227.80 42.90 644401018 0.00 0.00 a_find 6.81 267.97 40.17 856647 0.05 0.07 internal_path_find 4.57 294.90 26.93 1055956 0.03 0.03 mt_find 3.33 314.51 19.61 263723185 0.00 0.00 check_leuchtturm
126 lines
3.1 KiB
C
126 lines
3.1 KiB
C
/* vi: set ts=2:
|
|
+-------------------+ Christian Schlittchen <corwin@amber.kn-bremen.de>
|
|
| | Enno Rehling <enno@eressea-pbem.de>
|
|
| Eressea PBEM host | Katja Zedel <katze@felidae.kn-bremen.de>
|
|
| (c) 1998 - 2003 | Henning Peters <faroul@beyond.kn-bremen.de>
|
|
| | Ingo Wilken <Ingo.Wilken@informatik.uni-oldenburg.de>
|
|
+-------------------+ Stefan Reich <reich@halbling.de>
|
|
|
|
This program may not be used, modified or distributed
|
|
without prior permission by the authors of Eressea.
|
|
|
|
*/
|
|
|
|
#include <config.h>
|
|
#include "nrmessage.h"
|
|
#include "nrmessage_struct.h"
|
|
|
|
/* util includes */
|
|
#include "log.h"
|
|
#include "message.h"
|
|
#include "language.h"
|
|
#include "translation.h"
|
|
#include "goodies.h"
|
|
|
|
/* libc includes */
|
|
#include <assert.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
#define NRT_MAXHASH 256
|
|
static nrmessage_type * messagetypes[NRT_MAXHASH];
|
|
|
|
const char *
|
|
nrt_string(const struct nrmessage_type *type)
|
|
{
|
|
return type->string;
|
|
}
|
|
|
|
nrmessage_type *
|
|
nrt_find(const struct locale * lang, const struct message_type * mtype)
|
|
{
|
|
nrmessage_type * found = NULL;
|
|
unsigned int hash = hashstring(mtype->name) % NRT_MAXHASH;
|
|
nrmessage_type * type = messagetypes[hash];
|
|
while (type) {
|
|
if (type->mtype==mtype) {
|
|
if (found==NULL) found = type;
|
|
else if (type->lang==NULL) found = type;
|
|
if (lang==type->lang) {
|
|
found = type;
|
|
break;
|
|
}
|
|
}
|
|
type = type->next;
|
|
}
|
|
return found;
|
|
}
|
|
|
|
void
|
|
nrt_register(const struct message_type * mtype, const struct locale * lang, const char * string, int level, const char * section)
|
|
{
|
|
unsigned int hash = hashstring(mtype->name) % NRT_MAXHASH;
|
|
nrmessage_type * nrt = messagetypes[hash];
|
|
while (nrt && (nrt->lang!=lang || nrt->mtype!=mtype)) {
|
|
nrt = nrt->next;
|
|
}
|
|
if (!nrt) {
|
|
int i;
|
|
char zNames[256];
|
|
char * c = zNames;
|
|
nrt = malloc(sizeof(nrmessage_type));
|
|
nrt->lang = lang;
|
|
nrt->mtype = mtype;
|
|
nrt->next = messagetypes[hash];
|
|
nrt->level=level;
|
|
if (section) nrt->section = strdup(section);
|
|
else nrt->section = NULL;
|
|
messagetypes[hash] = nrt;
|
|
assert(string && *string);
|
|
nrt->string = strdup(string);
|
|
*c = '\0';
|
|
for (i=0;i!=mtype->nparameters;++i) {
|
|
if (i!=0) *c++ = ' ';
|
|
c+= strlen(strcpy(c, mtype->pnames[i]));
|
|
}
|
|
nrt->vars = strdup(zNames);
|
|
/* TODO: really necessary to strdup them all? here? better to extend the caller? hash? */
|
|
}
|
|
}
|
|
|
|
int
|
|
nr_render(const struct message * msg, const struct locale * lang, char * buffer, size_t bufsize, const void * userdata)
|
|
{
|
|
struct nrmessage_type * nrt = nrt_find(lang, msg->type);
|
|
|
|
if (nrt) {
|
|
const char * m = translate(nrt->string, userdata, nrt->vars, msg->parameters);
|
|
if (m) {
|
|
strcpy(buffer, m);
|
|
return 0;
|
|
} else {
|
|
log_error(("Couldn't render message %s\n", nrt->mtype->name));
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
int
|
|
nr_level(const struct message *msg)
|
|
{
|
|
nrmessage_type * nrt = nrt_find(NULL, msg->type);
|
|
return nrt->level;
|
|
}
|
|
|
|
const char *
|
|
nr_section(const struct message *msg)
|
|
{
|
|
nrmessage_type * nrt = nrt_find(default_locale, msg->type);
|
|
return nrt->section;
|
|
}
|
|
|
|
const char *
|
|
nrt_section(const nrmessage_type * nrt)
|
|
{
|
|
return nrt->section;
|
|
}
|