Merge pull request from ennorehling/develop

crash fix
This commit is contained in:
Enno Rehling 2018-05-20 17:27:19 +02:00 committed by GitHub
commit f1d76808d1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 172 additions and 142 deletions

2
clibs

@ -1 +1 @@
Subproject commit 147584ad70b220abf6a4e97ca76e785729b9ac32 Subproject commit f9842e07a442c5453c270badf25ab72633b4edf5

View file

@ -17,9 +17,7 @@ msgstr "Rostiges Kettenhemd"
msgctxt "spellinfo" msgctxt "spellinfo"
msgid "destroy_magic" msgid "destroy_magic"
msgstr "" msgstr ""
"Dieser Zauber ermöglicht dem Magier, Verzauberungen " "Dieser Zauber ermöglicht dem Magier, Verzauberungen einer Einheit, eines Schiffes, Gebäudes oder auch der Region aufzulösen."
"einer Einheit, eines Schiffes, Gebäudes oder auch "
"der Region aufzulösen."
msgctxt "spell" msgctxt "spell"
msgid "shadowknights" msgid "shadowknights"
@ -168,9 +166,6 @@ msgstr "TRÄNKE"
msgid "northwest" msgid "northwest"
msgstr "Nordwesten" msgstr "Nordwesten"
msgid "spinx09"
msgstr "Das Schiff mit dem Stern im Wappen liegt neben dem der einen Mandelkern hat"
msgctxt "iteminfo" msgctxt "iteminfo"
msgid "cookie" msgid "cookie"
msgstr "Kleines trockenes Dauergebäck, m od. s; - u. -es, - u. -e" msgstr "Kleines trockenes Dauergebäck, m od. s; - u. -es, - u. -e"

View file

@ -486,3 +486,13 @@ function test_rising_undead()
assert_equal(2, u.number) assert_equal(2, u.number)
assert_equal(u.number, u:get_item('rustysword')) assert_equal(u.number, u:get_item('rustysword'))
end end
function test_dwarf_mining()
local f = faction.create('dwarf')
local r = region.create(0, 0, 'plain')
local u = unit.create(f, r)
u.name = 'Xolgrim'
u:set_skill('mining', 2)
assert_equal(2, u:get_skill('mining'))
assert_equal(4, u:eff_skill('mining'))
end

View file

@ -85,13 +85,15 @@ static void test_steal_okay(CuTest * tc) {
struct steal env; struct steal env;
race *rc; race *rc;
struct terrain_type *ter; struct terrain_type *ter;
message *msg;
test_setup(); test_setup();
ter = test_create_terrain("plain", LAND_REGION); ter = test_create_terrain("plain", LAND_REGION);
rc = test_create_race("human"); rc = test_create_race("human");
rc->flags = 0; rc->flags = 0;
setup_steal(&env, ter, rc); setup_steal(&env, ter, rc);
CuAssertPtrEquals(tc, 0, steal_message(env.u, 0)); CuAssertPtrEquals(tc, NULL, msg = steal_message(env.u, 0));
assert(!msg);
test_teardown(); test_teardown();
} }
@ -739,6 +741,7 @@ static void test_expand_production(CuTest *tc) {
CuAssertPtrEquals(tc, u, results[0]->unit); CuAssertPtrEquals(tc, u, results[0]->unit);
CuAssertPtrEquals(tc, u, results[1]->unit); CuAssertPtrEquals(tc, u, results[1]->unit);
CuAssertIntEquals(tc, 0, u->n); CuAssertIntEquals(tc, 0, u->n);
free(results);
test_teardown(); test_teardown();
} }

View file

