]> granicus.if.org Git - vim/commitdiff
patch 8.2.0523: loops are repeated v8.2.0523
authorBram Moolenaar <Bram@vim.org>
Mon, 6 Apr 2020 20:13:01 +0000 (22:13 +0200)
committerBram Moolenaar <Bram@vim.org>
Mon, 6 Apr 2020 20:13:01 +0000 (22:13 +0200)
Problem:    Loops are repeated.
Solution:   Use FOR_ALL_ macros. (Yegappan Lakshmanan, closes #5882)

19 files changed:
src/buffer.c
src/drawscreen.c
src/evalfunc.c
src/evalwindow.c
src/globals.h
src/gui_athena.c
src/gui_gtk.c
src/gui_motif.c
src/gui_w32.c
src/list.c
src/menu.c
src/popupmenu.c
src/popupwin.c
src/quickfix.c
src/syntax.c
src/time.c
src/userfunc.c
src/version.c
src/vim9compile.c

index 8201157547c4e6791ac5811d3f0f90040ae95265..a657e72422eed2365058af72d9374d078b6f8d39 100644 (file)
@@ -52,6 +52,9 @@ static void   clear_wininfo(buf_T *buf);
 # define dev_T unsigned
 #endif
 
+#define FOR_ALL_BUFS_FROM_LAST(buf) \
+    for ((buf) = lastbuf; (buf) != NULL; (buf) = (buf)->b_prev)
+
 #if defined(FEAT_QUICKFIX)
 static char *msg_loclist = N_("[Location List]");
 static char *msg_qflist = N_("[Quickfix List]");
@@ -415,7 +418,7 @@ buf_valid(buf_T *buf)
 
     // Assume that we more often have a recent buffer, start with the last
     // one.
-    for (bp = lastbuf; bp != NULL; bp = bp->b_prev)
+    FOR_ALL_BUFS_FROM_LAST(bp)
        if (bp == buf)
            return TRUE;
     return FALSE;
@@ -2510,7 +2513,7 @@ buflist_findname_stat(
     buf_T      *buf;
 
     // Start at the last buffer, expect to find a match sooner.
-    for (buf = lastbuf; buf != NULL; buf = buf->b_prev)
+    FOR_ALL_BUFS_FROM_LAST(buf)
        if ((buf->b_flags & BF_DUMMY) == 0 && !otherfile_buf(buf, ffname
 #ifdef UNIX
                    , stp
@@ -2593,7 +2596,7 @@ buflist_findpat(
                    return -1;
                }
 
-               for (buf = lastbuf; buf != NULL; buf = buf->b_prev)
+               FOR_ALL_BUFS_FROM_LAST(buf)
                    if (buf->b_p_bl == find_listed
 #ifdef FEAT_DIFF
                            && (!diffmode || diff_mode_buf(buf))
index c60d75b3c36ac28f6f7a9d3ea706ab821db77bed..be4d6aa7ca122f5a5bed3bc287319d2f95424f03 100644 (file)
@@ -963,7 +963,7 @@ redraw_win_toolbar(win_T *wp)
     int                button_attr = syn_name2attr((char_u *)"ToolbarButton");
 
     vim_free(wp->w_winbar_items);
-    for (menu = wp->w_winbar->children; menu != NULL; menu = menu->next)
+    FOR_ALL_CHILD_MENUS(wp->w_winbar, menu)
        ++item_count;
     wp->w_winbar_items = ALLOC_CLEAR_MULT(winbar_item_T, item_count + 1);
 
index 3b8b319fde0d55b11442f62c1851f5f7e1b44fdf..45077f6cb1566b304dd331fc491d7082b5a68011 100644 (file)
@@ -5008,7 +5008,7 @@ f_inputlist(typval_T *argvars, typval_T *rettv)
 
     l = argvars[0].vval.v_list;
     range_list_materialize(l);
-    FOR_ALL_LIST_ITEMS(argvars[0].vval.v_list, li)
+    FOR_ALL_LIST_ITEMS(l, li)
     {
        msg_puts((char *)tv_get_string(&li->li_tv));
        msg_putchar('\n');
@@ -7317,7 +7317,7 @@ f_setreg(typval_T *argvars, typval_T *rettv)
        if (ll != NULL)
        {
            range_list_materialize(ll);
-           for (li = ll->lv_first; li != NULL; li = li->li_next)
+           FOR_ALL_LIST_ITEMS(ll, li)
            {
                strval = tv_get_string_buf_chk(&li->li_tv, buf);
                if (strval == NULL)
index ab4ba838f5a14b0a0a326cbaea350fb65d023823..0db45bc9c242fa2d2925e9fee4e8cdab021fd24a 100644 (file)
@@ -444,8 +444,7 @@ get_tabpage_info(tabpage_T *tp, int tp_idx)
     l = list_alloc();
     if (l != NULL)
     {
-       for (wp = (tp == curtab) ? firstwin : tp->tp_firstwin;
-                                                  wp != NULL; wp = wp->w_next)
+       FOR_ALL_WINDOWS_IN_TAB(tp, wp)
            list_append_number(l, (varnumber_T)wp->w_id);
        dict_add_list(dict, "windows", l);
     }
index 6f594e9132ba9ec9a167b26158a31a7af3df0a90..199a0c5e7ab53021e8f6f6aacbf0941586c17901 100644 (file)
@@ -574,6 +574,10 @@ EXTERN vimmenu_T   *root_menu INIT(= NULL);
  * overruling of menus that the user already defined.
  */
 EXTERN int     sys_menu INIT(= FALSE);
+
+#define FOR_ALL_MENUS(m) for ((m) = root_menu; (m) != NULL; (m) = (m)->next)
+#define FOR_ALL_CHILD_MENUS(p, c) \
+    for ((c) = (p)->children; (c) != NULL; (c) = (c)->next)
 #endif
 
 #ifdef FEAT_GUI
@@ -724,7 +728,8 @@ EXTERN buf_T        *firstbuf INIT(= NULL); // first buffer
 EXTERN buf_T   *lastbuf INIT(= NULL);  // last buffer
 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_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)
@@ -1484,7 +1489,7 @@ EXTERN disptick_T display_tick INIT(= 0);
 EXTERN linenr_T                spell_redraw_lnum INIT(= 0);
 
 #define FOR_ALL_SPELL_LANGS(slang) \
-    for ((slang) = first_lang; (slang) != NULL; (slang) = slang->sl_next)
+    for ((slang) = first_lang; (slang) != NULL; (slang) = (slang)->sl_next)
 #endif
 
 #ifdef FEAT_CONCEAL
@@ -1545,20 +1550,20 @@ EXTERN char e_font[]            INIT(= N_("E235: Unknown font: %s"));
 EXTERN char e_fontwidth[]      INIT(= N_("E236: Font \"%s\" is not fixed-width"));
 #endif
 EXTERN char e_internal[]       INIT(= N_("E473: Internal error"));
-EXTERN char e_intern2[]        INIT(= N_("E685: Internal error: %s"));
-EXTERN char e_interr[] INIT(= N_("Interrupted"));
-EXTERN char e_invarg[] INIT(= N_("E474: Invalid argument"));
-EXTERN char e_invarg2[]        INIT(= N_("E475: Invalid argument: %s"));
-EXTERN char e_duparg2[]        INIT(= N_("E983: Duplicate argument: %s"));
+EXTERN char e_intern2[]                INIT(= N_("E685: Internal error: %s"));
+EXTERN char e_interr[]         INIT(= N_("Interrupted"));
+EXTERN char e_invarg[]         INIT(= N_("E474: Invalid argument"));
+EXTERN char e_invarg2[]                INIT(= N_("E475: Invalid argument: %s"));
+EXTERN char e_duparg2[]                INIT(= N_("E983: Duplicate argument: %s"));
 EXTERN char e_invargval[]      INIT(= N_("E475: Invalid value for argument %s"));
 EXTERN char e_invargNval[]     INIT(= N_("E475: Invalid value for argument %s: %s"));
 #ifdef FEAT_EVAL
 EXTERN char e_invexpr2[]       INIT(= N_("E15: Invalid expression: %s"));
 #endif
 EXTERN char e_invrange[]       INIT(= N_("E16: Invalid range"));
-EXTERN char e_invcmd[] INIT(= N_("E476: Invalid command"));
+EXTERN char e_invcmd[]         INIT(= N_("E476: Invalid command"));
 #if defined(UNIX) || defined(FEAT_SYN_HL) || defined(FEAT_SPELL)
-EXTERN char e_isadir2[]        INIT(= N_("E17: \"%s\" is a directory"));
+EXTERN char e_isadir2[]                INIT(= N_("E17: \"%s\" is a directory"));
 #endif
 #ifdef FEAT_LIBCALL
 EXTERN char e_libcall[]        INIT(= N_("E364: Library call failed for \"%s()\""));
@@ -1614,8 +1619,8 @@ EXTERN char e_noserver[]  INIT(= N_("E247: no registered server named \"%s\""));
 #endif
 EXTERN char e_notcreate[]      INIT(= N_("E482: Can't create file %s"));
 EXTERN char e_notmp[]          INIT(= N_("E483: Can't get temp file name"));
-EXTERN char e_notopen[]        INIT(= N_("E484: Can't open file %s"));
-EXTERN char e_notread[]        INIT(= N_("E485: Can't read file %s"));
+EXTERN char e_notopen[]                INIT(= N_("E484: Can't open file %s"));
+EXTERN char e_notread[]                INIT(= N_("E485: Can't read file %s"));
 EXTERN char e_null[]           INIT(= N_("E38: Null argument"));
 #if defined(FEAT_DIGRAPHS) || defined(FEAT_TIMERS) || defined(FEAT_EVAL)
 EXTERN char e_number_exp[]     INIT(= N_("E39: Number expected"));
@@ -1837,6 +1842,16 @@ EXTERN HINSTANCE g_hinst INIT(= NULL);
 EXTERN int did_repeated_msg INIT(= 0);
 # define REPEATED_MSG_LOOKING      1
 # define REPEATED_MSG_SAFESTATE            2
+
+#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)
+#endif
+
+#if defined(FEAT_DIFF)
+#define FOR_ALL_DIFFBLOCKS_IN_TAB(tp, dp) \
+    for ((dp) = (tp)->tp_first_diff; (dp) != NULL; (dp) = (dp)->df_next)
 #endif
 
 #define FOR_ALL_LIST_ITEMS(l, li) \
index 99c7a67cbad3b1b04b2fbcb11357e415d9d9ebb1..6a64de5c112b02d4f57c5e6ef2204717d90dcd25 100644 (file)
@@ -954,7 +954,7 @@ gui_mch_new_menu_font(void)
        vimmenu_T *mp;
        int max_height = 9999;
 
-       for (mp = root_menu; mp != NULL; mp = mp->next)
+       FOR_ALL_MENUS(mp)
        {
            if (menu_is_menubar(mp->dname))
            {
@@ -1280,7 +1280,7 @@ gui_mch_show_toolbar(int showit)
                vimmenu_T   *toolbar;
                vimmenu_T   *cur;
 
-               for (toolbar = root_menu; toolbar; toolbar = toolbar->next)
+               FOR_ALL_MENUS(toolbar)
                    if (menu_is_toolbar(toolbar->dname))
                        break;
                // Assumption: toolbar is NULL if there is no toolbar,
@@ -1632,7 +1632,7 @@ gui_athena_popup_callback(
     {
        vimmenu_T *i;
 
-       for (i = menu->parent->children; i != NULL; i = i->next)
+       FOR_ALL_CHILD_MENUS(menu->parent, i)
        {
            if (i->submenu_id != NULL && XtIsManaged(i->submenu_id))
                XtPopdown(i->submenu_id);
index 152f068ae7e60fc3721c4d3d7147a880255245a9..fa63bf9101d8f13be259be780415d8bce4c330a1 100644 (file)
@@ -824,7 +824,7 @@ gui_gtk_set_mnemonics(int enable)
     vimmenu_T  *menu;
     char_u     *name;
 
-    for (menu = root_menu; menu != NULL; menu = menu->next)
+    FOR_ALL_MENUS(menu)
     {
        if (menu->id == NULL)
            continue;
index d5a627609a50948dd84bced3e170efe5b9a48f33..28b080a4a872c8807b193488e6ce1fe22318e87b 100644 (file)
@@ -889,7 +889,7 @@ do_set_mnemonics(int enable)
 {
     vimmenu_T  *menu;
 
-    for (menu = root_menu; menu != NULL; menu = menu->next)
+    FOR_ALL_MENUS(menu)
        if (menu->id != (Widget)0)
            XtVaSetValues(menu->id,
                    XmNmnemonic, enable ? menu->mnemonic : NUL,
@@ -1094,7 +1094,7 @@ gui_mch_compute_menu_height(
 
     // Find any menu Widget, to be able to call XtManageChild()
     else
-       for (mp = root_menu; mp != NULL; mp = mp->next)
+       FOR_ALL_MENUS(mp)
            if (mp->id != (Widget)0 && menu_is_menubar(mp->name))
            {
                id = mp->id;
@@ -1112,7 +1112,7 @@ gui_mch_compute_menu_height(
      * Now find the menu item that is the furthest down, and get its position.
      */
     maxy = 0;
-    for (mp = root_menu; mp != NULL; mp = mp->next)
+    FOR_ALL_MENUS(mp)
     {
        if (mp->id != (Widget)0 && menu_is_menubar(mp->name))
        {
@@ -2928,7 +2928,7 @@ gui_mch_show_toolbar(int showit)
                vimmenu_T   *toolbar;
                vimmenu_T   *cur;
 
-               for (toolbar = root_menu; toolbar; toolbar = toolbar->next)
+               FOR_ALL_MENUS(toolbar)
                    if (menu_is_toolbar(toolbar->dname))
                        break;
                // Assumption: toolbar is NULL if there is no toolbar,
index e6b5dad54f3a5eb0e9bc372b3d671e1f96d17d11..5af41059d2838670d04e0071679e911413dec820 100644 (file)
@@ -7591,7 +7591,7 @@ gui_mch_tearoff(
     for (col = 0; col < 2; col++)
     {
        columnWidths[col] = 0;
-       for (pmenu = menu->children; pmenu != NULL; pmenu = pmenu->next)
+       FOR_ALL_CHILD_MENUS(menu, pmenu)
        {
            // Use "dname" here to compute the width of the visible text.
            text = (col == 0) ? pmenu->dname : pmenu->actext;
index b532e28ebca83a61792889fff2402f8ff4d26b89..9fe53841434710a786a959a04fdca924d3f10ead 100644 (file)
@@ -20,6 +20,9 @@ static char *e_listblobarg = N_("E899: Argument of %s must be a List or Blob");
 // List heads for garbage collection.
 static list_T          *first_list = NULL;     // list of all lists
 
+#define FOR_ALL_WATCHERS(l, lw) \
+    for ((lw) = (l)->lv_watch; (lw) != NULL; (lw) = (lw)->lw_next)
+
 static void list_free_item(list_T *l, listitem_T *item);
 
 /*
@@ -42,7 +45,7 @@ list_rem_watch(list_T *l, listwatch_T *lwrem)
     listwatch_T        *lw, **lwp;
 
     lwp = &l->lv_watch;
-    for (lw = l->lv_watch; lw != NULL; lw = lw->lw_next)
+    FOR_ALL_WATCHERS(l, lw)
     {
        if (lw == lwrem)
        {
@@ -62,7 +65,7 @@ list_fix_watch(list_T *l, listitem_T *item)
 {
     listwatch_T        *lw;
 
-    for (lw = l->lv_watch; lw != NULL; lw = lw->lw_next)
+    FOR_ALL_WATCHERS(l, lw)
        if (lw->lw_item == item)
            lw->lw_item = item->li_next;
 }
index 0c8887945a72abc2954105deb1cb31858faed2cd..38b4fd8af2955b3b984f95ed9205bf150f1e3c32 100644 (file)
@@ -1980,7 +1980,7 @@ show_popupmenu(void)
 
     apply_autocmds(EVENT_MENUPOPUP, (char_u*)mode, NULL, FALSE, curbuf);
 
-    for (menu = root_menu; menu != NULL; menu = menu->next)
+    FOR_ALL_MENUS(menu)
        if (STRNCMP("PopUp", menu->name, 5) == 0 && STRNCMP(menu->name + 5, mode, mode_len) == 0)
            break;
 
@@ -2133,7 +2133,7 @@ gui_is_menu_shortcut(int key)
 
     if (key < 256)
        key = TOLOWER_LOC(key);
-    for (menu = root_menu; menu != NULL; menu = menu->next)
+    FOR_ALL_MENUS(menu)
        if (menu->mnemonic == key
                || (menu->mnemonic < 256 && TOLOWER_LOC(menu->mnemonic) == key))
            return TRUE;
index c57681c9e95cf2c4d921ab208df413ead11581b7..c6214d290b465591141f350dcb854394649df70b 100644 (file)
@@ -1379,7 +1379,7 @@ pum_execute_menu(vimmenu_T *menu, int mode)
     int                idx = 0;
     exarg_T    ea;
 
-    for (mp = menu->children; mp != NULL; mp = mp->next)
+    FOR_ALL_CHILD_MENUS(menu, mp)
        if ((mp->modes & mp->enabled & mode) && idx++ == pum_selected)
        {
            vim_memset(&ea, 0, sizeof(ea));
@@ -1407,7 +1407,7 @@ pum_show_popupmenu(vimmenu_T *menu)
     pum_size = 0;
     mode = get_menu_mode_flag();
 
-    for (mp = menu->children; mp != NULL; mp = mp->next)
+    FOR_ALL_CHILD_MENUS(menu, mp)
        if (menu_is_separator(mp->dname)
                || (mp->modes & mp->enabled & mode))
            ++pum_size;
@@ -1424,7 +1424,7 @@ pum_show_popupmenu(vimmenu_T *menu)
     if (array == NULL)
        return;
 
-    for (mp = menu->children; mp != NULL; mp = mp->next)
+    FOR_ALL_CHILD_MENUS(menu, mp)
        if (menu_is_separator(mp->dname))
            array[idx++].pum_text = (char_u *)"";
        else if (mp->modes & mp->enabled & mode)
index 608db4c0962516a4a61a1ca9acca90084d5eb7a0..863439e83a36c482de20f1cfca9f51dd979b295a 100644 (file)
@@ -2133,7 +2133,7 @@ popup_close_and_callback(win_T *wp, typval_T *arg)
        // - another popup window with a terminal
        // - the previous window
        // - the first one.
-       for (owp = first_popupwin; owp != NULL; owp = owp->w_next)
+       FOR_ALL_POPUPWINS(owp)
            if (owp != curwin && owp->w_buffer->b_term != NULL)
                break;
        if (owp != NULL)
index 127811a6585c1ba4e087b623db8137f025444dc9..5c24babdfe059ce8181e40b89a8d814e908176ac 100644 (file)
@@ -6276,7 +6276,7 @@ wipe_dummy_buffer(buf_T *buf, char_u *dirname_start)
        win_T       *wp;
 
        if (firstwin->w_next != NULL)
-           for (wp = firstwin; wp != NULL; wp = wp->w_next)
+           FOR_ALL_WINDOWS(wp)
                if (wp->w_buffer == buf)
                {
                    if (win_close(wp, FALSE) == OK)
index c1d1b856bf16cfdc5db8c102b2077b65dec91efc..b4d3afc5d72b9a245c8b2d840db5db68f2bf128f 100644 (file)
@@ -256,6 +256,9 @@ static reg_extmatch_T *next_match_extmatch = NULL;
 #define INVALID_STATE(ssp)  ((ssp)->ga_itemsize == 0)
 #define VALID_STATE(ssp)    ((ssp)->ga_itemsize != 0)
 
+#define FOR_ALL_SYNSTATES(sb, sst) \
+    for ((sst) = (sb)->b_sst_first; (sst) != NULL; (sst) = (sst)->sst_next)
+
 /*
  * The current state (within the line) of the recognition engine.
  * When current_state.ga_itemsize is 0 the current state is invalid.
@@ -438,7 +441,7 @@ syntax_start(win_T *wp, linenr_T lnum)
     if (INVALID_STATE(&current_state) && syn_block->b_sst_array != NULL)
     {
        // Find last valid saved state before start_lnum.
-       for (p = syn_block->b_sst_first; p != NULL; p = p->sst_next)
+       FOR_ALL_SYNSTATES(syn_block, p)
        {
            if (p->sst_lnum > lnum)
                break;
@@ -1044,7 +1047,7 @@ syn_stack_free_block(synblock_T *block)
 
     if (block->b_sst_array != NULL)
     {
-       for (p = block->b_sst_first; p != NULL; p = p->sst_next)
+       FOR_ALL_SYNSTATES(block, p)
            clear_syn_state(p);
        VIM_CLEAR(block->b_sst_array);
        block->b_sst_first = NULL;
@@ -1353,7 +1356,7 @@ store_current_state(void)
            else
            {
                // find the entry just before this one to adjust sst_next
-               for (p = syn_block->b_sst_first; p != NULL; p = p->sst_next)
+               FOR_ALL_SYNSTATES(syn_block, p)
                    if (p->sst_next == sp)
                        break;
                if (p != NULL)  // just in case
index 2706ac22daadd91cbeff77ac5004bdef939cfe24..bf6801f679695d3b9091e119a7e96060274bcc0d 100644 (file)
@@ -21,6 +21,9 @@
 static char    tz_cache[64];
 #endif
 
+#define FOR_ALL_TIMERS(t) \
+    for ((t) = first_timer; (t) != NULL; (t) = (t)->tr_next)
+
 /*
  * Call either localtime(3) or localtime_r(3) from POSIX libc time.h, with the
  * latter version preferred for reentrancy.
@@ -583,7 +586,7 @@ find_timer(long id)
 
     if (id >= 0)
     {
-       for (timer = first_timer; timer != NULL; timer = timer->tr_next)
+       FOR_ALL_TIMERS(timer)
            if (timer->tr_id == id)
                return timer;
     }
@@ -659,7 +662,7 @@ add_timer_info_all(typval_T *rettv)
 {
     timer_T *timer;
 
-    for (timer = first_timer; timer != NULL; timer = timer->tr_next)
+    FOR_ALL_TIMERS(timer)
        if (timer->tr_id != -1)
            add_timer_info(rettv, timer);
 }
index cff86da6fde363ab8658925399c01e6119a5f635..f93c1492c4646f811a210633a83d34e97142030e 100644 (file)
@@ -1643,7 +1643,7 @@ func_call(
     int                r = 0;
 
     range_list_materialize(l);
-    FOR_ALL_LIST_ITEMS(args->vval.v_list, item)
+    FOR_ALL_LIST_ITEMS(l, item)
     {
        if (argc == MAX_FUNC_ARGS - (partial == NULL ? 0 : partial->pt_argc))
        {
index 1b9bc68b6974a172a1d70cd971a8a1ed601a6676..d39537d7e90ff2bd5509ae1aa9997b1218c22f72 100644 (file)
@@ -738,6 +738,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    523,
 /**/
     522,
 /**/
index 0dfe5a1634f320b37a3eaeff0b9152740788d10a..359007a38a5edf58cc966b39db270fe1a5460162 100644 (file)
@@ -3984,7 +3984,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
        l = heredoc_get(eap, op + 3);
 
        // Push each line and the create the list.
-       for (li = l->lv_first; li != NULL; li = li->li_next)
+       FOR_ALL_LIST_ITEMS(l, li)
        {
            generate_PUSHS(cctx, li->li_tv.vval.v_string);
            li->li_tv.vval.v_string = NULL;