diff --git a/src/common/gamecode/creport.c b/src/common/gamecode/creport.c index 7ef6941ac..6f3ef3c23 100644 --- a/src/common/gamecode/creport.c +++ b/src/common/gamecode/creport.c @@ -399,7 +399,8 @@ cr_order(variant var, char * buffer, const void * userdata) } *wp++ = '\"'; *wp++ = 0; - /* sprintf(buffer, "\"%s\"", cmd); */ + + free(cmd); } else strcpy(buffer, "\"\""); return 0; diff --git a/src/common/gamecode/economy.c b/src/common/gamecode/economy.c index 11a43c78c..818825dec 100644 --- a/src/common/gamecode/economy.c +++ b/src/common/gamecode/economy.c @@ -73,12 +73,6 @@ # include #endif -typedef struct donation { - struct donation *next; - struct faction *f1, *f2; - int amount; -} donation; - typedef struct request { struct request * next; struct unit *unit; @@ -372,6 +366,11 @@ free_recruitments(recruitment * recruits) while (recruits) { recruitment * rec = recruits; recruits = rec->next; + while (rec->requests) { + request * req = rec->requests; + rec->requests = req->next; + free(req); + } free(rec); } } @@ -845,8 +844,8 @@ report_donations(void) { region * r; for (r=regions;r;r=r->next) { - donation * sp; - for (sp = r->donations; sp; sp = sp->next) { + while (r->donations) { + donation * sp = r->donations; if (sp->amount > 0) { struct message * msg = msg_message("donation", "from to amount", sp->f1, sp->f2, sp->amount); @@ -854,6 +853,8 @@ report_donations(void) r_addmessage(r, sp->f2, msg); msg_release(msg); } + r->donations = sp->next; + free(sp); } } } diff --git a/src/common/gamecode/monster.c b/src/common/gamecode/monster.c index 904009e15..2f79020e7 100644 --- a/src/common/gamecode/monster.c +++ b/src/common/gamecode/monster.c @@ -979,4 +979,5 @@ plan_monsters(void) } } } + pathfinder_cleanup(); } diff --git a/src/common/gamecode/report.c b/src/common/gamecode/report.c index beb3b42d3..9735bc2b3 100644 --- a/src/common/gamecode/report.c +++ b/src/common/gamecode/report.c @@ -871,16 +871,20 @@ static void rp_battles(FILE * F, faction * f) { if (f->battles!=NULL) { - struct bmsg * bm; rnl(F); centre(F, LOC(f->locale, "section_battle"), false); rnl(F); - for (bm=f->battles;bm;bm=bm->next) { + + while (f->battles) { + struct bmsg * bm = f->battles; + f->battles = bm->next; RENDER(f, buf, 80, ("battle::header", "region", bm->r)); rnl(F); centre(F, buf, true); rnl(F); rp_messages(F, bm->msgs, f, 0, true, false); + free_messagelist(bm->msgs); + free(bm); } } } diff --git a/src/common/kernel/battle.c b/src/common/kernel/battle.c index 4e589f3fa..29235f006 100644 --- a/src/common/kernel/battle.c +++ b/src/common/kernel/battle.c @@ -1416,7 +1416,7 @@ select_opponent(battle * b, troop at, int minrow, int maxrow) * * } * - * cv_kill(fgs); Nicht vergessen + * cv_kill(fgs); free(fgs); Nicht vergessen */ cvector * diff --git a/src/common/kernel/calendar.c b/src/common/kernel/calendar.c index 751999f7e..e87b60451 100644 --- a/src/common/kernel/calendar.c +++ b/src/common/kernel/calendar.c @@ -30,3 +30,29 @@ get_gamedate(int turn, gamedate * gd) return gd; } +void +calendar_cleanup(void) +{ + int i; + + free(agename); + + for (i=0;i!=seasons;++i) { + free(seasonnames[i]); + } + free(seasonnames); + + for (i=0;i!=months_per_year;++i) { + free(monthnames[i]); + } + free(storms); + free(month_season); + free(monthnames); + + for (i=0;i!=weeks_per_month;++i) { + free(weeknames[i]); + free(weeknames2[i]); + } + free(weeknames); + free(weeknames2); +} diff --git a/src/common/kernel/calendar.h b/src/common/kernel/calendar.h index 3cb9889b1..323ca68a2 100644 --- a/src/common/kernel/calendar.h +++ b/src/common/kernel/calendar.h @@ -1,6 +1,10 @@ #ifndef KRNL_CALENDAR_H #define KRNL_CALENDAR_H +#ifdef __cplusplus +extern "C" { +#endif + extern char *agename; extern int first_turn; extern int first_month; @@ -25,5 +29,9 @@ typedef struct gamedate { } gamedate; extern gamedate * get_gamedate(int turn, gamedate * gd); +extern void calendar_cleanup(void); +#ifdef __cplusplus +} +#endif #endif diff --git a/src/common/kernel/combatspells.c b/src/common/kernel/combatspells.c index ae4164f64..7f1ac3748 100644 --- a/src/common/kernel/combatspells.c +++ b/src/common/kernel/combatspells.c @@ -355,6 +355,7 @@ sp_combatrosthauch(fighter * fi, int level, double power, spell * sp) } } cv_kill(fgs); + free(fgs); if (k == 0) { /* keine Waffen mehr da, die zerstört werden könnten */ @@ -678,6 +679,7 @@ sp_immolation(fighter * fi, int level, double power, spell * sp) if (force==0) break; } cv_kill(fgs); + free(fgs); sprintf(buf, "%d Personen %s getötet", killed, killed == 1 ? "wurde" : "wurden"); @@ -968,6 +970,7 @@ sp_chaosrow(fighter * fi, int level, double power, spell * sp) power = max(0, power-n); } cv_kill(fgs); + free(fgs); scat("Ein plötzlicher Tumult entsteht"); if (k > 0) { @@ -1045,6 +1048,7 @@ sp_flee(fighter * fi, int level, double power, spell * sp) } } cv_kill(fgs); + free(fgs); sprintf(buf, "%d Krieger %s von Furcht gepackt.", panik, panik == 1 ? "wurde" : "wurden"); @@ -1672,6 +1676,7 @@ sp_healing(fighter * fi, int level, double power, spell * sp) j += heal_fighters(fgs, &healhp, false); j += heal_fighters(fgs, &healhp, true); cv_kill(fgs); + free(fgs); if (j == 0) { scat(", doch niemand mußte magisch geheilt werden."); @@ -1754,6 +1759,7 @@ sp_undeadhero(fighter * fi, int level, double power, spell * sp) } } cv_kill(fgs); + free(fgs); if (undead == 0) { sprintf(buf, "%s kann keine Untoten rufen.", unitname(mage)); diff --git a/src/common/kernel/eressea.c b/src/common/kernel/eressea.c index 2ca97acdb..e5c89b887 100644 --- a/src/common/kernel/eressea.c +++ b/src/common/kernel/eressea.c @@ -3032,7 +3032,7 @@ void add_income(unit * u, int type, int want, int qty) { if (want==INT_MAX) want = qty; - add_message(&u->faction->msgs, new_message(u->faction, "income%u:unit%r:region%i:mode%i:wanted%i:amount", + ADDMSG(&u->faction->msgs, msg_message("income", "unit region mode wanted amount", u, u->region, type, want, qty)); } diff --git a/src/common/kernel/message.c b/src/common/kernel/message.c index da2cc5587..bdf1b0f41 100644 --- a/src/common/kernel/message.c +++ b/src/common/kernel/message.c @@ -378,7 +378,7 @@ cmistake(const unit * u, struct order *ord, int mno, int mtype) if (u->faction->no == MONSTER_FACTION) return; sprintf(ebuf, "error%d", mno); ADDMSG(&u->faction->msgs, msg_message(ebuf, - "command unit region", copy_order(ord), u, u->region)); + "command unit region", ord, u, u->region)); } extern unsigned int new_hashstring(const char* s); diff --git a/src/common/kernel/movement.c b/src/common/kernel/movement.c index b9a0da007..ef223c9b8 100644 --- a/src/common/kernel/movement.c +++ b/src/common/kernel/movement.c @@ -1786,6 +1786,7 @@ run_to(unit * u, region * to) region_list * route = NULL; add_regionlist(&route, to); travel_route(u, route, NULL, NULL, TRAVEL_RUNNING); + free_regionlist(route); /* weder transport noch follow */ } diff --git a/src/common/kernel/pathfinder.c b/src/common/kernel/pathfinder.c index bebb4af51..bcfde874e 100644 --- a/src/common/kernel/pathfinder.c +++ b/src/common/kernel/pathfinder.c @@ -58,6 +58,16 @@ typedef struct node { static node * node_garbage; +void +pathfinder_cleanup(void) +{ + while (node_garbage) { + node * n = node_garbage; + node_garbage = n->next; + free(n); + } +} + static node * new_node(region * r, int distance, node * prev) { diff --git a/src/common/kernel/pathfinder.h b/src/common/kernel/pathfinder.h index 308bb85a7..71559c760 100644 --- a/src/common/kernel/pathfinder.h +++ b/src/common/kernel/pathfinder.h @@ -29,6 +29,9 @@ extern boolean allowed_swim(const struct region * src, const struct region * tar extern boolean allowed_fly(const struct region * src, const struct region * target); extern boolean allowed_walk(const struct region * src, const struct region * target); extern struct region_list * regions_in_range(struct region * src, int maxdist, boolean (*allowed)(const struct region*, const struct region*)); + +extern void pathfinder_cleanup(void); + #ifdef __cplusplus } #endif diff --git a/src/common/kernel/region.c b/src/common/kernel/region.c index 0447671a9..3be3ce100 100644 --- a/src/common/kernel/region.c +++ b/src/common/kernel/region.c @@ -821,6 +821,13 @@ free_region(region * r) r->resources = res->next; free(res); } + + while (r->donations) { + donation * don = r->donations; + r->donations = don->next; + free(don); + } + free(r); } diff --git a/src/common/kernel/region.h b/src/common/kernel/region.h index e6d85bc7b..d14b1b2a2 100644 --- a/src/common/kernel/region.h +++ b/src/common/kernel/region.h @@ -82,6 +82,12 @@ typedef struct land_region { #endif } land_region; +typedef struct donation { + struct donation *next; + struct faction *f1, *f2; + int amount; +} donation; + typedef struct region { struct region *next; struct land_region *land; diff --git a/src/common/kernel/unit.c b/src/common/kernel/unit.c index 4465ad856..8cf5e6458 100644 --- a/src/common/kernel/unit.c +++ b/src/common/kernel/unit.c @@ -1122,6 +1122,11 @@ stripunit(unit * u) u->items = it; } while (u->attribs) a_remove (&u->attribs, u->attribs); + while (u->reservations) { + struct reservation *res = u->reservations; + u->reservations = res->next; + free(res); + } } diff --git a/src/eressea/server.cpp b/src/eressea/server.cpp index 4b59b6bb7..377b403fa 100644 --- a/src/eressea/server.cpp +++ b/src/eressea/server.cpp @@ -64,6 +64,7 @@ /* kernel includes */ #include #include +#include #include #include #include @@ -431,6 +432,7 @@ game_done(void) creport_cleanup(); report_cleanup(); + calendar_cleanup(); } #endif