]> git.neil.brown.name Git - edlib.git/commitdiff
doc-text fix text_next for bytes
authorNeilBrown <neil@brown.name>
Sat, 15 Jul 2023 21:20:35 +0000 (07:20 +1000)
committerNeilBrown <neil@brown.name>
Sat, 15 Jul 2023 21:23:35 +0000 (07:23 +1000)
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 <neil@brown.name>
doc-text.c
tests.d/01-hex

index 21d5b4fd2ab9fe4a43ff62f19b9c0d61191ca4aa..b9ff27e297ed9660d6026b59b75480f229c15ff6 100644 (file)
@@ -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 {
index ed70c4ec57261115e5aea974dd1e1502027d2f62..a45e81b509458b8d2f7bb527058396663ed3534d 100644 (file)
@@ -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