diff --git a/src/mail.c b/src/mail.c index 63142ad51..064b69bc5 100644 --- a/src/mail.c +++ b/src/mail.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 mail.c $NHDT-Date: 1545597424 2018/12/23 20:37:04 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.39 $ */ +/* NetHack 3.6 mail.c $NHDT-Date: 1568508711 2019/09/15 00:51:51 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.40 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Pasi Kallinen, 2018. */ /* NetHack may be freely redistributed. See license for details. */ @@ -460,28 +460,65 @@ void readmail(otmp) struct obj *otmp UNUSED; { - static char *junk[] = { - NULL, /* placeholder for "Report bugs to .", */ - "Please disregard previous letter.", "Welcome to NetHack.", + static const char *junk[] = { + "Report bugs to <%s>.", /*** must be first entry ***/ + "Please disregard previous letter.", + "Welcome to NetHack.", #ifdef AMIGA - "Only Amiga makes it possible.", "CATS have all the answers.", + "Only Amiga makes it possible.", + "CATS have all the answers.", #endif "This mail complies with the Yendorian Anti-Spam Act (YASA)", "Please find enclosed a small token to represent your Owlbear", "**FR33 P0T10N 0F FULL H34L1NG**", "Please return to sender (Asmodeus)", + /* when enclosed by "It reads: \"...\"", this is too long + for an ordinary 80-column display so wraps to a second line + (suboptimal but works correctly); + dollar sign and fractional zorkmids are inappropriate within + nethack but are suitable for typical dysfunctional spam mail */ "Buy a potion of gain level for only $19.99! Guaranteed to be blessed!", - "Invitation: Visit the NetHack web site at http://www.nethack.org!" + /* DEVTEAM_URL will be substituted for "%s"; terminating punctuation + (formerly "!") has deliberately been omitted so that it can't be + mistaken for part of the URL (unfortunately that is still followed + by a closing quote--in the pline below, not the data here) */ + "Invitation: Visit the NetHack web site at %s" }; /* XXX replace with more general substitution code and add local - * contact message. Also use DEVTEAM_URL */ - if (junk[0] == NULL) { -#define BUGS_FORMAT "Report bugs to <%s>." - /* +2 from '%s' suffices as substitute for usual +1 for terminator */ - junk[0] = (char *) alloc(strlen(BUGS_FORMAT) + strlen(DEVTEAM_EMAIL)); - Sprintf(junk[0], BUGS_FORMAT, DEVTEAM_EMAIL); -#undef BUGS_FORMAT + * contact message. + * + * FIXME: this allocated memory is never freed. However, if the + * game is restarted, the junk[] update will be a no-op for second + * and subsequent runs and this updated text will still be appropriate. + */ + if (index(junk[0], '%')) { + char *tmp; + int i; + + for (i = 0; i < SIZE(junk); ++i) { + if (index(junk[i], '%')) { + if (i == 0) { + /* +2 from '%s' in junk[0] suffices as substitute + for usual +1 for terminator */ + tmp = (char *) alloc(strlen(junk[0]) + + strlen(DEVTEAM_EMAIL)); + Sprintf(tmp, junk[0], DEVTEAM_EMAIL); + junk[0] = tmp; + } else if (strstri(junk[i], "web site")) { + /* as with junk[0], room for terminator is present */ + tmp = (char *) alloc(strlen(junk[i]) + + strlen(DEVTEAM_URL)); + Sprintf(tmp, junk[i], DEVTEAM_URL); + junk[i] = tmp; + } else { + /* could check for "%%" but unless that becomes needed, + handling it is more complicated than necessary */ + impossible("fake mail #%d has undefined substitution", i); + junk[i] = "Bad fake mail..."; + } + } + } } if (Blind) { pline("Unfortunately you cannot see what it says.");