X-Git-Url: http://git.pond.sub.org/?p=empserver;a=blobdiff_plain;f=include%2Ffile.h;h=07dae38dadfd23f50ca81d75c2abe0aac98cdd0b;hp=22fcf0c83212821f90d743b074ca1ad05ee5f041;hb=HEAD;hpb=4f20f3dd9c5473b34d4bea7189b5bb116b05f4d2 diff --git a/include/file.h b/include/file.h index 22fcf0c83..07dae38da 100644 --- a/include/file.h +++ b/include/file.h @@ -1,11 +1,11 @@ /* * Empire - A multi-player, client/server Internet based war game. - * Copyright (C) 1986-2006, Dave Pare, Jeff Bailey, Thomas Ruschak, - * Ken Stevens, Steve McClure + * Copyright (C) 1986-2021, Dave Pare, Jeff Bailey, Thomas Ruschak, + * Ken Stevens, Steve McClure, Markus Armbruster * - * This program is free software; you can redistribute it and/or modify + * Empire is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -14,53 +14,85 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * along with this program. If not, see . * * --- * - * See the "LEGAL", "LICENSE", "CREDITS" and "README" files for all the - * related information and legal notices. It is expected that any future - * projects/authors will amend these files as needed. + * See files README, COPYING and CREDITS in the root of the source + * tree for related information and legal notices. It is expected + * that future projects/authors will amend these files as needed. * * --- * * file.h: Describes Empire tables (`files' for historical reasons) - * + * * Known contributors to this file: - * Markus Armbruster, 2005 + * Markus Armbruster, 2005-2016 */ #ifndef FILE_H #define FILE_H -#include #include struct empfile { /* Members with immutable values */ int uid; /* Table ID */ - char *name; /* Empire name (e.g., "treaty") */ - char *file; /* if backed by file, file name relative to - data directory */ + char *name; /* Empire name (e.g., "land") */ + char *pretty_name; /* prettier name, e.g. "land unit" */ + char *file; /* file name, relative to gamedir for + game state, to builtindir for config */ struct castr *cadef; /* table column selectors (column meta-data) */ + int base; /* view's base table, else EF_BAD */ int size; /* size of a table entry */ + int nent; /* #table entries, -1 if variable */ int flags; /* only EFF_IMMUTABLE immutable, see below for use of remaining bits */ + /* Members whose values are fixed when the cache is mapped */ char *cache; /* pointer to cache */ int csize; /* cache size, in entries */ - /* and flags bit EFF_MEM */ + /* flags bits EFF_MEM, EFF_PRIVATE, EFF_NOTIME also fixed then */ + /* Members whose values may vary throughout operation */ - int baseid; /* id of first entry in cache */ + int baseid; /* ID of first entry in cache */ int cids; /* # entries in cache */ int fids; /* # entries in table */ int fd; /* file descriptor, -1 if not open */ - /* and flags bit EFF_RDONLY */ - /* User callbacks */ - void (*init)(int, void *); /* called after entry creation, unless null */ - int (*postread)(int, void *); /* called after read, unless null */ - int (*prewrite)(int, void *); /* called before write, unless null */ + /* flags bit EFF_CUSTOM also varies */ + + /* User callbacks, may all be null */ + /* + * Called after element initialization. @elt is the element. + * May modify the element. + */ + void (*oninit)(void *elt); + /* + * Called after read. @id is the element ID, and @elt is the + * element read. May modify the element. Modifications are + * visible to caller of ef_read(), but have no effect on the file. + */ + void (*postread)(int id, void *elt); + /* + * Called before write. @id is the element ID, @old is the + * element being updated (null unless it is cached) and @elt is + * the element being written. May modify the element. + * Modifications will be visible to caller of ef_write() and are + * written to the file. + */ + void (*prewrite)(int id, void *old, void *elt); + /* + * Called after table size changed, with file type as argument. + */ + void (*onresize)(int type); +}; + +struct ef_typedstr { + signed ef_type: 8; + unsigned seqno: 12; + unsigned generation: 12; + int uid; + time_t timestamp; }; /* @@ -69,31 +101,47 @@ struct empfile { * The remaining flags record how the table is being used. */ /* Immutable flags, fixed at compile-time */ +/* Dereferencing entry address cast to struct ef_typedstr * is safe */ +#define EFF_TYPED bit(0) /* * EFF_XY / EFF_OWNER / EFF_GROUP assert that coordinates / owner / * group of such a table's entries can be safely obtained by - * dereferencing entry address cast to struct genitem *. + * dereferencing the entry's address cast to struct empobj *. */ -#define EFF_XY bit(0) -#define EFF_OWNER bit(1) -#define EFF_GROUP bit(2) -/* Table is allocated statically */ -#define EFF_STATIC bit(3) +#define EFF_XY bit(1) +#define EFF_OWNER bit(2) +#define EFF_GROUP bit(3) +/* Table cache is allocated statically */ +#define EFF_STATIC bit(4) +/* Table has a sentinel (all zero, not counted as elt), implies EFF_MEM */ +#define EFF_SENTINEL bit(5) /* All the immutable flags */ -#define EFF_IMMUTABLE (EFF_XY | EFF_OWNER | EFF_GROUP | EFF_STATIC) +#define EFF_IMMUTABLE \ + (EFF_TYPED | EFF_XY | EFF_OWNER | EFF_GROUP | EFF_STATIC | EFF_SENTINEL) /* Flags set when table contents is mapped */ /* Table is entirely in memory */ #define EFF_MEM bit(8) -/* Table is read-only */ -#define EFF_RDONLY bit(9) +/* Table is privately mapped: changes don't affect the underlying file */ +#define EFF_PRIVATE bit(9) +/* Table is customized (configuration tables only) */ +#define EFF_CUSTOM bit(10) +/* Don't update timestamps */ +#define EFF_NOTIME bit(11) /* Transient flags, only occur in argument of ef_open() */ /* Create table file, clobbering any existing file */ -#define EFF_CREATE bit(10) +#define EFF_CREATE bit(16) + +/* + * A value larger than any struct empfile member size where member + * cadef is not null. + */ +#define EF_WITH_CADEF_MAX_ENTRY_SIZE 1024 /* * Empire `file types' * These are really table IDs. Some tables are backed by files, some - * are compiled into the server. + * are compiled into the server, some initialized from configuration + * files. */ enum { /* Error value */ @@ -105,75 +153,96 @@ enum { EF_LAND, EF_NUKE, EF_NEWS, - EF_TREATY, EF_TRADE, EF_POWER, EF_NATION, + EF_RELAT, + EF_CONTACT, + EF_REJECT, EF_LOAN, EF_MAP, EF_BMAP, EF_COMM, EF_LOST, EF_REALM, + EF_GAME, + EF_DYNMAX = EF_GAME, /* Static game data (configuration) */ + /* Order is relevant; see read_builtin_tables() */ + EF_ITEM, + EF_PRODUCT, EF_SECTOR_CHR, EF_SHIP_CHR, EF_PLANE_CHR, EF_LAND_CHR, EF_NUKE_CHR, EF_NEWS_CHR, - EF_TREATY_FLAGS, - EF_ITEM, EF_INFRASTRUCTURE, - EF_PRODUCT, + EF_UPDATES, /* not actually static */ EF_TABLE, - EF_SHIP_CHR_FLAGS, - EF_PLANE_CHR_FLAGS, + EF_VERSION, + EF_META, /* not really configuration */ + /* Symbol tables */ + EF_AGREEMENT_STATUS, EF_LAND_CHR_FLAGS, - EF_NUKE_CHR_FLAGS, - EF_META, - EF_META_TYPE, + EF_LEVEL, EF_META_FLAGS, + EF_META_TYPE, EF_MISSIONS, - EF_PLANE_FLAGS, - EF_RETREAT_FLAGS, EF_NATION_FLAGS, + EF_NATION_REJECTS, EF_NATION_RELATIONS, - EF_LEVEL, - EF_AGREEMENT_STATUS, - EF_PLAGUE_STAGES, + EF_NATION_STATUS, + EF_NUKE_CHR_FLAGS, EF_PACKING, + EF_PAGE_HEADINGS, + EF_PLAGUE_STAGES, + EF_PLANE_CHR_FLAGS, + EF_PLANE_FLAGS, EF_RESOURCES, - EF_NATION_STATUS, + EF_RETREAT_FLAGS, EF_SECTOR_NAVIGATION, + EF_SECTOR_CHR_FLAGS, + EF_SHIP_CHR_FLAGS, /* Views */ EF_COUNTRY, /* Number of types: */ EF_MAX }; -#define EF_IS_GAME_STATE(type) (EF_SECTOR <= (type) && (type) <= EF_REALM) +#define EF_IS_GAME_STATE(type) (EF_SECTOR <= (type) && (type) <= EF_DYNMAX) +#define EF_IS_VIEW(type) (empfile[(type)].base != EF_BAD) extern struct castr *ef_cadef(int); extern int ef_read(int, int, void *); +extern void ef_make_stale(void); +extern void ef_mark_fresh(int, void *); extern void *ef_ptr(int, int); extern char *ef_nameof(int); +extern char *ef_nameof_pretty(int); extern time_t ef_mtime(int); extern int ef_open(int, int); -extern int ef_check(int); +extern int ef_open_view(int); extern int ef_close(int); extern int ef_flush(int); +extern void ef_blank(int, int, void *); extern int ef_write(int, int, void *); +extern void ef_set_uid(int, void *, int); +extern int ef_typedstr_eq(struct ef_typedstr *, struct ef_typedstr *); extern int ef_extend(int, int); extern int ef_ensure_space(int, int, int); +extern int ef_id_limit(int); +extern int ef_truncate(int, int); extern int ef_nelem(int); extern int ef_flags(int); extern int ef_byname(char *); extern int ef_byname_from(char *, int *); -extern void ef_init(void); -extern int ef_load(void); -extern int ef_verify(void); +extern int ef_verify_config(void); +extern int ef_verify_state(int); +extern int ef_elt_byname(int, char *); extern struct empfile empfile[EF_MAX + 1]; +extern void empfile_init(void); +extern void empfile_fixup(void); #endif