I have modifed do_reboot in teh following way:
struct reboot_data {
char reboot_option[MAX_STRING_LENGTH];
char reboot_file[MAX_STRING_LENGTH];
char *whichfile;
};
#define RB_OP(data) (data).reboot_option
#define RB_FILE(data) (data).reboot_file
#define RB_FILE_PTR(data) (data).whichfile
#define REREAD_FILE(file) file_to_string_alloc(RB_FILE((file)), \
&RB_FILE_PTR((file)))
#define DO_ALL(str) ((is_abbrev((str), "all")) || *(str) == '*')
#define DO_LIST(str) ((is_abbrev((str), "list")) || *(str) == '?')
#define OK(ch) send_to_char("Okay.\n\r", (ch))
#define STRING(var) char (var)[MAX_STRING_LENGTH]
ACMD(do_reboot)
{
int i;
STRING(debug);
struct reboot_data reboot_info[] =
{
{ "credits", CREDITS_FILE, credits},
{ "news", NULL_FILE, '\0'},
{ "motd", MOTD_FILE, motd},
{ "kwdhelp", NULL_FILE, '\0'},
{ "pagehelp", HELP_PAGE_FILE, help},
{ "info", INFO_FILE, info},
{ "wizlist", WIZLIST_FILE, wizlist},
{ "poses", NULL_FILE, '\0'},
{ "imotd", IMOTD_FILE, imotd},
{ "policies", POLICIES_FILE, policies},
{ "handbook", HANDBOOK_FILE, handbook},
{ "background", BACKGROUND_FILE, background},
{ "sacrifice", NULL_FILE, '\0'},
{ "houses", HOUSE_FILE, houses},
{ "marriages", MARRIAGES_FILE, marriages},
{ "qmanual", QMANUAL_FILE, qmanual},
{ "greetings", GREETINGS_FILE, GREETINGS},
{ "\n", NULL_FILE, '\0'}
};
one_argument(argument, arg);
if(!*arg)
{
send_to_char("Reboot what?\n\r",ch);
return;
}
if(DO_LIST(arg))
{
send_to_char("The following reload options are available:\n\r", ch);
for(i = 0;*RB_OP(reboot_info[i]) != TERM_ARRAY_CHAR; i++)
{
sprintf(buf,"%s\n\r", RB_OP(reboot_info[i]));
send_to_char(buf, ch);
}
return;
}
else
if(!DO_ALL(arg))
{
for(i = 0; *RB_OP(reboot_info[i]) != TERM_ARRAY_CHAR; i++)
if(is_abbrev(arg, RB_OP(reboot_info[i]))) break;
}
else
{
for(i = 0; *RB_OP(reboot_info[i]) != TERM_ARRAY_CHAR; i++)
if(str_cmp(RB_FILE(reboot_info[i]), NULL_FILE))
{
sprintf(debug, "Rebooting_file: %s\n\r", RB_FILE(reboot_info[i]));
send_to_char(debug, ch);
if(REREAD_FILE(reboot_info[i]) < 0)
send_to_char("ERROR! That file could not be reloaded!\n\r", ch);
}
OK(ch);
return;
}
/* if the two strings DON'T compare */
if(str_cmp(RB_FILE(reboot_info[i]), NULL_FILE))
{
sprintf(debug, "Okay, rebooting file: %s\n\r", RB_FILE(reboot_info[i]));
send_to_char(debug, ch);
if(REREAD_FILE(reboot_info[i])< 0)
send_to_char("Could not reboot the file!!", ch);
OK(ch);
return;
}
else
{
switch(i)
{
case 1:
send_to_char("Reloading the news files\n\r", ch);
file_to_string_alloc(NEWS_FILE, &news);
file_to_string_alloc(NEWSVERSION, &nv);
if(*news) newsversion = atoi(nv);
OK(ch);
break;
case 3: /* this is for the keyword file */
send_to_char("Loading the help file again\n\r", ch);
if (help_fl)
fclose(help_fl);
if (!(help_fl = fopen(HELP_KWRD_FILE, "r"))) return;
else
{
for (i = 0; i < top_of_helpt; i++)
free(help_index[i].keyword);
free(help_index);
help_index = build_help_index(help_fl, &top_of_helpt);
}
OK(ch);
break;
case 7: /* this is for the poses file */
send_to_char("Loading the poses file =)\n\r", ch);
boot_poses(); break;
case 12: /* sacrifice messages */
send_to_char("Rebooting sacrifice messages", ch);
boot_sacrifices();
}
return;
}
/* If all of this fails, then you KNOW it didn't work. */
send_to_char("Unknown reload option.\n\r", ch);
send_to_char("Correct format: reload list | all | ? | * | <option>", ch);
return;
}
For some reason, SOMETIMES it works, sometimes it doesn't!
For example, if I want to do a "reboot wizlist", first time it works like a
charm. Second time it works like a charm. Third time, and the pointers are all
fubared.
Can anyone at all see my error?
Thanks! :)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cavness@utxvms.cc.utexas.edu | The Great Holy Star Goat
Kenneth G. Cavness | is with all of us,
"Supreme Diva" | braised be Its name.
"I'm pro-choice--please don't |
shoot me in the back." | Braise the name of Our Lard!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This archive was generated by hypermail 2b30 : 12/07/00 PST