New way of storing attrib-lists should make it faster to find a specific one and jump over entire classes of attribs.

This commit is contained in:
Enno Rehling 2006-02-25 00:12:48 +00:00
parent 2ab8cc7564
commit 3fb3e7b201
31 changed files with 281 additions and 496 deletions

View File

@ -48,7 +48,9 @@ attrib *
find_key(attrib * alist, int key) find_key(attrib * alist, int key)
{ {
attrib * a = a_find(alist, &at_key); attrib * a = a_find(alist, &at_key);
while (a && a->data.i != key) a = a->nexttype; while (a && a->type==&at_key && a->data.i != key) {
a = a->next;
}
return a; return a;
} }

View File

@ -69,16 +69,14 @@ attrib_type at_variable = {
const char * const char *
get_variable(attrib *a, const char *key) get_variable(attrib *a, const char *key)
{ {
attrib *ap; attrib *ap = a_find(a, &at_variable);;
for(ap = a_find(a, &at_variable); ap; ap=ap->nexttype) { while (ap && ap->type==&at_variable) {
if(strcmp(key, ((variable *)ap->data.v)->key) == 0) { variable * var = (variable *)ap->data.v;
break; if (strcmp(key, var->key) == 0) {
return var->value;
} }
} ap = ap->next;
if(ap) {
return ((variable *)ap->data.v)->value;
} }
return NULL; return NULL;
@ -87,42 +85,41 @@ get_variable(attrib *a, const char *key)
void void
set_variable(attrib **app, const char *key, const char *value) set_variable(attrib **app, const char *key, const char *value)
{ {
attrib *ap; attrib *ap = a_find(*app, &at_variable);
assert(value); assert(value);
for(ap = a_find(*app, &at_variable); ap; ap=ap->nexttype) { while (ap && ap->type==&at_variable) {
if(strcmp(key, ((variable *)ap->data.v)->key) == 0) { variable * var = (variable *)ap->data.v;
break; if (strcmp(key, var->key) == 0) {
free(var->value);
var->value = strdup(value);
return;
} }
ap = ap->next;
} }
if(ap) {
free(((variable *)ap->data.v)->value);
((variable *)ap->data.v)->value = strdup(value);
} else {
ap = a_add(app, a_new(&at_variable)); ap = a_add(app, a_new(&at_variable));
((variable *)ap->data.v)->key = strdup(key); ((variable *)ap->data.v)->key = strdup(key);
((variable *)ap->data.v)->value = strdup(value); ((variable *)ap->data.v)->value = strdup(value);
}
} }
void void
delete_variable(attrib **app, const char *key) delete_variable(attrib **app, const char *key)
{ {
attrib *ap; attrib *ap = a_find(*app, &at_variable);
for(ap = a_find(*app, &at_variable); ap; ap=ap->nexttype) { while (ap && ap->type==&at_variable) {
if(strcmp(key, ((variable *)ap->data.v)->key) == 0) { variable * var = (variable *)ap->data.v;
if (strcmp(key, var->key) == 0) {
free(var->key);
free(var->value);
a_remove(app, ap);
break; break;
} }
ap = ap->next;
} }
if(ap) {
free(((variable *)ap->data.v)->key);
free(((variable *)ap->data.v)->value);
a_remove(app, ap);
}
} }
void void

View File

@ -1202,12 +1202,12 @@ report_computer(const char * filename, report_context * ctx)
cr_find_address(F, f, ctx->addresses); cr_find_address(F, f, ctx->addresses);
a = a_find(f->attribs, &at_reportspell); a = a_find(f->attribs, &at_reportspell);
while (a) { while (a && a->type==&at_reportspell) {
spell *sp = (spell *)a->data.v; spell *sp = (spell *)a->data.v;
cr_reportspell(F, sp, f->locale); cr_reportspell(F, sp, f->locale);
a = a->nexttype; a = a->next;
} }
for (a=a_find(f->attribs, &at_showitem);a;a=a->nexttype) { for (a=a_find(f->attribs, &at_showitem);a && a->type==&at_showitem;a=a->next) {
const potion_type * ptype = resource2potion(((const item_type*)a->data.v)->rtype); const potion_type * ptype = resource2potion(((const item_type*)a->data.v)->rtype);
requirement * m; requirement * m;
const char * ch, * description = NULL; const char * ch, * description = NULL;
@ -1396,7 +1396,7 @@ report_computer(const char * filename, report_context * ctx)
boolean seeunits = false, seeships = false; boolean seeunits = false, seeships = false;
const attrib * ru; const attrib * ru;
/* show units pulled through region */ /* show units pulled through region */
for (ru = a_find(r->attribs, &at_travelunit); ru; ru = ru->nexttype) { for (ru = a_find(r->attribs, &at_travelunit); ru && ru->type==&at_travelunit; ru = ru->next) {
unit * u = (unit*)ru->data.v; unit * u = (unit*)ru->data.v;
if (cansee_durchgezogen(f, r, u, 0) && r!=u->region) { if (cansee_durchgezogen(f, r, u, 0) && r!=u->region) {
if (!u->ship || !fval(u, UFL_OWNER)) continue; if (!u->ship || !fval(u, UFL_OWNER)) continue;
@ -1405,7 +1405,7 @@ report_computer(const char * filename, report_context * ctx)
fprintf(F, "\"%s\"\n", shipname(u->ship)); fprintf(F, "\"%s\"\n", shipname(u->ship));
} }
} }
for (ru = a_find(r->attribs, &at_travelunit); ru; ru = ru->nexttype) { for (ru = a_find(r->attribs, &at_travelunit); ru && ru->type==&at_travelunit; ru = ru->next) {
unit * u = (unit*)ru->data.v; unit * u = (unit*)ru->data.v;
if (cansee_durchgezogen(f, r, u, 0) && r!=u->region) { if (cansee_durchgezogen(f, r, u, 0) && r!=u->region) {
if (u->ship) continue; if (u->ship) continue;

View File

@ -2474,7 +2474,7 @@ reshow(unit * u, struct order * ord, const char * s, param_t p)
sp = get_spellfromtoken(u, s, u->faction->locale); sp = get_spellfromtoken(u, s, u->faction->locale);
if (sp!=NULL && has_spell(u, sp)) { if (sp!=NULL && has_spell(u, sp)) {
attrib *a = a_find(u->faction->attribs, &at_seenspell); attrib *a = a_find(u->faction->attribs, &at_seenspell);
while (a!=NULL && a->data.v!=sp) a = a->nexttype; while (a!=NULL && a->type==&at_seenspell && a->data.v!=sp) a = a->next;
if (a!=NULL) a_remove(&u->faction->attribs, a); if (a!=NULL) a_remove(&u->faction->attribs, a);
break; break;
} }
@ -2688,16 +2688,16 @@ instant_orders(void)
for (f = factions; f; f = f->next) { for (f = factions; f; f = f->next) {
attrib *a; attrib *a;
a = a_find(f->attribs, &at_showitem); a = a_find(f->attribs, &at_showitem);
while(a!=NULL) { while (a!=NULL && a->type==&at_showitem) {
const item_type * itype = (const item_type *)a->data.v; const item_type * itype = (const item_type *)a->data.v;
const potion_type * ptype = resource2potion(itype->rtype); const potion_type * ptype = resource2potion(itype->rtype);
attrib * an = a->next;
if (ptype!=NULL) { if (ptype!=NULL) {
attrib * n = a->nexttype;
/* potions werden separat behandelt */ /* potions werden separat behandelt */
display_item(f, NULL, (const item_type *)a->data.v); display_item(f, NULL, (const item_type *)a->data.v);
a_remove(&f->attribs, a); a_remove(&f->attribs, a);
a = n; }
} else a = a->nexttype; a = an;
} }
} }

View File

@ -982,7 +982,7 @@ describe(FILE * F, const region * r, int partial, faction * f)
} }
} }
/* Spezielle Richtungen */ /* Spezielle Richtungen */
for (a = a_find(r->attribs, &at_direction);a;a = a->nexttype) { for (a = a_find(r->attribs, &at_direction);a && a->type==&at_direction;a=a->next) {
spec_direction * d = (spec_direction *)(a->data.v); spec_direction * d = (spec_direction *)(a->data.v);
strcpy(bufp++, " "); strcpy(bufp++, " ");
bufp += strxcpy(bufp, d->desc); bufp += strxcpy(bufp, d->desc);
@ -1155,7 +1155,7 @@ durchreisende(FILE * F, const region * r, const faction * f)
/* Wieviele sind aufzulisten? Für die Grammatik. */ /* Wieviele sind aufzulisten? Für die Grammatik. */
if (fval(r, RF_TRAVELUNIT)) { if (fval(r, RF_TRAVELUNIT)) {
for (ru = a_find(r->attribs, &at_travelunit); ru; ru = ru->nexttype) { for (ru = a_find(r->attribs, &at_travelunit); ru && ru->type!=&at_travelunit; ru = ru->next) {
unit * u = (unit*)ru->data.v; unit * u = (unit*)ru->data.v;
if (cansee_durchgezogen(f, r, u, 0) > 0 && r!=u->region) { if (cansee_durchgezogen(f, r, u, 0) > 0 && r!=u->region) {
if (u->ship && !fval(u, UFL_OWNER)) if (u->ship && !fval(u, UFL_OWNER))
@ -1173,7 +1173,7 @@ durchreisende(FILE * F, const region * r, const faction * f)
buf[0] = 0; buf[0] = 0;
rnl(F); rnl(F);
for (ru = a_find(r->attribs, &at_travelunit); ru; ru = ru->nexttype) { for (ru = a_find(r->attribs, &at_travelunit); ru && ru->type==&at_travelunit; ru = ru->next) {
unit * u = (unit*)ru->data.v; unit * u = (unit*)ru->data.v;
if (cansee_durchgezogen(f, r, u, 0) > 0 && r!=u->region) { if (cansee_durchgezogen(f, r, u, 0) > 0 && r!=u->region) {
if (u->ship && !fval(u, UFL_OWNER)) if (u->ship && !fval(u, UFL_OWNER))
@ -1778,7 +1778,7 @@ report_plaintext(const char * filename, report_context * ctx)
#ifdef KARMA_MODULE #ifdef KARMA_MODULE
buf[0] = 0; buf[0] = 0;
dh = 0; dh = 0;
for (a=a_find(f->attribs, &at_faction_special); a; a=a->nexttype) { for (a=a_find(f->attribs, &at_faction_special); a && a->type==&at_faction_special; a=a->next) {
char buf2[80]; char buf2[80];
dh++; dh++;
if (fspecials[a->data.sa[0]].maxlevel != 100) { if (fspecials[a->data.sa[0]].maxlevel != 100) {
@ -1930,15 +1930,15 @@ report_plaintext(const char * filename, report_context * ctx)
if (a) { if (a) {
rnl(F); rnl(F);
centre(F, LOC(f->locale, "section_newspells"), true); centre(F, LOC(f->locale, "section_newspells"), true);
while (a) { while (a && a->type==&at_reportspell) {
spell *sp = (spell *)a->data.v; spell *sp = (spell *)a->data.v;
report_spell(F, sp, f->locale); report_spell(F, sp, f->locale);
a = a->nexttype; a = a->next;
} }
} }
ch = 0; ch = 0;
for (a=a_find(f->attribs, &at_showitem);a;a=a->nexttype) { for (a=a_find(f->attribs, &at_showitem);a && a->type==&at_showitem;a=a->next) {
const potion_type * ptype = resource2potion(((const item_type*)a->data.v)->rtype); const potion_type * ptype = resource2potion(((const item_type*)a->data.v)->rtype);
const char * description = NULL; const char * description = NULL;
requirement * m; requirement * m;

View File

@ -668,7 +668,7 @@ learn(void)
teach->value += u->number * 10; teach->value += u->number * 10;
} }
if (is_cursed(r->attribs,C_BADLEARN,0)) { if (is_cursed(r->attribs, C_BADLEARN,0)) {
teach->value -= u->number * 10; teach->value -= u->number * 10;
} }
@ -724,8 +724,8 @@ learn(void)
for (ptype=potiontypes; ptype; ptype=ptype->next) { for (ptype=potiontypes; ptype; ptype=ptype->next) {
if (skill == ptype->level * 2) { if (skill == ptype->level * 2) {
attrib * a = a_find(f->attribs, &at_showitem); attrib * a = a_find(f->attribs, &at_showitem);
while (a && a->data.v != ptype) a=a->nexttype; while (a && a->type==&at_showitem && a->data.v != ptype) a=a->next;
if (!a) { if (a==NULL || a->type!=&at_showitem) {
a = a_add(&f->attribs, a_new(&at_showitem)); a = a_add(&f->attribs, a_new(&at_showitem));
a->data.v = (void*) ptype->itype; a->data.v = (void*) ptype->itype;
} }

View File

@ -200,7 +200,7 @@ int
get_effect(const unit * u, const potion_type * effect) get_effect(const unit * u, const potion_type * effect)
{ {
const attrib * a; const attrib * a;
for (a=a_find(u->attribs, &at_effect); a!=NULL; a=a->nexttype) { for (a=a_find(u->attribs, &at_effect); a!=NULL && a->type==&at_effect; a=a->next) {
const effect_data * data = (const effect_data *)a->data.v; const effect_data * data = (const effect_data *)a->data.v;
if (data->type==effect) return data->value; if (data->type==effect) return data->value;
} }
@ -210,27 +210,27 @@ get_effect(const unit * u, const potion_type * effect)
int int
change_effect (unit * u, const potion_type * effect, int delta) change_effect (unit * u, const potion_type * effect, int delta)
{ {
attrib ** ap = &u->attribs, * a; attrib * a = a_find(u->attribs, &at_effect);
effect_data * data = NULL; effect_data * data = NULL;
assert(delta!=0); assert(delta!=0);
while (*ap && (*ap)->type!=&at_effect) ap=&(*ap)->next; while (a && a->type==&at_effect) {
a = *ap;
while (a) {
data = (effect_data *)a->data.v; data = (effect_data *)a->data.v;
if (data->type==effect) break; if (data->type==effect) {
a=a->nexttype; if (data->value+delta==0) {
}
if (a!=NULL && data->value+delta==0) {
a_remove(&u->attribs, a); a_remove(&u->attribs, a);
return 0; return 0;
} else if (a!=NULL) {
data->value += delta;
} else { } else {
attrib * an = a_add(ap, a_new(&at_effect)); data->value += delta;
data = (effect_data*)an->data.v; return data->value;
}
}
a = a->next;
}
a = a_add(&u->attribs, a_new(&at_effect));
data = (effect_data*)a->data.v;
data->type = effect; data->type = effect;
data->value = delta; data->value = delta;
}
return data->value; return data->value;
} }

View File

@ -2355,12 +2355,13 @@ aftermath(battle * b)
int dead = du->number - df->alive - df->run.number; int dead = du->number - df->alive - df->run.number;
int pr_mercy = 0; int pr_mercy = 0;
#ifdef KARMA_MODULE #ifdef KARMA_MODULE
const attrib *a; const attrib *a= a_find(du->attribs, &at_prayer_effect);
for (a = a_find(du->attribs, &at_prayer_effect); a; a = a->nexttype) { while (a && a->type==&at_prayer_effect) {
if (a->data.sa[0] == PR_MERCY) { if (a->data.sa[0] == PR_MERCY) {
pr_mercy = a->data.sa[1]; pr_mercy = a->data.sa[1];
} }
a = a->next;
} }
#endif /* KARMA_MODULE */ #endif /* KARMA_MODULE */
@ -2914,7 +2915,7 @@ make_fighter(battle * b, unit * u, side * s1, boolean attack)
strongmen = min(fig->unit->number, get_item(u, I_TROLLBELT)); strongmen = min(fig->unit->number, get_item(u, I_TROLLBELT));
#ifdef KARMA_MODULE #ifdef KARMA_MODULE
for (a = a_find(u->attribs, &at_prayer_effect); a; a = a->nexttype) { for (a = a_find(u->attribs, &at_prayer_effect); a && a->type==&at_prayer_effect; a = a->next) {
if (a->data.sa[0] == PR_AID) { if (a->data.sa[0] == PR_AID) {
pr_aid = true; pr_aid = true;
break; break;

View File

@ -593,7 +593,7 @@ required(int size, int msize, int maxneed)
static int static int
matmod(const attrib * a, const unit * u, const resource_type * material, int value) matmod(const attrib * a, const unit * u, const resource_type * material, int value)
{ {
for (a=a_find((attrib*)a, &at_matmod);a;a=a->nexttype) { for (a=a_find((attrib*)a, &at_matmod);a && a->type==&at_matmod;a=a->next) {
mm_fun fun = (mm_fun)a->data.f; mm_fun fun = (mm_fun)a->data.f;
value = fun(u, material, value); value = fun(u, material, value);
if (value<0) return value; /* pass errors to caller */ if (value<0) return value; /* pass errors to caller */
@ -1110,15 +1110,16 @@ void
remove_contacts(void) remove_contacts(void)
{ {
region *r; region *r;
unit *u;
attrib *a;
for (r = regions; r; r = r->next) { for (r = regions; r; r = r->next) {
unit *u;
for (u = r->units; u; u = u->next) { for (u = r->units; u; u = u->next) {
a = (attrib *)a_find(u->attribs, &at_contact); attrib * a = (attrib *)a_find(u->attribs, &at_contact);
while(a != NULL) {
while (a!=NULL &&a->type==&at_contact) {
attrib * ar = a; attrib * ar = a;
a = a->nexttype; a = a->next;
a_remove(&u->attribs, ar); a_remove(&u->attribs, ar);
} }
} }

View File

@ -352,7 +352,7 @@ remove_allcurse(attrib **ap, const void * data, boolean(*compare)(const attrib *
{ {
attrib * a = a_select(*ap, data, compare); attrib * a = a_select(*ap, data, compare);
while (a) { while (a) {
attrib * next = a->nexttype; attrib * next = a->next;
a_remove(ap, a); a_remove(ap, a);
a = a_select(next, data, compare); a = a_select(next, data, compare);
} }
@ -618,10 +618,10 @@ transfer_curse(unit * u, unit * u2, int n)
attrib * a; attrib * a;
a = a_find(u->attribs, &at_curse); a = a_find(u->attribs, &at_curse);
while (a) { while (a && a->type==&at_curse) {
curse *c = (curse*)a->data.v; curse *c = (curse*)a->data.v;
do_transfer_curse(c, u, u2, n); do_transfer_curse(c, u, u2, n);
a = a->nexttype; a = a->next;
} }
} }

View File

@ -607,9 +607,9 @@ shipspeed (const ship * sh, const unit * u)
} }
a = a_find(sh->attribs, &at_speedup); a = a_find(sh->attribs, &at_speedup);
while (a != NULL) { while (a != NULL && a->type==&at_speedup) {
k += a->data.sa[0]; k += a->data.sa[0];
a = a->nexttype; a = a->next;
} }
c = get_curse(sh->attribs, ct_find("shipspeedup")); c = get_curse(sh->attribs, ct_find("shipspeedup"));
@ -887,7 +887,7 @@ scale_number (unit * u, int n)
remain = 0; remain = 0;
u->hp = 0; u->hp = 0;
} }
for (a = a_find(u->attribs, &at_effect);a;a=a->nexttype) { for (a = a_find(u->attribs, &at_effect);a && a->type==&at_effect;a=a->next) {
effect_data * data = (effect_data *)a->data.v; effect_data * data = (effect_data *)a->data.v;
int snew = data->value / u->number * n; int snew = data->value / u->number * n;
if (n) { if (n) {
@ -1191,10 +1191,10 @@ update_lighthouse(building * lh)
if (!fval(r2->terrain, SEA_REGION)) continue; if (!fval(r2->terrain, SEA_REGION)) continue;
if (distance(r, r2) > d) continue; if (distance(r, r2) > d) continue;
a = a_find(r2->attribs, &at_lighthouse); a = a_find(r2->attribs, &at_lighthouse);
while (a) { while (a && a->type==&at_lighthouse) {
building * b = (building*)a->data.v; building * b = (building*)a->data.v;
if (b==lh) break; if (b==lh) break;
a=a->nexttype; a = a->next;
} }
if (!a) { if (!a) {
a = a_add(&r2->attribs, a_new(&at_lighthouse)); a = a_add(&r2->attribs, a_new(&at_lighthouse));
@ -2022,7 +2022,7 @@ get_lighthouses(const region * r)
if (!fval(r->terrain, SEA_REGION)) return NULL; if (!fval(r->terrain, SEA_REGION)) return NULL;
for (a = a_find(r->attribs, &at_lighthouse);a;a=a->nexttype) { for (a = a_find(r->attribs, &at_lighthouse);a && a->type==&at_lighthouse;a=a->next) {
building *b = (building *)a->data.v; building *b = (building *)a->data.v;
region *r2 = b->region; region *r2 = b->region;
@ -2081,7 +2081,7 @@ check_leuchtturm(region * r, faction * f)
if (!fval(r->terrain, SEA_REGION)) return false; if (!fval(r->terrain, SEA_REGION)) return false;
for (a = a_find(r->attribs, &at_lighthouse);a;a=a->nexttype) { for (a = a_find(r->attribs, &at_lighthouse);a && a->type==&at_lighthouse;a=a->next) {
building *b = (building *)a->data.v; building *b = (building *)a->data.v;
region *r2 = b->region; region *r2 = b->region;
@ -2130,16 +2130,17 @@ lastregion (faction * f)
/* we continue from the best region and look for travelthru etc. */ /* we continue from the best region and look for travelthru etc. */
for (r = f->last->next; r; r = r->next) { for (r = f->last->next; r; r = r->next) {
plane * p = rplane(r); plane * p = rplane(r);
attrib *ru;
/* search the region for travelthru-attributes: */ /* search the region for travelthru-attributes: */
if (fval(r, RF_TRAVELUNIT)) { if (fval(r, RF_TRAVELUNIT)) {
for (ru = a_find(r->attribs, &at_travelunit); ru; ru = ru->nexttype) { attrib * ru = a_find(r->attribs, &at_travelunit);
while (ru && ru->type==&at_travelunit) {
u = (unit*)ru->data.v; u = (unit*)ru->data.v;
if (u->faction == f) { if (u->faction == f) {
f->last = r; f->last = r;
break; break;
} }
ru = ru->next;
} }
} }
if (f->last == r) continue; if (f->last == r) continue;
@ -2844,7 +2845,7 @@ findspecialdirection(const region *r, const char *token)
spec_direction *d; spec_direction *d;
if (strlen(token)==0) return NULL; if (strlen(token)==0) return NULL;
for (a = a_find(r->attribs, &at_direction);a;a=a->nexttype) { for (a = a_find(r->attribs, &at_direction);a && a->type==&at_direction;a=a->next) {
d = (spec_direction *)(a->data.v); d = (spec_direction *)(a->data.v);
if (d->active && strncasecmp(d->keyword, token, strlen(token)) == 0) { if (d->active && strncasecmp(d->keyword, token, strlen(token)) == 0) {

View File

@ -318,7 +318,7 @@ buy_special(unit *u, struct order * ord, fspecial_t special)
/* Kosten berechnen */ /* Kosten berechnen */
for(a=a_find(f->attribs, &at_faction_special); a; a=a->nexttype) { for(a=a_find(f->attribs, &at_faction_special); a && a->type==&at_faction_special; a=a->next) {
count += a->data.sa[1]; count += a->data.sa[1];
if(a->data.sa[0] == special) a2 = a; if(a->data.sa[0] == special) a2 = a;
} }
@ -356,7 +356,7 @@ fspecial(const faction *f, fspecial_t special)
{ {
attrib *a; attrib *a;
for (a=a_find(f->attribs, &at_faction_special); a; a=a->nexttype) { for (a=a_find(f->attribs, &at_faction_special); a && a->type==&at_faction_special; a=a->next) {
if(a->data.sa[0] == special) return a->data.sa[1]; if(a->data.sa[0] == special) return a->data.sa[1];
} }
return 0; return 0;
@ -498,7 +498,7 @@ jihad_cmd(unit * u, struct order * ord)
attrib *a; attrib *a;
const char *s; const char *s;
for (a = a_find(f->attribs, &at_jihad); a; a = a->nexttype) { for (a = a_find(f->attribs, &at_jihad); a && a->type==&at_jihad; a = a->next) {
has += a->data.sa[1]; has += a->data.sa[1];
} }
@ -524,7 +524,7 @@ jihad_cmd(unit * u, struct order * ord)
return 0; return 0;
} }
for (a = a_find(f->attribs, &at_jihad); a; a = a->nexttype) { for (a = a_find(f->attribs, &at_jihad); a && a->type==&at_jihad; a = a->next) {
if (a->data.sa[0] == jrt) break; if (a->data.sa[0] == jrt) break;
} }
@ -546,7 +546,7 @@ jihad(faction *f, const race * rc)
attrib *a; attrib *a;
race_t jrt = old_race(rc); race_t jrt = old_race(rc);
for(a = a_find(f->attribs, &at_jihad); a; a = a->nexttype) { for(a = a_find(f->attribs, &at_jihad); a && a->type==&at_jihad; a = a->next) {
if(a->data.sa[0] == jrt) return a->data.sa[1]; if(a->data.sa[0] == jrt) return a->data.sa[1];
} }
return 0; return 0;

View File

@ -167,106 +167,6 @@
<Tool <Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/> Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration> </Configuration>
<Configuration
Name="Release64|Win32"
OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE">
<Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="../util,../..,.."
PreprocessorDefinitions="WIN32,NDEBUG,_WINDOWS"
StringPooling="TRUE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="TRUE"
DisableLanguageExtensions="TRUE"
UsePrecompiledHeader="0"
PrecompiledHeaderFile=".\Release/kernel.pch"
AssemblerListingLocation=".\Release/"
ObjectFile=".\Release/"
ProgramDataBaseFileName=".\Release/"
WarningLevel="4"
SuppressStartupBanner="TRUE"
DebugInformationFormat="3"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLibrarianTool"
OutputFile=".\Release\kernel.lib"
SuppressStartupBanner="TRUE"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
Culture="1031"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Debug64|Win32"
OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
ImproveFloatingPointConsistency="FALSE"
AdditionalIncludeDirectories="../util;../..;.."
PreprocessorDefinitions="_WINDOWS,WIN32"
BasicRuntimeChecks="0"
BufferSecurityCheck="FALSE"
DisableLanguageExtensions="TRUE"
UsePrecompiledHeader="0"
PrecompiledHeaderThrough="stdafx.h"
PrecompiledHeaderFile=".\Debug/kernel.pch"
WarningLevel="4"
SuppressStartupBanner="TRUE"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLibrarianTool"
SuppressStartupBanner="TRUE"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
Culture="1031"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations> </Configurations>
<References> <References>
</References> </References>

View File

@ -401,7 +401,7 @@ already_seen(const faction * f, const spell * sp)
{ {
attrib *a; attrib *a;
for (a = a_find(f->attribs, &at_seenspell); a; a=a->nexttype) { for (a = a_find(f->attribs, &at_seenspell); a && a->type==&at_seenspell; a=a->next) {
if (a->data.v==sp) return true; if (a->data.v==sp) return true;
} }
return false; return false;
@ -1101,7 +1101,7 @@ magic_resistance(unit *target)
/* Auswirkungen von Zaubern auf der Region */ /* Auswirkungen von Zaubern auf der Region */
a = a_find(target->region->attribs, &at_curse); a = a_find(target->region->attribs, &at_curse);
while (a) { while (a && a->type==&at_curse) {
curse *c = (curse*)a->data.v; curse *c = (curse*)a->data.v;
unit *mage = c->magician; unit *mage = c->magician;
@ -1114,12 +1114,13 @@ magic_resistance(unit *target)
} }
else if (c->type == ct_find("badmagicresistancezone")) { else if (c->type == ct_find("badmagicresistancezone")) {
if (alliedunit(mage, target->faction, HELP_GUARD)) { if (alliedunit(mage, target->faction, HELP_GUARD)) {
a = a->nexttype; /* TODO: hier sollte doch sicher was passieren? */
a = a->next;
continue; continue;
} }
} }
} }
a = a->nexttype; a = a->next;
} }
/* Bonus durch Artefakte */ /* Bonus durch Artefakte */
/* TODO (noch gibs keine)*/ /* TODO (noch gibs keine)*/
@ -2116,10 +2117,10 @@ set_familiar(unit * mage, unit * familiar)
{ {
/* if the skill modifier for the mage does not yet exist, add it */ /* if the skill modifier for the mage does not yet exist, add it */
attrib * a = a_find(mage->attribs, &at_skillmod); attrib * a = a_find(mage->attribs, &at_skillmod);
while (a) { while (a && a->type==&at_skillmod) {
skillmod_data * smd = (skillmod_data *)a->data.v; skillmod_data * smd = (skillmod_data *)a->data.v;
if (smd->special==sm_familiar) break; if (smd->special==sm_familiar) break;
a = a->nexttype; a = a->next;
} }
if (a==NULL) { if (a==NULL) {
attrib * an = a_add(&mage->attribs, a_new(&at_skillmod)); attrib * an = a_add(&mage->attribs, a_new(&at_skillmod));
@ -2151,8 +2152,8 @@ remove_familiar(unit *mage)
a_remove(&mage->attribs, a); a_remove(&mage->attribs, a);
a = a_find(mage->attribs, &at_skillmod); a = a_find(mage->attribs, &at_skillmod);
while (a) { while (a && a->type==&at_skillmod) {
an = a->nexttype; an = a->next;
smd = (skillmod_data *)a->data.v; smd = (skillmod_data *)a->data.v;
if (smd->special==sm_familiar) a_remove(&mage->attribs, a); if (smd->special==sm_familiar) a_remove(&mage->attribs, a);
a = an; a = an;
@ -2164,10 +2165,10 @@ create_newfamiliar(unit * mage, unit * familiar)
{ {
/* if the skill modifier for the mage does not yet exist, add it */ /* if the skill modifier for the mage does not yet exist, add it */
attrib * a = a_find(mage->attribs, &at_skillmod); attrib * a = a_find(mage->attribs, &at_skillmod);
while (a) { while (a && a->type==&at_skillmod) {
skillmod_data * smd = (skillmod_data *)a->data.v; skillmod_data * smd = (skillmod_data *)a->data.v;
if (smd->special==sm_familiar) break; if (smd->special==sm_familiar) break;
a = a->nexttype; a = a->next;
} }
if (a==NULL) { if (a==NULL) {
attrib * an = a_add(&mage->attribs, a_new(&at_skillmod)); attrib * an = a_add(&mage->attribs, a_new(&at_skillmod));

View File

@ -539,10 +539,10 @@ leave_trail(ship * sh, region * from, region_list *route)
traveldir * td = NULL; traveldir * td = NULL;
attrib * a = a_find(r->attribs, &at_shiptrail); attrib * a = a_find(r->attribs, &at_shiptrail);
while (a!=NULL) { while (a!=NULL && a->type==&at_shiptrail) {
td = (traveldir *)a->data.v; td = (traveldir *)a->data.v;
if (td->no == sh->no) break; if (td->no == sh->no) break;
a = a->nexttype; a = a->next;
} }
if (a == NULL) { if (a == NULL) {
@ -2112,7 +2112,7 @@ piracy_cmd(unit *u, struct order * ord)
} }
} }
for (a = a_find(r->attribs, &at_piracy_direction); a; a=a->nexttype) { for (a = a_find(r->attribs, &at_piracy_direction); a && a->type==&at_piracy_direction; a=a->next) {
piracy_data * data = a->data.v; piracy_data * data = a->data.v;
const faction * p = data->pirate; const faction * p = data->pirate;
const faction * t = data->target; const faction * t = data->target;
@ -2196,15 +2196,13 @@ age_traveldir(region *r)
{ {
attrib *a = a_find(r->attribs, &at_traveldir); attrib *a = a_find(r->attribs, &at_traveldir);
while(a) { while(a && a->type==&at_traveldir) {
attrib *an = a->next;
a->data.ca[3]--; a->data.ca[3]--;
if(a->data.ca[3] <= 0) { if(a->data.ca[3] <= 0) {
attrib *an = a->nexttype;
a_remove(&r->attribs, a); a_remove(&r->attribs, a);
a = an;
} else {
a = a->nexttype;
} }
a = an;
} }
} }
@ -2213,10 +2211,10 @@ hunted_dir(attrib *at, int id)
{ {
attrib *a = a_find(at, &at_shiptrail); attrib *a = a_find(at, &at_shiptrail);
while (a!=NULL) { while (a!=NULL && a->type==&at_shiptrail) {
traveldir *t = (traveldir *)(a->data.v); traveldir *t = (traveldir *)(a->data.v);
if (t->no == id) return t->dir; if (t->no == id) return t->dir;
a = a->nexttype; a = a->next;
} }
return NODIRECTION; return NODIRECTION;

View File

@ -386,10 +386,10 @@ special_direction(const region * from, const region * to)
{ {
const attrib *a = a_findc(from->attribs, &at_direction); const attrib *a = a_findc(from->attribs, &at_direction);
while (a!=NULL) { while (a!=NULL && a->type==&at_direction) {
spec_direction * sd = (spec_direction *)a->data.v; spec_direction * sd = (spec_direction *)a->data.v;
if (sd->x==to->x && sd->y==to->y) return sd; if (sd->x==to->x && sd->y==to->y) return sd;
a = a->nexttype; a = a->next;
} }
return NULL; return NULL;
} }

View File

@ -1292,7 +1292,7 @@ prepare_report(faction * f)
} }
if (mode<see_travel && fval(r, RF_TRAVELUNIT)) { if (mode<see_travel && fval(r, RF_TRAVELUNIT)) {
for (ru = a_find(r->attribs, &at_travelunit); ru; ru = ru->nexttype) { for (ru = a_find(r->attribs, &at_travelunit); ru && ru->type==&at_travelunit; ru = ru->next) {
unit * u = (unit*)ru->data.v; unit * u = (unit*)ru->data.v;
if (u->faction == f) { if (u->faction == f) {
mode = see_travel; mode = see_travel;

View File

@ -154,7 +154,7 @@ make_skillmod(skill_t sk, unsigned int flags, skillmod_fun special, double multi
int int
skillmod(const attrib * a, const unit * u, const region * r, skill_t sk, int value, int flags) skillmod(const attrib * a, const unit * u, const region * r, skill_t sk, int value, int flags)
{ {
for (a = a_find((attrib*)a, &at_skillmod); a; a=a->nexttype) { for (a = a_find((attrib*)a, &at_skillmod); a && a->type==&at_skillmod; a=a->next) {
skillmod_data * smd = (skillmod_data *)a->data.v; skillmod_data * smd = (skillmod_data *)a->data.v;
if (smd->skill!=NOSKILL && smd->skill!=sk) continue; if (smd->skill!=NOSKILL && smd->skill!=sk) continue;
if (flags!=SMF_ALWAYS && (smd->flags & flags) == 0) continue; if (flags!=SMF_ALWAYS && (smd->flags & flags) == 0) continue;

View File

@ -481,8 +481,8 @@ void
usetcontact(unit * u, const unit * u2) usetcontact(unit * u, const unit * u2)
{ {
attrib * a = a_find(u->attribs, &at_contact); attrib * a = a_find(u->attribs, &at_contact);
while (a && a->data.v!=u2) a = a->nexttype; while (a && a->type==&at_contact && a->data.v!=u2) a = a->next;
if (a) return; if (a && a->type==&at_contact) return;
a_add(&u->attribs, a_new(&at_contact))->data.v = (void*)u2; a_add(&u->attribs, a_new(&at_contact))->data.v = (void*)u2;
} }
@ -494,7 +494,7 @@ ucontact(const unit * u, const unit * u2)
if (u->faction==u2->faction) return true; if (u->faction==u2->faction) return true;
/* Explizites KONTAKTIERE */ /* Explizites KONTAKTIERE */
for (ru = a_find(u->attribs, &at_contact); ru; ru = ru->nexttype) for (ru = a_find(u->attribs, &at_contact); ru && ru->type==&at_contact; ru = ru->next)
if (((unit*)ru->data.v) == u2) if (((unit*)ru->data.v) == u2)
return true; return true;
@ -828,10 +828,10 @@ transfermen(unit * u, unit * u2, int n)
} }
} }
a = a_find(u->attribs, &at_effect); a = a_find(u->attribs, &at_effect);
while (a) { while (a && a->type==&at_effect) {
effect_data * olde = (effect_data*)a->data.v; effect_data * olde = (effect_data*)a->data.v;
if (olde->value) change_effect(u2, olde->type, olde->value); if (olde->value) change_effect(u2, olde->type, olde->value);
a = a->nexttype; a = a->next;
} }
if (fval(u, UFL_LONGACTION)) fset(u2, UFL_LONGACTION); if (fval(u, UFL_LONGACTION)) fset(u2, UFL_LONGACTION);
if (u->attribs) { if (u->attribs) {
@ -845,8 +845,8 @@ transfermen(unit * u, unit * u2, int n)
u2->hp += hp; u2->hp += hp;
/* TODO: Das ist schnarchlahm! und gehört ncht hierhin */ /* TODO: Das ist schnarchlahm! und gehört ncht hierhin */
a = a_find(u2->attribs, &at_effect); a = a_find(u2->attribs, &at_effect);
while (a) { while (a && a->type==&at_effect) {
attrib * an = a->nexttype; attrib * an = a->next;
effect_data * olde = (effect_data*)a->data.v; effect_data * olde = (effect_data*)a->data.v;
int e = get_effect(u, olde->type); int e = get_effect(u, olde->type);
if (e!=0) change_effect(u2, olde->type, -e); if (e!=0) change_effect(u2, olde->type, -e);

View File

@ -154,7 +154,7 @@ gm_create(const tnode * tnext, const char * str, void * data, struct order * ord
} else { } else {
attrib * a = a_find(permissions, &at_gmcreate); attrib * a = a_find(permissions, &at_gmcreate);
while (a && a->data.v!=(void*)itype) a=a->nexttype; while (a && a->type==&at_gmcreate && a->data.v!=(void*)itype) a=a->next;
if (a) i_change(&u->items, itype, i); if (a) i_change(&u->items, itype, i);
else mistake(u, ord, "Diesen Gegenstand darf deine Partei nicht machen.", 0); else mistake(u, ord, "Diesen Gegenstand darf deine Partei nicht machen.", 0);
} }

View File

@ -142,12 +142,12 @@ warden_add_give(unit *src, unit *u, const item_type *itype, int n)
attrib *a; attrib *a;
/* has the giver a cookie corresponding to the warden */ /* has the giver a cookie corresponding to the warden */
for(a = a_find(src->attribs, &at_museumgivebackcookie); a; a=a->nexttype) { for(a = a_find(src->attribs, &at_museumgivebackcookie); a && a->type==&at_museumgivebackcookie; a=a->next) {
if(((museumgivebackcookie *)(a->data.v))->warden_no == u->no) break; if(((museumgivebackcookie *)(a->data.v))->warden_no == u->no) break;
} }
/* if not give it one */ /* if not give it one */
if(!a) { if (a==NULL || a->type!=&at_museumgivebackcookie) {
a = a_add(&src->attribs, a_new(&at_museumgivebackcookie)); a = a_add(&src->attribs, a_new(&at_museumgivebackcookie));
gbc = (museumgivebackcookie *)a->data.v; gbc = (museumgivebackcookie *)a->data.v;
gbc->warden_no = u->no; gbc->warden_no = u->no;
@ -159,15 +159,15 @@ warden_add_give(unit *src, unit *u, const item_type *itype, int n)
} }
/* now we search for the warden's corresponding item list */ /* now we search for the warden's corresponding item list */
for(a = a_find(u->attribs, &at_museumgiveback); a; a=a->nexttype) { for (a = a_find(u->attribs, &at_museumgiveback); a && a->type==&at_museumgiveback; a=a->next) {
gb = (museumgiveback *)a->data.v; gb = (museumgiveback *)a->data.v;
if(gb->cookie == gbc->cookie) { if (gb->cookie == gbc->cookie) {
break; break;
} }
} }
/* if there's none, give it one */ /* if there's none, give it one */
if(!gb) { if (!gb) {
a = a_add(&u->attribs, a_new(&at_museumgiveback)); a = a_add(&u->attribs, a_new(&at_museumgiveback));
gb = (museumgiveback *)a->data.v; gb = (museumgiveback *)a->data.v;
gb->cookie = gbc->cookie; gb->cookie = gbc->cookie;
@ -309,10 +309,10 @@ use_museumexitticket(unit *u, const struct item_type *itype, int amount, order *
a_remove(&u->attribs, a); a_remove(&u->attribs, a);
if(a) { if(a) {
for(a = a_find(warden->attribs, &at_museumgiveback); a; a = a->nexttype) { for(a = a_find(warden->attribs, &at_museumgiveback); a && a->type==&at_museumgiveback; a = a->next) {
if(((museumgiveback *)(a->data.v))->cookie == unit_cookie) break; if(((museumgiveback *)(a->data.v))->cookie == unit_cookie) break;
} }
if(a) { if (a && a->type==&at_museumgiveback) {
museumgiveback *gb = (museumgiveback *)(a->data.v); museumgiveback *gb = (museumgiveback *)(a->data.v);
item *it; item *it;

View File

@ -2816,18 +2816,18 @@ resolve_buddy(variant data)
curse * c = (curse*)a->data.v; curse * c = (curse*)a->data.v;
wallcurse * wc = (wallcurse*)c->data.v; wallcurse * wc = (wallcurse*)c->data.v;
if (wc->wall->id==br->id) break; if (wc->wall->id==br->id) break;
a = a->nexttype; a = a->next;
} }
if (!a) { if (!a || a->type!=&at_cursewall) {
a = a_find(b->to->attribs, &at_cursewall); a = a_find(b->to->attribs, &at_cursewall);
while (a && a->data.v!=br->self) { while (a && a->type==&at_cursewall && a->data.v!=br->self) {
curse * c = (curse*)a->data.v; curse * c = (curse*)a->data.v;
wallcurse * wc = (wallcurse*)c->data.v; wallcurse * wc = (wallcurse*)c->data.v;
if (wc->wall->id==br->id) break; if (wc->wall->id==br->id) break;
a = a->nexttype; a = a->next;
} }
} }
if (a) { if (a && a->type==&at_cursewall) {
curse * c = (curse*)a->data.v; curse * c = (curse*)a->data.v;
free(br); free(br);
return c; return c;
@ -6271,7 +6271,7 @@ sp_disruptastral(castorder *co)
rl = all_in_range(rt, (short)(power/5), NULL); rl = all_in_range(rt, (short)(power/5), NULL);
for (rl2=rl; rl2!=NULL; rl2=rl2->next) { for (rl2=rl; rl2!=NULL; rl2=rl2->next) {
attrib *a, *a2; attrib *a;
variant effect; variant effect;
region * r2 = rl2->data; region * r2 = rl2->data;
spec_direction *sd; spec_direction *sd;
@ -6290,8 +6290,8 @@ sp_disruptastral(castorder *co)
/* Nicht-Permanente Tore zerstören */ /* Nicht-Permanente Tore zerstören */
a = a_find(r->attribs, &at_direction); a = a_find(r->attribs, &at_direction);
while (a!=NULL) { while (a!=NULL && a->type==&at_direction) {
a2 = a->nexttype; attrib * a2 = a->next;
sd = (spec_direction *)(a->data.v); sd = (spec_direction *)(a->data.v);
if (sd->duration != -1) a_remove(&r->attribs, a); if (sd->duration != -1) a_remove(&r->attribs, a);
a = a2; a = a2;

View File

@ -88,91 +88,142 @@ a_select(attrib * a, const void * data, boolean(*compare)(const attrib *, const
attrib * attrib *
a_find(attrib * a, const attrib_type * at) a_find(attrib * a, const attrib_type * at)
{ {
while (a && a->type!=at) a = a->next; while (a && a->type!=at) a = a->nexttype;
return a; return a;
} }
const attrib * const attrib *
a_findc(const attrib * a, const attrib_type * at) a_findc(const attrib * a, const attrib_type * at)
{ {
while (a && a->type!=at) a = a->next; while (a && a->type!=at) a = a->nexttype;
return a; return a;
} }
static attrib *
a_insert(attrib * head, attrib * a)
{
attrib ** pa=&head->next;
assert(!(a->type->flags & ATF_UNIQUE));
assert(head && head->type==a->type);
while (*pa && (*pa)->type==a->type) {
pa = &(*pa)->next;
}
a->next = *pa;
return *pa = a;
}
attrib * attrib *
a_add(attrib ** pa, attrib * a) a_add(attrib ** pa, attrib * a)
{ {
attrib ** find = pa; attrib * first = *pa;
assert(a->next==NULL && a->nexttype==NULL); assert(a->next==NULL && a->nexttype==NULL);
while (*find && (*find)->type!=a->type) find = &(*find)->next;
if (a->type->flags & ATF_PRESERVE) { if (first==NULL) return *pa = a;
while (*find) find = &(*find)->nexttype; if (first->type==a->type) {
return a_insert(first, a);
} }
if (a->type->flags & ATF_UNIQUE && *find) { for (;;) {
if ((*find)->type == a->type) { attrib * next = first->nexttype;
log_error(("duplicate attribute: %s\n", a->type->name)); if (next==NULL) {
return a; /* the type is not in the list, append it behind the last type */
attrib ** insert = &first->next;
first->nexttype = a;
while (*insert) insert = &(*insert)->next;
*insert = a;
break;
} }
if (next->type==a->type) {
return a_insert(next, a);
} }
if (*find) { first = next;
attrib ** last = find;
while (*last) last = &(*last)->nexttype;
*last = a;
while (*find && (*find)->type==a->type) find = &(*find)->next;
} }
a->next = *find;
*find = a;
return a; return a;
} }
void void
a_free(attrib * a) { a_free(attrib * a)
{
const attrib_type * at = a->type; const attrib_type * at = a->type;
if (at->finalize) at->finalize(a); if (at->finalize) at->finalize(a);
free(a); free(a);
} }
static int static int
a_unlink(attrib ** p, attrib * a) { a_unlink(attrib ** pa, attrib * a)
attrib ** pa = p; {
while (*pa && *pa!=a) pa = &(*pa)->next; attrib ** pnexttype = pa;
if (*pa) { attrib ** pnext = NULL;
attrib ** pnt;
for (pnt=p;*pnt;pnt=&(*pnt)->next) while (*pnexttype) {
if ((*pnt)->nexttype == a) { attrib * next = *pnexttype;
(*pnt)->nexttype = a->nexttype; if (next->type==a->type) break;
break; pnexttype = &next->nexttype;
pnext = &next->next;
} }
*pa = (*pa)->next; if (*pnexttype && (*pnexttype)->type==a->type) {
if (*pnexttype==a) {
*pnexttype = a->next;
if (a->next!=a->nexttype) {
a->next->nexttype = a->nexttype;
}
if (pnext==NULL) return 1;
while (*pnext && (*pnext)->type!=a->type) pnext = &(*pnext)->next;
} else {
pnext = &(*pnexttype)->next;
}
while (*pnext && (*pnext)->type==a->type) {
if (*pnext==a) {
*pnext = a->next;
return 1; return 1;
} }
pnext = &(*pnext)->next;
}
}
return 0; return 0;
} }
int int
a_remove(attrib ** p, attrib * a) { a_remove(attrib ** pa, attrib * a)
{
int ok; int ok;
ok = a_unlink(p, a); ok = a_unlink(pa, a);
if( ok ) a_free(a); if (ok) a_free(a);
return ok; return ok;
} }
void void
a_removeall(attrib **p, const attrib_type * at) a_removeall(attrib **pa, const attrib_type * at)
{ {
attrib *find = *p, *findnext; attrib ** pnexttype = pa;
if (find && find->type != at){ attrib ** pnext = NULL;
find = a_find(find, at);
while (*pnexttype) {
attrib * next = *pnexttype;
if (next->type==at) break;
pnexttype = &next->nexttype;
pnext = &next->next;
}
if (*pnexttype && (*pnexttype)->type==at) {
attrib * a = *pnexttype;
*pnexttype = a->nexttype;
if (pnext) {
while (*pnext && (*pnext)->type!=at) pnext = &(*pnext)->next;
*pnext = a->nexttype;
}
while (a && a->type==at) {
attrib * ra = a;
a = a->next;
a_free(ra);
} }
while(find && find->type == at) {
findnext = find->next;
a_remove(p, find);
find = findnext;
} }
} }
attrib * attrib *
a_new(const attrib_type * at) { a_new(const attrib_type * at)
{
attrib * a = (attrib*)calloc(1, sizeof(attrib)); attrib * a = (attrib*)calloc(1, sizeof(attrib));
assert(at!=NULL); assert(at!=NULL);
a->type = at; a->type = at;
@ -189,7 +240,7 @@ a_age(attrib ** p)
while(*ap) { while(*ap) {
attrib * a = *ap; attrib * a = *ap;
if (a->type->age && a->type->age(a)==0) a_remove(p, a); if (a->type->age && a->type->age(a)==0) a_remove(p, a);
else ap=&a->next; else ap = &a->next;
} }
return (*p!=NULL); return (*p!=NULL);
} }
@ -248,8 +299,10 @@ a_write(FILE * f, const attrib * attribs)
assert(na->type->hashkey || !"attribute not registered"); assert(na->type->hashkey || !"attribute not registered");
fprintf(f, "%s ", na->type->name); fprintf(f, "%s ", na->type->name);
na->type->write(na, f); na->type->write(na, f);
}
na = na->next; na = na->next;
} else {
na = na->nexttype;
}
} }
fprintf(f, "end "); fprintf(f, "end ");
} }

View File

@ -34,7 +34,7 @@ typedef struct attrib {
} data; } data;
/* internal data, do not modify: */ /* internal data, do not modify: */
struct attrib * next; /* next attribute in the list */ struct attrib * next; /* next attribute in the list */
struct attrib * nexttype; /* next attribute of same type */ struct attrib * nexttype; /* skip to attribute of a different type */
} attrib; } attrib;
#define ATF_UNIQUE (1<<0) /* only one per attribute-list */ #define ATF_UNIQUE (1<<0) /* only one per attribute-list */

View File

@ -26,6 +26,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <assert.h> #include <assert.h>
#include <limits.h> #include <limits.h>
#include <memory.h>
void void
cv_init(cvector * cv) cv_init(cvector * cv)

View File

@ -165,15 +165,14 @@ get_triggers(struct attrib * ap, const char * eventname)
{ {
handler_info * td = NULL; handler_info * td = NULL;
attrib * a = a_find(ap, &at_eventhandler); attrib * a = a_find(ap, &at_eventhandler);
while (a!=NULL) { while (a!=NULL && a->type==&at_eventhandler) {
td = (handler_info *)a->data.v; td = (handler_info *)a->data.v;
if (!strcmp(td->event, eventname)) { if (strcmp(td->event, eventname)==0) {
break;
}
a = a->nexttype;
}
if (!a) return NULL;
return &td->triggers; return &td->triggers;
}
a = a->next;
}
return NULL;
} }
void void
@ -183,14 +182,14 @@ add_trigger(struct attrib ** ap, const char * eventname, struct trigger * t)
handler_info * td = NULL; handler_info * td = NULL;
attrib * a = a_find(*ap, &at_eventhandler); attrib * a = a_find(*ap, &at_eventhandler);
assert(t->next==NULL); assert(t->next==NULL);
while (a!=NULL) { while (a!=NULL && a->type==&at_eventhandler) {
td = (handler_info *)a->data.v; td = (handler_info *)a->data.v;
if (!strcmp(td->event, eventname)) { if (!strcmp(td->event, eventname)) {
break; break;
} }
a = a->nexttype; a = a->next;
} }
if (!a) { if (a==NULL || a->type!=&at_eventhandler) {
a = a_add(ap, a_new(&at_eventhandler)); a = a_add(ap, a_new(&at_eventhandler));
td = (handler_info *)a->data.v; td = (handler_info *)a->data.v;
td->event = strdup(eventname); td->event = strdup(eventname);
@ -207,14 +206,14 @@ handle_event(attrib ** attribs, const char * eventname, void * data)
if ((*attribs)->type==&at_eventhandler) break; if ((*attribs)->type==&at_eventhandler) break;
attribs = &(*attribs)->next; attribs = &(*attribs)->next;
} }
while (*attribs) { while (*attribs && (*attribs)->type==&at_eventhandler) {
handler_info * tl = (handler_info*)(*attribs)->data.v; handler_info * tl = (handler_info*)(*attribs)->data.v;
if (!strcmp(tl->event, eventname)) break; if (!strcmp(tl->event, eventname)) {
attribs = &(*attribs)->nexttype;
}
if (*attribs) {
handler_info * tl = (handler_info*)(*attribs)->data.v; handler_info * tl = (handler_info*)(*attribs)->data.v;
handle_triggers(&tl->triggers, data); handle_triggers(&tl->triggers, data);
break;
}
attribs = &(*attribs)->next;
} }
} }

View File

@ -441,6 +441,9 @@
<File <File
RelativePath=".\message.c"> RelativePath=".\message.c">
</File> </File>
<File
RelativePath=".\mt19937ar.c">
</File>
<File <File
RelativePath=".\nrmessage.c"> RelativePath=".\nrmessage.c">
</File> </File>

View File

@ -76,129 +76,80 @@ EndProject
Global Global
GlobalSection(SolutionConfiguration) = preSolution GlobalSection(SolutionConfiguration) = preSolution
Debug = Debug Debug = Debug
Debug64 = Debug64
Profile = Profile Profile = Profile
Release = Release Release = Release
Release64 = Release64
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution GlobalSection(ProjectConfiguration) = postSolution
{330712B5-8B27-4B17-B3CF-7A02CC0F93C3}.Debug.ActiveCfg = Debug|Win32 {330712B5-8B27-4B17-B3CF-7A02CC0F93C3}.Debug.ActiveCfg = Debug|Win32
{330712B5-8B27-4B17-B3CF-7A02CC0F93C3}.Debug.Build.0 = Debug|Win32 {330712B5-8B27-4B17-B3CF-7A02CC0F93C3}.Debug.Build.0 = Debug|Win32
{330712B5-8B27-4B17-B3CF-7A02CC0F93C3}.Debug64.ActiveCfg = Debug64|Win32
{330712B5-8B27-4B17-B3CF-7A02CC0F93C3}.Debug64.Build.0 = Debug64|Win32
{330712B5-8B27-4B17-B3CF-7A02CC0F93C3}.Profile.ActiveCfg = Profile|Win32 {330712B5-8B27-4B17-B3CF-7A02CC0F93C3}.Profile.ActiveCfg = Profile|Win32
{330712B5-8B27-4B17-B3CF-7A02CC0F93C3}.Profile.Build.0 = Profile|Win32 {330712B5-8B27-4B17-B3CF-7A02CC0F93C3}.Profile.Build.0 = Profile|Win32
{330712B5-8B27-4B17-B3CF-7A02CC0F93C3}.Release.ActiveCfg = Release|Win32 {330712B5-8B27-4B17-B3CF-7A02CC0F93C3}.Release.ActiveCfg = Release|Win32
{330712B5-8B27-4B17-B3CF-7A02CC0F93C3}.Release.Build.0 = Release|Win32 {330712B5-8B27-4B17-B3CF-7A02CC0F93C3}.Release.Build.0 = Release|Win32
{330712B5-8B27-4B17-B3CF-7A02CC0F93C3}.Release64.ActiveCfg = Release64|Win32
{330712B5-8B27-4B17-B3CF-7A02CC0F93C3}.Release64.Build.0 = Release64|Win32
{B859D542-781E-4647-BCAB-3FE5ED077366}.Debug.ActiveCfg = Debug|Win32 {B859D542-781E-4647-BCAB-3FE5ED077366}.Debug.ActiveCfg = Debug|Win32
{B859D542-781E-4647-BCAB-3FE5ED077366}.Debug.Build.0 = Debug|Win32 {B859D542-781E-4647-BCAB-3FE5ED077366}.Debug.Build.0 = Debug|Win32
{B859D542-781E-4647-BCAB-3FE5ED077366}.Debug64.ActiveCfg = Debug64|Win32
{B859D542-781E-4647-BCAB-3FE5ED077366}.Debug64.Build.0 = Debug64|Win32
{B859D542-781E-4647-BCAB-3FE5ED077366}.Profile.ActiveCfg = Profile|Win32 {B859D542-781E-4647-BCAB-3FE5ED077366}.Profile.ActiveCfg = Profile|Win32
{B859D542-781E-4647-BCAB-3FE5ED077366}.Profile.Build.0 = Profile|Win32 {B859D542-781E-4647-BCAB-3FE5ED077366}.Profile.Build.0 = Profile|Win32
{B859D542-781E-4647-BCAB-3FE5ED077366}.Release.ActiveCfg = Release|Win32 {B859D542-781E-4647-BCAB-3FE5ED077366}.Release.ActiveCfg = Release|Win32
{B859D542-781E-4647-BCAB-3FE5ED077366}.Release.Build.0 = Release|Win32 {B859D542-781E-4647-BCAB-3FE5ED077366}.Release.Build.0 = Release|Win32
{B859D542-781E-4647-BCAB-3FE5ED077366}.Release64.ActiveCfg = Release64|Win32
{B859D542-781E-4647-BCAB-3FE5ED077366}.Release64.Build.0 = Release64|Win32
{79659D44-EC28-42B9-9475-6C0D62D0AAE0}.Debug.ActiveCfg = Debug|Win32 {79659D44-EC28-42B9-9475-6C0D62D0AAE0}.Debug.ActiveCfg = Debug|Win32
{79659D44-EC28-42B9-9475-6C0D62D0AAE0}.Debug.Build.0 = Debug|Win32 {79659D44-EC28-42B9-9475-6C0D62D0AAE0}.Debug.Build.0 = Debug|Win32
{79659D44-EC28-42B9-9475-6C0D62D0AAE0}.Debug64.ActiveCfg = Debug64|Win32
{79659D44-EC28-42B9-9475-6C0D62D0AAE0}.Debug64.Build.0 = Debug64|Win32
{79659D44-EC28-42B9-9475-6C0D62D0AAE0}.Profile.ActiveCfg = Profile|Win32 {79659D44-EC28-42B9-9475-6C0D62D0AAE0}.Profile.ActiveCfg = Profile|Win32
{79659D44-EC28-42B9-9475-6C0D62D0AAE0}.Profile.Build.0 = Profile|Win32 {79659D44-EC28-42B9-9475-6C0D62D0AAE0}.Profile.Build.0 = Profile|Win32
{79659D44-EC28-42B9-9475-6C0D62D0AAE0}.Release.ActiveCfg = Release|Win32 {79659D44-EC28-42B9-9475-6C0D62D0AAE0}.Release.ActiveCfg = Release|Win32
{79659D44-EC28-42B9-9475-6C0D62D0AAE0}.Release.Build.0 = Release|Win32 {79659D44-EC28-42B9-9475-6C0D62D0AAE0}.Release.Build.0 = Release|Win32
{79659D44-EC28-42B9-9475-6C0D62D0AAE0}.Release64.ActiveCfg = Release64|Win32
{79659D44-EC28-42B9-9475-6C0D62D0AAE0}.Release64.Build.0 = Release64|Win32
{C14E3D2B-8189-4570-A4E3-9010C873E4FD}.Debug.ActiveCfg = Debug|Win32 {C14E3D2B-8189-4570-A4E3-9010C873E4FD}.Debug.ActiveCfg = Debug|Win32
{C14E3D2B-8189-4570-A4E3-9010C873E4FD}.Debug.Build.0 = Debug|Win32 {C14E3D2B-8189-4570-A4E3-9010C873E4FD}.Debug.Build.0 = Debug|Win32
{C14E3D2B-8189-4570-A4E3-9010C873E4FD}.Debug64.ActiveCfg = Debug64|Win32
{C14E3D2B-8189-4570-A4E3-9010C873E4FD}.Debug64.Build.0 = Debug64|Win32
{C14E3D2B-8189-4570-A4E3-9010C873E4FD}.Profile.ActiveCfg = Profile|Win32 {C14E3D2B-8189-4570-A4E3-9010C873E4FD}.Profile.ActiveCfg = Profile|Win32
{C14E3D2B-8189-4570-A4E3-9010C873E4FD}.Profile.Build.0 = Profile|Win32 {C14E3D2B-8189-4570-A4E3-9010C873E4FD}.Profile.Build.0 = Profile|Win32
{C14E3D2B-8189-4570-A4E3-9010C873E4FD}.Release.ActiveCfg = Release|Win32 {C14E3D2B-8189-4570-A4E3-9010C873E4FD}.Release.ActiveCfg = Release|Win32
{C14E3D2B-8189-4570-A4E3-9010C873E4FD}.Release.Build.0 = Release|Win32 {C14E3D2B-8189-4570-A4E3-9010C873E4FD}.Release.Build.0 = Release|Win32
{C14E3D2B-8189-4570-A4E3-9010C873E4FD}.Release64.ActiveCfg = Release64|Win32
{C14E3D2B-8189-4570-A4E3-9010C873E4FD}.Release64.Build.0 = Release64|Win32
{EDB0DE67-8215-4AF7-ACA1-F23CB11FF211}.Debug.ActiveCfg = Debug|Win32 {EDB0DE67-8215-4AF7-ACA1-F23CB11FF211}.Debug.ActiveCfg = Debug|Win32
{EDB0DE67-8215-4AF7-ACA1-F23CB11FF211}.Debug.Build.0 = Debug|Win32 {EDB0DE67-8215-4AF7-ACA1-F23CB11FF211}.Debug.Build.0 = Debug|Win32
{EDB0DE67-8215-4AF7-ACA1-F23CB11FF211}.Debug64.ActiveCfg = Debug64|Win32
{EDB0DE67-8215-4AF7-ACA1-F23CB11FF211}.Debug64.Build.0 = Debug64|Win32
{EDB0DE67-8215-4AF7-ACA1-F23CB11FF211}.Profile.ActiveCfg = Profile|Win32 {EDB0DE67-8215-4AF7-ACA1-F23CB11FF211}.Profile.ActiveCfg = Profile|Win32
{EDB0DE67-8215-4AF7-ACA1-F23CB11FF211}.Profile.Build.0 = Profile|Win32 {EDB0DE67-8215-4AF7-ACA1-F23CB11FF211}.Profile.Build.0 = Profile|Win32
{EDB0DE67-8215-4AF7-ACA1-F23CB11FF211}.Release.ActiveCfg = Release|Win32 {EDB0DE67-8215-4AF7-ACA1-F23CB11FF211}.Release.ActiveCfg = Release|Win32
{EDB0DE67-8215-4AF7-ACA1-F23CB11FF211}.Release.Build.0 = Release|Win32 {EDB0DE67-8215-4AF7-ACA1-F23CB11FF211}.Release.Build.0 = Release|Win32
{EDB0DE67-8215-4AF7-ACA1-F23CB11FF211}.Release64.ActiveCfg = Release64|Win32
{EDB0DE67-8215-4AF7-ACA1-F23CB11FF211}.Release64.Build.0 = Release64|Win32
{17F83AAB-352D-4F68-ADA6-09F36D86826F}.Debug.ActiveCfg = Debug|Win32 {17F83AAB-352D-4F68-ADA6-09F36D86826F}.Debug.ActiveCfg = Debug|Win32
{17F83AAB-352D-4F68-ADA6-09F36D86826F}.Debug.Build.0 = Debug|Win32 {17F83AAB-352D-4F68-ADA6-09F36D86826F}.Debug.Build.0 = Debug|Win32
{17F83AAB-352D-4F68-ADA6-09F36D86826F}.Debug64.ActiveCfg = Debug64|Win32
{17F83AAB-352D-4F68-ADA6-09F36D86826F}.Debug64.Build.0 = Debug64|Win32
{17F83AAB-352D-4F68-ADA6-09F36D86826F}.Profile.ActiveCfg = Profile|Win32 {17F83AAB-352D-4F68-ADA6-09F36D86826F}.Profile.ActiveCfg = Profile|Win32
{17F83AAB-352D-4F68-ADA6-09F36D86826F}.Release.ActiveCfg = Release|Win32 {17F83AAB-352D-4F68-ADA6-09F36D86826F}.Release.ActiveCfg = Release|Win32
{17F83AAB-352D-4F68-ADA6-09F36D86826F}.Release64.ActiveCfg = Release64|Win32
{601CF164-F483-4DE7-8014-64BDD30680B5}.Debug.ActiveCfg = Debug|Win32 {601CF164-F483-4DE7-8014-64BDD30680B5}.Debug.ActiveCfg = Debug|Win32
{601CF164-F483-4DE7-8014-64BDD30680B5}.Debug.Build.0 = Debug|Win32 {601CF164-F483-4DE7-8014-64BDD30680B5}.Debug.Build.0 = Debug|Win32
{601CF164-F483-4DE7-8014-64BDD30680B5}.Debug64.ActiveCfg = Debug64|Win32
{601CF164-F483-4DE7-8014-64BDD30680B5}.Debug64.Build.0 = Debug64|Win32
{601CF164-F483-4DE7-8014-64BDD30680B5}.Profile.ActiveCfg = Profile|Win32 {601CF164-F483-4DE7-8014-64BDD30680B5}.Profile.ActiveCfg = Profile|Win32
{601CF164-F483-4DE7-8014-64BDD30680B5}.Profile.Build.0 = Profile|Win32 {601CF164-F483-4DE7-8014-64BDD30680B5}.Profile.Build.0 = Profile|Win32
{601CF164-F483-4DE7-8014-64BDD30680B5}.Release.ActiveCfg = Release|Win32 {601CF164-F483-4DE7-8014-64BDD30680B5}.Release.ActiveCfg = Release|Win32
{601CF164-F483-4DE7-8014-64BDD30680B5}.Release.Build.0 = Release|Win32 {601CF164-F483-4DE7-8014-64BDD30680B5}.Release.Build.0 = Release|Win32
{601CF164-F483-4DE7-8014-64BDD30680B5}.Release64.ActiveCfg = Release64|Win32
{601CF164-F483-4DE7-8014-64BDD30680B5}.Release64.Build.0 = Release64|Win32
{4C837BEC-A428-4287-84B3-8F8F9DE7FA00}.Debug.ActiveCfg = Debug|Win32 {4C837BEC-A428-4287-84B3-8F8F9DE7FA00}.Debug.ActiveCfg = Debug|Win32
{4C837BEC-A428-4287-84B3-8F8F9DE7FA00}.Debug.Build.0 = Debug|Win32 {4C837BEC-A428-4287-84B3-8F8F9DE7FA00}.Debug.Build.0 = Debug|Win32
{4C837BEC-A428-4287-84B3-8F8F9DE7FA00}.Debug64.ActiveCfg = Debug64|Win32
{4C837BEC-A428-4287-84B3-8F8F9DE7FA00}.Debug64.Build.0 = Debug64|Win32
{4C837BEC-A428-4287-84B3-8F8F9DE7FA00}.Profile.ActiveCfg = Profile|Win32 {4C837BEC-A428-4287-84B3-8F8F9DE7FA00}.Profile.ActiveCfg = Profile|Win32
{4C837BEC-A428-4287-84B3-8F8F9DE7FA00}.Profile.Build.0 = Profile|Win32 {4C837BEC-A428-4287-84B3-8F8F9DE7FA00}.Profile.Build.0 = Profile|Win32
{4C837BEC-A428-4287-84B3-8F8F9DE7FA00}.Release.ActiveCfg = Release|Win32 {4C837BEC-A428-4287-84B3-8F8F9DE7FA00}.Release.ActiveCfg = Release|Win32
{4C837BEC-A428-4287-84B3-8F8F9DE7FA00}.Release.Build.0 = Release|Win32 {4C837BEC-A428-4287-84B3-8F8F9DE7FA00}.Release.Build.0 = Release|Win32
{4C837BEC-A428-4287-84B3-8F8F9DE7FA00}.Release64.ActiveCfg = Release64|Win32
{4C837BEC-A428-4287-84B3-8F8F9DE7FA00}.Release64.Build.0 = Release64|Win32
{0EE778AB-8445-40DB-8F65-6BE378A91B97}.Debug.ActiveCfg = Debug|Win32 {0EE778AB-8445-40DB-8F65-6BE378A91B97}.Debug.ActiveCfg = Debug|Win32
{0EE778AB-8445-40DB-8F65-6BE378A91B97}.Debug.Build.0 = Debug|Win32 {0EE778AB-8445-40DB-8F65-6BE378A91B97}.Debug.Build.0 = Debug|Win32
{0EE778AB-8445-40DB-8F65-6BE378A91B97}.Debug64.ActiveCfg = Debug64|Win32
{0EE778AB-8445-40DB-8F65-6BE378A91B97}.Debug64.Build.0 = Debug64|Win32
{0EE778AB-8445-40DB-8F65-6BE378A91B97}.Profile.ActiveCfg = Profile|Win32 {0EE778AB-8445-40DB-8F65-6BE378A91B97}.Profile.ActiveCfg = Profile|Win32
{0EE778AB-8445-40DB-8F65-6BE378A91B97}.Profile.Build.0 = Profile|Win32 {0EE778AB-8445-40DB-8F65-6BE378A91B97}.Profile.Build.0 = Profile|Win32
{0EE778AB-8445-40DB-8F65-6BE378A91B97}.Release.ActiveCfg = Release|Win32 {0EE778AB-8445-40DB-8F65-6BE378A91B97}.Release.ActiveCfg = Release|Win32
{0EE778AB-8445-40DB-8F65-6BE378A91B97}.Release.Build.0 = Release|Win32 {0EE778AB-8445-40DB-8F65-6BE378A91B97}.Release.Build.0 = Release|Win32
{0EE778AB-8445-40DB-8F65-6BE378A91B97}.Release64.ActiveCfg = Release64|Win32
{0EE778AB-8445-40DB-8F65-6BE378A91B97}.Release64.Build.0 = Release64|Win32
{EF495253-2EEC-4F83-B6C0-D651F88B2198}.Debug.ActiveCfg = Debug|Win32 {EF495253-2EEC-4F83-B6C0-D651F88B2198}.Debug.ActiveCfg = Debug|Win32
{EF495253-2EEC-4F83-B6C0-D651F88B2198}.Debug.Build.0 = Debug|Win32 {EF495253-2EEC-4F83-B6C0-D651F88B2198}.Debug.Build.0 = Debug|Win32
{EF495253-2EEC-4F83-B6C0-D651F88B2198}.Debug64.ActiveCfg = Debug64|Win32
{EF495253-2EEC-4F83-B6C0-D651F88B2198}.Debug64.Build.0 = Debug64|Win32
{EF495253-2EEC-4F83-B6C0-D651F88B2198}.Profile.ActiveCfg = Profile|Win32 {EF495253-2EEC-4F83-B6C0-D651F88B2198}.Profile.ActiveCfg = Profile|Win32
{EF495253-2EEC-4F83-B6C0-D651F88B2198}.Profile.Build.0 = Profile|Win32 {EF495253-2EEC-4F83-B6C0-D651F88B2198}.Profile.Build.0 = Profile|Win32
{EF495253-2EEC-4F83-B6C0-D651F88B2198}.Release.ActiveCfg = Release|Win32 {EF495253-2EEC-4F83-B6C0-D651F88B2198}.Release.ActiveCfg = Release|Win32
{EF495253-2EEC-4F83-B6C0-D651F88B2198}.Release.Build.0 = Release|Win32 {EF495253-2EEC-4F83-B6C0-D651F88B2198}.Release.Build.0 = Release|Win32
{EF495253-2EEC-4F83-B6C0-D651F88B2198}.Release64.ActiveCfg = Release64|Win32
{EF495253-2EEC-4F83-B6C0-D651F88B2198}.Release64.Build.0 = Release64|Win32
{1D80D05F-BCF5-4971-8F06-D9581FD3B1F4}.Debug.ActiveCfg = Debug|Win32 {1D80D05F-BCF5-4971-8F06-D9581FD3B1F4}.Debug.ActiveCfg = Debug|Win32
{1D80D05F-BCF5-4971-8F06-D9581FD3B1F4}.Debug.Build.0 = Debug|Win32 {1D80D05F-BCF5-4971-8F06-D9581FD3B1F4}.Debug.Build.0 = Debug|Win32
{1D80D05F-BCF5-4971-8F06-D9581FD3B1F4}.Debug64.ActiveCfg = Debug64|Win32
{1D80D05F-BCF5-4971-8F06-D9581FD3B1F4}.Debug64.Build.0 = Debug64|Win32
{1D80D05F-BCF5-4971-8F06-D9581FD3B1F4}.Profile.ActiveCfg = Profile|Win32 {1D80D05F-BCF5-4971-8F06-D9581FD3B1F4}.Profile.ActiveCfg = Profile|Win32
{1D80D05F-BCF5-4971-8F06-D9581FD3B1F4}.Profile.Build.0 = Profile|Win32 {1D80D05F-BCF5-4971-8F06-D9581FD3B1F4}.Profile.Build.0 = Profile|Win32
{1D80D05F-BCF5-4971-8F06-D9581FD3B1F4}.Release.ActiveCfg = Release|Win32 {1D80D05F-BCF5-4971-8F06-D9581FD3B1F4}.Release.ActiveCfg = Release|Win32
{1D80D05F-BCF5-4971-8F06-D9581FD3B1F4}.Release.Build.0 = Release|Win32 {1D80D05F-BCF5-4971-8F06-D9581FD3B1F4}.Release.Build.0 = Release|Win32
{1D80D05F-BCF5-4971-8F06-D9581FD3B1F4}.Release64.ActiveCfg = Release64|Win32
{1D80D05F-BCF5-4971-8F06-D9581FD3B1F4}.Release64.Build.0 = Release64|Win32
{749A2F7C-B9C3-4CEB-B1B2-1D4587E68719}.Debug.ActiveCfg = Debug|Win32 {749A2F7C-B9C3-4CEB-B1B2-1D4587E68719}.Debug.ActiveCfg = Debug|Win32
{749A2F7C-B9C3-4CEB-B1B2-1D4587E68719}.Debug.Build.0 = Debug|Win32 {749A2F7C-B9C3-4CEB-B1B2-1D4587E68719}.Debug.Build.0 = Debug|Win32
{749A2F7C-B9C3-4CEB-B1B2-1D4587E68719}.Debug64.ActiveCfg = Debug64|Win32
{749A2F7C-B9C3-4CEB-B1B2-1D4587E68719}.Debug64.Build.0 = Debug64|Win32
{749A2F7C-B9C3-4CEB-B1B2-1D4587E68719}.Profile.ActiveCfg = Profile|Win32 {749A2F7C-B9C3-4CEB-B1B2-1D4587E68719}.Profile.ActiveCfg = Profile|Win32
{749A2F7C-B9C3-4CEB-B1B2-1D4587E68719}.Profile.Build.0 = Profile|Win32 {749A2F7C-B9C3-4CEB-B1B2-1D4587E68719}.Profile.Build.0 = Profile|Win32
{749A2F7C-B9C3-4CEB-B1B2-1D4587E68719}.Release.ActiveCfg = Release|Win32 {749A2F7C-B9C3-4CEB-B1B2-1D4587E68719}.Release.ActiveCfg = Release|Win32
{749A2F7C-B9C3-4CEB-B1B2-1D4587E68719}.Release.Build.0 = Release|Win32 {749A2F7C-B9C3-4CEB-B1B2-1D4587E68719}.Release.Build.0 = Release|Win32
{749A2F7C-B9C3-4CEB-B1B2-1D4587E68719}.Release64.ActiveCfg = Release64|Win32
{749A2F7C-B9C3-4CEB-B1B2-1D4587E68719}.Release64.Build.0 = Release64|Win32
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection EndGlobalSection

View File

@ -934,7 +934,7 @@ fix_chaosgates(void)
for (r = regions; r; r=r->next) { for (r = regions; r; r=r->next) {
const attrib *a = a_findc(r->attribs, &at_direction); const attrib *a = a_findc(r->attribs, &at_direction);
while (a!=NULL) { while (a!=NULL && a->type==&at_direction) {
spec_direction * sd = (spec_direction *)a->data.v; spec_direction * sd = (spec_direction *)a->data.v;
region * r2 = findregion(sd->x, sd->y); region * r2 = findregion(sd->x, sd->y);
if (r2!=NULL) { if (r2!=NULL) {
@ -947,7 +947,7 @@ fix_chaosgates(void)
b = new_border(&bt_chaosgate, r, r2); b = new_border(&bt_chaosgate, r, r2);
} }
} }
a = a->nexttype; a = a->next;
} }
} }
return 0; return 0;

View File

@ -24,7 +24,7 @@ namespace eressea {
objects::get(const char * name) { objects::get(const char * name) {
lua_State * L = (lua_State *)global.vm_state; lua_State * L = (lua_State *)global.vm_state;
attrib * a = a_find(*mAttribPtr, &at_object); attrib * a = a_find(*mAttribPtr, &at_object);
for (;a;a=a->nexttype) { for (;a && a->type==&at_object;a=a->next) {
if (strcmp(object_name(a), name)==0) { if (strcmp(object_name(a), name)==0) {
variant val; variant val;
object_type type; object_type type;
@ -61,15 +61,14 @@ namespace eressea {
static void set_object(attrib **attribs, const char * name, object_type type, variant val) { static void set_object(attrib **attribs, const char * name, object_type type, variant val) {
attrib * a = a_find(*attribs, &at_object); attrib * a = a_find(*attribs, &at_object);
for (;a;a=a->nexttype) { for (;a && a->type==&at_object;a=a->next) {
if (strcmp(object_name(a), name)==0) break; if (strcmp(object_name(a), name)==0) {
}
if (a==NULL) {
a = a_add(attribs, object_create(name, type, val));
} else {
object_set(a, type, val); object_set(a, type, val);
return;
} }
} }
a = a_add(attribs, object_create(name, type, val));
}
template<> void template<> void
objects::set<int, TINTEGER>(const char * name, int value) { objects::set<int, TINTEGER>(const char * name, int value) {

View File

@ -200,128 +200,6 @@
<Tool <Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/> Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration> </Configuration>
<Configuration
Name="Release64|Win32"
OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="../common/kernel,../common/gamecode,../common/util,../common,.."
PreprocessorDefinitions="WIN32,NDEBUG,_CONSOLE"
StringPooling="TRUE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="TRUE"
DisableLanguageExtensions="TRUE"
UsePrecompiledHeader="0"
PrecompiledHeaderFile=".\Release/mapper.pch"
AssemblerListingLocation=".\Release/"
ObjectFile=".\Release/"
ProgramDataBaseFileName=".\Release/"
WarningLevel="4"
SuppressStartupBanner="TRUE"
DebugInformationFormat="3"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:AMD64"
AdditionalDependencies="curses.lib libxml2.lib"
OutputFile=".\Release/mapper.exe"
LinkIncremental="1"
SuppressStartupBanner="TRUE"
GenerateDebugInformation="TRUE"
ProgramDatabaseFile=".\Release/mapper.pdb"
SubSystem="1"/>
<Tool
Name="VCMIDLTool"
TypeLibraryName=".\Release/mapper.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1031"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Debug64|Win32"
OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="FALSE"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
ImproveFloatingPointConsistency="FALSE"
AdditionalIncludeDirectories="../common/kernel,../common/gamecode,../common/util,../common,.."
PreprocessorDefinitions="_CONSOLE,WIN32"
BasicRuntimeChecks="0"
BufferSecurityCheck="FALSE"
DisableLanguageExtensions="TRUE"
UsePrecompiledHeader="0"
PrecompiledHeaderThrough="stdafx.h"
PrecompiledHeaderFile=".\Debug/mapper.pch"
WarningLevel="4"
SuppressStartupBanner="TRUE"
Detect64BitPortabilityProblems="FALSE"
DebugInformationFormat="3"
CompileAs="0"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalOptions="/MACHINE:I386"
AdditionalDependencies="curses.lib libxml2.lib"
LinkIncremental="2"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories=""
GenerateDebugInformation="TRUE"
ProgramDatabaseFile=".\Debug/mapper.pdb"
SubSystem="1"/>
<Tool
Name="VCMIDLTool"
TypeLibraryName=".\Debug/mapper.tlb"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1031"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations> </Configurations>
<References> <References>
</References> </References>