daleken/
daleken/data/notes/
daleken/data/player/
daleken/data/system/poses/
daleken/doc/Homepage/images/
daleken/log/
/*___________________________________________________________________________*
   )()(			  DalekenMUD 1.12 (C) 2000			)()(
   `]['		       by Martin Thomson, Lee Brooks,			`]['
    ||		       Ken Herbert and David Jacques			 ||
    || ----------------------------------------------------------------- ||
    || Envy Diku Mud improvements copyright (C) 1994 by Michael Quan,	 ||
    || David Love, Guilherme 'Willie' Arnold, and Mitchell Tse.		 ||
    || Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael	 ||
    || Chastain, Michael Quan, and Mitchell Tse.			 ||
    || Original Diku Mud copyright (C) 1990, 1991			 ||
    || by Sebastian Hammer, Michael Seifert, Hans Henrik St{rfeldt,	 ||
    || Tom Madsen, and Katja Nyboe.					 ||
    || ----------------------------------------------------------------- ||
    || Any use of this software must follow the licenses of the		 ||
    || creators.  Much time and thought has gone into this software and	 ||
    || you are benefitting. We hope that you share your changes too.	 ||
    || What goes around, comes around.					 ||
    || ----------------------------------------------------------------- ||
    ||				    db.h				 ||
    || Declarations of functions and structures used for loading/saving. ||
 *_/<>\_________________________________________________________________/<>\_*/


/*
 * This is taken from Erwin Andreasen's Generic Linked List Loading code.
 * Copyright 1997 Erwin S. Andreasen <erwin@pip.dknet.dk>
 * This expands to the first field of what the void* ptr points at, which
 * is assumed to be a structure whose first field is the pointer to the
 * next in the list. This is just to make the source more readable - the
 * purpose of the cast may seem unclear.
 */
#define NEXT(ptr) (*(void**)(ptr))


/*
 * The following defines are used for identifying what type of data
 * is required or is present.
 * This is all packed into the type field of the data_desc_type.
 *
 * Note that DTYPE_TIME isn't really needed, but this is a safety thing as
 * the time_t type is likely to be one type that increases above 32 bit.
 */
#define DTYPE_STRING	0	/* "a string"				*/
#define DTYPE_NUMBER	1	/* 123|456 / 0xabc|123 /		*
				 * (flag flag) / (<table> flag)		*
				 * for a flag table, vector tables are	*
				 * interpreted as vector values		*/
#define DTYPE_VECTOR	2	/* Same as DTYPE_NUMBER in all respects	*
				 * except for its default value		*/
#define DTYPE_COMPLEX	3	/* Requires an entire table to read it.	*/
#define DTYPE_LLIST	4	/* Is a linked list (implies complex).	*/
#define DTYPE_TIME	5	/* Like number but more careful.	*/
#define DTYPE_BASIC	(DTYPE_STRING|DTYPE_NUMBER|DTYPE_VECTOR \
			 |DTYPE_COMPLEX|DTYPE_LLIST|DTYPE_TIME)

#define DFLAG_MAND	BIT_05	/* OR this, to specify manditory	*/
#define DFLAG_ARRAY	BIT_06	/* OR this, for arrays			*/
#define DFLAG_SPECREAD	BIT_07	/* value needs special read.		*/
#define DFLAG_SPECWRITE	BIT_08	/* value needs special write.		*/
#define DFLAG_SPECIAL	(DFLAG_SPECREAD|DFLAG_SPECWRITE)
#define DFLAG_CHKDEFAULT BIT_09	/* Use the RWF to check if a value is a default */
#define DFLAG_NEEDPARENT BIT_10	/* Needs values on the parent object for any
				   special read/write/chkdefault.	*/

#define DSHIFT_ARRAY	13	/* so type can hold the array size too	*/


/*
 * DBACTION_* flags, used to specify an action type to a DB_RWF function.
 */
typedef enum
{
    DBACTION_READ,		/* Read data.				*/
    DBACTION_FIX,		/* Fill unfilled fields etc...		*/
    DBACTION_ADDWORLD,		/* Insert into the world.		*/

    DBACTION_WRITE,		/* Write to a file.			*/
    DBACTION_CHKDEFAULT		/* Check if the value is a default.	*/
} db_action;


/*
 * DB_RWF.
 *
 * fp - input file.
 * vo - pointer to data that is to be written.
 * action - the DBACTION_* action type.
 *
 * returns: FALSE on error.
 */
