From f742dbfbccdb73db01ac44d4ff9a925cbdc30926 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Wed, 19 Jul 2023 19:01:36 +1000 Subject: [PATCH] doc-email use do_char_byte for the doc:char function do_char_byte now passes a mark to the next/prev functions and doc-email makes use of it. Signed-off-by: NeilBrown --- core-log.c | 4 +- core.h | 12 +++--- doc-dir.c | 4 +- doc-docs.c | 4 +- doc-email.c | 110 ++++++++++++++++++++++------------------------------ doc-list.c | 4 +- doc-text.c | 4 +- 7 files changed, 63 insertions(+), 79 deletions(-) diff --git a/core-log.c b/core-log.c index 5b5c9485..0a4464fa 100644 --- a/core-log.c +++ b/core-log.c @@ -22,8 +22,8 @@ struct doc_ref { unsigned int o; }; #define DOC_DATA_TYPE struct log -#define DOC_NEXT log_next -#define DOC_PREV log_prev +#define DOC_NEXT(p,m,r,b) log_next(p,r,b) +#define DOC_PREV(p,m,r,b) log_prev(p,r,b) #include "core.h" #include "internal.h" diff --git a/core.h b/core.h index da2ab9db..ea46d6e4 100644 --- a/core.h +++ b/core.h @@ -553,8 +553,8 @@ static inline wint_t doc_pending(struct pane *p safe, struct mark *m, int n) } #if defined(DOC_NEXT) -static inline wint_t DOC_NEXT(struct pane *p safe, struct doc_ref *r safe, bool byte); -static inline wint_t DOC_PREV(struct pane *p safe, struct doc_ref *r safe, bool byte); +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); static inline int do_char_byte(const struct cmd_info *ci safe) { struct mark *m = ci->mark; @@ -580,9 +580,9 @@ static inline int do_char_byte(const struct cmd_info *ci safe) mark_step(m, forward); #endif if (forward) - ret = DOC_NEXT(p, &m->ref, byte); + ret = DOC_NEXT(p, m, &m->ref, byte); else - ret = DOC_PREV(p, &m->ref, byte); + ret = DOC_PREV(p, m, &m->ref, byte); steps -= forward*2 - 1; } if (end) @@ -594,9 +594,9 @@ static inline int do_char_byte(const struct cmd_info *ci safe) /* Want the 'next' char */ r = m->ref; if (ci->num2 > 0) - ret = DOC_NEXT(p, &r, byte); + ret = DOC_NEXT(p, m, &r, byte); else - ret = DOC_PREV(p, &r, byte); + ret = DOC_PREV(p, m, &r, byte); return CHAR_RET(ret); } #endif diff --git a/doc-dir.c b/doc-dir.c index c6d35c7d..5c329404 100644 --- a/doc-dir.c +++ b/doc-dir.c @@ -49,8 +49,8 @@ struct doc_ref { }; #define DOC_SHARESREF #define DOC_DATA_TYPE struct directory -#define DOC_NEXT dir_next -#define DOC_PREV dir_prev +#define DOC_NEXT(d,m,r,b) dir_next(d,r,b) +#define DOC_PREV(d,m,r,b) dir_prev(d,r,b) #include "core.h" struct dir_ent { diff --git a/doc-docs.c b/doc-docs.c index d8319d04..97c758f5 100644 --- a/doc-docs.c +++ b/doc-docs.c @@ -45,8 +45,8 @@ struct doc_ref { }; #define DOC_SHARESREF #define DOC_DATA_TYPE struct docs -#define DOC_NEXT docs_next -#define DOC_PREV docs_prev +#define DOC_NEXT(d,m,r,b) docs_next(d,r,b) +#define DOC_PREV(d,m,r,b) docs_prev(d,r,b) #include "core.h" static struct map *docs_map, *docs_aux_map, *docs_modified_map, diff --git a/doc-email.c b/doc-email.c index fa782da1..d1891c23 100644 --- a/doc-email.c +++ b/doc-email.c @@ -42,7 +42,8 @@ #include #define PANE_DATA_TYPE struct email_view - +#define DOC_NEXT email_next +#define DOC_PREV email_prev #include "core.h" #include "misc.h" @@ -980,80 +981,63 @@ static int count_buttons(struct pane *p safe, struct mark *m safe) return cnt; } -static int email_step(struct pane *home safe, struct mark *mark safe, - int forward, int move) +static inline wint_t email_next(struct pane *p safe, struct mark *m safe, + struct doc_ref *r safe, bool bytes) { - struct pane *p = home; struct email_view *evi = &p->data; + bool move = r == &m->ref; wint_t ret; int n = -1; - if (forward) { - ret = home_call(p->parent, "doc:char", home, - move ? 1 : 0, - mark, evi->invis, - move ? 0 : 1); - n = get_part(p->parent, mark); - if (move && is_spacer(n)) { - /* Moving in a spacer, If after valid buttons, - * move to end - */ - wint_t c; - unsigned int buttons; - buttons = count_buttons(p, mark); - while ((c = doc_following(p->parent, mark)) != WEOF - && iswdigit(c) && (c - '0') >= buttons) - doc_next(p->parent, mark); - } - } else { - ret = home_call(p->parent, "doc:char", home, - move ? -1 : 0, - mark, evi->invis, - move ? 0 : -1); - n = get_part(p->parent, mark); - if (is_spacer(n) && move && - ret != CHAR_RET(WEOF) && iswdigit(ret & 0x1fffff)) { - /* Just stepped back over the 9 at the end of a spacer, - * Maybe step further if there aren't 10 buttons. - */ - unsigned int buttons = count_buttons(p, mark); - wint_t c = ret & 0x1fffff; - - while (c != WEOF && iswdigit(c) && c - '0' >= buttons) - c = doc_prev(p->parent, mark); - ret = CHAR_RET(c); - } + ret = home_call(p->parent, "doc:char", p, + move ? 1 : 0, + m, evi->invis, + move ? 0 : 1); + n = get_part(p->parent, m); + if (move && is_spacer(n)) { + /* Moving in a spacer. IF after valid buttons, + * move to end. + */ + wint_t c; + unsigned int buttons = count_buttons(p, m); + while ((c = doc_following(p->parent, m)) != WEOF && + iswdigit(c) && (c-'0') >= buttons) + doc_next(p->parent, m); } return ret; } -DEF_CMD(email_char) +static inline wint_t email_prev(struct pane *p safe, struct mark *m safe, + struct doc_ref *r safe, bool bytes) { - struct mark *m = ci->mark; - struct mark *end = ci->mark2; - int steps = ci->num; - int forward = steps > 0; - int ret = Einval; + struct email_view *evi = &p->data; + bool move = r == &m->ref; + wint_t ret; + int n = -1; - 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 = email_step(ci->home, m, forward, 1); - steps -= forward*2 - 1; + ret = home_call(p->parent, "doc:char", p, + move ? -1 : 0, + m, evi->invis, + move ? 0 : -1); + n = get_part(p->parent, m); + if (is_spacer(n) && move && + ret != CHAR_RET(WEOF) && iswdigit(ret & 0x1fffff)) { + /* Just stepped back over the 9 at the end of a spacer, + * Maybe step further if there aren't 10 buttons. + */ + unsigned int buttons = count_buttons(p, m); + wint_t c = ret & 0x1fffff; + + while (c != WEOF && iswdigit(c) && c - '0' >= buttons) + c = doc_prev(p->parent, m); + ret = c; } - 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 email_step(ci->home, m, ci->num2 > 0, 0); + return ret; +} + +DEF_CMD(email_char) +{ + return do_char_byte(ci); } DEF_CMD(email_content) diff --git a/doc-list.c b/doc-list.c index b573d678..f3aa98e1 100644 --- a/doc-list.c +++ b/doc-list.c @@ -21,8 +21,8 @@ struct doc_ref { #define DOC_SHARESREF #define DOC_DATA_TYPE struct list -#define DOC_NEXT list_next -#define DOC_PREV list_prev +#define DOC_NEXT(d,m,r,b) list_next(d,r,b) +#define DOC_PREV(d,m,r,b) list_prev(d,r,b) #include "core.h" #include "misc.h" diff --git a/doc-text.c b/doc-text.c index 48eeeea6..826a947a 100644 --- a/doc-text.c +++ b/doc-text.c @@ -80,8 +80,8 @@ struct doc_ref { }; struct text; #define DOC_DATA_TYPE struct text -#define DOC_NEXT text_next -#define DOC_PREV text_prev +#define DOC_NEXT(d,m,r,b) text_next(d,r,b) +#define DOC_PREV(d,m,r,b) text_prev(d,r,b) #include "core.h" #include "misc.h" -- 2.39.5