From 5f4fc03487dd9fced87bb2ec2de28f252e7166ea Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Sun, 16 Jul 2023 07:20:35 +1000 Subject: [PATCH] doc-text fix text_next for bytes I was completely ignoring 'bytes' for text_next. Consequently the 'hex' test, which display bytes, was all wrong. Also simplify text_prev using denormalise Signed-off-by: NeilBrown --- doc-text.c | 31 ++++++++++++------------ tests.d/01-hex | 66 +++++++++++++++++++++++++------------------------- 2 files changed, 48 insertions(+), 49 deletions(-) diff --git a/doc-text.c b/doc-text.c index 21d5b4fd..b9ff27e2 100644 --- a/doc-text.c +++ b/doc-text.c @@ -1533,6 +1533,9 @@ static int text_str_cmp(struct text *t, struct doc_ref *r, char *s) static void text_normalize(struct text *t safe, struct doc_ref *r safe) { + /* Adjust so at not at the end of a chunk - either ->o points + * at a byte, or ->c is NULL. + */ while (r->c && r->o >= r->c->end) { if (r->c->lst.next == &t->text) { r->c = NULL; @@ -1546,6 +1549,7 @@ static void text_normalize(struct text *t safe, struct doc_ref *r safe) static void text_denormalize(struct text *t safe, struct doc_ref *r safe) { + /* Ensure r->o is after some byte, or at start of file. */ if (r->c && r->o > r->c->start) /* nothing to do */ return; @@ -1585,7 +1589,7 @@ static void text_add_str(struct text *t safe, struct mark *pm safe, static wint_t text_next(struct text *t safe, struct doc_ref *r safe, bool bytes) { - wint_t ret; + wint_t ret = WERR; const char *c; text_normalize(t, r); @@ -1593,10 +1597,11 @@ static wint_t text_next(struct text *t safe, struct doc_ref *r safe, bool bytes) return WEOF; c = r->c->txt + r->o; - ret = get_utf8(&c, r->c->txt + r->c->end); - if (ret < WERR) { + if (!bytes) + ret = get_utf8(&c, r->c->txt + r->c->end); + if (ret < WERR) r->o = c - r->c->txt; - } else + else ret = (unsigned char)r->c->txt[r->o++]; text_normalize(t, r); return ret; @@ -1607,19 +1612,13 @@ static wint_t text_prev(struct text *t safe, struct doc_ref *r safe, bool bytes) wint_t ret; const char *c; - if (r->c == NULL) { - if (list_empty(&t->text)) - return WEOF; - r->c = list_entry(t->text.prev, struct text_chunk, lst); - r->o = r->c->end; - } + text_denormalize(t, r); + if (list_empty(&t->text)) + return WEOF; + if (r->c == NULL || r->o <= r->c->start) + // assert (r->c->lst.prev == &t->text) + return WEOF; - if (r->o <= r->c->start) { - if (r->c->lst.prev == &t->text) - return WEOF; - r->c = list_prev_entry(r->c, lst); - r->o = r->c->end; - } if (bytes) r->o -= 1; else { diff --git a/tests.d/01-hex b/tests.d/01-hex index ed70c4ec..a45e81b5 100644 --- a/tests.d/01-hex +++ b/tests.d/01-hex @@ -12,43 +12,43 @@ Display 80,30 F03D3559FBC5AB0F82A840100F882274 1,6 Key ":C-N" Display 80,30 14DF59CD936EFA04483069B763360A86 1,7 Key "-H" -Display 80,30 DE94663244D06B5A6A83191757901031 11,1 +Display 80,30 BB835584D2C88E404EA86CEEB99F3AD0 11,1 Key ":C-N" -Display 80,30 FE43F77D46229D99D0300BB94808B8E3 11,2 +Display 80,30 88ABDDDBF6AFE145C482FE268C07BDC9 11,2 Key ":C-N" -Display 80,30 FE43F77D46229D99D0300BB94808B8E3 11,3 +Display 80,30 88ABDDDBF6AFE145C482FE268C07BDC9 11,3 Key ":C-N" -Display 80,30 FE43F77D46229D99D0300BB94808B8E3 11,4 +Display 80,30 88ABDDDBF6AFE145C482FE268C07BDC9 14,3 Key ":C-V" -Display 80,30 A92E1DBB772AFD54F4D4D7C7A4CF2F00 11,1 +Display 80,30 57CA6D2E9193B42FC22A445F6F9D5471 11,2 Key ":C-V" -Display 80,30 EE7F5A714D885619B2E427801003C1C1 11,1 +Display 80,30 50B1229DE90F4B538E9A1CAAE94CBCB8 11,1 Key ":C-N" -Display 80,30 EE7F5A714D885619B2E427801003C1C1 11,2 +Display 80,30 50B1229DE90F4B538E9A1CAAE94CBCB8 11,2 Key ":C-N" -Display 80,30 EE7F5A714D885619B2E427801003C1C1 11,3 +Display 80,30 50B1229DE90F4B538E9A1CAAE94CBCB8 11,3 Key ":A-<" -Display 80,30 DE94663244D06B5A6A83191757901031 11,1 +Display 80,30 BB835584D2C88E404EA86CEEB99F3AD0 11,1 Key ":C-S" -Display 80,30 07C19F9405B9CF3EA8C2DAC45889F7D1 50,0 +Display 80,30 CCE035062EC1F81DBDA1C5768FC88ADB 50,0 Key "-C" -Display 80,30 CC54B285A6E9AE1BCD42380B9DF76D6F 51,0 +Display 80,30 F6D1E531571DBF1F6876220F671C9A53 51,0 Key "-H" -Display 80,30 48EA5032F8A559401EB8D83D5DF788FD 52,0 +Display 80,30 161CFC505BD7B23B9BEB9ED34D63F267 52,0 Key "-E" -Display 80,30 75879A2DE095D0A42A8DC2D3F5E03C4F 53,0 +Display 80,30 DFEEAF41043931699450501A0DFCB8E0 53,0 Key "-C" -Display 80,30 B596A79B3628146A9BFC4E96AEA31132 54,0 +Display 80,30 D5CB7A9194EA3525C8DEFAA7313DC8F8 54,0 Key "-K" -Display 80,30 9D7E943776424944EE9EBDBF7B00D64C 55,0 +Display 80,30 9AF601DB933FF9C6EBDB7A9786930B65 55,0 Key ":Enter" -Display 80,30 F8E1EDF844151F12AFF379EEB6058B44 17,9 +Display 80,30 11480313276ED96DAE3A8BAF8D126C8F 20,9 Key ":C-S" -Display 80,30 D9B11E3D051A924E5BBC419103B0AB75 50,0 +Display 80,30 46CB1ED6F95440CB2F976DE269818D24 50,0 Key ":C-S" -Display 80,30 3A4D532F7A58316B3EC655B22F080A24 55,0 +Display 80,30 6F79B3FEA697DE8F18170C76E8668C08 55,0 Key ":Enter" -Display 80,30 EB2BFAB188A7FAAC3435F7EF40BBA60C 51,10 +Display 80,30 DBB3E77109B0A9CB880586F5082D2803 54,10 Key ":A->" Display 80,30 E8E30F4928C01305659D4F3B512B78F3 1,25 Key ":A-v" @@ -58,29 +58,29 @@ Display 80,30 0F371502686F37A65E50DF4969382AEA 11,27 Key ":A-v" Display 80,30 AE4F220A2150CFF7BBDCAA1B971C91BE 11,27 Key ":A-<" -Display 80,30 DE94663244D06B5A6A83191757901031 11,1 +Display 80,30 BB835584D2C88E404EA86CEEB99F3AD0 11,1 Key ":C-N" -Display 80,30 FE43F77D46229D99D0300BB94808B8E3 11,2 +Display 80,30 88ABDDDBF6AFE145C482FE268C07BDC9 11,2 Key ":C-N" -Display 80,30 FE43F77D46229D99D0300BB94808B8E3 11,3 +Display 80,30 88ABDDDBF6AFE145C482FE268C07BDC9 11,3 Key ":C-C" -Display 80,30 F4A50C66CAD6CF74DDA539F202B3CDB6 11,3 +Display 80,30 97948AE8E3CDD3ACAF8E85B77EF95795 11,3 Key ":C-C" -Display 80,30 FE43F77D46229D99D0300BB94808B8E3 11,3 +Display 80,30 88ABDDDBF6AFE145C482FE268C07BDC9 11,3 Key ":C-D" -Display 80,30 2F15E749DB014DD7063C48657AFE94BB 11,3 +Display 80,30 E67AB4CE579284E815F5882F0EB00A7C 11,3 Key ":C-D" -Display 80,30 C5C1129A35355ABF0D08D34120BCA536 11,3 +Display 80,30 E00D038E7B2EFFB7D55683552C750CF7 11,3 Key ":C-D" -Display 80,30 B5303D2B56C7A7EA7387CC795DA79E95 11,3 +Display 80,30 6B4F2B1D89FCD5B9786E12C71162C159 11,3 Key ":C-D" -Display 80,30 332F94792AADEA10194D4E41381F68DB 11,3 +Display 80,30 5B707465068B9430342A21FD83581412 11,3 Key ":C-D" -Display 80,30 ECAC36FC4A1813969954135C1D3E358E 11,3 +Display 80,30 1FBD0785DE77729E0F0ECC565B702E92 11,3 Key ":C-_" -Display 80,30 FE43F77D46229D99D0300BB94808B8E3 14,3 +Display 80,30 88ABDDDBF6AFE145C482FE268C07BDC9 14,3 Key ":C-X" -Display 80,30 45BD9A363837C8B0DAF047FB0002FC1D 14,3 +Display 80,30 03B92C6B72859C64F0A8D6830B7789BC 14,3 Key ":C-C" -Display 80,30 FE43F77D46229D99D0300BB94808B8E3 14,3 -Close 578 +Display 80,30 88ABDDDBF6AFE145C482FE268C07BDC9 14,3 +Close 604 -- 2.39.5