Virtual selectors can't be used in xundump, since we lack a setter to
go with ca_get(). verify_ca() verifies they don't occur in tables
that can be xundumped.
When I restricted xundump to tables with a file name (commit
029d929,
v4.3.28), I neglected to update the test in verify_ca().
Factor out the correct test into xundumpable(). Use it to fix
verify_ca().
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
* xdump.h: Extended dumps
*
* Known contributors to this file:
- * Markus Armbruster, 2008-2014
+ * Markus Armbruster, 2008-2016
*/
#ifndef XDUMP_H
extern void xdflds(struct xdstr *, struct castr[], void *);
extern void xdftr(struct xdstr *, int);
extern int xundump(FILE *, char *, int *, int);
+extern int xundumpable(int);
extern int xundump_redundant(int, int, void *);
#endif
#include "misc.h"
#include "nsc.h"
#include "product.h"
+#include "xdump.h"
static void verify_fail(int, int, struct castr *, int, char *, ...)
ATTRIBUTE((format (printf, 5, 6)));
for (i = 0; ca[i].ca_name; i++) {
/*
* Virtual selectors can't be used in xundump, since we lack a
- * setter to go with ca_get(). Exception: if EFF_MEM is not
- * set, xundump doesn't touch the table.
+ * setter to go with ca_get().
*/
- if (CANT_HAPPEN((ef_flags(type) & EFF_MEM)
+ if (CANT_HAPPEN(xundumpable(type)
&& ca[i].ca_get
&& ca[i].ca_dump <= CA_DUMP_CONST))
ca[i].ca_dump = CA_DUMP_ONLY;
return gripe("expected table '%s', not '%s'",
ef_nameof(expected_table), name);
- if (!empfile[type].file
- || !ef_cadef(type) || !(ef_flags(type) & EFF_MEM)) {
+ if (!xundumpable(type)) {
CANT_HAPPEN(expected_table != EF_BAD);
return gripe("table '%s' is not permitted here", name);
}
return type;
}
+/*
+ * Can table @type be xundumped?
+ */
+int
+xundumpable(int type)
+{
+ return empfile[type].file && ef_cadef(type)
+ && (ef_flags(type) & EFF_MEM);
+}
+
/*
* Find fields in this xdump.
* If reading human-readable syntax, read a field header line from @fp.