/************************************************************************** * 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-2004 by Markanth * * http://www.firstmud.com/ <markanth@firstmud.com> * * By using this code you have agreed to follow the term of * * the 1stMud license in ../doc/1stMud/LICENSE * ***************************************************************************/ #ifndef __DATA_TABLE_H_ #define __DATA_TABLE_H_ 1 #define DATA_LIST 1 #define DATA_NAME 2 #define DATA_STAT 3 Proto(void load_struct, (FileData *, void *, DataTable *, void *)); Proto(void save_struct, (FileData *, void *, DataTable *, void *)); Proto(void show_struct, (CharData *, Buffer *, void *, DataTable *, void *, int)); Proto(bool edit_struct, (CharData *, const char *, void *, DataTable *, void *)); Proto(bool set_struct, (CharData *, const char *, void *, DataTable *, void *)); Proto(void show_set_commands, (CharData *, DataTable *)); struct datasave_type { TableSave_F *fun; const char *name; }; EXTERN const struct datasave_type datasave_table[]; #define DTE(field, name, var, arg1, arg2, olc, arg3) \ {#var, FIELD_##field, (void *)&name##_zero.var, (void *)(arg1), (void *)(arg2), olced_##olc, (void *)(arg3)} #define DTE_SHOW(field, name, var, arg1, arg2, arg3) \ {#var, FIELD_##field, (void *)&name##_zero.var, (void *)(arg1), (void *)(arg2), NULL, (void *)(arg3)} #define DTE_SAVE(field, name, var, arg1, arg2, arg3) \ {#var, FIELD_##field, (void *)&name##_zero.var, (void *)(arg1), (void *) (arg2), \ olced_none, (void *) (arg3)} #define DTE_NOSAVE(field, name, var, arg1, arg2, olc, arg3) \ {#var, FIELD_INUTIL, (void *) &name##_zero.var, (void *)(arg1), (void *) (arg2), \ olced_##olc, (void *) (arg3)} #define DTE_OLC(cmd, name, var, arg1, arg2, olc, arg3) \ {cmd, FIELD_INUTIL, (void *) &name##_zero.var, (void *)(arg1), NULL, olced_##olc, (void *)(arg3)} #define DTE_OLC2(cmd, arg1, olc, arg3) \ {cmd, FIELD_INUTIL, NULL, (void *)(arg1), NULL, olced_##olc, (void *)(arg3)} #define DTE_LIST(field, name, var, list, arg2, arg3) \ {#list, FIELD_##field, (void *) &name##_zero.var, (void *) DATA_LIST, (void *) (arg2), NULL, \ (void *) (arg3)}, \ {#list, FIELD_INUTIL, (void *) &name##_zero.var, (void *) FIELD_##field, (void *) (arg2), olced_##list, (void *)(arg3)} #define DTE_LIST2(field, name, var, list, arg2, arg3) \ {#list, FIELD_##field, (void *) &name##_zero.var, (void *) DATA_LIST, (void *) (arg2), NULL, \ (void *) (arg3)}, \ {"add"#list, FIELD_INUTIL, (void *) &name##_zero.var, (void *) FIELD_##field, (void *) (arg2), olced_add##list, (void *)(arg3)}, \ {"del"#list, FIELD_INUTIL, (void *) &name##_zero.var, (void *) FIELD_##field, (void *) (arg2), olced_del##list, (void *)(arg3)} #define DTE_END {NULL, (field_t)-1, NULL, NULL, NULL, NULL, NULL} #define rwgetdata(var, type, temp, base, data) \ ((var) = (type *) ((size_t)(temp) - (size_t)(base) + (size_t)(data))) #define rw_table(action, file, type, name) \ do { \ int i = 0; \ switch(action) { \ case act_read: { \ FileData *fp; \ const char *word; \ if ((fp = f_open(file, "r")) == NULL) { \ bugf("Unable to open %s for reading.", file); \ if((fp = f_open(file, "w")) != NULL) { \ f_printf(fp, "0" LF "#!" LF); \ f_close(fp); \ } \ break; \ } \ top_##name = read_number(fp); \ alloc_mem(name##_table, type, top_##name + 1); \ if (!name##_table) { \ bugf("Error! " #name "_table == NULL, top_" #name " : %d", top_##name); \ break; \ } \ log_string("Loading " #name " data..."); \ for (;;) { \ word = f_eof(fp) ? "#!" : read_word(fp); \ if (!str_cmp(word, "#!")) \ break; \ if (str_cmp(word, "#" #name)) { \ bugf("word doesn't exist (%s)", word); \ break; \ } \ if (i >= top_##name) { \ bugf("%d greater than top_" #name " %d", i, top_##name); \ break; \ } \ name##_table[i] = name##_zero; \ load_struct(fp, &name##_zero, name##_data_table, &name##_table[i++]); \ } \ f_close(fp); \ } \ break; \ case act_write: { \ FileData *fp; \ int i; \ if ((fp = f_open(file, "w")) == NULL) { \ log_error(file); \ break; \ } \ f_printf(fp, "%d" LF, top_##name); \ log_string("Saving " #name " data..."); \ for (i = 0; i < top_##name; ++i) { \ f_printf(fp, LF "#%s" LF, strupper(#name)); \ save_struct(fp, &name##_zero, name##_data_table, &name##_table[i]); \ f_printf(fp, "#" END_MARK LF); \ } \ f_printf(fp, "#!" LF ); \ f_close(fp); \ }\ break;\ default: \ break; \ } \ } while(0) #define rw_list(action, file, type, name) \ do { \ switch(action) {\ case act_read: { \ FileData *fp; \ type *data; \ const char *word; \ if ((fp = f_open(file, "r")) == NULL) { \ bugf("Unable to open %s for reading.", file); \ if((fp = f_open(file, "w")) != NULL) { \ f_printf(fp, "#!" LF); \ f_close(fp); \ } \ break; \ } \ log_string("Loading " #name " data..."); \ for (;;) { \ word = f_eof(fp) ? "#!" : read_word(fp); \ if (!str_cmp(word, "#!")) \ break; \ if (str_cmp(word, "#" #name)) { \ bugf("word doesn't exist (%s)", word); \ break; \ } \ data = new_##name(); \ load_struct(fp, &name##_zero, name##_data_table, data); \ if(name##_data_table == social_data_table) \ add_social((SocialData *)data); \ else if(name##_data_table == cmd_data_table) \ add_command((CmdData *)data); \ else if(name##_data_table == help_data_table) \ add_help((HelpData *)data); \ else \ Link(data, name, next, prev); \ } \ f_close(fp); \ } \ break; \ case act_write: { \ FileData *fp; \ type *data; \ if ((fp = f_open(file, "w")) == NULL) { \ log_error(file); \ break; \ } \ log_string("Saving " #name " data..."); \ for (data = name##_first; data != NULL; data = data->next) { \ f_printf(fp, LF "#%s" LF, strupper(#name)); \ save_struct(fp, &name##_zero, name##_data_table, data); \ f_printf(fp, "#" END_MARK LF); \ } \ f_printf(fp, "#!" LF ); \ f_close(fp); \ } \ break; \ default: \ break; \ } \ } while(0) #define rw_sublist(action, file, type, name, sub) \ do { \ switch(action) {\ case act_read: { \ FileData *fp; \ type *data; \ const char *word; \ if ((fp = f_open(file, "r")) == NULL) { \ bugf("Unable to open %s for reading.", file); \ if((fp = f_open(file, "w")) != NULL) { \ f_printf(fp, "#!" LF); \ f_close(fp); \ } \ break; \ } \ for (;;) { \ word = f_eof(fp) ? "#!" : read_word(fp); \ if (!str_cmp(word, "#!")) \ break; \ if (str_cmp(word, "#" #name)) { \ bugf("word doesn't exist (%s)", word); \ break; \ } \ data = new_##sub(); \ load_struct(fp, &sub##_zero, sub##_data_table, data); \ if(sub##_data_table == social_data_table) \ add_social((SocialData *)data); \ else if(sub##_data_table == cmd_data_table) \ add_command((CmdData *)data); \ else \ Link(data, name->sub, next, prev); \ } \ f_close(fp); \ } \ break; \ case act_write: { \ FileData *fp; \ type *data; \ if ((fp = f_open(file, "w")) == NULL) { \ log_error(file); \ break; \ } \ for (data = name->sub##_first; data != NULL; data = data->next) { \ f_printf(fp, LF "#%s" LF, strupper(#name)); \ save_struct(fp, &sub##_zero, sub##_data_table, data); \ f_printf(fp, "#" END_MARK LF); \ } \ f_printf(fp, "#!" LF ); \ f_close(fp); \ } \ break; \ default: \ break; \ } \ } while(0) #define rw_single(action, file, name) \ do { \ switch(action) { \ case act_read: { \ FileData *fp; \ const char *word; \ if ((fp = f_open(file, "r")) == NULL) { \ bugf("Could not open file %s for reading.", file); \ if((fp = f_open(file, "w")) != NULL) { \ f_printf(fp, "#!" LF); \ f_close(fp); \ } \ break; \ } \ log_string("Loading " #name " data..."); \ for (;;) { \ word = f_eof(fp) ? "#!" : read_word(fp); \ if (!str_cmp(word, "#!")) \ break; \ if (str_cmp(word, "#" #name)) { \ bugf("word doesn't exist (%s)", word); \ break; \ } \ load_struct(fp, &name##_zero, name##_data_table, &name##_info); \ } \ f_close(fp); \ }\ break; \ case act_write: { \ FileData *fp; \ if (!(fp = f_open(file, "w"))) { \ log_error(file); \ break; \ } \ log_string("Saving " #name " data..."); \ f_printf(fp, LF "#%s" LF, strupper(#name)); \ save_struct(fp, &name##_zero, name##_data_table, &name##_info); \ f_printf(fp, "#" END_MARK LF); \ f_printf(fp, "#!" LF ); \ f_close(fp); \ } \ break; \ default: \ break; \ } \ } while(0) #endif