neue hashfunktion

This commit is contained in:
Enno Rehling 2001-02-10 11:38:30 +00:00
parent 102bd9cf02
commit 93620b8c56
13 changed files with 128 additions and 44 deletions

View File

@ -1,6 +1,6 @@
/* vi: set ts=2: /* vi: set ts=2:
* *
* $Id: message.c,v 1.3 2001/02/09 13:53:51 corwin Exp $ * $Id: message.c,v 1.4 2001/02/10 11:38:29 enno Exp $
* Eressea PB(E)M host Copyright (C) 1998-2000 * Eressea PB(E)M host Copyright (C) 1998-2000
* Christian Schlittchen (corwin@amber.kn-bremen.de) * Christian Schlittchen (corwin@amber.kn-bremen.de)
* Katja Zedel (katze@felidae.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de)
@ -208,8 +208,8 @@ new_messagetype(const char * name, int level, const char * section)
messagetype * mt2 = messagetypes; messagetype * mt2 = messagetypes;
while(mt2 && mt2->hashkey != mt->hashkey) mt2 = mt2->next; while(mt2 && mt2->hashkey != mt->hashkey) mt2 = mt2->next;
if (mt2) { if (mt2) {
fprintf(stderr, "duplicate hashkey for messagetype %s and %s\n", fprintf(stderr, "duplicate hashkey %u for messagetype %s and %s\n",
name, mt2->name); mt->hashkey, name, mt2->name);
} }
} }
#endif #endif

View File

@ -1,6 +1,6 @@
/* vi: set ts=2: /* vi: set ts=2:
* *
* $Id: render.c,v 1.3 2001/01/30 23:16:17 enno Exp $ * $Id: render.c,v 1.4 2001/02/10 11:38:29 enno Exp $
* Eressea PB(E)M host Copyright (C) 1998-2000 * Eressea PB(E)M host Copyright (C) 1998-2000
* Christian Schlittchen (corwin@amber.kn-bremen.de) * Christian Schlittchen (corwin@amber.kn-bremen.de)
* Katja Zedel (katze@felidae.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de)
@ -48,7 +48,7 @@ int lastint = 0;
typedef struct localizer { typedef struct localizer {
struct localizer * nexthash; struct localizer * nexthash;
int hashkey; unsigned int hashkey;
const locale * lang; const locale * lang;
struct renderer * renderers[RMAXHASH]; struct renderer * renderers[RMAXHASH];
struct eval * evaluators[RMAXHASH]; struct eval * evaluators[RMAXHASH];
@ -58,14 +58,14 @@ typedef const char* (*eval_fun)(const locale * lang, void *);
typedef char * (*render_fun)(const message * m, const locale * lang); typedef char * (*render_fun)(const message * m, const locale * lang);
typedef struct renderer { typedef struct renderer {
int hashkey; unsigned int hashkey;
render_fun fun; render_fun fun;
char * name; char * name;
struct renderer * nexthash; struct renderer * nexthash;
} renderer; } renderer;
typedef struct eval { typedef struct eval {
int hashkey; unsigned int hashkey;
eval_fun fun; eval_fun fun;
const char * name; const char * name;
struct eval * nexthash; struct eval * nexthash;
@ -74,12 +74,10 @@ typedef struct eval {
#define LMAXHASH 32 #define LMAXHASH 32
localizer * localizers[LMAXHASH]; localizer * localizers[LMAXHASH];
extern int hashstring(const char * name);
static localizer * static localizer *
get_localizer(const locale * lang) get_localizer(const locale * lang)
{ {
int hkey = locale_hashkey(lang); unsigned int hkey = locale_hashkey(lang);
int id = hkey % LMAXHASH; int id = hkey % LMAXHASH;
localizer * find = localizers[id]; localizer * find = localizers[id];
while (find && find->lang!=lang) find = find->nexthash; while (find && find->lang!=lang) find = find->nexthash;
@ -96,8 +94,8 @@ get_localizer(const locale * lang)
void void
add_renderfun(const char * name, localizer * l, render_fun fun) add_renderfun(const char * name, localizer * l, render_fun fun)
{ {
int hkey = hashstring(name); unsigned int hkey = hashstring(name);
int id = hkey % RMAXHASH; unsigned int id = hkey % RMAXHASH;
renderer * find = l->renderers[id]; renderer * find = l->renderers[id];
while (find && find->hashkey!=hkey) find=find->nexthash; while (find && find->hashkey!=hkey) find=find->nexthash;
if (!find) { if (!find) {
@ -114,8 +112,8 @@ add_renderfun(const char * name, localizer * l, render_fun fun)
void void
add_evalfun(const char * name, localizer * l, eval_fun fun) add_evalfun(const char * name, localizer * l, eval_fun fun)
{ {
int hkey = hashstring(name); unsigned int hkey = hashstring(name);
int id = hkey % RMAXHASH; unsigned int id = hkey % RMAXHASH;
eval * find = l->evaluators[id]; eval * find = l->evaluators[id];
while (find && find->hashkey!=hkey) find=find->nexthash; while (find && find->hashkey!=hkey) find=find->nexthash;
if (!find) { if (!find) {
@ -376,8 +374,8 @@ render_default(const message * m, const locale * lang)
static render_fun static render_fun
get_renderfun(const char * name, const localizer * l) get_renderfun(const char * name, const localizer * l)
{ {
int hkey = hashstring(name); unsigned int hkey = hashstring(name);
int id = hkey % RMAXHASH; unsigned int id = hkey % RMAXHASH;
renderer * find = l->renderers[id]; renderer * find = l->renderers[id];
while (find && find->hashkey!=hkey) find=find->nexthash; while (find && find->hashkey!=hkey) find=find->nexthash;
if (find && !strcmp(find->name, name)) return find->fun; if (find && !strcmp(find->name, name)) return find->fun;

View File

@ -1,6 +1,6 @@
/* vi: set ts=2: /* vi: set ts=2:
* *
* $Id: goodies.c,v 1.3 2001/02/09 13:53:52 corwin Exp $ * $Id: goodies.c,v 1.4 2001/02/10 11:38:29 enno Exp $
* Eressea PB(E)M host Copyright (C) 1998-2000 * Eressea PB(E)M host Copyright (C) 1998-2000
* Christian Schlittchen (corwin@amber.kn-bremen.de) * Christian Schlittchen (corwin@amber.kn-bremen.de)
* Katja Zedel (katze@felidae.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de)
@ -57,17 +57,16 @@ intlist_find(int *i_p, int fi)
return NULL; return NULL;
} }
int unsigned int
hashstring(const char* s) hashstring(const char* s)
{ {
int key = 0; unsigned int key = 0;
int i = strlen(s); int i = strlen(s);
while (i) { while (i>0) {
--i; key = (s[--i] + key*37);
key = ((key >> 31) & 1) ^ (key << 1) ^ s[i];
} }
return key & 0x7fff; return key;
} }
/* Standardfunktion aus Sedgewick: Algorithmen in C++ */ /* Standardfunktion aus Sedgewick: Algorithmen in C++ */

