server/src/common/util/nrmessage.c
Enno Rehling 0f2f7f7b62 Mit einem Hashtable nrt_find beschleunigt.
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
2004-01-19 10:01:43 +00:00

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;
}