*/
void (*postread)(int id, void *elt);
/*
- * Called before write. ID is the element id, 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.
+ * 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 *elt);
+ void (*prewrite)(int id, void *old, void *elt);
};
struct emptypedstr {
/* land.c */
extern char *prland(struct lndstr *);
extern void lnd_postread(int, void *);
-extern void lnd_prewrite(int, void *);
+extern void lnd_prewrite(int, void *, void *);
/* landgun.c */
extern double seagun(int, int);
extern double fortgun(int, int);
/* nuke.c */
extern char *prnuke(struct nukstr *);
extern void nuk_postread(int, void *);
-extern void nuk_prewrite(int, void *);
+extern void nuk_prewrite(int, void *, void *);
extern int nuk_on_plane(struct nukstr *, int);
/* nxtitem.c */
extern int nxtitem(struct nstr_item *, void *);
/* plane.c */
extern char *prplane(struct plnstr *);
extern void pln_postread(int, void *);
-extern void pln_prewrite(int, void *);
+extern void pln_prewrite(int, void *, void *);
/* plnsub.c */
extern void count_planes(struct shpstr *);
extern int get_planes(struct nstr_item *, struct nstr_item *,
extern void sathead(void);
/* sect.c */
extern void sct_postread(int, void *);
-extern void sct_prewrite(int, void *);
+extern void sct_prewrite(int, void *, void *);
extern void item_prewrite(short *);
extern int issector(char *);
/* sectdamage.c */
/* ship.c */
extern char *prship(struct shpstr *);
extern void shp_postread(int, void *);
-extern void shp_prewrite(int, void *);
+extern void shp_prewrite(int, void *, void *);
/* show.c */
extern void show_bridge(int);
extern void show_tower(int);
ef_read(int type, int id, void *into)
{
struct empfile *ep;
- void *from;
+ void *cachep;
if (ef_check(type) < 0)
return 0;
return 0;
if (ep->flags & EFF_MEM) {
- from = ep->cache + id * ep->size;
+ cachep = ep->cache + id * ep->size;
} else {
if (ep->baseid + ep->cids <= id || ep->baseid > id) {
if (fillcache(ep, id) < 1)
return 0;
}
- from = ep->cache + (id - ep->baseid) * ep->size;
+ cachep = ep->cache + (id - ep->baseid) * ep->size;
}
- memcpy(into, from, ep->size);
+ memcpy(into, cachep, ep->size);
if (ep->postread)
ep->postread(id, into);
ef_write(int type, int id, void *from)
{
struct empfile *ep;
- char *to;
+ char *cachep;
if (ef_check(type) < 0)
return 0;
ep = &empfile[type];
if (CANT_HAPPEN((ep->flags & (EFF_MEM | EFF_PRIVATE)) == EFF_PRIVATE))
return 0;
+ if (id >= ep->baseid && id < ep->baseid + ep->cids)
+ cachep = ep->cache + (id - ep->baseid) * ep->size;
+ else
+ cachep = NULL;
if (ep->prewrite)
- ep->prewrite(id, from);
+ ep->prewrite(id, cachep, from);
if (CANT_HAPPEN((ep->flags & EFF_MEM) ? id >= ep->fids : id > ep->fids))
return 0; /* not implemented */
new_seqno(ep, from);
if (do_write(ep, from, id, 1) < 0)
return 0;
}
- if (id >= ep->baseid && id < ep->baseid + ep->cids) {
- /* update the cache if necessary */
- to = ep->cache + (id - ep->baseid) * ep->size;
- if (to != from)
- memcpy(to, from, ep->size);
- }
+ if (cachep && cachep != from) /* update the cache if necessary */
+ memcpy(cachep, from, ep->size);
if (id >= ep->fids) {
/* write beyond end of file extends it, take note */
ep->fids = id + 1;
struct fileinit {
int ef_type;
void (*postread) (int, void *);
- void (*prewrite) (int, void *);
+ void (*prewrite) (int, void *, void *);
};
static struct fileinit fileinit[] = {
}
void
-lnd_prewrite(int n, void *ptr)
+lnd_prewrite(int n, void *old, void *new)
{
- struct lndstr *llp = ptr;
+ struct lndstr *llp = new;
struct lndstr *lp;
struct plnstr *pp;
int i;
}
void
-nuk_prewrite(int n, void *ptr)
+nuk_prewrite(int n, void *old, void *new)
{
- struct nukstr *np = ptr;
+ struct nukstr *np = new;
if (np->nuk_effic == 0) {
if (np->nuk_own)
}
void
-pln_prewrite(int n, void *ptr)
+pln_prewrite(int n, void *old, void *new)
{
- struct plnstr *pp = ptr;
+ struct plnstr *pp = new;
struct nukstr *np;
int i;
}
void
-sct_prewrite(int id, void *ptr)
+sct_prewrite(int id, void *old, void *new)
{
- struct sctstr *sp = ptr;
+ struct sctstr *sp = new;
int mil, civs;
natid own;
}
void
-shp_prewrite(int n, void *ptr)
+shp_prewrite(int n, void *old, void *new)
{
- struct shpstr *sp = ptr;
+ struct shpstr *sp = new;
struct lndstr *lp;
struct plnstr *pp;
int i;