View File

@ -1,6 +1,6 @@
/* vi: set ts=2: /* vi: set ts=2:
* *
* $Id: goodies.h,v 1.2 2001/01/26 16:19:41 enno Exp $ * $Id: goodies.h,v 1.3 2001/02/10 11:38:29 enno Exp $
* Eressea PB(E)M host Copyright (C) 1998-2000 * Eressea PB(E)M host Copyright (C) 1998-2000
* Christian Schlittchen (corwin@amber.kn-bremen.de) * Christian Schlittchen (corwin@amber.kn-bremen.de)
* Katja Zedel (katze@felidae.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de)
@ -18,7 +18,7 @@
extern int *intlist_init(void); extern int *intlist_init(void);
extern int *intlist_add(int *i_p, int i); extern int *intlist_add(int *i_p, int i);
extern int *intlist_find(int *i_p, int i); extern int *intlist_find(int *i_p, int i);
extern int hashstring(const char* s); extern unsigned int hashstring(const char* s);
extern char *escape_string(char * str, char replace); extern char *escape_string(char * str, char replace);
extern char *unescape_string(char * str, char replace); extern char *unescape_string(char * str, char replace);
/* grammar constants: */ /* grammar constants: */

View File

@ -1,6 +1,6 @@
/* vi: set ts=2: /* vi: set ts=2:
* *
* $Id: language.c,v 1.2 2001/01/26 16:19:41 enno Exp $ * $Id: language.c,v 1.3 2001/02/10 11:38:29 enno Exp $
* Eressea PB(E)M host Copyright (C) 1998-2000 * Eressea PB(E)M host Copyright (C) 1998-2000
* Christian Schlittchen (corwin@amber.kn-bremen.de) * Christian Schlittchen (corwin@amber.kn-bremen.de)
* Katja Zedel (katze@felidae.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de)
@ -26,10 +26,10 @@ extern int hashstring(const char* s);
struct locale { struct locale {
struct locale * next; struct locale * next;
int hashkey; unsigned int hashkey;
const char * name; const char * name;
struct locale_string { struct locale_string {
int hashkey; unsigned int hashkey;
struct locale_string * nexthash; struct locale_string * nexthash;
char * str; char * str;
char * key; char * key;
@ -39,7 +39,7 @@ struct locale {
static locale * locales; static locale * locales;
static locale * default_locale; static locale * default_locale;
int unsigned int
locale_hashkey(const locale * lang) locale_hashkey(const locale * lang)
{ {
if (lang==NULL) lang = default_locale; if (lang==NULL) lang = default_locale;
@ -49,7 +49,7 @@ locale_hashkey(const locale * lang)
locale * locale *
find_locale(const char * name) find_locale(const char * name)
{ {
int hkey = hashstring(name); unsigned int hkey = hashstring(name);
locale * l = locales; locale * l = locales;
while (l && l->hashkey!=hkey) l=l->next; while (l && l->hashkey!=hkey) l=l->next;
return l; return l;
@ -58,7 +58,7 @@ find_locale(const char * name)
locale * locale *
make_locale(const char * name) make_locale(const char * name)
{ {
int hkey = hashstring(name); unsigned int hkey = hashstring(name);
locale * l = calloc(sizeof(locale), 1); locale * l = calloc(sizeof(locale), 1);
#ifndef NDEBUG #ifndef NDEBUG
locale * lp = locales; locale * lp = locales;
@ -76,8 +76,8 @@ make_locale(const char * name)
const char * const char *
locale_string(const locale * lang, const char * key) locale_string(const locale * lang, const char * key)
{ {
int hkey = hashstring(key); unsigned int hkey = hashstring(key);
int id = hkey % SMAXHASH; unsigned int id = hkey % SMAXHASH;
struct locale_string * find; struct locale_string * find;
if (key==NULL || *key==0) return NULL; if (key==NULL || *key==0) return NULL;
@ -102,8 +102,8 @@ void
locale_setstring(locale * lang, const char * key, const char * value) locale_setstring(locale * lang, const char * key, const char * value)
{ {
int nval = atoi(key); int nval = atoi(key);
int hkey = nval?nval:hashstring(key); unsigned int hkey = nval?nval:hashstring(key);
int id = hkey % SMAXHASH; unsigned int id = hkey % SMAXHASH;
struct locale_string * find; struct locale_string * find;
if (lang==NULL) lang = default_locale; if (lang==NULL) lang = default_locale;

View File

@ -1,6 +1,6 @@
/* vi: set ts=2: /* vi: set ts=2:
* *
* $Id: language.h,v 1.2 2001/01/26 16:19:41 enno Exp $ * $Id: language.h,v 1.3 2001/02/10 11:38:29 enno Exp $
* Eressea PB(E)M host Copyright (C) 1998-2000 * Eressea PB(E)M host Copyright (C) 1998-2000
* Christian Schlittchen (corwin@amber.kn-bremen.de) * Christian Schlittchen (corwin@amber.kn-bremen.de)
* Katja Zedel (katze@felidae.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de)
@ -23,7 +23,7 @@ extern locale * make_locale(const char * key);
/** operations on locales: **/ /** operations on locales: **/
extern const char * locale_string(const locale * lang, const char * key); extern const char * locale_string(const locale * lang, const char * key);
extern void locale_setstring(locale * lang, const char * key, const char * value); extern void locale_setstring(locale * lang, const char * key, const char * value);
extern int locale_hashkey(const locale * lang); extern unsigned int locale_hashkey(const locale * lang);
extern const char * locale_name(const locale * lang); extern const char * locale_name(const locale * lang);
extern const char * reverse_lookup(const locale * lang, const char * str); extern const char * reverse_lookup(const locale * lang, const char * str);

