# HG changeset patch # User Bram Moolenaar # Date 1585846805 -7200 # Node ID 435726a0348117f56bb7116ff2c5b1df24fc91f7 # Parent d03edd8c7e2f0ae2a2c7bc37faeed7faf395e4ba patch 8.2.0500: using the same loop in many places Commit: https://github.com/vim/vim/commit/aeea72151c31d686bcbb7b06d895006d7363585c Author: Bram Moolenaar Date: Thu Apr 2 18:50:46 2020 +0200 patch 8.2.0500: using the same loop in many places Problem: Using the same loop in many places. Solution: Define more FOR_ALL macros. (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/5339) diff --git a/src/arglist.c b/src/arglist.c --- 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 --- 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 *sfnam 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 --- 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 --- 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 --- a/src/channel.c +++ b/src/channel.c @@ -61,6 +61,12 @@ static ch_part_T channel_part_send(chann 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 // 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 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 * // 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 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, stru 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 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 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 *r 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, in 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 --- 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 --- a/src/diff.c +++ b/src/diff.c @@ -90,6 +90,9 @@ static int parse_diff_ed(char_u *line, l 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->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 --- 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 --- 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 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -2831,8 +2831,7 @@ common_function(typval_T *argvars, typva 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 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 --- a/src/evalvars.c +++ b/src/evalvars.c @@ -1698,7 +1698,7 @@ item_lock(typval_T *tv, int deep, int lo 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 --- 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 --- 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 --- a/src/filepath.c +++ b/src/filepath.c @@ -1917,7 +1917,7 @@ f_writefile(typval_T *argvars, typval_T 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 --- a/src/globals.h +++ b/src/globals.h @@ -676,6 +676,11 @@ EXTERN win_T *prevwin INIT(= NULL); // p 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); // cu #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 --- 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 --- a/src/if_py_both.h +++ b/src/if_py_both.h @@ -786,7 +786,7 @@ VimToPython(typval_T *our_tv, int depth, } 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 *subtyp 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 --- 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 --- 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, dic { 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 --- a/src/list.c +++ b/src/list.c @@ -1109,7 +1109,7 @@ write_list(FILE *fd, list_T *list, int b 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 * 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 * } 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 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 --- a/src/misc2.c +++ b/src/misc2.c @@ -4348,7 +4348,7 @@ build_argv_from_list(list_T *l, char *** 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 --- a/src/netbeans.c +++ b/src/netbeans.c @@ -2982,7 +2982,7 @@ netbeans_is_guarded(linenr_T top, linenr 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 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -835,8 +835,7 @@ apply_general_options(win_T *wp, dict_T listitem_T *li; ok = TRUE; - for (li = di->di_tv.vval.v_list->lv_first; li != NULL; - li = li->li_next) + FOR_ALL_LIST_ITEMS(di->di_tv.vval.v_list, li) { if (li->li_tv.v_type != VAR_LIST || li->li_tv.vval.v_list == NULL @@ -967,7 +966,7 @@ add_popup_strings(buf_T *buf, list_T *l) linenr_T lnum = 0; char_u *p; - for (li = l->lv_first; li != NULL; li = li->li_next) + FOR_ALL_LIST_ITEMS(l, li) if (li->li_tv.v_type == VAR_STRING) { p = li->li_tv.vval.v_string; @@ -989,7 +988,7 @@ add_popup_dicts(buf_T *buf, list_T *l) dict_T *dict; // first add the text lines - for (li = l->lv_first; li != NULL; li = li->li_next) + FOR_ALL_LIST_ITEMS(l, li) { if (li->li_tv.v_type != VAR_DICT) { @@ -1022,7 +1021,7 @@ add_popup_dicts(buf_T *buf, list_T *l) plist = di->di_tv.vval.v_list; if (plist != NULL) { - for (pli = plist->lv_first; pli != NULL; pli = pli->li_next) + FOR_ALL_LIST_ITEMS(plist, pli) { if (pli->li_tv.v_type != VAR_DICT) { @@ -2881,12 +2880,12 @@ f_popup_getoptions(typval_T *argvars, ty { win_T *twp; - for (twp = tp->tp_first_popupwin; twp != NULL; twp = twp->w_next) - if (twp->w_id == id) - break; - if (twp != NULL) - break; - ++i; + FOR_ALL_POPUPWINS_IN_TAB(tp, twp) + if (twp->w_id == id) + break; + if (twp != NULL) + break; + ++i; } if (tp == NULL) i = -1; // must be global @@ -2954,9 +2953,9 @@ popup_reset_handled(int handled_flag) { win_T *wp; - for (wp = first_popupwin; wp != NULL; wp = wp->w_next) + FOR_ALL_POPUPWINS(wp) wp->w_popup_handled &= ~handled_flag; - for (wp = curtab->tp_first_popupwin; wp != NULL; wp = wp->w_next) + FOR_ALL_POPUPWINS_IN_TAB(curtab, wp) wp->w_popup_handled &= ~handled_flag; } @@ -2975,7 +2974,7 @@ find_next_popup(int lowest, int handled_ found_zindex = lowest ? INT_MAX : 0; found_wp = NULL; - for (wp = first_popupwin; wp != NULL; wp = wp->w_next) + FOR_ALL_POPUPWINS(wp) if ((wp->w_popup_handled & handled_flag) == 0 && (wp->w_popup_flags & POPF_HIDDEN) == 0 && (lowest ? wp->w_zindex < found_zindex @@ -2984,7 +2983,7 @@ find_next_popup(int lowest, int handled_ found_zindex = wp->w_zindex; found_wp = wp; } - for (wp = curtab->tp_first_popupwin; wp != NULL; wp = wp->w_next) + FOR_ALL_POPUPWINS_IN_TAB(curtab, wp) if ((wp->w_popup_handled & handled_flag) == 0 && (wp->w_popup_flags & POPF_HIDDEN) == 0 && (lowest ? wp->w_zindex < found_zindex @@ -3157,7 +3156,7 @@ popup_update_mask(win_T *wp, int width, return; cells = wp->w_popup_mask_cells; - for (lio = wp->w_popup_mask->lv_first; lio != NULL; lio = lio->li_next) + FOR_ALL_LIST_ITEMS(wp->w_popup_mask, lio) { int cols, cole; int lines, linee; @@ -3215,7 +3214,7 @@ update_popup_transparent(win_T *wp, int int lines, linee; int col, line; - for (lio = wp->w_popup_mask->lv_first; lio != NULL; lio = lio->li_next) + FOR_ALL_LIST_ITEMS(wp->w_popup_mask, lio) { li = lio->li_tv.vval.v_list->lv_first; cols = tv_get_number(&li->li_tv); @@ -3325,12 +3324,12 @@ may_update_popup_mask(int type) // Check if any popup window buffer has changed and if any popup connected // to a text property has become visible. - for (wp = first_popupwin; wp != NULL; wp = wp->w_next) + FOR_ALL_POPUPWINS(wp) if (wp->w_popup_flags & POPF_HIDDEN) popup_mask_refresh |= check_popup_unhidden(wp); else if (popup_need_position_adjust(wp)) popup_mask_refresh = TRUE; - for (wp = curtab->tp_first_popupwin; wp != NULL; wp = wp->w_next) + FOR_ALL_POPUPWINS_IN_TAB(curtab, wp) if (wp->w_popup_flags & POPF_HIDDEN) popup_mask_refresh |= check_popup_unhidden(wp); else if (popup_need_position_adjust(wp)) @@ -3838,7 +3837,7 @@ popup_find_preview_window(void) win_T *wp; // Preview window popup is always local to tab page. - for (wp = curtab->tp_first_popupwin; wp != NULL; wp = wp->w_next) + FOR_ALL_POPUPWINS_IN_TAB(curtab, wp) if (wp->w_p_pvw) return wp; return NULL; @@ -3854,7 +3853,7 @@ popup_find_info_window(void) win_T *wp; // info window popup is always local to tab page. - for (wp = curtab->tp_first_popupwin; wp != NULL; wp = wp->w_next) + FOR_ALL_POPUPWINS_IN_TAB(curtab, wp) if (wp->w_popup_flags & POPF_INFO) return wp; return NULL; diff --git a/src/quickfix.c b/src/quickfix.c --- a/src/quickfix.c +++ b/src/quickfix.c @@ -6911,7 +6911,7 @@ qf_add_entries( qf_store_title(qfl, title); } - for (li = list->lv_first; li != NULL; li = li->li_next) + FOR_ALL_LIST_ITEMS(list, li) { if (li->li_tv.v_type != VAR_DICT) continue; // Skip non-dict items diff --git a/src/screen.c b/src/screen.c --- a/src/screen.c +++ b/src/screen.c @@ -2572,11 +2572,11 @@ retry: win_free_lsize(aucmd_win); #ifdef FEAT_PROP_POPUP // global popup windows - for (wp = first_popupwin; wp != NULL; wp = wp->w_next) + FOR_ALL_POPUPWINS(wp) win_free_lsize(wp); // tab-local popup windows FOR_ALL_TABPAGES(tp) - for (wp = tp->tp_first_popupwin; wp != NULL; wp = wp->w_next) + FOR_ALL_POPUPWINS_IN_TAB(tp, wp) win_free_lsize(wp); #endif @@ -2614,7 +2614,7 @@ retry: outofmem = TRUE; #ifdef FEAT_PROP_POPUP // global popup windows - for (wp = first_popupwin; wp != NULL; wp = wp->w_next) + FOR_ALL_POPUPWINS(wp) if (win_alloc_lines(wp) == FAIL) { outofmem = TRUE; @@ -2622,7 +2622,7 @@ retry: } // tab-local popup windows FOR_ALL_TABPAGES(tp) - for (wp = tp->tp_first_popupwin; wp != NULL; wp = wp->w_next) + FOR_ALL_POPUPWINS_IN_TAB(tp, wp) if (win_alloc_lines(wp) == FAIL) { outofmem = TRUE; diff --git a/src/sign.c b/src/sign.c --- a/src/sign.c +++ b/src/sign.c @@ -57,6 +57,9 @@ static char *cmds[] = { # define SIGNCMD_LAST 6 }; +#define FOR_ALL_SIGNS(sp) \ + for ((sp) = first_sign; (sp) != NULL; (sp) = (sp)->sn_next) + static hashtab_T sg_table; // sign group (signgroup_T) hashtable static int next_sign_id = 1; // next sign id in the global group @@ -294,7 +297,7 @@ find_sign_by_typenr(int typenr) { sign_T *sp; - for (sp = first_sign; sp != NULL; sp = sp->sn_next) + FOR_ALL_SIGNS(sp) if (sp->sn_typenr == typenr) return sp; return NULL; @@ -308,7 +311,7 @@ sign_typenr2name(int typenr) { sign_T *sp; - for (sp = first_sign; sp != NULL; sp = sp->sn_next) + FOR_ALL_SIGNS(sp) if (sp->sn_typenr == typenr) return sp->sn_name; return (char_u *)_("[Deleted]"); @@ -880,7 +883,7 @@ sign_find(char_u *name, sign_T **sp_prev if (sp_prev != NULL) *sp_prev = NULL; - for (sp = first_sign; sp != NULL; sp = sp->sn_next) + FOR_ALL_SIGNS(sp) { if (STRCMP(sp->sn_name, name) == 0) break; @@ -1153,7 +1156,7 @@ sign_place( if (sign_group != NULL && (*sign_group == '*' || *sign_group == '\0')) return FAIL; - for (sp = first_sign; sp != NULL; sp = sp->sn_next) + FOR_ALL_SIGNS(sp) if (STRCMP(sp->sn_name, sign_name) == 0) break; if (sp == NULL) @@ -1830,7 +1833,7 @@ sign_gui_started(void) { sign_T *sp; - for (sp = first_sign; sp != NULL; sp = sp->sn_next) + FOR_ALL_SIGNS(sp) if (sp->sn_icon != NULL) sp->sn_image = gui_mch_register_sign(sp->sn_icon); } @@ -1911,7 +1914,7 @@ sign_get_image( { sign_T *sp; - for (sp = first_sign; sp != NULL; sp = sp->sn_next) + FOR_ALL_SIGNS(sp) if (sp->sn_typenr == typenr) return sp->sn_image; return NULL; @@ -1950,7 +1953,7 @@ get_nth_sign_name(int idx) // Complete with name of signs already defined current_idx = 0; - for (sp = first_sign; sp != NULL; sp = sp->sn_next) + FOR_ALL_SIGNS(sp) if (current_idx++ == idx) return sp->sn_name; return NULL; @@ -2212,7 +2215,7 @@ sign_define_multiple(list_T *l, list_T * listitem_T *li; int retval; - for (li = l->lv_first; li != NULL; li = li->li_next) + FOR_ALL_LIST_ITEMS(l, li) { retval = -1; if (li->li_tv.v_type == VAR_DICT) @@ -2547,7 +2550,7 @@ f_sign_placelist(typval_T *argvars, typv } // Process the List of sign attributes - for (li = argvars[0].vval.v_list->lv_first; li != NULL; li = li->li_next) + FOR_ALL_LIST_ITEMS(argvars[0].vval.v_list, li) { sign_id = -1; if (li->li_tv.v_type == VAR_DICT) @@ -2569,7 +2572,7 @@ sign_undefine_multiple(list_T *l, list_T listitem_T *li; int retval; - for (li = l->lv_first; li != NULL; li = li->li_next) + FOR_ALL_LIST_ITEMS(l, li) { retval = -1; name = tv_get_string_chk(&li->li_tv); @@ -2765,7 +2768,7 @@ f_sign_unplacelist(typval_T *argvars, ty return; } - for (li = argvars[0].vval.v_list->lv_first; li != NULL; li = li->li_next) + FOR_ALL_LIST_ITEMS(argvars[0].vval.v_list, li) { retval = -1; if (li->li_tv.v_type == VAR_DICT) diff --git a/src/spell.c b/src/spell.c --- a/src/spell.c +++ b/src/spell.c @@ -2031,7 +2031,7 @@ did_set_spelllang(win_T *wp) dont_use_region = TRUE; // Check if we loaded this language before. - for (slang = first_lang; slang != NULL; slang = slang->sl_next) + FOR_ALL_SPELL_LANGS(slang) if (fullpathcmp(lang, slang->sl_fname, FALSE, TRUE) == FPC_SAME) break; } @@ -2048,7 +2048,7 @@ did_set_spelllang(win_T *wp) dont_use_region = TRUE; // Check if we loaded this language before. - for (slang = first_lang; slang != NULL; slang = slang->sl_next) + FOR_ALL_SPELL_LANGS(slang) if (STRICMP(lang, slang->sl_name) == 0) break; } @@ -2083,7 +2083,7 @@ did_set_spelllang(win_T *wp) /* * Loop over the languages, there can be several files for "lang". */ - for (slang = first_lang; slang != NULL; slang = slang->sl_next) + FOR_ALL_SPELL_LANGS(slang) if (filename ? fullpathcmp(lang, slang->sl_fname, FALSE, TRUE) == FPC_SAME : STRICMP(lang, slang->sl_name) == 0) @@ -2162,7 +2162,7 @@ did_set_spelllang(win_T *wp) } // Check if it was loaded already. - for (slang = first_lang; slang != NULL; slang = slang->sl_next) + FOR_ALL_SPELL_LANGS(slang) if (fullpathcmp(spf_name, slang->sl_fname, FALSE, TRUE) == FPC_SAME) break; diff --git a/src/spellfile.c b/src/spellfile.c --- a/src/spellfile.c +++ b/src/spellfile.c @@ -296,6 +296,12 @@ #define CF_WORD 0x01 #define CF_UPPER 0x02 +/* + * Loop through all the siblings of a node (including the node) + */ +#define FOR_ALL_NODE_SIBLINGS(node, np) \ + for ((np) = (node); (np) != NULL; (np) = (np)->wn_sibling) + static int set_spell_finish(spelltab_T *new_st); static int write_spell_prefcond(FILE *fd, garray_T *gap); static int read_region_section(FILE *fd, slang_T *slang, int len); @@ -1737,7 +1743,7 @@ spell_reload_one( slang_T *slang; int didit = FALSE; - for (slang = first_lang; slang != NULL; slang = slang->sl_next) + FOR_ALL_SPELL_LANGS(slang) { if (fullpathcmp(fname, slang->sl_fname, FALSE, TRUE) == FPC_SAME) { @@ -2081,7 +2087,7 @@ spell_clear_flags(wordnode_T *node) { wordnode_T *np; - for (np = node; np != NULL; np = np->wn_sibling) + FOR_ALL_NODE_SIBLINGS(node, np) { np->wn_u1.index = FALSE; spell_clear_flags(np->wn_child); @@ -4427,7 +4433,7 @@ tree_add_word( { --node->wn_refs; copyprev = prev; - for (copyp = node; copyp != NULL; copyp = copyp->wn_sibling) + FOR_ALL_NODE_SIBLINGS(node, copyp) { // Allocate a new node and copy the info. np = get_wordnode(spin); @@ -4618,7 +4624,7 @@ deref_wordnode(spellinfo_T *spin, wordno if (--node->wn_refs == 0) { - for (np = node; np != NULL; np = np->wn_sibling) + FOR_ALL_NODE_SIBLINGS(node, np) { if (np->wn_child != NULL) cnt += deref_wordnode(spin, np->wn_child); @@ -4761,7 +4767,7 @@ node_compress( */ node->wn_u1.hashkey[0] = len; nr = 0; - for (np = node; np != NULL; np = np->wn_sibling) + FOR_ALL_NODE_SIBLINGS(node, np) { if (np->wn_byte == NUL) // end node: use wn_flags, wn_region and wn_affixID @@ -5252,7 +5258,7 @@ clear_node(wordnode_T *node) wordnode_T *np; if (node != NULL) - for (np = node; np != NULL; np = np->wn_sibling) + FOR_ALL_NODE_SIBLINGS(node, np) { np->wn_u1.index = 0; np->wn_u2.wnode = NULL; @@ -5296,7 +5302,7 @@ put_node( node->wn_u1.index = idx; // Count the number of siblings. - for (np = node; np != NULL; np = np->wn_sibling) + FOR_ALL_NODE_SIBLINGS(node, np) ++siblingcount; // Write the sibling count. @@ -5304,7 +5310,7 @@ put_node( putc(siblingcount, fd); // // Write each sibling byte and optionally extra info. - for (np = node; np != NULL; np = np->wn_sibling) + FOR_ALL_NODE_SIBLINGS(node, np) { if (np->wn_byte == 0) { @@ -5392,7 +5398,7 @@ put_node( newindex += siblingcount + 1; // Recursively dump the children of each sibling. - for (np = node; np != NULL; np = np->wn_sibling) + FOR_ALL_NODE_SIBLINGS(node, np) if (np->wn_byte != 0 && np->wn_child->wn_u2.wnode == node) newindex = put_node(fd, np->wn_child, newindex, regionmask, prefixtree); @@ -5447,7 +5453,7 @@ spell_make_sugfile(spellinfo_T *spin, ch * of the code for the soundfolding stuff. * It might have been done already by spell_reload_one(). */ - for (slang = first_lang; slang != NULL; slang = slang->sl_next) + FOR_ALL_SPELL_LANGS(slang) if (fullpathcmp(wfname, slang->sl_fname, FALSE, TRUE) == FPC_SAME) break; if (slang == NULL) @@ -5666,7 +5672,7 @@ sug_filltable( int nr; int prev_nr; - for (p = node; p != NULL; p = p->wn_sibling) + FOR_ALL_NODE_SIBLINGS(node, p) { if (p->wn_byte == NUL) { diff --git a/src/spellsuggest.c b/src/spellsuggest.c --- a/src/spellsuggest.c +++ b/src/spellsuggest.c @@ -887,7 +887,7 @@ spell_suggest_expr(suginfo_T *su, char_u if (list != NULL) { // Loop over the items in the list. - for (li = list->lv_first; li != NULL; li = li->li_next) + FOR_ALL_LIST_ITEMS(list, li) if (li->li_tv.v_type == VAR_LIST) { // Get the word and the score from the items. diff --git a/src/tag.c b/src/tag.c --- a/src/tag.c +++ b/src/tag.c @@ -1358,7 +1358,7 @@ find_tagfunc_tags( } taglist = rettv.vval.v_list; - for (item = taglist->lv_first; item != NULL; item = item->li_next) + FOR_ALL_LIST_ITEMS(taglist, item) { char_u *mfp; char_u *res_name, *res_fname, *res_cmd, *res_kind; @@ -4191,7 +4191,7 @@ tagstack_push_items(win_T *wp, list_T *l int fnum; // Add one entry at a time to the tag stack - for (li = l->lv_first; li != NULL; li = li->li_next) + FOR_ALL_LIST_ITEMS(l, li) { if (li->li_tv.v_type != VAR_DICT || li->li_tv.vval.v_dict == NULL) continue; // Skip non-dict items diff --git a/src/terminal.c b/src/terminal.c --- a/src/terminal.c +++ b/src/terminal.c @@ -183,6 +183,9 @@ static BOOL has_conpty = FALSE; #define MAX_ROW 999999 // used for tl_dirty_row_end to update all rows #define KEY_BUF_LEN 200 +#define FOR_ALL_TERMS(term) \ + for ((term) = first_term; (term) != NULL; (term) = (term)->tl_next) + /* * Functions with separate implementation for MS-Windows and Unix-like systems. */ @@ -626,8 +629,7 @@ term_start( listitem_T *item; ga_init2(&ga, 1, 100); - for (item = argvar->vval.v_list->lv_first; - item != NULL; item = item->li_next) + FOR_ALL_LIST_ITEMS(argvar->vval.v_list, item) { char_u *s = tv_get_string_chk(&item->li_tv); char_u *p; @@ -1892,7 +1894,7 @@ term_check_timers(int next_due_arg, prof term_T *term; int next_due = next_due_arg; - for (term = first_term; term != NULL; term = term->tl_next) + FOR_ALL_TERMS(term) { if (term->tl_timer_set && !term->tl_normal_mode) { @@ -2175,7 +2177,7 @@ term_paste_register(int prev_c UNUSED) if (l != NULL) { type = get_reg_type(c, ®len); - for (item = l->lv_first; item != NULL; item = item->li_next) + FOR_ALL_LIST_ITEMS(l, item) { char_u *s = tv_get_string(&item->li_tv); #ifdef MSWIN @@ -5701,7 +5703,7 @@ f_term_list(typval_T *argvars UNUSED, ty return; l = rettv->vval.v_list; - for (tp = first_term; tp != NULL; tp = tp->tl_next) + FOR_ALL_TERMS(tp) if (tp != NULL && tp->tl_buffer != NULL) if (list_append_number(l, (varnumber_T)tp->tl_buffer->b_fnum) == FAIL) @@ -6077,7 +6079,7 @@ term_send_eof(channel_T *ch) { term_T *term; - for (term = first_term; term != NULL; term = term->tl_next) + FOR_ALL_TERMS(term) if (term->tl_job == ch->ch_job) { if (term->tl_eof_chars != NULL) diff --git a/src/userfunc.c b/src/userfunc.c --- a/src/userfunc.c +++ b/src/userfunc.c @@ -792,7 +792,7 @@ free_funccal_contents(funccall_T *fc) vars_clear(&fc->l_avars.dv_hashtab); // Free the a:000 variables. - for (li = fc->l_varlist.lv_first; li != NULL; li = li->li_next) + FOR_ALL_LIST_ITEMS(&fc->l_varlist, li) clear_tv(&li->li_tv); free_funccal(fc); @@ -851,7 +851,7 @@ cleanup_function_call(funccall_T *fc) free_fc = FALSE; // Make a copy of the a:000 items, since we didn't do that above. - for (li = fc->l_varlist.lv_first; li != NULL; li = li->li_next) + FOR_ALL_LIST_ITEMS(&fc->l_varlist, li) copy_tv(&li->li_tv, &li->li_tv); } @@ -1640,7 +1640,7 @@ func_call( int r = 0; range_list_materialize(l); - for (item = l->lv_first; item != NULL; item = item->li_next) + FOR_ALL_LIST_ITEMS(args->vval.v_list, item) { if (argc == MAX_FUNC_ARGS - (partial == NULL ? 0 : partial->pt_argc)) { diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -739,6 +739,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 500, +/**/ 499, /**/ 498, diff --git a/src/window.c b/src/window.c --- a/src/window.c +++ b/src/window.c @@ -1428,10 +1428,10 @@ win_valid_popup(win_T *win UNUSED) #ifdef FEAT_PROP_POPUP win_T *wp; - for (wp = first_popupwin; wp != NULL; wp = wp->w_next) + FOR_ALL_POPUPWINS(wp) if (wp == win) return TRUE; - for (wp = curtab->tp_first_popupwin; wp != NULL; wp = wp->w_next) + FOR_ALL_POPUPWINS_IN_TAB(curtab, wp) if (wp == win) return TRUE; #endif @@ -1473,7 +1473,7 @@ win_valid_any_tab(win_T *win) return TRUE; } #ifdef FEAT_PROP_POPUP - for (wp = tp->tp_first_popupwin; wp != NULL; wp = wp->w_next) + FOR_ALL_POPUPWINS_IN_TAB(tp, wp) if (wp == win) return TRUE; #endif @@ -2276,7 +2276,7 @@ close_windows( { nexttp = tp->tp_next; if (tp != curtab) - for (wp = tp->tp_firstwin; wp != NULL; wp = wp->w_next) + FOR_ALL_WINDOWS_IN_TAB(tp, wp) if (wp->w_buffer == buf && !(wp->w_closing || wp->w_buffer->b_locked > 0)) { @@ -4785,7 +4785,7 @@ buf_jump_open_tab(buf_T *buf) 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) if (wp->w_buffer == buf) break; if (wp != NULL) @@ -4968,7 +4968,7 @@ win_free( // Remove the window from the b_wininfo lists, it may happen that the // freed memory is re-used for another window. FOR_ALL_BUFFERS(buf) - for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next) + FOR_ALL_BUF_WININFO(buf, wip) if (wip->wi_win == wp) wip->wi_win = NULL;