From bb0c563c3dbf806ea053828074b234e6d326b48e Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 13 Feb 2001 02:58:51 +0000 Subject: [PATCH] speedups --- src/common/kernel/eressea.c | 4 +- src/common/kernel/item.c | 77 ++++++++++++++++++++++++++++++------ src/common/kernel/item.h | 22 ++++++++++- src/common/util/umlaut.c | 19 +++++---- src/common/util/util-6.dsp | 8 ++++ src/eressea-6.opt | Bin 135852 -> 144384 bytes 6 files changed, 109 insertions(+), 21 deletions(-) diff --git a/src/common/kernel/eressea.c b/src/common/kernel/eressea.c index 221dde231..da55b9df5 100644 --- a/src/common/kernel/eressea.c +++ b/src/common/kernel/eressea.c @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: eressea.c,v 1.13 2001/02/12 22:39:56 enno Exp $ + * $Id: eressea.c,v 1.14 2001/02/13 02:58:51 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -1033,7 +1033,7 @@ igetstrtoken (const char *s1) s++; i = 0; - while (i < DISPLAYSIZE && *s && *s != ' ') { + while (*s && *s != ' ' && i < DISPLAYSIZE) { buf[i] = (*s); /* Hier wird space_replacement wieder in space zurueck diff --git a/src/common/kernel/item.c b/src/common/kernel/item.c index 0b3802e5d..720d690b7 100644 --- a/src/common/kernel/item.c +++ b/src/common/kernel/item.c @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: item.c,v 1.9 2001/02/11 20:54:01 enno Exp $ + * $Id: item.c,v 1.10 2001/02/13 02:58:51 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -44,11 +44,21 @@ potion_type * potiontypes; item_type * itemtypes; herb_type * herbtypes; -attrib_type at_ptype = { "potion_type" }; -attrib_type at_wtype = { "weapon_type" }; -attrib_type at_ltype = { "luxury_type" }; -attrib_type at_itype = { "item_type" }; -attrib_type at_htype = { "herb_type" }; +#ifdef AT_PTYPE +static attrib_type at_ptype = { "potion_type" }; +#endif +#ifdef AT_WTYPE +static attrib_type at_wtype = { "weapon_type" }; +#endif +#ifdef AT_LTYPE +static attrib_type at_ltype = { "luxury_type" }; +#endif +#ifdef AT_ITYPE +static attrib_type at_itype = { "item_type" }; +#endif +#ifdef AT_HTYPE +static attrib_type at_htype = { "herb_type" }; +#endif static int res_changeaura(unit * u, const resource_type * rtype, int delta) @@ -158,7 +168,11 @@ it_register(item_type * itype) item_type ** p_itype = &itemtypes; while (*p_itype && *p_itype != itype) p_itype = &(*p_itype)->next; if (*p_itype==NULL) { +#ifdef AT_ITYPE a_add(&itype->rtype->attribs, a_new(&at_itype))->data.v = (void*) itype; +#else + itype->rtype->itype = itype; +#endif *p_itype = itype; rt_register(itype->rtype); } @@ -190,7 +204,11 @@ new_itemtype(resource_type * rtype, void lt_register(luxury_type * ltype) { +#ifdef AT_LTYPE a_add(<ype->itype->rtype->attribs, a_new(&at_ltype))->data.v = (void*) ltype; +#else + ltype->itype->rtype->ltype = ltype; +#endif ltype->next = luxurytypes; luxurytypes = ltype; } @@ -214,7 +232,11 @@ new_luxurytype(item_type * itype, int price) void wt_register(weapon_type * wtype) { +#ifdef AT_WTYPE a_add(&wtype->itype->rtype->attribs, a_new(&at_wtype))->data.v = (void*) wtype; +#else + wtype->itype->rtype->wtype = wtype; +#endif wtype->next = weapontypes; weapontypes = wtype; } @@ -250,7 +272,11 @@ new_weapontype(item_type * itype, void pt_register(potion_type * ptype) { +#ifdef AT_PTYPE a_add(&ptype->itype->rtype->attribs, a_new(&at_ptype))->data.v = (void*) ptype; +#else + ptype->itype->rtype->ptype = ptype; +#endif ptype->next = potiontypes; potiontypes = ptype; } @@ -276,7 +302,11 @@ new_potiontype(item_type * itype, void ht_register(herb_type * htype) { +#ifdef AT_HTYPE a_add(&htype->itype->rtype->attribs, a_new(&at_htype))->data.v = (void*) htype; +#else + htype->itype->rtype->htype = htype; +#endif htype->next = herbtypes; herbtypes = htype; } @@ -312,43 +342,68 @@ rt_register(resource_type * rtype) } const resource_type * -item2resource(const item_type * itype) { +item2resource(const item_type * itype) +{ return itype->rtype; } const item_type * -resource2item(const resource_type * rtype) { +resource2item(const resource_type * rtype) +{ +#ifdef AT_ITYPE attrib * a = a_find(rtype->attribs, &at_itype); if (a) return (const item_type *)a->data.v; return NULL; +#else + return rtype->itype; +#endif } const herb_type * -resource2herb(const resource_type * rtype) { +resource2herb(const resource_type * rtype) +{ +#ifdef AT_HTYPE attrib * a = a_find(rtype->attribs, &at_htype); if (a) return (const herb_type *)a->data.v; return NULL; +#else + return rtype->htype; +#endif } const weapon_type * resource2weapon(const resource_type * rtype) { +#ifdef AT_WTYPE attrib * a = a_find(rtype->attribs, &at_wtype); if (a) return (const weapon_type *)a->data.v; return NULL; +#else + return rtype->wtype; +#endif } const luxury_type * -resource2luxury(const resource_type * rtype) { +resource2luxury(const resource_type * rtype) +{ +#ifdef AT_LTYPE attrib * a = a_find(rtype->attribs, &at_ltype); if (a) return (const luxury_type *)a->data.v; return NULL; +#else + return rtype->ltype; +#endif } const potion_type * -resource2potion(const resource_type * rtype) { +resource2potion(const resource_type * rtype) +{ +#ifdef AT_PTYPE attrib * a = a_find(rtype->attribs, &at_ptype); if (a) return (const potion_type *)a->data.v; return NULL; +#else + return rtype->ptype; +#endif } resource_type * diff --git a/src/common/kernel/item.h b/src/common/kernel/item.h index 52a90e9df..aa63ec357 100644 --- a/src/common/kernel/item.h +++ b/src/common/kernel/item.h @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: item.h,v 1.3 2001/02/03 13:45:32 enno Exp $ + * $Id: item.h,v 1.4 2001/02/13 02:58:51 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -37,6 +37,11 @@ typedef struct item { * limited supply */ #define RTF_DYNAMIC (1<<3) /* dynamic type, must be saved */ +#undef AT_ITYPE /* should resource_type use an attribute for items ? */ +#undef AT_HTYPE /* should resource_type use an attribute for herbs ? */ +#undef AT_PTYPE /* should resource_type use an attribute for potions ? */ +#undef AT_LTYPE /* should resource_type use an attribute for luxuries ? */ +#undef AT_WTYPE /* should resource_type use an attribute for weapons ? */ /* flags for resource_type::name() */ #define NMF_PLURAL 0x01 @@ -55,6 +60,21 @@ typedef struct resource_type { struct attrib * attribs; struct resource_type * next; unsigned int hashkey; +#ifndef AT_ITYPE + struct item_type * itype; +#endif +#ifndef AT_HTYPE + struct herb_type * htype; +#endif +#ifndef AT_PTYPE + struct potion_type * ptype; +#endif +#ifndef AT_LTYPE + struct luxury_type * ltype; +#endif +#ifndef AT_WTYPE + struct weapon_type * wtype; +#endif } resource_type; extern resource_type * resourcetypes; extern const char* resourcename(const resource_type * rtype, int flags); diff --git a/src/common/util/umlaut.c b/src/common/util/umlaut.c index c186b5212..1cbc0d2dd 100644 --- a/src/common/util/umlaut.c +++ b/src/common/util/umlaut.c @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: umlaut.c,v 1.3 2001/02/10 10:40:12 enno Exp $ + * $Id: umlaut.c,v 1.4 2001/02/13 02:58:51 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -50,10 +50,12 @@ addtoken(tnode * root, const char* str, void * id) root->id = id; root->leaf=1; } else { - char c = (char)tolower(*(unsigned char*)str); - int index = ((unsigned char)c) % 32; - int i=0; - tnode * tk = root->next[index]; + tnode * tk; + int index, i = 0; + char c = *str; + if (c<'a' || c>'z') c = (char)tolower((unsigned char)c); + index = ((unsigned char)c) % 32; + tk = root->next[index]; if (root->id==E_TOK_NOMATCH) root->id = id; while (tk && tk->c != c) tk = tk->nexthash; if (!tk) { @@ -81,8 +83,11 @@ findtoken(tnode * tk, const char * str) if(*str == 0) return E_TOK_NOMATCH; while (*str) { - char c = (char)tolower(*str); - int index = ((unsigned char)c) % 32; + int index; + char c = *str; + if (c<'a' || c>'z') c = (char)tolower((unsigned char)c); + + index = ((unsigned char)c) % 32; tk = tk->next[index]; while (tk && tk->c!=c) tk = tk->nexthash; ++str; diff --git a/src/common/util/util-6.dsp b/src/common/util/util-6.dsp index fbb0cebbe..c3fe48464 100644 --- a/src/common/util/util-6.dsp +++ b/src/common/util/util-6.dsp @@ -167,6 +167,10 @@ SOURCE=.\lists.h # End Source File # Begin Source File +SOURCE=.\log.h +# End Source File +# Begin Source File + SOURCE=.\rand.h # End Source File # Begin Source File @@ -228,6 +232,10 @@ SOURCE=.\lists.c # End Source File # Begin Source File +SOURCE=.\log.c +# End Source File +# Begin Source File + SOURCE=.\rand.c # End Source File # Begin Source File diff --git a/src/eressea-6.opt b/src/eressea-6.opt index f1e03834b83ae358d6b34163bd89b444ba79429b..5d1ac37d343e8ddd8a895090fd5c9348af82ef32 100644 GIT binary patch literal 144384 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 W7y(9r5nu!u0Y-okU