vis

a vi-like editor based on Plan 9's structural regular expressions

git clone https://9o.is/git/vis.git

commit e77e6b1694b18e5580420001db45f66852c513e0
parent 14a144a2347a496d75b13e260e8edeebf6783402
Author: Marc André Tanner <mat@brain-dump.org>
Date:   Wed,  3 May 2017 17:21:46 +0200

vis: introduce count iterator to handle interrupted flag

Diffstat:
Mmain.c | 6++++--
Mvis.c | 22++++++++++++++++++++++
Mvis.h | 10++++++++++
3 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/main.c b/main.c @@ -1241,7 +1241,8 @@ static const char *repeat(Vis *vis, const char *keys, const Arg *arg) { static const char *cursors_new(Vis *vis, const char *keys, const Arg *arg) { View *view = vis_view(vis); - for (int count = vis_count_get_default(vis, 1); count > 0; count--) { + VisCountIterator it = vis_count_iterator_get(vis, 1); + while (vis_count_iterator_next(&it)) { Cursor *cursor = NULL; switch (arg->i) { case -1: @@ -1481,7 +1482,8 @@ static const char *cursors_navigate(Vis *vis, const char *keys, const Arg *arg) return keys; } Cursor *c = view_cursors_primary_get(view); - for (int count = vis_count_get_default(vis, 1); count > 0; count--) { + VisCountIterator it = vis_count_iterator_get(vis, 1); + while (vis_count_iterator_next(&it)) { if (arg->i > 0) { c = view_cursors_next(c); if (!c) diff --git a/vis.c b/vis.c @@ -1545,6 +1545,28 @@ void vis_count_set(Vis *vis, int count) { vis->action.count = (count >= 0 ? count : VIS_COUNT_UNKNOWN); } +VisCountIterator vis_count_iterator_get(Vis *vis, int def) { + return (VisCountIterator) { + .vis = vis, + .iteration = 0, + .count = vis_count_get_default(vis, def), + }; +} + +VisCountIterator vis_count_iterator_init(Vis *vis, int count) { + return (VisCountIterator) { + .vis = vis, + .iteration = 0, + .count = count, + }; +} + +bool vis_count_iterator_next(VisCountIterator *it) { + if (it->vis->interrupted) + return false; + return it->iteration++ < it->count; +} + void vis_exit(Vis *vis, int status) { vis->running = false; vis->exit_status = status; diff --git a/vis.h b/vis.h @@ -352,6 +352,16 @@ int vis_count_get(Vis*); int vis_count_get_default(Vis*, int def); void vis_count_set(Vis*, int count); +typedef struct { + Vis *vis; + int iteration; + int count; +} VisCountIterator; + +VisCountIterator vis_count_iterator_get(Vis*, int def); +VisCountIterator vis_count_iterator_init(Vis*, int count); +bool vis_count_iterator_next(VisCountIterator*); + enum VisMotionType { VIS_MOTIONTYPE_LINEWISE = 1 << 0, VIS_MOTIONTYPE_CHARWISE = 1 << 1,