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 text_states
}; };
#define engr_text_space(ep) ((char *) ((ep) + 1))
struct engr { struct engr {
struct engr *nxt_engr; struct engr *nxt_engr;
char *engr_txt[text_states]; char *engr_txt[text_states];

View File

@@ -374,7 +374,8 @@ read_engr_at(coordxy x, coordxy y)
int maxelen = (int) (sizeof buf int maxelen = (int) (sizeof buf
/* sizeof "literal" counts terminating \0 */ /* sizeof "literal" counts terminating \0 */
- sizeof "You feel the words: \"\"."), - 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) { if (elen > maxelen) {
(void) strncpy(buf, ep->engr_txt[actual_text], 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]; et = ep->engr_txt[actual_text];
} }
endpunct = ""; 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 = "."; endpunct = ".";
} }
You("%s: \"%s\"%s", (Blind) ? "feel the words" : "read", et, You("%s: \"%s\"%s", (Blind) ? "feel the words" : "read", et,
@@ -427,7 +432,7 @@ make_engr_at(
head_engr = ep; head_engr = ep;
ep->engr_x = x; ep->engr_x = x;
ep->engr_y = y; 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[remembered_text] = ep->engr_txt[actual_text] + smem;
ep->engr_txt[pristine_text] = ep->engr_txt[remembered_text] + smem; ep->engr_txt[pristine_text] = ep->engr_txt[remembered_text] + smem;
for(i = 0; i < text_states; ++i) for(i = 0; i < text_states; ++i)
@@ -1556,7 +1561,7 @@ save_engravings(NHFILE *nhfp)
szeach = ep->engr_szeach; szeach = ep->engr_szeach;
Sfo_unsigned(nhfp, &engr_alloc, "engraving-engr_alloc"); Sfo_unsigned(nhfp, &engr_alloc, "engraving-engr_alloc");
Sfo_engr(nhfp, ep, "engraving"); 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[remembered_text] = ep->engr_txt[actual_text] + szeach;
ep->engr_txt[pristine_text] = ep->engr_txt[remembered_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); Sfo_char(nhfp, ep->engr_txt[actual_text], "engraving-actual_text", szeach);
@@ -1591,7 +1596,7 @@ rest_engravings(NHFILE *nhfp)
szeach = ep->engr_szeach; szeach = ep->engr_szeach;
ep->nxt_engr = head_engr; ep->nxt_engr = head_engr;
head_engr = ep; 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[remembered_text] = ep->engr_txt[actual_text] + szeach;
ep->engr_txt[pristine_text] = ep->engr_txt[remembered_text] + szeach; ep->engr_txt[pristine_text] = ep->engr_txt[remembered_text] + szeach;
Sfi_char(nhfp, ep->engr_txt[actual_text], Sfi_char(nhfp, ep->engr_txt[actual_text],