View File

@ -236,10 +236,6 @@ SOURCE=.\resolve.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\translation.c
# End Source File
# Begin Source File
SOURCE=.\umlaut.c SOURCE=.\umlaut.c
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@ -22,3 +22,18 @@ Es gibt einen Zauber (Ferne Vision) der Einheiten vom Typ RC_SPELL erzeugt, aber
- Wie komplex macht man einen Curse? - Wie komplex macht man einen Curse?
siehe vorangegangener Absatz. Generell gilt hier: Lieber zwei vielseitige Dinge machen, als ein unflexibles - der curse sollte lediglich der container seiin, der die wirkung aufrechterhält (das attribut an der region überwacht, und per trigger-funktion bei ende des curse oder antimagie entfernt). die eigentliche wirkung kann man in ein separates attribut stecken, dann ist sie auch in anderen kontexten als zauberei verwendbar (gebaüde oder items mit der gleichen wirkung, z.b.). Tests sollten so wenig wie möglich auf einen curse gehen (in fact, eigentlich nur bei der antimagie) sondern immer auf die wirkung (das attribut). siehe vorangegangener Absatz. Generell gilt hier: Lieber zwei vielseitige Dinge machen, als ein unflexibles - der curse sollte lediglich der container seiin, der die wirkung aufrechterhält (das attribut an der region überwacht, und per trigger-funktion bei ende des curse oder antimagie entfernt). die eigentliche wirkung kann man in ein separates attribut stecken, dann ist sie auch in anderen kontexten als zauberei verwendbar (gebaüde oder items mit der gleichen wirkung, z.b.). Tests sollten so wenig wie möglich auf einen curse gehen (in fact, eigentlich nur bei der antimagie) sondern immer auf die wirkung (das attribut).
- wie benenne ich Sourcedateien?
lang drüber nachgedacht, bin ich zum schluss gekommen: kleinbuchstaben, keien unterstriche. Es kann sich nie jemand merken, ob testplayer oder test_player jetzt richtig ist, und wir kommen sicher selten in die situation, das wir zwischen opium_bringen.c und opi_umbringen.c unterscheiden müssen.
- wie benenne ich variablen?
da gilt das gleiceh wie bei den files, mit einer ausnahme: typspezifikation, also zum beispiel at_ für attributstypen, mit einem unterstrich. dann ist auch klar, was at_work ist: ein attribut, das was mit arbeit zu tun hat, keine boolean-variable die sagt ob man auf der arbeit ist.
- faction::units
Die Variable funktioniert und kann benutzt werden. folgendes:
for (r=regions;r;r=r->next) for (u=r->units;u;u=u->next) if (u->faction==f) {}
schreibt sich viel einfacher so:
for (u=f->units;u;u=u->nextF) {}
und ja, es wird garantiert, das das funktioiniert, und regionsreihenfolge einhalten tut es auch. weshalb wahlloses erzeugen von einheiten per calloc und ohne createunit() aufruf schon seit längerem ein NoNo ist.
- buffer length
Namen von attributen, hashcodes für items, usw. sollten kurz sein. schliesslich landen sie im Datenfile. Eine Funktion, die sie einlädt, sollte mit 32 byte speicherbedarf rechnen.

