From a38625d9a46b295fa8f68fd605953c450367ff63 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Mon, 12 May 2008 11:26:41 +0200 Subject: [PATCH] Make xundump oops on virtual selectors Commit da8a1dae (v4.3.12) introduced virtual selectors, but neglected to update xundump. Xundump can't work for them, because they don't provide a setter method. This didn't actually break anything, because all virtual selectors have flag NSC_EXTRA set, or are in table EF_VERSION, which xundump refuses to touch. Make deffld() oops on virtual selector, just to be safe. --- include/nsc.h | 4 +++- src/lib/common/xundump.c | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/include/nsc.h b/include/nsc.h index f46ca6cc..405cf46d 100644 --- a/include/nsc.h +++ b/include/nsc.h @@ -213,8 +213,10 @@ enum { * NP points to the country to use for coordinate translation and * access control (null for none), and CTXO is the context object. * See struct valstr for details. + * Because virtual selectors don't have a setter method, xundump must + * be made to ignore them, e.g. by setting NSC_EXTRA. * If flag NSC_DEITY is set, only to deities can use this selector. - * If flag NSC_EXTRA is set, xdump ignores this selector. + * If flag NSC_EXTRA is set, xdump and xundump ignore this selector. * If flag NSC_CONST is set, the datum can't be changed from its * initial value (xundump obeys that). * If ca_table is not EF_BAD, the datum refers to that Empire table; diff --git a/src/lib/common/xundump.c b/src/lib/common/xundump.c index 1cce54f7..69914c33 100644 --- a/src/lib/common/xundump.c +++ b/src/lib/common/xundump.c @@ -47,6 +47,7 @@ * - Check each partial table supplies the same rows * - Check EFF_CFG tables are dense * - Symbolic array indexes + * - Option to treat missing and unknown fields as warning, not error * TODO, but hardly worth the effort: * - Permit reordering of array elements */ @@ -352,7 +353,7 @@ deffld(int fldno, char *name, int idx) if (res < 0) return gripe("Header %s of field %d is %s", name, fldno + 1, res == M_NOTUNIQUE ? "ambiguous" : "unknown"); - if (ca[res].ca_flags == NSC_EXTRA) + if (ca[res].ca_flags == NSC_EXTRA || CANT_HAPPEN(ca[res].ca_get)) return gripe("Extraneous header %s in field %d", name, fldno + 1); if (ca[res].ca_type != NSC_STRINGY && ca[res].ca_len != 0) { if (idx < 0)