typedef bool DB_RWF	args( ( FILE *fp, void *vo, db_action action ) );
#define DECLARE_DBRWF( fun )	DB_RWF	fun

/*
 * data_desc_type
 *
 * This struct is used to describe complex sets of data so that it can
 * be both read and written.
 */
struct data_desc_type
{
    const char *name;		/* The identifier.			*/
    int type;			/* Flags saying what to expect.		*/
    void *target;		/* A pointer to the data.		*/
    union			/* This is the default value.		*/
    {
	int number;		/* - for a number.			*/
	int vector[MAX_VECTOR];	/* - for a vector.			*/
	const char *string;	/* - for a character string.		*/
	const struct top_data_type *table;	/* - for complex types.	*/
    } deflt;
    const char *flag_table;	/* For mapped values.			*/
    DB_RWF *rwf;		/* for special types/cases.		*/
};


/*
 * top_data_type
 *
 * This is used to associate names and data with associated tables.
 */
struct top_data_type
{
    const char *name;
    struct data_desc_type *table;
    void *data_ptr;
    int data_size;
    DB_RWF *rwf;
};

/*
 * Miscellaneous functions.
 */
void init_data_desc_tables args( ( void ) );

/*
 * Reading functions.
 */
void load_file_list	args( ( const char *dirname, const char *listname ) );
bool load_file		args( ( const char *name ) );
bool load_file_stream	args( ( FILE *fp ) );
void *read_next_item	args( ( FILE *fp, int *status ) );
void *load_complex_block args( ( FILE *fp, const struct top_data_type *block_desc ) );
bool load_single_field	args( ( FILE *fp, const struct data_desc_type *entry ) );
bool load_array		args( ( FILE *fp, const struct data_desc_type *entry ) );
bool ignore_unknown_field args( ( FILE *fp ) );
bool fread_number_ii	args( ( FILE *fp, int *value, const char *def_table ) );
time_t fread_time args( ( FILE *fp, int *status ) );

/*
 * Writing functions.
 */
bool write_next_item	args( ( FILE *fp, const char *name, const void *value ) );
bool save_complex_block	args( ( FILE *fp, const struct top_data_type *block_desc,
				const void *value ) );
void fwrite_number	args( ( FILE *fp, int value ) );
void fwrite_time	args( ( FILE *fp, time_t value ) );
void fwrite_mapped_value args( ( FILE *fp, int *value, const char *table,
				 bool title ) );
void fwrite_quoted_string args( ( FILE *fp, const char *str ) );


/*
 * Tables used.
 */
extern struct top_data_type	global_data_table[];
extern struct data_desc_type	affect_data_table[];
extern struct data_desc_type	alias_data_table[];
extern struct data_desc_type	area_data_table[];
extern struct data_desc_type	char_data_table[];
extern struct data_desc_type	clan_data_table[];
extern struct data_desc_type	event_data_table[];
extern struct data_desc_type	exdesc_data_table[];
extern struct data_desc_type	exit_data_table[];
extern struct data_desc_type	gprog_data_table[];
extern struct data_desc_type	help_data_table[];
extern struct data_desc_type	high_data_table[];
extern struct data_desc_type	highent_data_table[];
extern struct data_desc_type	mobile_data_table[];
extern struct data_desc_type	mudprog_data_table[];
extern struct data_desc_type	note_data_table[];
extern struct data_desc_type	obj_data_table[];
extern struct data_desc_type	object_data_table[];
extern struct data_desc_type	pcdata_data_table[];
extern struct data_desc_type	plane_data_table[];
extern struct data_desc_type	pose_data_table[];
extern struct data_desc_type	quest_data_table[];
extern struct data_desc_type	room_data_table[];
extern struct data_desc_type	religion_data_table[];
extern struct data_desc_type	relskill_data_table[];
extern struct data_desc_type	shop_data_table[];
extern struct data_desc_type	social_data_table[];
extern struct data_desc_type	sysinfo_data_table[];

/*
 * These two variables are used in the versioning of files.  They are made
 * available to the FIX and ADDWORLD actions of the dbrwf functions.
 *
 * file_version should be set before opening a file for writing.
 */
extern int	file_version;
extern time_t	file_date;


/*
 * Special Read/Write/Fix functions.
 */
