/**************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefiting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************
* ROM 2.4 is copyright 1993-1998 Russ Taylor *
* ROM has been brought to you by the ROM consortium *
* Russ Taylor (rtaylor@hypercube.org) *
* Gabrielle Taylor (gtaylor@hypercube.org) *
* Brian Moore (zump@rom.org) *
* By using this code, you have agreed to follow the terms of the *
* ROM license, in the file Rom24/doc/rom.license *
***************************************************************************
* 1stMUD ROM Derivative (c) 2001-2003 by Ryan Jennings *
* http://1stmud.dlmud.com/ <r-jenn@shaw.ca> *
***************************************************************************/
#if !defined(TABLESAVE_H)
#define TABLESAVE_H
typedef bool RW_FUNC(action_types type, void *temp, const char **arg);
#define RW_FUN(fun) bool fun(action_types type, void *temp, const char **arg)
#define DECLARE_RW_FUN(fun) RW_FUNC fun
typedef void TABLESAVE(action_types type);
#define TABLESAVE(fun) void fun(action_types type)
#define DECLARE_TABLESAVE(fun) TABLESAVE fun
struct savetable_type
{
const char *field;
int type_field;
void *puntero_field;
const void *argument;
const void *array_arg;
};
#define FIELD_STRING 0
#define FIELD_FUNCTION_INT_TO_STR 1
#define FIELD_LONG_ARRAY 2
#define FIELD_FLAGSTRING 3
#define FIELD_INT 4
#define FIELD_FLAGVECTOR 5
#define FIELD_BOOL 6
#define FIELD_INT_ARRAY 7
#define FIELD_STRING_ARRAY 8
#define FIELD_INT_FLAGSTRING 9
#define FIELD_BOOL_ARRAY 10
#define FIELD_INUTIL 11
#define FIELD_INT_ALLOC_ARRAY 12
#define FIELD_LONG 13
#define FIELD_STRING_ARRAY_NULL 14
#define FIELD_RANK_DATA 15
#define FIELD_LONG_ALLOC_ARRAY 16
#define FIELD_STRING_SIZE 17
#define FIELD_CHAR 18
#define FIELD_INT_FUNCTION 19
#define FIELD_FLOAT 20
#define FIELD_DOUBLE 21
#define FIELD_TIME 22
#define FIELD_INT_FUNC_ARRAY 23
#define FIELD_CHARDATA 24
#define FIELD_SPEC_FUN 25
#define FIELD_MOBINDEX 26
#define FIELD_RACE 27
#define FIELD_DEITY 28
#define FIELD_AREA 29
#define FIELD_ROOM 30
#define FIELD_CLAN 31
#define FIELD_OBJ 32
#define FIELD_PCDATA 33
#define FIELD_DESC 34
#define FIELD_SHOP 35
#define FIELD_EXDESC 36
#define FIELD_RESET_DATA 37
#define FIELD_EXIT_DATA 38
#define FIELD_PROG_LIST 39
#define FIELD_OBJINDEX 40
#define FIELD_AFFECT 41
#define FIELD_FUNCTION 42
#define FIELD_DICE 43
#define DATA_LIST 1
#define DATA_NAME 2
#define DATA_STAT 3
PROTOTYPE(void load_struct, (READ_DATA *, void *,
const struct savetable_type *, void *));
PROTOTYPE(void save_struct, (FILE *, void *,
const struct savetable_type *, void *));
struct data_save_type
{
TABLESAVE *fun;
const char *name;
};
EXTERN const struct data_save_type data_save_table[];
EXTERN const struct savetable_type socialsavetable[];
EXTERN const struct savetable_type cmdsavetable[];
DECLARE_TABLESAVE(rw_commands);
DECLARE_TABLESAVE(rw_skills);
DECLARE_TABLESAVE(rw_races);
DECLARE_TABLESAVE(rw_groups);
DECLARE_TABLESAVE(rw_classes);
DECLARE_TABLESAVE(rw_socials);
DECLARE_TABLESAVE(rw_clans);
DECLARE_TABLESAVE(rw_stats);
DECLARE_TABLESAVE(rw_bans);
DECLARE_TABLESAVE(rw_gquest_data);
DECLARE_TABLESAVE(rw_deities);
DECLARE_TABLESAVE(rw_webpasswds);
DECLARE_TABLESAVE(rw_members);
DECLARE_TABLESAVE(rw_war_data);
DECLARE_TABLESAVE(rw_channels);
DECLARE_TABLESAVE(rw_mud_data);
DECLARE_TABLESAVE(rw_music);
DECLARE_RW_FUN(clan_rw);
#define rw_table(action, file, type, iMax, header, typebase, save_table, table) \
do \
{ \
int i = 0; \
switch(action) \
{ \
case action_read: \
{ \
static bool Loaded = FALSE; \
if(!Loaded) \
{ \
READ_DATA *fp; \
const char *word; \
static type zero; \
fp = open_read(file); \
if (!fp) \
{ \
bugf("Unable to open %s for reading.", file); \
break; \
} \
iMax = read_number(fp); \
alloc_mem(table, type, iMax + 1); \
if (!table) \
{ \
bugf("Error! " #table " == NULL, " #iMax " : %d", iMax); \
break; \
} \
for (;;) \
{ \
word = read_word(fp); \
if (!str_cmp(word, "#!")) \
break; \
if (str_cmp(word, "#" header)) \
{ \
bugf("word doesn't exist (%s)", word); \
break; \
} \
if (i >= iMax) \
{ \
bugf("%d greater than " #iMax " %d", i, iMax); \
break; \
} \
table[i] = zero; \
load_struct(fp, &typebase, save_table, &table[i++]); \
} \
close_read(fp); \
Loaded = TRUE; \
} \
} \
break; \
case action_write: \
{ \
WRITE_DATA *fp; \
int i; \
fp = open_write(file); \
if (!fp) \
{ \
log_error(file); \
break; \
} \
fprintf(fp->stream, "%d\n\n", iMax); \
for (i = 0; i < iMax; ++i) \
{ \
fprintf(fp->stream, "#%s\n", header); \
save_struct(fp->stream, &typebase, save_table, &table[i]); \
fprintf(fp->stream, "#END\n\n"); \
} \
fprintf(fp->stream, "#!\n"); \
close_write(fp); \
}\
break;\
default: \
break; \
} \
} while(0)
#define rw_list(action, file, type, first, last, next, prev, new_fun, header, typebase, save_table) \
do \
{ \
switch(action)\
{\
case action_read: \
{ \
static bool Loaded = FALSE; \
if(!Loaded) \
{ \
READ_DATA *fp; \
type *data; \
const char *word; \
fp = open_read(file); \
if (!fp) \
{ \
bugf("Unable to open %s for reading.", file); \
break; \
} \
for (;;) \
{ \
word = read_word(fp); \
if (!str_cmp(word, "#!")) \
break; \
if (str_cmp(word, "#" header)) \
{ \
bugf("word doesn't exist (%s)", word); \
break; \
} \
if(new_fun != NULL) \
data = new_fun(); \
else \
alloc_mem(data, type, 1); \
load_struct(fp, &typebase, save_table, data); \
if(save_table == socialsavetable) \
add_social((SOCIAL_DATA *)data); \
else if(save_table == cmdsavetable) \
add_command((CMD_DATA *)data); \
else \
LINK(data, first, last, next, prev); \
} \
close_read(fp); \
Loaded = TRUE; \
} \
} \
break; \
case action_write: \
{ \
WRITE_DATA *fp; \
type *data; \
fp = open_write(file); \
if (!fp) \
{ \
log_error(file); \
break; \
} \
for (data = first; data != NULL; data = data->next) \
{ \
fprintf(fp->stream, "#%s\n", header); \
save_struct(fp->stream, &typebase, save_table, data); \
fprintf(fp->stream, "#END\n\n"); \
} \
fprintf(fp->stream, "#!\n"); \
close_write(fp); \
} \
break; \
default: \
break; \
} \
} while(0)
#define rw_single(action, file, header, typebase, save_table, data) \
do \
{ \
switch(action) \
{ \
case action_read: \
{ \
static bool Loaded = FALSE; \
if(!Loaded) \
{ \
READ_DATA *fp; \
const char *word; \
fp = open_read(file); \
if (!fp) \
{ \
bugf("Could not open file %s for reading.", file); \
break; \
} \
for (;;) \
{ \
word = read_word(fp); \
if (!str_cmp(word, "#!")) \
break; \
if (str_cmp(word, "#" header "")) \
{ \
bugf("word doesn't exist (%s)", word); \
break; \
} \
load_struct(fp, &typebase, save_table, &data); \
} \
close_read(fp); \
Loaded = TRUE; \
} \
}\
break; \
case action_write: \
{ \
WRITE_DATA *fp; \
if (!(fp = open_write(file))) \
{ \
log_error(file); \
break; \
} \
fprintf(fp->stream, "#%s\n", header); \
save_struct(fp->stream, &typebase, save_table, &data); \
fprintf(fp->stream, "#END\n"); \
fprintf(fp->stream, "\n#!\n"); \
close_write(fp); \
} \
break; \
default: \
break; \
} \
} while(0)
#endif