Binary file not shown.

View File

@ -42,6 +42,18 @@ Package=<4>
############################################################################### ###############################################################################
Project: "doc"=.\doc\doc.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Project: "eressea"=".\eressea\eressea-6.dsp" - Package Owner=<4> Project: "eressea"=".\eressea\eressea-6.dsp" - Package Owner=<4>
Package=<5> Package=<5>
@ -171,6 +183,21 @@ Package=<4>
############################################################################### ###############################################################################
Project: "translator"=.\tools\translator.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name util
End Project Dependency
}}}
###############################################################################
Project: "triggers"=".\common\triggers\triggers-6.dsp" - Package Owner=<4> Project: "triggers"=".\common\triggers\triggers-6.dsp" - Package Owner=<4>
Package=<5> Package=<5>

Binary file not shown.

View File

@ -1,6 +1,6 @@
/* vi: set ts=2: /* vi: set ts=2:
* *
* $Id: attributes.c,v 1.5 2001/02/04 08:38:14 enno Exp $ * $Id: attributes.c,v 1.6 2001/02/10 11:38:29 enno Exp $
* Eressea PB(E)M host Copyright (C) 1998-2000 * Eressea PB(E)M host Copyright (C) 1998-2000
* Christian Schlittchen (corwin@amber.kn-bremen.de) * Christian Schlittchen (corwin@amber.kn-bremen.de)
* Katja Zedel (katze@felidae.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de)
@ -24,14 +24,15 @@
#include <attributes/follow.h> #include <attributes/follow.h>
#include <attributes/iceberg.h> #include <attributes/iceberg.h>
#include <attributes/hate.h> #include <attributes/hate.h>
#include <attributes/overrideroads.h>
/* util includes */ /* util includes */
#include <attrib.h> #include <attrib.h>
extern attrib_type at_roads_override;
void void
init_attributes(void) init_attributes(void)
{ {
at_register(&at_roads_override); at_register(&at_overrideroads);
/* at_iceberg */ /* at_iceberg */
init_iceberg(); init_iceberg();
/* at_key */ /* at_key */

View File

@ -1036,6 +1036,8 @@ SOURCE=..\common\attributes\orcification.c
!ELSEIF "$(CFG)" == "eressea - Win32 Debug" !ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion" !ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
# PROP Intermediate_Dir "..\common\attributes\Conversion" # PROP Intermediate_Dir "..\common\attributes\Conversion"
@ -1050,6 +1052,52 @@ SOURCE=..\common\attributes\orcification.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\common\attributes\overrideroads.c
!IF "$(CFG)" == "eressea - Win32 Release"
# PROP Intermediate_Dir "..\common\attributes\Release"
!ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
# PROP Intermediate_Dir "..\common\attributes\Conversion"
!ELSEIF "$(CFG)" == "eressea - Win32 Profile"
# PROP Intermediate_Dir "..\common\attributes\Profile"
!ENDIF
# End Source File
# Begin Source File
SOURCE=..\common\attributes\overrideroads.h
!IF "$(CFG)" == "eressea - Win32 Release"
# PROP Intermediate_Dir "..\common\attributes\Release"
!ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
# PROP Intermediate_Dir "..\common\attributes\Conversion"
!ELSEIF "$(CFG)" == "eressea - Win32 Profile"
# PROP Intermediate_Dir "..\common\attributes\Profile"
!ENDIF
# End Source File
# Begin Source File
SOURCE=..\common\attributes\reduceproduction.c SOURCE=..\common\attributes\reduceproduction.c
!IF "$(CFG)" == "eressea - Win32 Release" !IF "$(CFG)" == "eressea - Win32 Release"