diff --git a/src/lib/common/xundump.c b/src/lib/common/xundump.c index 53a647b7..41a87e29 100644 --- a/src/lib/common/xundump.c +++ b/src/lib/common/xundump.c @@ -60,6 +60,7 @@ #include #include "file.h" #include "match.h" +#include "nat.h" #include "nsc.h" #include "optlist.h" #include "xdump.h" @@ -130,7 +131,7 @@ ca0_is_id(int type) static int can_fill_gaps(int type) { - return (ca0_is_id(type) || type == EF_SECTOR) + return (ca0_is_id(type) || type == EF_SECTOR || type == EF_REALM) && !have_hardcoded_indexes(type); } @@ -393,6 +394,40 @@ rowid_sect(void) return id; } +/* + * Get the current row's ID. + * Current table's type must be EF_REALM. + * Return ID on success, -1 on failure. + */ +static int +rowid_realm(void) +{ + int fldno_cnum, fldno_realm, id; + long realm, cnum; + + if (CANT_HAPPEN(partno != 0 || cur_type != EF_REALM)) + return -1; + + fldno_cnum = fld_find_long_by_name("cnum", 0); + fldno_realm = fld_find_long_by_name("realm", 0); + if (fldno_cnum < 0 || fldno_realm < 0) + return cur_id + 1; + + realm = (long)fldval[fldno_realm].val_as.dbl; + cnum = (long)fldval[fldno_cnum].val_as.dbl; + if (cnum < 0 || cnum >= MAXNOC) + return gripe("Field %d must be between 0 and %d", + fldno_cnum, MAXNOC); + if (realm < 0 || realm >= MAXNOR) + return gripe("Field %d must be between 0 and %d", + fldno_realm, MAXNOR); + id = realm + cnum * MAXNOR; + if (id <= cur_id) + return gripe("Fields %d,%d must be > (%d,%d)", + fldno_cnum + 1, fldno_realm + 1, + cur_id / MAXNOR, cur_id % MAXNOR); + return id; +} /* * Get the current row's object. * Extend the table if necessary. @@ -420,6 +455,10 @@ rowobj(void) id = rowid_sect(); if (id < 0) return NULL; + } else if (cur_type == EF_REALM) { + id = rowid_realm(); + if (id < 0) + return NULL; } else id = last_id + 1; if (id > ef_id_limit(cur_type)) { diff --git a/tests/empdump/errors.err b/tests/empdump/errors.err index ea76e977..01f71735 100644 --- a/tests/empdump/errors.err +++ b/tests/empdump/errors.err @@ -46,6 +46,9 @@ tests/empdump/xundump-errors/fld-invid2:3: Field 1 must be > -1 tests/empdump/xundump-errors/fld-invid3:4: Field 1 must be > 2 tests/empdump/xundump-errors/fld-invid4:3: Field 1 must be <= 98 tests/empdump/xundump-errors/fld-invid5:4: Coordinates in fields 1,2 must be > 2,0 +tests/empdump/xundump-errors/fld-invid6:3: Field 0 must be between 0 and 99 +tests/empdump/xundump-errors/fld-invid7:3: Field 1 must be between 0 and 50 +tests/empdump/xundump-errors/fld-invid8:4: Fields 1,2 must be > (0,1) tests/empdump/xundump-errors/fld-junk:2: Junk in field 1 tests/empdump/xundump-errors/fld-junk2:2: Junk in field 19 tests/empdump/xundump-errors/fld-malnum:2: Malformed number in field 1 diff --git a/tests/empdump/errors.status b/tests/empdump/errors.status index da7383b0..bd9eb7c9 100644 --- a/tests/empdump/errors.status +++ b/tests/empdump/errors.status @@ -70,6 +70,9 @@ 1 1 1 +1 +1 +1 0 1 0 diff --git a/tests/empdump/xundump-errors/fld-constnum b/tests/empdump/xundump-errors/fld-constnum index 410ad88e..9317c0f3 100644 --- a/tests/empdump/xundump-errors/fld-constnum +++ b/tests/empdump/xundump-errors/fld-constnum @@ -1,4 +1,4 @@ -config realm -cnum realm xl xh yl yh -1 0 0 0 0 0 +config sect +xloc yloc ... +64 0 # Value for field 1 must be 0 diff --git a/tests/empdump/xundump-errors/fld-invid6 b/tests/empdump/xundump-errors/fld-invid6 new file mode 100644 index 00000000..af877ba3 --- /dev/null +++ b/tests/empdump/xundump-errors/fld-invid6 @@ -0,0 +1,4 @@ +config realm +cnum realm ... +100 0 +# Field 0 must be between 0 and 99 diff --git a/tests/empdump/xundump-errors/fld-invid7 b/tests/empdump/xundump-errors/fld-invid7 new file mode 100644 index 00000000..491df9b2 --- /dev/null +++ b/tests/empdump/xundump-errors/fld-invid7 @@ -0,0 +1,4 @@ +config realm +cnum realm ... +0 100 +# Field 1 must be between 0 and 50 diff --git a/tests/empdump/xundump-errors/fld-invid8 b/tests/empdump/xundump-errors/fld-invid8 new file mode 100644 index 00000000..6a69789a --- /dev/null +++ b/tests/empdump/xundump-errors/fld-invid8 @@ -0,0 +1,5 @@ +config realm +cnum realm ... +0 1 +0 0 +# Fields 1,2 must be > (0,1)