impossible fix - potentially invalid feedback
From a bug report, the message displayed to the screen by impossible() might be different from the one written into paniclog, if it had argument subsitution/formatting. I couldn't reproduce that myself, but stdarg.h/varargs.h is tricky stuff and I think that passing the va_list to a routine which steps through it requires that va_start be called again if you're going to use the va_list a second time. This changes impossible() to handle its arguments only once, like panic().
This commit is contained in:
@@ -847,6 +847,7 @@ when a monster zapped by polymorph drops inventory because of its new form,
|
||||
entering an untended shop while blind gave an inappropriate message
|
||||
engraving feedback about partial text when weapon became too dull to finish
|
||||
was lacking sentence-ending period
|
||||
impossible() might display inaccurate feedback after updating paniclog
|
||||
|
||||
|
||||
Platform- and/or Interface-Specific Fixes
|
||||
|
||||
14
src/pline.c
14
src/pline.c
@@ -302,17 +302,17 @@ raw_printf VA_DECL(const char *, line)
|
||||
/*VARARGS1*/
|
||||
void
|
||||
impossible VA_DECL(const char *, s)
|
||||
char pbuf[2*BUFSZ];
|
||||
VA_START(s);
|
||||
VA_INIT(s, const char *);
|
||||
if (program_state.in_impossible)
|
||||
panic("impossible called impossible");
|
||||
panic("impossible called impossible");
|
||||
|
||||
program_state.in_impossible = 1;
|
||||
{
|
||||
char pbuf[BUFSZ];
|
||||
Vsprintf(pbuf,s,VA_ARGS);
|
||||
paniclog("impossible", pbuf);
|
||||
}
|
||||
vpline(s,VA_ARGS);
|
||||
Vsprintf(pbuf, s, VA_ARGS);
|
||||
pbuf[BUFSZ-1] = '\0'; /* sanity */
|
||||
paniclog("impossible", pbuf);
|
||||
pline("%s", pbuf);
|
||||
pline("Program in disorder - perhaps you'd better #quit.");
|
||||
program_state.in_impossible = 0;
|
||||
VA_END();
|
||||
|
||||
Reference in New Issue
Block a user