]> git.neil.brown.name Git - edlib.git/commitdiff
render-format: use do_char_byte()
authorNeilBrown <neil@brown.name>
Wed, 19 Jul 2023 09:43:54 +0000 (19:43 +1000)
committerNeilBrown <neil@brown.name>
Fri, 21 Jul 2023 01:01:54 +0000 (11:01 +1000)
This requires some more ugly #define stuff, but I think the code sharing
is good.

Signed-off-by: NeilBrown <neil@brown.name>
core.h
render-format.c
tests.d/00-basic

diff --git a/core.h b/core.h
index ea46d6e46ccc6d56f7d34769ddb6a869ccc99e5f..5c899dbe0a5204002fe9611b75ccc6dfdec94ae5 100644 (file)
--- a/core.h
+++ b/core.h
@@ -553,8 +553,13 @@ static inline wint_t doc_pending(struct pane *p safe, struct mark *m, int n)
 }
 
 #if defined(DOC_NEXT)
+#ifdef DOC_NEXT_DECL
+static inline wint_t DOC_NEXT_DECL(struct pane *p safe, struct mark *m, struct doc_ref *r safe, bool byte);
+static inline wint_t DOC_PREV_DECL(struct pane *p safe, struct mark *m, struct doc_ref *r safe, bool byte);
+#else
 static inline wint_t DOC_NEXT(struct pane *p safe, struct mark *m, struct doc_ref *r safe, bool byte);
 static inline wint_t DOC_PREV(struct pane *p safe, struct mark *m, struct doc_ref *r safe, bool byte);
+#endif
 static inline int do_char_byte(const struct cmd_info *ci safe)
 {
        struct mark *m = ci->mark;
index 6b8393c42d88be8ca7a433dd1348377ef7e32c6e..d9a2a5049cc2ca9508e8118a677ca975d6d6df2d 100644 (file)
 #include <stdio.h>
 
 #define PANE_DATA_TYPE struct rf_data
-
+#define DOC_NEXT(p,m,r,b) format_next_prev(p, ci->focus, m, r, 1, b)
+#define DOC_PREV(p,m,r,b) format_next_prev(p, ci->focus, m, r, 0, b)
+#define DOC_NEXT_DECL(p,m,r,b) format_next_prev(p, struct pane *focus safe, m, r, int forward, b)
+#define DOC_PREV_DECL(p,m,r,b) format_next_prev(p, struct pane *focus safe, m, r, int forward, b)
 #include "core.h"
 #include "misc.h"
 
@@ -522,15 +525,13 @@ static void next_line(struct pane *home safe, struct mark *m safe)
        mark_step(m, 1);
 }
 
-static int format_step(struct pane *home safe, struct pane *focus safe,
-                      struct mark *mark safe,
-                      int num, int num2)
+static inline wint_t format_next_prev(struct pane *home safe, struct pane *focus safe,
+                                     struct mark *m safe, struct doc_ref *r safe,
+                                     int forward, bool bytes)
 {
        struct rf_data *rd = &home->data;
        struct rf_field *rf;
-       struct mark *m = mark;
-       int forward = num;
-       int move = num2;
+       int move = r == &m->ref;
        int f, o;
        int margin;
        int fsize;
@@ -568,7 +569,6 @@ static int format_step(struct pane *home safe, struct pane *focus safe,
        rf = &rd->fields[f];
        fsize = field_size(home, focus, m, f, &val);
        if (move && forward) {
-               mark_step(m, forward);
                index = normalize(home, focus, m, 1);
                if (index < 0) {
                        next_line(home, m);
@@ -576,7 +576,6 @@ static int format_step(struct pane *home safe, struct pane *focus safe,
                }
                update_offset(m, rd, index);
        } else if (move && !forward) {
-               mark_step(m, forward);
                update_offset(m, rd, index);
        }
 
@@ -626,31 +625,7 @@ static int format_step(struct pane *home safe, struct pane *focus safe,
 
 DEF_CMD(format_char)
 {
-       struct mark *m = ci->mark;
-       struct mark *end = ci->mark2;
-       int steps = ci->num;
-       int forward = steps > 0;
-       int ret = Einval;
-
-       if (!m)
-               return Enoarg;
-       if (end && mark_same(m, end))
-               return 1;
-       if (end && (end->seq < m->seq) != (steps < 0))
-               /* Can never cross 'end' */
-               return Einval;
-       while (steps && ret != CHAR_RET(WEOF) && (!end || !mark_same(m, end))) {
-               ret = format_step(ci->home, ci->focus, m, forward, 1);
-               steps -= forward*2 - 1;
-       }
-       if (end)
-               return 1 + (forward ? ci->num - steps : steps - ci->num);
-       if (ret == CHAR_RET(WEOF) || ci->num2 == 0)
-               return ret;
-       if (ci->num &&(ci->num2 < 0) == forward)
-               return ret;
-       /* Want the 'next' char */
-       return format_step(ci->home, ci->focus, m, ci->num2 > 0, 0);
+       return do_char_byte(ci);
 }
 
 DEF_CMD(format_content2)
index 97c93c418494555ee6d9a053d64d444b2b668cd3..212ef3eb788c1675753fd9269ca286231d287008 100644 (file)
@@ -601,4 +601,4 @@ Key ":C-X"
 Display 80,30 84F4B35BF26F9D5EEBB67D572ADD0BBF 1,0
 Key ":C-C"
 Display 80,30 D2E6DB1DE1E62B191C28D1B2CFF7F1C0 1,0
-Close 1574
+Close 1575