summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-04-02 18:50:46 +0200
committerBram Moolenaar <Bram@vim.org>2020-04-02 18:50:46 +0200
commitaeea72151c31d686bcbb7b06d895006d7363585c (patch)
tree500d487503a1a82cecc8f2a3e9bf89b50638fe5a
parentf10806b25090879fdc1a86cc0da2f4f34fd21921 (diff)
patch 8.2.0500: using the same loop in many placesv8.2.0500
Problem: Using the same loop in many places. Solution: Define more FOR_ALL macros. (Yegappan Lakshmanan, closes #5339)
-rw-r--r--src/arglist.c2
-rw-r--r--src/autocmd.c12
-rw-r--r--src/buffer.c8
-rw-r--r--src/change.c6
-rw-r--r--src/channel.c51
-rw-r--r--src/cmdexpand.c2
-rw-r--r--src/diff.c15
-rw-r--r--src/eval.c4
-rw-r--r--src/evalbuffer.c6
-rw-r--r--src/evalfunc.c5
-rw-r--r--src/evalvars.c2
-rw-r--r--src/evalwindow.c6
-rw-r--r--src/ex_cmds2.c4
-rw-r--r--src/filepath.c2
-rw-r--r--src/globals.h14
-rw-r--r--src/gui.c2
-rw-r--r--src/if_py_both.h4
-rw-r--r--src/if_ruby.c2
-rw-r--r--src/insexpand.c4
-rw-r--r--src/list.c8
-rw-r--r--src/misc2.c2
-rw-r--r--src/netbeans.c4
-rw-r--r--src/popupwin.c41
-rw-r--r--src/quickfix.c2
-rw-r--r--src/screen.c8
-rw-r--r--src/sign.c25
-rw-r--r--src/spell.c8
-rw-r--r--src/spellfile.c28
-rw-r--r--src/spellsuggest.c2
-rw-r--r--src/tag.c4
-rw-r--r--src/terminal.c14
-rw-r--r--src/userfunc.c6
-rw-r--r--src/version.c2
-rw-r--r--src/window.c12
34 files changed, 176 insertions, 141 deletions
diff --git a/src/arglist.c b/src/arglist.c
index ad404d8ae9..8e0f4d2e8e 100644
--- a/src/arglist.c
+++ b/src/arglist.c
@@ -1046,7 +1046,7 @@ do_arg_all(
// Move the already present window to below the current window
if (curwin->w_arg_idx != i)
{
- for (wpnext = firstwin; wpnext != NULL; wpnext = wpnext->w_next)
+ FOR_ALL_WINDOWS(wpnext)
{
if (wpnext->w_arg_idx == i)
{
diff --git a/src/autocmd.c b/src/autocmd.c
index dce23b8978..d6945f3062 100644
--- a/src/autocmd.c
+++ b/src/autocmd.c
@@ -235,6 +235,10 @@ struct AutoPatCmd_S
static AutoPatCmd *active_apc_list = NULL; // stack of active autocommands
+// Macro to loop over all the patterns for an autocmd event
+#define FOR_ALL_AUTOCMD_PATTERNS(event, ap) \
+ for ((ap) = first_autopat[(int)(event)]; (ap) != NULL; (ap) = (ap)->next)
+
/*
* augroups stores a list of autocmd group names.
*/
@@ -456,7 +460,7 @@ aubuflocal_remove(buf_T *buf)
for (event = (event_T)0; (int)event < (int)NUM_EVENTS;
event = (event_T)((int)event + 1))
// loop over all autocommand patterns
- for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
+ FOR_ALL_AUTOCMD_PATTERNS(event, ap)
if (ap->buflocal_nr == buf->b_fnum)
{
au_remove_pat(ap);
@@ -519,7 +523,7 @@ au_del_group(char_u *name)
for (event = (event_T)0; (int)event < (int)NUM_EVENTS;
event = (event_T)((int)event + 1))
{
- for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
+ FOR_ALL_AUTOCMD_PATTERNS(event, ap)
if (ap->group == i && ap->pat != NULL)
{
give_warning((char_u *)_("W19: Deleting augroup that is still in use"), TRUE);
@@ -1041,7 +1045,7 @@ do_autocmd_event(
*/
if (*pat == NUL)
{
- for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
+ FOR_ALL_AUTOCMD_PATTERNS(event, ap)
{
if (forceit) // delete the AutoPat, if it's in the current group
{
@@ -2400,7 +2404,7 @@ has_autocmd(event_T event, char_u *sfname, buf_T *buf)
forward_slash(fname);
#endif
- for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
+ FOR_ALL_AUTOCMD_PATTERNS(event, ap)
if (ap->pat != NULL && ap->cmds != NULL
&& (ap->buflocal_nr == 0
? match_file_pat(NULL, &ap->reg_prog,
diff --git a/src/buffer.c b/src/buffer.c
index cec33b0a45..8201157547 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -2911,7 +2911,7 @@ buflist_setfpos(
{
wininfo_T *wip;
- for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next)
+ FOR_ALL_BUF_WININFO(buf, wip)
if (wip->wi_win == win)
break;
if (wip == NULL)
@@ -3004,7 +3004,7 @@ find_wininfo(
{
wininfo_T *wip;
- for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next)
+ FOR_ALL_BUF_WININFO(buf, wip)
if (wip->wi_win == curwin
#ifdef FEAT_DIFF
&& (!skip_diff_buffer || !wininfo_other_tab_diff(wip))
@@ -3019,7 +3019,7 @@ find_wininfo(
#ifdef FEAT_DIFF
if (skip_diff_buffer)
{
- for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next)
+ FOR_ALL_BUF_WININFO(buf, wip)
if (!wininfo_other_tab_diff(wip))
break;
}
@@ -3132,7 +3132,7 @@ buflist_list(exarg_T *eap)
if (vim_strchr(eap->arg, 't'))
{
ga_init2(&buflist, sizeof(buf_T *), 50);
- for (buf = firstbuf; buf != NULL; buf = buf->b_next)
+ FOR_ALL_BUFFERS(buf)
{
if (ga_grow(&buflist, 1) == OK)
((buf_T **)buflist.ga_data)[buflist.ga_len++] = buf;
diff --git a/src/change.c b/src/change.c
index 3ee719812f..cfba90b3ca 100644
--- a/src/change.c
+++ b/src/change.c
@@ -172,8 +172,7 @@ check_recorded_changes(
linenr_T prev_lnum;
linenr_T prev_lnume;
- for (li = buf->b_recorded_changes->lv_first; li != NULL;
- li = li->li_next)
+ FOR_ALL_LIST_ITEMS(buf->b_recorded_changes, li)
{
prev_lnum = (linenr_T)dict_get_number(
li->li_tv.vval.v_dict, (char_u *)"lnum");
@@ -362,8 +361,7 @@ invoke_listeners(buf_T *buf)
argv[0].v_type = VAR_NUMBER;
argv[0].vval.v_number = buf->b_fnum; // a:bufnr
-
- for (li = buf->b_recorded_changes->lv_first; li != NULL; li = li->li_next)
+ FOR_ALL_LIST_ITEMS(buf->b_recorded_changes, li)
{
varnumber_T lnum;
diff --git a/src/channel.c b/src/channel.c
index 4db40c9ddc..1dfb28f854 100644
--- a/src/channel.c
+++ b/src/channel.c
@@ -61,6 +61,12 @@ static ch_part_T channel_part_send(channel_T *channel);
static ch_part_T channel_part_read(channel_T *channel);
static void free_job_options(jobopt_T *opt);
+#define FOR_ALL_CHANNELS(ch) \
+ for ((ch) = first_channel; (ch) != NULL; (ch) = (ch)->ch_next)
+
+#define FOR_ALL_JOBS(job) \
+ for ((job) = first_job; (job) != NULL; (job) = (job)->jv_next)
+
// Whether a redraw is needed for appending a line to a buffer.
static int channel_need_redraw = FALSE;
@@ -476,7 +482,7 @@ free_unused_channels_contents(int copyID, int mask)
// point.
++safe_to_invoke_callback;
- for (ch = first_channel; ch != NULL; ch = ch->ch_next)
+ FOR_ALL_CHANNELS(ch)
if (!channel_still_useful(ch)
&& (ch->ch_copyID & mask) != (copyID & mask))
{
@@ -520,8 +526,7 @@ channel_fd2channel(sock_T fd, ch_part_T *partp)
ch_part_T part;
if (fd != INVALID_FD)
- for (channel = first_channel; channel != NULL;
- channel = channel->ch_next)
+ FOR_ALL_CHANNELS(channel)
{
for (part = PART_SOCK; part < PART_IN; ++part)
if (channel->ch_part[part].ch_fd == fd)
@@ -662,7 +667,7 @@ channel_gui_register_all(void)
{
channel_T *channel;
- for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+ FOR_ALL_CHANNELS(channel)
channel_gui_register(channel);
}
@@ -1569,7 +1574,7 @@ channel_buffer_free(buf_T *buf)
channel_T *channel;
ch_part_T part;
- for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+ FOR_ALL_CHANNELS(channel)
for (part = PART_SOCK; part < PART_COUNT; ++part)
{
chanpart_T *ch_part = &channel->ch_part[part];
@@ -1610,7 +1615,7 @@ channel_write_any_lines(void)
{
channel_T *channel;
- for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+ FOR_ALL_CHANNELS(channel)
channel_write_input(channel);
}
@@ -1625,7 +1630,7 @@ channel_write_new_lines(buf_T *buf)
// There could be more than one channel for the buffer, loop over all of
// them.
- for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+ FOR_ALL_CHANNELS(channel)
{
chanpart_T *in_part = &channel->ch_part[PART_IN];
linenr_T lnum;
@@ -2604,7 +2609,7 @@ append_to_buffer(buf_T *buffer, char_u *msg, channel_T *channel, ch_part_T part)
// Find channels reading from this buffer and adjust their
// next-to-read line number.
buffer->b_write_to_channel = TRUE;
- for (ch = first_channel; ch != NULL; ch = ch->ch_next)
+ FOR_ALL_CHANNELS(ch)
{
chanpart_T *in_part = &ch->ch_part[PART_IN];
@@ -3180,7 +3185,7 @@ channel_free_all(void)
channel_T *channel;
ch_log(NULL, "channel_free_all()");
- for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+ FOR_ALL_CHANNELS(channel)
channel_clear(channel);
}
#endif
@@ -3202,7 +3207,7 @@ channel_fill_wfds(int maxfd_arg, fd_set *wfds)
int maxfd = maxfd_arg;
channel_T *ch;
- for (ch = first_channel; ch != NULL; ch = ch->ch_next)
+ FOR_ALL_CHANNELS(ch)
{
chanpart_T *in_part = &ch->ch_part[PART_IN];
@@ -3227,7 +3232,7 @@ channel_fill_poll_write(int nfd_in, struct pollfd *fds)
int nfd = nfd_in;
channel_T *ch;
- for (ch = first_channel; ch != NULL; ch = ch->ch_next)
+ FOR_ALL_CHANNELS(ch)
{
chanpart_T *in_part = &ch->ch_part[PART_IN];
@@ -3821,7 +3826,7 @@ channel_handle_events(int only_keep_open)
ch_part_T part;
sock_T fd;
- for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+ FOR_ALL_CHANNELS(channel)
{
if (only_keep_open && !channel->ch_keep_open)
continue;
@@ -3854,7 +3859,7 @@ channel_any_keep_open()
{
channel_T *channel;
- for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+ FOR_ALL_CHANNELS(channel)
if (channel->ch_keep_open)
return TRUE;
return FALSE;
@@ -4234,7 +4239,7 @@ channel_poll_setup(int nfd_in, void *fds_in, int *towait)
struct pollfd *fds = fds_in;
ch_part_T part;
- for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+ FOR_ALL_CHANNELS(channel)
{
for (part = PART_SOCK; part < PART_IN; ++part)
{
@@ -4281,7 +4286,7 @@ channel_poll_check(int ret_in, void *fds_in)
int idx;
chanpart_T *in_part;
- for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+ FOR_ALL_CHANNELS(channel)
{
for (part = PART_SOCK; part < PART_IN; ++part)
{
@@ -4332,7 +4337,7 @@ channel_select_setup(
fd_set *wfds = wfds_in;
ch_part_T part;
- for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+ FOR_ALL_CHANNELS(channel)
{
for (part = PART_SOCK; part < PART_IN; ++part)
{
@@ -4381,7 +4386,7 @@ channel_select_check(int ret_in, void *rfds_in, void *wfds_in)
ch_part_T part;
chanpart_T *in_part;
- for (channel = first_channel; channel != NULL; channel = channel->ch_next)
+ FOR_ALL_CHANNELS(channel)
{
for (part = PART_SOCK; part < PART_IN; ++part)
{
@@ -5471,7 +5476,7 @@ job_any_running()
{
job_T *job;
- for (job = first_job; job != NULL; job = job->jv_next)
+ FOR_ALL_JOBS(job)
if (job_still_useful(job))
{
ch_log(NULL, "GUI not forking because a job is running");
@@ -5570,7 +5575,7 @@ win32_build_cmd(list_T *l, garray_T *gap)
char_u *s;
range_list_materialize(l);
- for (li = l->lv_first; li != NULL; li = li->li_next)
+ FOR_ALL_LIST_ITEMS(l, li)
{
s = tv_get_string_chk(&li->li_tv);
if (s == NULL)
@@ -5695,7 +5700,7 @@ free_unused_jobs_contents(int copyID, int mask)
int did_free = FALSE;
job_T *job;
- for (job = first_job; job != NULL; job = job->jv_next)
+ FOR_ALL_JOBS(job)
if ((job->jv_copyID & mask) != (copyID & mask)
&& !job_still_useful(job))
{
@@ -5781,7 +5786,7 @@ job_stop_on_exit(void)
{
job_T *job;
- for (job = first_job; job != NULL; job = job->jv_next)
+ FOR_ALL_JOBS(job)
if (job->jv_status == JOB_STARTED && job->jv_stoponexit != NULL)
mch_signal_job(job, job->jv_stoponexit);
}
@@ -5795,7 +5800,7 @@ has_pending_job(void)
{
job_T *job;
- for (job = first_job; job != NULL; job = job->jv_next)
+ FOR_ALL_JOBS(job)
// Only should check if the channel has been closed, if the channel is
// open the job won't exit.
if ((job->jv_status == JOB_STARTED && !job_channel_still_useful(job))
@@ -6589,7 +6594,7 @@ job_info_all(list_T *l)
job_T *job;
typval_T tv;
- for (job = first_job; job != NULL; job = job->jv_next)
+ FOR_ALL_JOBS(job)
{
tv.v_type = VAR_JOB;
tv.vval.v_job = job;
diff --git a/src/cmdexpand.c b/src/cmdexpand.c
index 1f70dc58e4..4f9b3cad0c 100644
--- a/src/cmdexpand.c
+++ b/src/cmdexpand.c
@@ -2587,7 +2587,7 @@ ExpandUserList(
ga_init2(&ga, (int)sizeof(char *), 3);
// Loop over the items in the list.
- for (li = retlist->lv_first; li != NULL; li = li->li_next)
+ FOR_ALL_LIST_ITEMS(retlist, li)
{
if (li->li_tv.v_type != VAR_STRING || li->li_tv.vval.v_string == NULL)
continue; // Skip non-string items and empty strings
diff --git a/src/diff.c b/src/diff.c
index f996904543..3d61d49d1c 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -90,6 +90,9 @@ static int parse_diff_ed(char_u *line, linenr_T *lnum_orig, long *count_orig, li
static int parse_diff_unified(char_u *line, linenr_T *lnum_orig, long *count_orig, linenr_T *lnum_new, long *count_new);
static int xdiff_out(void *priv, mmbuffer_t *mb, int nbuf);
+#define FOR_ALL_DIFFBLOCKS_IN_TAB(tp, dp) \
+ for ((dp) = (tp)->tp_first_diff; (dp) != NULL; (dp) = (dp)->df_next)
+
/*
* Called when deleting or unloading a buffer: No longer make a diff with it.
*/
@@ -1857,7 +1860,7 @@ diff_check(win_T *wp, linenr_T lnum)
#endif
// search for a change that includes "lnum" in the list of diffblocks.
- for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next)
+ FOR_ALL_DIFFBLOCKS_IN_TAB(curtab, dp)
if (lnum <= dp->df_lnum[idx] + dp->df_count[idx])
break;
if (dp == NULL || lnum < dp->df_lnum[idx])
@@ -2069,7 +2072,7 @@ diff_set_topline(win_T *fromwin, win_T *towin)
towin->w_topfill = 0;
// search for a change that includes "lnum" in the list of diffblocks.
- for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next)
+ FOR_ALL_DIFFBLOCKS_IN_TAB(curtab, dp)
if (lnum <= dp->df_lnum[fromidx] + dp->df_count[fromidx])
break;
if (dp == NULL)
@@ -2374,7 +2377,7 @@ diff_find_change(
}
// search for a change that includes "lnum" in the list of diffblocks.
- for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next)
+ FOR_ALL_DIFFBLOCKS_IN_TAB(curtab, dp)
if (lnum <= dp->df_lnum[idx] + dp->df_count[idx])
break;
if (dp == NULL || diff_check_sanity(curtab, dp) == FAIL)
@@ -2508,7 +2511,7 @@ diff_infold(win_T *wp, linenr_T lnum)
if (curtab->tp_first_diff == NULL)
return TRUE;
- for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next)
+ FOR_ALL_DIFFBLOCKS_IN_TAB(curtab, dp)
{
// If this change is below the line there can't be any further match.
if (dp->df_lnum[idx] - diff_context > lnum)
@@ -3001,7 +3004,7 @@ diff_get_corresponding_line_int(
if (curtab->tp_first_diff == NULL) // no diffs today
return lnum1;
- for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next)
+ FOR_ALL_DIFFBLOCKS_IN_TAB(curtab, dp)
{
if (dp->df_lnum[idx1] > lnum1)
return lnum1 - baseline;
@@ -3070,7 +3073,7 @@ diff_lnum_win(linenr_T lnum, win_T *wp)
ex_diffupdate(NULL); // update after a big change
// search for a change that includes "lnum" in the list of diffblocks.
- for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next)
+ FOR_ALL_DIFFBLOCKS_IN_TAB(curtab, dp)
if (lnum <= dp->df_lnum[idx] + dp->df_count[idx])
break;
diff --git a/src/eval.c b/src/eval.c
index 78673759c1..6d666e6121 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -3973,11 +3973,11 @@ garbage_collect(int testing)
abort = abort || set_ref_in_item(&aucmd_win->w_winvar.di_tv, copyID,
NULL, NULL);
#ifdef FEAT_PROP_POPUP
- for (wp = first_popupwin; wp != NULL; wp = wp->w_next)
+ FOR_ALL_POPUPWINS(wp)
abort = abort || set_ref_in_item(&wp->w_winvar.di_tv, copyID,
NULL, NULL);
FOR_ALL_TABPAGES(tp)
- for (wp = tp->tp_first_popupwin; wp != NULL; wp = wp->w_next)
+ FOR_ALL_POPUPWINS_IN_TAB(tp, wp)
abort = abort || set_ref_in_item(&wp->w_winvar.di_tv, copyID,
NULL, NULL);
#endif
diff --git a/src/evalbuffer.c b/src/evalbuffer.c
index de6af6ad13..2c20939bd4 100644
--- a/src/evalbuffer.c
+++ b/src/evalbuffer.c
@@ -117,7 +117,7 @@ find_win_for_curbuf(void)
{
wininfo_T *wip;
- for (wip = curbuf->b_wininfo; wip != NULL; wip = wip->wi_next)
+ FOR_ALL_BUF_WININFO(curbuf, wip)
{
if (wip->wi_win != NULL)
{
@@ -572,11 +572,11 @@ get_buffer_info(buf_T *buf)
windows = list_alloc();
if (windows != NULL)
{
- for (wp = first_popupwin; wp != NULL; wp = wp->w_next)
+ FOR_ALL_POPUPWINS(wp)
if (wp->w_buffer == buf)
list_append_number(windows, (varnumber_T)wp->w_id);
FOR_ALL_TABPAGES(tp)
- for (wp = tp->tp_first_popupwin; wp != NULL; wp = wp->w_next)
+ FOR_ALL_POPUPWINS_IN_TAB(tp, wp)
if (wp->w_buffer == buf)
list_append_number(windows, (varnumber_T)wp->w_id);
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 6832bf1714..0db848cb35 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -2831,8 +2831,7 @@ common_function(typval_T *argvars, typval_T *rettv, int is_funcref)
if (lv_len > 0)
{
range_list_materialize(list);
- for (li = list->lv_first; li != NULL;
- li = li->li_next)
+ FOR_ALL_LIST_ITEMS(list, li)
copy_tv(&li->li_tv, &pt->pt_argv[i++]);
}
}
@@ -5021,7 +5020,7 @@ f_inputlist(typval_T *argvars, typval_T *rettv)
l = argvars[0].vval.v_list;
range_list_materialize(l);
- for (li = l->lv_first; li != NULL; li = li->li_next)
+ FOR_ALL_LIST_ITEMS(argvars[0].vval.v_list, li)
{
msg_puts((char *)tv_get_string(&li->li_tv));
msg_putchar('\n');
diff --git a/src/evalvars.c b/src/evalvars.c
index 35d038db37..7e408864ff 100644
--- a/src/evalvars.c
+++ b/src/evalvars.c
@@ -1698,7 +1698,7 @@ item_lock(typval_T *tv, int deep, int lock)
l->lv_lock &= ~VAR_LOCKED;
if ((deep < 0 || deep > 1) && l->lv_first != &range_list_item)
// recursive: lock/unlock the items the List contains
- for (li = l->lv_first; li != NULL; li = li->li_next)
+ FOR_ALL_LIST_ITEMS(l, li)
item_lock(&li->li_tv, deep - 1, lock);
}
break;
diff --git a/src/evalwindow.c b/src/evalwindow.c
index 534a047e69..ab4ba838f5 100644
--- a/src/evalwindow.c
+++ b/src/evalwindow.c
@@ -106,14 +106,14 @@ win_id2wp_tp(int id, tabpage_T **tpp)
#ifdef FEAT_PROP_POPUP
// popup windows are in separate lists
FOR_ALL_TABPAGES(tp)
- for (wp = tp->tp_first_popupwin; wp != NULL; wp = wp->w_next)
+ FOR_ALL_POPUPWINS_IN_TAB(tp, wp)
if (wp->w_id == id)
{
if (tpp != NULL)
*tpp = tp;
return wp;
}
- for (wp = first_popupwin; wp != NULL; wp = wp->w_next)
+ FOR_ALL_POPUPWINS(wp)
if (wp->w_id == id)
{
if (tpp != NULL)
@@ -188,7 +188,7 @@ find_win_by_nr(
if (wp->w_id == nr)
return wp;
// check global popup windows
- for (wp = first_popupwin; wp != NULL; wp = wp->w_next)
+ FOR_ALL_POPUPWINS(wp)
if (wp->w_id == nr)
return wp;
#endif
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index bbaff391e4..59f04a59a8 100644
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -303,7 +303,7 @@ check_changed_any(
// buffers in other tabs
FOR_ALL_TABPAGES(tp)
if (tp != curtab)
- for (wp = tp->tp_firstwin; wp != NULL; wp = wp->w_next)
+ FOR_ALL_WINDOWS_IN_TAB(tp, wp)
add_bufnum(bufnrs, &bufnum, wp->w_buffer->b_fnum);
// any other buffer
@@ -477,7 +477,7 @@ ex_listdo(exarg_T *eap)
// great speed improvement.
save_ei = au_event_disable(",Syntax");
- for (buf = firstbuf; buf != NULL; buf = buf->b_next)
+ FOR_ALL_BUFFERS(buf)
buf->b_flags &= ~BF_SYN_SET;
buf = curbuf;
}
diff --git a/src/filepath.c b/src/filepath.c
index 49b814fab7..37455a2569 100644
--- a/src/filepath.c
+++ b/src/filepath.c
@@ -1917,7 +1917,7 @@ f_writefile(typval_T *argvars, typval_T *rettv)
if (list == NULL)
return;
range_list_materialize(list);
- for (li = list->lv_first; li != NULL; li = li->li_next)
+ FOR_ALL_LIST_ITEMS(list, li)
if (tv_get_string_chk(&li->li_tv) == NULL)
return;
}
diff --git a/src/globals.h b/src/globals.h
index 290f07dd5e..ac48a793d1 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -676,6 +676,11 @@ EXTERN win_T *prevwin INIT(= NULL); // previous window
for ((wp) = ((tp) == curtab) \
? firstwin : (tp)->tp_firstwin; (wp); (wp) = (wp)->w_next)
+#define FOR_ALL_POPUPWINS(wp) \
+ for ((wp) = first_popupwin; (wp) != NULL; (wp) = (wp)->w_next)
+#define FOR_ALL_POPUPWINS_IN_TAB(tp, wp) \
+ for ((wp) = (tp)->tp_first_popupwin; (wp) != NULL; (wp) = (wp)->w_next)
+
EXTERN win_T *curwin; // currently active window
@@ -716,6 +721,9 @@ EXTERN buf_T *curbuf INIT(= NULL); // currently active buffer
#define FOR_ALL_BUFFERS(buf) for (buf = firstbuf; buf != NULL; buf = buf->b_next)
+#define FOR_ALL_BUF_WININFO(buf, wip) \
+ for ((wip) = (buf)->b_wininfo; (wip) != NULL; (wip) = (wip)->wi_next)
+
// Iterate through all the signs placed in a buffer
#define FOR_ALL_SIGNS_IN_BUF(buf, sign) \
for (sign = buf->b_signlist; sign != NULL; sign = sign->se_next)
@@ -1469,6 +1477,9 @@ EXTERN disptick_T display_tick INIT(= 0);
// Line in which spell checking wasn't highlighted because it touched the
// cursor position in Insert mode.
EXTERN linenr_T spell_redraw_lnum INIT(= 0);
+
+#define FOR_ALL_SPELL_LANGS(slang) \
+ for ((slang) = first_lang; (slang) != NULL; (slang) = slang->sl_next)
#endif
#ifdef FEAT_CONCEAL
@@ -1822,3 +1833,6 @@ EXTERN int did_repeated_msg INIT(= 0);
# define REPEATED_MSG_LOOKING 1
# define REPEATED_MSG_SAFESTATE 2
#endif
+
+#define FOR_ALL_LIST_ITEMS(l, li) \
+ for ((li) = (l)->lv_first; (li) != NULL; (li) = (li)->li_next)
diff --git a/src/gui.c b/src/gui.c
index 85e4628e71..2d6008146d 100644
--- a/src/gui.c
+++ b/src/gui.c
@@ -4189,7 +4189,7 @@ gui_update_scrollbars(
// avoid that moving components around generates events
++hold_gui_events;
- for (wp = firstwin; wp != NULL; wp = W_NEXT(wp))
+ FOR_ALL_WINDOWS(wp)
{
if (wp->w_buffer == NULL) // just in case
continue;
diff --git a/src/if_py_both.h b/src/if_py_both.h
index c4d82e7f71..0d70de2309 100644
--- a/src/if_py_both.h
+++ b/src/if_py_both.h
@@ -786,7 +786,7 @@ VimToPython(typval_T *our_tv, int depth, PyObject *lookup_dict)
}
range_list_materialize(list);
- for (curr = list->lv_first; curr != NULL; curr = curr->li_next)
+ FOR_ALL_LIST_ITEMS(list, curr)
{
if (!(newObj = VimToPython(&curr->li_tv, depth + 1, lookup_dict)))
{
@@ -3035,7 +3035,7 @@ FunctionConstructor(PyTypeObject *subtype, PyObject *args, PyObject *kwargs)
return NULL;
}
curtv = argv;
- for (li = argslist->lv_first; li != NULL; li = li->li_next)
+ FOR_ALL_LIST_ITEMS(argslist, li)
copy_tv(&li->li_tv, curtv++);
}
list_unref(argslist);
diff --git a/src/if_ruby.c b/src/if_ruby.c
index 80481e7d24..9b6d388a3c 100644
--- a/src/if_ruby.c
+++ b/src/if_ruby.c
@@ -1147,7 +1147,7 @@ vim_to_ruby(typval_T *tv)
if (list != NULL)
{
- for (curr = list->lv_first; curr != NULL; curr = curr->li_next)
+ FOR_ALL_LIST_ITEMS(list, curr)
rb_ary_push(result, vim_to_ruby(&curr->li_tv));
}
}
diff --git a/src/insexpand.c b/src/insexpand.c
index 0b2435f4ce..259acb91a5 100644
--- a/src/insexpand.c
+++ b/src/insexpand.c
@@ -2331,7 +2331,7 @@ ins_compl_add_list(list_T *list)
// Go through the List with matches and add each of them.
range_list_materialize(list);
- for (li = list->lv_first; li != NULL; li = li->li_next)
+ FOR_ALL_LIST_ITEMS(list, li)
{
if (ins_compl_add_tv(&li->li_tv, dir) == OK)
// if dir was BACKWARD then honor it just once
@@ -2513,7 +2513,7 @@ get_complete_info(list_T *what_list, dict_T *retdict)
{
what_flag = 0;
range_list_materialize(what_list);
- for (item = what_list->lv_first; item != NULL; item = item->li_next)
+ FOR_ALL_LIST_ITEMS(what_list, item)
{
char_u *what = tv_get_string(&item->li_tv);
diff --git a/src/list.c b/src/list.c
index 918626e169..a7f4d40f7e 100644
--- a/src/list.c
+++ b/src/list.c
@@ -1109,7 +1109,7 @@ write_list(FILE *fd, list_T *list, int binary)
char_u *s;
range_list_materialize(list);
- for (li = list->lv_first; li != NULL; li = li->li_next)
+ FOR_ALL_LIST_ITEMS(list, li)
{
for (s = tv_get_string(&li->li_tv); *s != NUL; ++s)
{
@@ -1207,7 +1207,7 @@ f_list2str(typval_T *argvars, typval_T *rettv)
else
char2bytes = mb_char2bytes;
- for (li = l->lv_first; li != NULL; li = li->li_next)
+ FOR_ALL_LIST_ITEMS(l, li)
{
buf[(*char2bytes)(tv_get_number(&li->li_tv), buf)] = NUL;
ga_concat(&ga, buf);
@@ -1216,7 +1216,7 @@ f_list2str(typval_T *argvars, typval_T *rettv)
}
else if (ga_grow(&ga, list_len(l) + 1) == OK)
{
- for (li = l->lv_first; li != NULL; li = li->li_next)
+ FOR_ALL_LIST_ITEMS(l, li)
ga_append(&ga, tv_get_number(&li->li_tv));
ga_append(&ga, NUL);
}
@@ -1579,7 +1579,7 @@ do_sort_uniq(typval_T *argvars, typval_T *rettv, int sort)
if (sort)
{
// sort(): ptrs will be the list to sort
- for (li = l->lv_first; li != NULL; li = li->li_next)
+ FOR_ALL_LIST_ITEMS(l, li)
{
ptrs[i].item = li;
ptrs[i].idx = i;
diff --git a/src/misc2.c b/src/misc2.c
index 864d1fd40b..4918189275 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -4348,7 +4348,7 @@ build_argv_from_list(list_T *l, char ***argv, int *argc)
if (*argv == NULL)
return FAIL;
*argc = 0;
- for (li = l->lv_first; li != NULL; li = li->li_next)
+ FOR_ALL_LIST_ITEMS(l, li)
{
s = tv_get_string_chk(&li->li_tv);
if (s == NULL)
diff --git a/src/netbeans.c b/src/netbeans.c
index f55f388e8a..4d79a2eafa 100644
--- a/src/netbeans.c
+++ b/src/netbeans.c
@@ -2982,7 +2982,7 @@ netbeans_is_guarded(linenr_T top, linenr_T bot)
if (!NETBEANS_OPEN)
return FALSE;
- for (p = curbuf->b_signlist; p != NULL; p = p->se_next)
+ FOR_ALL_SIGNS_IN_BUF(curbuf, p)
if (p->se_id >= GUARDEDOFFSET)
for (lnum = top + 1; lnum < bot; lnum++)
if (lnum == p->se_lnum)
@@ -3095,7 +3095,7 @@ netbeans_gutter_click(linenr_T lnum)
if (!NETBEANS_OPEN)
return;
- for (p = curbuf->b_signlist; p != NULL; p = p->se_next)
+ FOR_ALL_SIGNS_IN_BUF(curbuf, p)
{
if (p->se_lnum == lnum && p->se_next && p->se_next->se_lnum == lnum)
{
diff --git a/src/popupwin.c b/src/popupwin.c
index 947dd91bc1..3a0dcb96aa 100644
--- a/