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