From: NeilBrown Date: Wed, 19 Jul 2023 09:43:54 +0000 (+1000) Subject: render-format: use do_char_byte() X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=8dda1b2b8b8fc82bd2138a402cb309c1fcc05786;p=edlib.git render-format: use do_char_byte() This requires some more ugly #define stuff, but I think the code sharing is good. Signed-off-by: NeilBrown --- diff --git a/core.h b/core.h index ea46d6e4..5c899dbe 100644 --- 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; diff --git a/render-format.c b/render-format.c index 6b8393c4..d9a2a504 100644 --- a/render-format.c +++ b/render-format.c @@ -15,7 +15,10 @@ #include #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) diff --git a/tests.d/00-basic b/tests.d/00-basic index 97c93c41..212ef3eb 100644 --- a/tests.d/00-basic +++ b/tests.d/00-basic @@ -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