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:
@@ -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];
|
||||
|
||||
@@ -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],
|
||||
|
||||
Reference in New Issue
Block a user