@ -40,12 +40,15 @@ static void setup_give(struct give *env) {
env->r = test_create_region(0, 0, ter); env->r = test_create_region(0, 0, ter);
env->src = test_create_unit(env->f1, env->r); env->src = test_create_unit(env->f1, env->r);
env->dst = env->f2 ? test_create_unit(env->f2, env->r) : 0;
env->itype = it_get_or_create(rt_get_or_create("money")); env->itype = it_get_or_create(rt_get_or_create("money"));
env->itype->flags |= ITF_HERB; env->itype->flags |= ITF_HERB;
if (env->f1 && env->f2) { if (env->f2) {
ally * al = ally_add(&env->f2->allies, env->f1); ally * al = ally_add(&env->f2->allies, env->f1);
al->status = HELP_GIVE; al->status = HELP_GIVE;
env->dst = test_create_unit(env->f2, env->r);
}
else {
env->dst = NULL;
} }
if (env->lang) { if (env->lang) {
locale_setstring(env->lang, env->itype->rtype->_name, "SILBER"); locale_setstring(env->lang, env->itype->rtype->_name, "SILBER");
@ -139,10 +142,12 @@ static void test_give_unit_to_ocean(CuTest * tc) {
static void test_give_men(CuTest * tc) { static void test_give_men(CuTest * tc) {
struct give env = { 0 }; struct give env = { 0 };
message * msg;
test_setup_ex(tc); test_setup_ex(tc);
env.f2 = env.f1 = test_create_faction(NULL); env.f2 = env.f1 = test_create_faction(NULL);
setup_give(&env); setup_give(&env);
CuAssertPtrEquals(tc, 0, give_men(1, env.src, env.dst, NULL)); CuAssertPtrEquals(tc, NULL, msg = give_men(1, env.src, env.dst, NULL));
assert(!msg);
CuAssertIntEquals(tc, 2, env.dst->number); CuAssertIntEquals(tc, 2, env.dst->number);
CuAssertIntEquals(tc, 0, env.src->number); CuAssertIntEquals(tc, 0, env.src->number);
test_teardown(); test_teardown();
@ -222,10 +227,13 @@ static void test_give_men_in_ocean(CuTest * tc) {
static void test_give_men_too_many(CuTest * tc) { static void test_give_men_too_many(CuTest * tc) {
struct give env = { 0 }; struct give env = { 0 };
message * msg;
test_setup_ex(tc); test_setup_ex(tc);
env.f2 = env.f1 = test_create_faction(NULL); env.f2 = env.f1 = test_create_faction(NULL);
setup_give(&env); setup_give(&env);
CuAssertPtrEquals(tc, 0, give_men(2, env.src, env.dst, NULL)); CuAssertPtrEquals(tc, NULL, msg = give_men(2, env.src, env.dst, NULL));
assert(!msg);
CuAssertIntEquals(tc, 2, env.dst->number); CuAssertIntEquals(tc, 2, env.dst->number);
CuAssertIntEquals(tc, 0, env.src->number); CuAssertIntEquals(tc, 0, env.src->number);
test_teardown(); test_teardown();

View file

@ -7,6 +7,8 @@
#include <CuTest.h> #include <CuTest.h>
#include <tests.h> #include <tests.h>
#include <assert.h>
void test_missing_message(CuTest *tc) { void test_missing_message(CuTest *tc) {
message *msg; message *msg;
@ -78,6 +80,7 @@ static void test_merge_split(CuTest *tc) {
static void test_noerror(CuTest *tc) { static void test_noerror(CuTest *tc) {
unit *u; unit *u;
struct locale *lang; struct locale *lang;
message *msg;
test_setup(); test_setup();
lang = test_create_locale(); lang = test_create_locale();
@ -85,8 +88,10 @@ static void test_noerror(CuTest *tc) {
u->thisorder = parse_order("!@move", lang); u->thisorder = parse_order("!@move", lang);
CuAssertIntEquals(tc, K_MOVE | CMD_QUIET | CMD_PERSIST, u->thisorder->command); CuAssertIntEquals(tc, K_MOVE | CMD_QUIET | CMD_PERSIST, u->thisorder->command);
CuAssertTrue(tc, !is_persistent(u->thisorder)); CuAssertTrue(tc, !is_persistent(u->thisorder));
CuAssertPtrEquals(tc, NULL, msg_error(u, u->thisorder, 100)); CuAssertPtrEquals(tc, NULL, msg = msg_error(u, u->thisorder, 100));
CuAssertPtrEquals(tc, NULL, msg_feedback(u, u->thisorder, "error_unit_not_found", NULL)); assert(!msg);
CuAssertPtrEquals(tc, NULL, msg = msg_feedback(u, u->thisorder, "error_unit_not_found", NULL));
assert(!msg);
test_teardown(); test_teardown();
} }

View file

@ -239,6 +239,7 @@ static void test_is_persistent(CuTest *tc) {
ord = parse_order("@invalid", lang); ord = parse_order("@invalid", lang);
CuAssertPtrEquals(tc, NULL, ord); CuAssertPtrEquals(tc, NULL, ord);
free_order(ord);
ord = parse_order("give", lang); ord = parse_order("give", lang);
CuAssertIntEquals(tc, K_GIVE, ord->command); CuAssertIntEquals(tc, K_GIVE, ord->command);
@ -290,6 +291,7 @@ static void test_is_silent(CuTest *tc) {
ord = parse_order("@invalid", lang); ord = parse_order("@invalid", lang);
CuAssertPtrEquals(tc, NULL, ord); CuAssertPtrEquals(tc, NULL, ord);
free_order(ord);
ord = parse_order("// comment", lang); ord = parse_order("// comment", lang);
CuAssertTrue(tc, is_persistent(ord)); CuAssertTrue(tc, is_persistent(ord));

View file

@ -723,8 +723,9 @@ rp_messages(struct stream *out, message_list * msgs, faction * viewer, int inden
int k = 0; int k = 0;
struct mlist *m = msgs->begin; struct mlist *m = msgs->begin;
while (m) { while (m) {
/* messagetype * mt = m->type; */ /* categorized messages need a section: */
if (!categorized || strcmp(m->msg->type->section, section) == 0) { assert(!categorized || (m->msg->type->section != NULL));
if (!categorized || m->msg->type->section == section) {
char lbuf[8192]; char lbuf[8192];
if (!k && categorized) { if (!k && categorized) {
@ -1037,6 +1038,9 @@ void report_region(struct stream *out, const region * r, faction * f)
if (wrptr(&bufp, &size, bytes) != 0) if (wrptr(&bufp, &size, bytes) != 0)
WARN_STATIC_BUFFER(); WARN_STATIC_BUFFER();
if (is_mourning(r, turn + 1)) { if (is_mourning(r, turn + 1)) {
bytes = (int)str_strlcpy(bufp, " ", size);
if (wrptr(&bufp, &size, bytes) != 0)
WARN_STATIC_BUFFER();
bytes = (int)str_strlcpy(bufp, LOC(f->locale, "nr_mourning"), size); bytes = (int)str_strlcpy(bufp, LOC(f->locale, "nr_mourning"), size);
if (wrptr(&bufp, &size, bytes) != 0) if (wrptr(&bufp, &size, bytes) != 0)
WARN_STATIC_BUFFER(); WARN_STATIC_BUFFER();
@ -1877,6 +1881,9 @@ nr_building(struct stream *out, const region *r, const building *b, const factio
} }
if (!building_finished(b)) { if (!building_finished(b)) {
bytes = (int)str_strlcpy(bufp, " ", size);
if (wrptr(&bufp, &size, bytes) != 0)
WARN_STATIC_BUFFER();
bytes = (int)str_strlcpy(bufp, LOC(lang, "nr_building_inprogress"), size); bytes = (int)str_strlcpy(bufp, LOC(lang, "nr_building_inprogress"), size);
if (wrptr(&bufp, &size, bytes) != 0) if (wrptr(&bufp, &size, bytes) != 0)
WARN_STATIC_BUFFER(); WARN_STATIC_BUFFER();
@ -2306,11 +2313,11 @@ report_plaintext(const char *filename, report_context * ctx,
message_list *mlist = r_getmessages(r, f); message_list *mlist = r_getmessages(r, f);
if (mlist) { if (mlist) {
struct mlist **split = merge_messages(mlist, r->msgs); struct mlist **split = merge_messages(mlist, r->msgs);
rp_messages(out, mlist, f, 0, true); rp_messages(out, mlist, f, 0, false);
split_messages(mlist, split); split_messages(mlist, split);
} }
else { else {
rp_messages(out, r->msgs, f, 0, true); rp_messages(out, r->msgs, f, 0, false);
} }
} }

View file

@ -111,7 +111,8 @@ size_t str_slprintf(char * dst, size_t size, const char * format, ...)
return (size_t)result; return (size_t)result;
} }
void str_replace(char *buffer, size_t size, const char *tmpl, const char *var, const char *value) void str_replace(char *buffer, size_t size, const char *tmpl, const char *var,
const char *value)
{ {
size_t val_len = strlen(value); size_t val_len = strlen(value);
size_t var_len = strlen(var); size_t var_len = strlen(var);
@ -154,8 +155,7 @@ int str_hash(const char *s)
return key & 0x7FFFFFFF; return key & 0x7FFFFFFF;
} }
const char *str_escape(const char *str, char *buffer, const char *str_escape(const char *str, char *buffer, size_t len)
size_t len)
{ {
const char *handle_start = strchr(str, '\"'); const char *handle_start = strchr(str, '\"');
if (!handle_start) handle_start = strchr(str, '\\'); if (!handle_start) handle_start = strchr(str, '\\');