]> git.neil.brown.name Git - edlib.git/commitdiff
doc-email use do_char_byte for the doc:char function
authorNeilBrown <neil@brown.name>
Wed, 19 Jul 2023 09:01:36 +0000 (19:01 +1000)
committerNeilBrown <neil@brown.name>
Wed, 19 Jul 2023 10:37:44 +0000 (20:37 +1000)
do_char_byte now passes a mark to the next/prev functions and doc-email
makes use of it.

Signed-off-by: NeilBrown <neil@brown.name>
core-log.c
core.h
doc-dir.c
doc-docs.c
doc-email.c
doc-list.c
doc-text.c

index 5b5c9485c3339a3d74713a1546d3176d4e5ef187..0a4464fa8162f21720952c0402aabcfa5dc497ac 100644 (file)
@@ -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 da2ab9db4b0320ffbf1aa8d6f4312db29541ce3a..ea46d6e46ccc6d56f7d34769ddb6a869ccc99e5f 100644 (file)
--- 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
index c6d35c7dcec9051ead49e5b205ca5aecd1591df3..5c329404e7001b309879c0b1410b253148cbaf98 100644 (file)
--- 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 {
index d8319d04299b6cea490a5ac556b87a85ed74efdc..97c758f50074b07d0f93a004e6c085054285ade2 100644 (file)
@@ -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,
index fa782da1de26fda87b53c42d82c1468a9413dc5e..d1891c230fd819685985a38e2a3053e70f4206c7 100644 (file)
@@ -42,7 +42,8 @@
 #include <stdio.h>
 
 #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)
index b573d678e4a31f9b01f743cf3dc85d443999389c..f3aa98e137d5365f080e7fe9a71ccfba60ecab4c 100644 (file)
@@ -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"
 
index 48eeeea66a61d0fe7cfda46c88554c7590fa7e41..826a947ac3588a1f6465f455599821a9ac226112 100644 (file)
@@ -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"