* Open the file-backed table TYPE (EF_SECTOR, ...).
* HOW are flags to control operation. Naturally, immutable flags are
* not permitted.
+ * If NELT is non-negative, the table must have that many elements.
* Return non-zero on success, zero on failure.
* You must call ef_close() before the next ef_open().
*/
int
-ef_open(int type, int how)
+ef_open(int type, int how, int nelt)
{
struct empfile *ep;
struct flock lock;
return 0;
}
ep->fids = fsiz / ep->size;
+ if (nelt >= 0 && nelt != ep->fids) {
+ logerror("Can't open %s (got %d records instead of %d)",
+ ep->file, ep->fids, nelt);
+ close(fd);
+ return 0;
+ }
/* allocate cache */
if (ep->flags & EFF_STATIC) {
#include <config.h>
#include "file.h"
+#include "nat.h"
+#include "optlist.h"
#include "prototypes.h"
struct fileinit {
{
int failed = 0;
- failed |= !ef_open(EF_NATION, EFF_MEM);
- failed |= !ef_open(EF_SECTOR, EFF_MEM);
- failed |= !ef_open(EF_SHIP, EFF_MEM);
- failed |= !ef_open(EF_PLANE, EFF_MEM);
- failed |= !ef_open(EF_LAND, EFF_MEM);
- failed |= !ef_open(EF_GAME, EFF_MEM);
- failed |= !ef_open(EF_NEWS, 0);
- failed |= !ef_open(EF_LOAN, 0);
- failed |= !ef_open(EF_TREATY, 0);
- failed |= !ef_open(EF_NUKE, EFF_MEM);
- failed |= !ef_open(EF_POWER, 0);
- failed |= !ef_open(EF_TRADE, 0);
- failed |= !ef_open(EF_MAP, EFF_MEM);
- failed |= !ef_open(EF_BMAP, EFF_MEM);
- failed |= !ef_open(EF_COMM, 0);
- failed |= !ef_open(EF_LOST, 0);
- failed |= !ef_open(EF_REALM, EFF_MEM);
+ failed |= !ef_open(EF_NATION, EFF_MEM, MAXNOC);
+ failed |= !ef_open(EF_SECTOR, EFF_MEM, WORLD_SZ());
+ failed |= !ef_open(EF_SHIP, EFF_MEM, -1);
+ failed |= !ef_open(EF_PLANE, EFF_MEM, -1);
+ failed |= !ef_open(EF_LAND, EFF_MEM, -1);
+ failed |= !ef_open(EF_GAME, EFF_MEM, 1);
+ failed |= !ef_open(EF_NEWS, 0, -1);
+ failed |= !ef_open(EF_LOAN, 0, -1);
+ failed |= !ef_open(EF_TREATY, 0, -1);
+ failed |= !ef_open(EF_NUKE, EFF_MEM, -1);
+ failed |= !ef_open(EF_POWER, 0, -1);
+ failed |= !ef_open(EF_TRADE, 0, -1);
+ failed |= !ef_open(EF_MAP, EFF_MEM, MAXNOC);
+ failed |= !ef_open(EF_BMAP, EFF_MEM, MAXNOC);
+ failed |= !ef_open(EF_COMM, 0, -1);
+ failed |= !ef_open(EF_LOST, 0, -1);
+ failed |= !ef_open(EF_REALM, EFF_MEM, MAXNOC * MAXNOR);
if (!failed)
failed |= ef_init_view(EF_COUNTRY, EF_NATION);
if (failed) {