Follow-up to engraving punctuation

Skip the terminal period only if there is true punctuation at the end of
the engraving, not degraded text.  This feels a bit janky because the
way engravings are malloced and structured uses this manual offset to
access the space allocated for text.  I used a macro to unify all those
accesses so that it will be harder to screw it up if something changes
in that respect, since repeating (ep + 1) as a magic number across
engrave.c seems quite brittle.
This commit is contained in:
Michael Meyer
2026-01-08 14:18:25 -05:00
committed by PatR
parent e18cf594d3
commit c92014bf3c
2 changed files with 12 additions and 5 deletions

View File

@@ -13,6 +13,8 @@ enum engraving_texts {
text_states
};
#define engr_text_space(ep) ((char *) ((ep) + 1))
struct engr {
struct engr *nxt_engr;
char *engr_txt[text_states];

View File

@@ -374,7 +374,8 @@ read_engr_at(coordxy x, coordxy y)
int maxelen = (int) (sizeof buf
/* sizeof "literal" counts terminating \0 */
- sizeof "You feel the words: \"\"."),
elen = (int) strlen(ep->engr_txt[actual_text]);
elen = (int) strlen(ep->engr_txt[actual_text]),
off = (int) (ep->engr_txt[actual_text] - engr_text_space(ep));
if (elen > maxelen) {
(void) strncpy(buf, ep->engr_txt[actual_text], maxelen);
@@ -385,7 +386,11 @@ read_engr_at(coordxy x, coordxy y)
et = ep->engr_txt[actual_text];
}
endpunct = "";
if (elen > 0 && !strchr(".!?", et[elen - 1])) {
if (elen < 2
/* only skip if punctuation is original, not degraded char */
|| !((ep->engr_txt[pristine_text][off + elen - 1]
== et[elen - 1])
&& strchr(".!?", et[elen - 1]))) {
endpunct = ".";
}
You("%s: \"%s\"%s", (Blind) ? "feel the words" : "read", et,
@@ -427,7 +432,7 @@ make_engr_at(
head_engr = ep;
ep->engr_x = x;
ep->engr_y = y;
ep->engr_txt[actual_text] = (char *) (ep + 1);
ep->engr_txt[actual_text] = engr_text_space(ep);
ep->engr_txt[remembered_text] = ep->engr_txt[actual_text] + smem;
ep->engr_txt[pristine_text] = ep->engr_txt[remembered_text] + smem;
for(i = 0; i < text_states; ++i)
@@ -1556,7 +1561,7 @@ save_engravings(NHFILE *nhfp)
szeach = ep->engr_szeach;
Sfo_unsigned(nhfp, &engr_alloc, "engraving-engr_alloc");
Sfo_engr(nhfp, ep, "engraving");
ep->engr_txt[actual_text] = (char *)(ep + 1);
ep->engr_txt[actual_text] = engr_text_space(ep);
ep->engr_txt[remembered_text] = ep->engr_txt[actual_text] + szeach;
ep->engr_txt[pristine_text] = ep->engr_txt[remembered_text] + szeach;
Sfo_char(nhfp, ep->engr_txt[actual_text], "engraving-actual_text", szeach);
@@ -1591,7 +1596,7 @@ rest_engravings(NHFILE *nhfp)
szeach = ep->engr_szeach;
ep->nxt_engr = head_engr;
head_engr = ep;
ep->engr_txt[actual_text] = (char *) (ep + 1); /* Andreas Bormann */
ep->engr_txt[actual_text] = engr_text_space(ep); /* Andreas Bormann */
ep->engr_txt[remembered_text] = ep->engr_txt[actual_text] + szeach;
ep->engr_txt[pristine_text] = ep->engr_txt[remembered_text] + szeach;
Sfi_char(nhfp, ep->engr_txt[actual_text],