DECLARE_DBRWF(	dbrwf_affect		);
DECLARE_DBRWF(	dbrwf_alias		);
DECLARE_DBRWF(	dbrwf_all_affect	);
DECLARE_DBRWF(	dbrwf_all_clan		);
DECLARE_DBRWF(	dbrwf_all_religion	);
DECLARE_DBRWF(	dbrwf_area		);
DECLARE_DBRWF(	dbrwf_area_flags	);
DECLARE_DBRWF(	dbrwf_area_plane	);
DECLARE_DBRWF(	dbrwf_char		);
DECLARE_DBRWF(	dbrwf_char_in_room	);
DECLARE_DBRWF(	dbrwf_char_max_hit	);
DECLARE_DBRWF(	dbrwf_char_max_mana	);
DECLARE_DBRWF(	dbrwf_char_max_move	);
DECLARE_DBRWF(	dbrwf_char_obj		);
DECLARE_DBRWF(	dbrwf_char_parts	);
DECLARE_DBRWF(	dbrwf_char_played	);
DECLARE_DBRWF(	dbrwf_char_position	);
DECLARE_DBRWF(	dbrwf_char_race		);
DECLARE_DBRWF(	dbrwf_char_sex		);
DECLARE_DBRWF(	dbrwf_check_room	);
DECLARE_DBRWF(	dbrwf_clan		);
DECLARE_DBRWF(	dbrwf_event		);
DECLARE_DBRWF(	dbrwf_event_data	);
DECLARE_DBRWF(	dbrwf_event_when	);
DECLARE_DBRWF(	dbrwf_exdesc		);
DECLARE_DBRWF(	dbrwf_exit		);
DECLARE_DBRWF(	dbrwf_gprog		);
DECLARE_DBRWF(	dbrwf_help		);
DECLARE_DBRWF(	dbrwf_high		);
DECLARE_DBRWF(	dbrwf_highent		);
DECLARE_DBRWF(	dbrwf_high_entries	);
DECLARE_DBRWF(	dbrwf_magic_mana	);
DECLARE_DBRWF(	dbrwf_mob_index		);
DECLARE_DBRWF(	dbrwf_mob_parts		);
DECLARE_DBRWF(	dbrwf_mob_spec		);
DECLARE_DBRWF(	dbrwf_mudprog		);
DECLARE_DBRWF(	dbrwf_note		);
DECLARE_DBRWF(	dbrwf_obj		);
DECLARE_DBRWF(	dbrwf_obj_index		);
DECLARE_DBRWF(	dbrwf_obj_index_values	);
DECLARE_DBRWF(	dbrwf_obj_obj		);
DECLARE_DBRWF(	dbrwf_obj_values	);
DECLARE_DBRWF(	dbrwf_obj_vnum		);
DECLARE_DBRWF(	dbrwf_pcdata		);
DECLARE_DBRWF(	dbrwf_pcdata_board	);
DECLARE_DBRWF(	dbrwf_pcdata_multi_class );
DECLARE_DBRWF(	dbrwf_pcdata_skills	);
DECLARE_DBRWF(	dbrwf_plane		);
DECLARE_DBRWF(	dbrwf_pose		);
DECLARE_DBRWF(	dbrwf_quest		);
DECLARE_DBRWF(	dbrwf_religion		);
DECLARE_DBRWF(	dbrwf_relskill		);
DECLARE_DBRWF(	dbrwf_room		);
DECLARE_DBRWF(	dbrwf_room_exits	);
DECLARE_DBRWF(	dbrwf_room_resets	);
DECLARE_DBRWF(	dbrwf_shop		);
DECLARE_DBRWF(	dbrwf_shop_trade	);
DECLARE_DBRWF(	dbrwf_social		);
DECLARE_DBRWF(	dbrwf_sysinfo		);


/*
 * Other functions.
 */
void save_clans		args( ( void ) );
void save_planes	args( ( void ) );
void save_religions	args( ( void ) );
void save_socials	args( ( void ) );



/*
 * Stuff in db.c used in other db files.
 */

extern int top_affect;
extern int top_clan;
extern int top_ed;
extern int top_event;
extern int top_exit;
extern int top_help;
extern int top_mprog;
extern int top_mprog_global;
extern int top_pose;
extern int top_religion;
extern int top_reset;
extern int top_room;
extern int top_shop;
extern int top_social;
extern int top_text_block;
extern int size_text_block;

void assign_area_vnum	args( ( int vnum ) );