diff --git a/include/engrave.h b/include/engrave.h index 47fd84783..33ee19c80 100644 --- a/include/engrave.h +++ b/include/engrave.h @@ -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]; diff --git a/src/engrave.c b/src/engrave.c index 40c3f95b1..c84908cf1 100644 --- a/src/engrave.c +++ b/src/engrave.c @@ -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],