server/src/kernel/attrib.h
2019-09-13 21:35:44 +02:00

94 lines
3.6 KiB
C

#ifndef ATTRIB_H
#define ATTRIB_H
#include <stdbool.h>
#include <util/variant.h>
#ifdef __cplusplus
extern "C" {
#endif
union variant;
struct gamedata;
struct storage;
typedef void(*afun) (void);
typedef struct attrib {
const struct attrib_type *type;
union variant data;
/* internal data, do not modify: */
struct attrib *next; /* next attribute in the list */
struct attrib *nexttype; /* skip to attribute of a different type */
} attrib;
#define ATF_UNIQUE (1<<0) /* only one per attribute-list */
#define ATF_PRESERVE (1<<1) /* preserve order in list. append to back */
#define ATF_USER_DEFINED (1<<2) /* use this to make udf */
typedef struct attrib_type {
const char *name;
void(*initialize) (union variant *);
void(*finalize) (union variant *);
int(*age) (struct attrib *, void *owner);
/* age returns 0 if the attribute needs to be removed, !=0 otherwise */
void(*write) (const union variant *, const void *owner, struct storage *);
int(*read) (union variant *, void *owner, struct gamedata *); /* return AT_READ_OK on success, AT_READ_FAIL if attrib needs removal */
void(*upgrade) (struct attrib **alist, struct attrib *a);
unsigned int flags;
/* ---- internal data, do not modify: ---- */
struct attrib_type *nexthash;
unsigned int hashkey;
} attrib_type;
void at_register(attrib_type * at);
void at_deprecate(const char * name, int (*reader)(variant *, void *, struct gamedata *));
struct attrib_type *at_find(const char *name);
void write_attribs(struct storage *store, struct attrib *alist, const void *owner);
int read_attribs(struct gamedata *store, struct attrib **alist, void *owner);
attrib *a_select(attrib * a, const void *data, bool(*compare) (const attrib *, const void *));
attrib *a_find(attrib * a, const attrib_type * at);
attrib *a_add(attrib ** pa, attrib * at);
int a_remove(attrib ** pa, attrib * at);
void a_removeall(attrib ** a, const attrib_type * at);
attrib *a_new(const attrib_type * at);
int a_age(attrib ** attribs, void *owner);
void a_free_voidptr(union variant *v);
int a_read_orig(struct gamedata *data, attrib ** attribs, void *owner);
int a_read(struct gamedata *data, attrib ** attribs, void *owner);
void a_write(struct storage *store, const attrib * attribs, const void *owner);
int a_readint(union variant *v, void *owner, struct gamedata *);
void a_writeint(const union variant *v, const void *owner,
struct storage *store);
int a_readshorts(union variant *v, void *owner, struct gamedata *);
void a_writeshorts(const union variant *v, const void *owner,
struct storage *store);
int a_readchars(union variant *v, void *owner, struct gamedata *);
void a_writechars(const union variant *v, const void *owner,
struct storage *store);
int a_readstring(union variant *v, void *owner, struct gamedata *);
void a_writestring(const union variant *v, const void *owner,
struct storage *);
void a_finalizestring(union variant *v);
void attrib_done(void);
#define DEFAULT_AGE NULL
#define DEFAULT_INIT NULL
#define DEFAULT_FINALIZE NULL
#define NO_WRITE NULL
#define NO_READ NULL
#define AT_READ_OK 0
#define AT_READ_FAIL -1
#define AT_READ_DEPR 1 /* a deprecated attribute was read, should run a_upgrade */
#define AT_AGE_REMOVE 0 /* remove the attribute after calling age() */
#define AT_AGE_KEEP 1 /* keep the attribute for another turn */
#ifdef __cplusplus
}
#endif
#endif