| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.056 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.3.056 |
| Problem: "getline" argument in do_cmdline() shadows global. |
| Solution: Rename the argument. |
| Files: src/ex_docmd.c |
| |
| |
| |
| |
| |
| *** 733,739 **** |
| * do_cmdline(): execute one Ex command line |
| * |
| * 1. Execute "cmdline" when it is not NULL. |
| ! * If "cmdline" is NULL, or more lines are needed, getline() is used. |
| * 2. Split up in parts separated with '|'. |
| * |
| * This function can be called recursively! |
| --- 733,739 ---- |
| * do_cmdline(): execute one Ex command line |
| * |
| * 1. Execute "cmdline" when it is not NULL. |
| ! * If "cmdline" is NULL, or more lines are needed, fgetline() is used. |
| * 2. Split up in parts separated with '|'. |
| * |
| * This function can be called recursively! |
| |
| *** 741,747 **** |
| * flags: |
| * DOCMD_VERBOSE - The command will be included in the error message. |
| * DOCMD_NOWAIT - Don't call wait_return() and friends. |
| ! * DOCMD_REPEAT - Repeat execution until getline() returns NULL. |
| * DOCMD_KEYTYPED - Don't reset KeyTyped. |
| * DOCMD_EXCRESET - Reset the exception environment (used for debugging). |
| * DOCMD_KEEPLINE - Store first typed line (for repeating with "."). |
| --- 741,747 ---- |
| * flags: |
| * DOCMD_VERBOSE - The command will be included in the error message. |
| * DOCMD_NOWAIT - Don't call wait_return() and friends. |
| ! * DOCMD_REPEAT - Repeat execution until fgetline() returns NULL. |
| * DOCMD_KEYTYPED - Don't reset KeyTyped. |
| * DOCMD_EXCRESET - Reset the exception environment (used for debugging). |
| * DOCMD_KEEPLINE - Store first typed line (for repeating with "."). |
| |
| *** 749,763 **** |
| * return FAIL if cmdline could not be executed, OK otherwise |
| */ |
| int |
| ! do_cmdline(cmdline, getline, cookie, flags) |
| char_u *cmdline; |
| ! char_u *(*getline) __ARGS((int, void *, int)); |
| ! void *cookie; /* argument for getline() */ |
| int flags; |
| { |
| char_u *next_cmdline; /* next cmd to execute */ |
| char_u *cmdline_copy = NULL; /* copy of cmd line */ |
| ! int used_getline = FALSE; /* used "getline" to obtain command */ |
| static int recursive = 0; /* recursive depth */ |
| int msg_didout_before_start = 0; |
| int count = 0; /* line number count */ |
| --- 749,763 ---- |
| * return FAIL if cmdline could not be executed, OK otherwise |
| */ |
| int |
| ! do_cmdline(cmdline, fgetline, cookie, flags) |
| char_u *cmdline; |
| ! char_u *(*fgetline) __ARGS((int, void *, int)); |
| ! void *cookie; /* argument for fgetline() */ |
| int flags; |
| { |
| char_u *next_cmdline; /* next cmd to execute */ |
| char_u *cmdline_copy = NULL; /* copy of cmd line */ |
| ! int used_getline = FALSE; /* used "fgetline" to obtain command */ |
| static int recursive = 0; /* recursive depth */ |
| int msg_didout_before_start = 0; |
| int count = 0; /* line number count */ |
| |
| *** 775,788 **** |
| struct msglist **saved_msg_list = NULL; |
| struct msglist *private_msg_list; |
| |
| ! /* "getline" and "cookie" passed to do_one_cmd() */ |
| char_u *(*cmd_getline) __ARGS((int, void *, int)); |
| void *cmd_cookie; |
| struct loop_cookie cmd_loop_cookie; |
| void *real_cookie; |
| int getline_is_func; |
| #else |
| ! # define cmd_getline getline |
| # define cmd_cookie cookie |
| #endif |
| static int call_depth = 0; /* recursiveness */ |
| --- 775,788 ---- |
| struct msglist **saved_msg_list = NULL; |
| struct msglist *private_msg_list; |
| |
| ! /* "fgetline" and "cookie" passed to do_one_cmd() */ |
| char_u *(*cmd_getline) __ARGS((int, void *, int)); |
| void *cmd_cookie; |
| struct loop_cookie cmd_loop_cookie; |
| void *real_cookie; |
| int getline_is_func; |
| #else |
| ! # define cmd_getline fgetline |
| # define cmd_cookie cookie |
| #endif |
| static int call_depth = 0; /* recursiveness */ |
| |
| *** 822,831 **** |
| cstack.cs_lflags = 0; |
| ga_init2(&lines_ga, (int)sizeof(wcmd_T), 10); |
| |
| ! real_cookie = getline_cookie(getline, cookie); |
| |
| /* Inside a function use a higher nesting level. */ |
| ! getline_is_func = getline_equal(getline, cookie, get_func_line); |
| if (getline_is_func && ex_nesting_level == func_level(real_cookie)) |
| ++ex_nesting_level; |
| |
| --- 822,831 ---- |
| cstack.cs_lflags = 0; |
| ga_init2(&lines_ga, (int)sizeof(wcmd_T), 10); |
| |
| ! real_cookie = getline_cookie(fgetline, cookie); |
| |
| /* Inside a function use a higher nesting level. */ |
| ! getline_is_func = getline_equal(fgetline, cookie, get_func_line); |
| if (getline_is_func && ex_nesting_level == func_level(real_cookie)) |
| ++ex_nesting_level; |
| |
| |
| *** 837,843 **** |
| breakpoint = func_breakpoint(real_cookie); |
| dbg_tick = func_dbg_tick(real_cookie); |
| } |
| ! else if (getline_equal(getline, cookie, getsourceline)) |
| { |
| fname = sourcing_name; |
| breakpoint = source_breakpoint(real_cookie); |
| --- 837,843 ---- |
| breakpoint = func_breakpoint(real_cookie); |
| dbg_tick = func_dbg_tick(real_cookie); |
| } |
| ! else if (getline_equal(fgetline, cookie, getsourceline)) |
| { |
| fname = sourcing_name; |
| breakpoint = source_breakpoint(real_cookie); |
| |
| *** 881,887 **** |
| * KeyTyped is only set when calling vgetc(). Reset it here when not |
| * calling vgetc() (sourced command lines). |
| */ |
| ! if (!(flags & DOCMD_KEYTYPED) && !getline_equal(getline, cookie, getexline)) |
| KeyTyped = FALSE; |
| |
| /* |
| --- 881,888 ---- |
| * KeyTyped is only set when calling vgetc(). Reset it here when not |
| * calling vgetc() (sourced command lines). |
| */ |
| ! if (!(flags & DOCMD_KEYTYPED) |
| ! && !getline_equal(fgetline, cookie, getexline)) |
| KeyTyped = FALSE; |
| |
| /* |
| |
| *** 894,900 **** |
| do |
| { |
| #ifdef FEAT_EVAL |
| ! getline_is_func = getline_equal(getline, cookie, get_func_line); |
| #endif |
| |
| /* stop skipping cmds for an error msg after all endif/while/for */ |
| --- 895,901 ---- |
| do |
| { |
| #ifdef FEAT_EVAL |
| ! getline_is_func = getline_equal(fgetline, cookie, get_func_line); |
| #endif |
| |
| /* stop skipping cmds for an error msg after all endif/while/for */ |
| |
| *** 909,915 **** |
| |
| /* |
| * 1. If repeating a line in a loop, get a line from lines_ga. |
| ! * 2. If no line given: Get an allocated line with getline(). |
| * 3. If a line is given: Make a copy, so we can mess with it. |
| */ |
| |
| --- 910,916 ---- |
| |
| /* |
| * 1. If repeating a line in a loop, get a line from lines_ga. |
| ! * 2. If no line given: Get an allocated line with fgetline(). |
| * 3. If a line is given: Make a copy, so we can mess with it. |
| */ |
| |
| |
| *** 938,949 **** |
| } |
| #ifdef FEAT_PROFILE |
| else if (do_profiling == PROF_YES |
| ! && getline_equal(getline, cookie, getsourceline)) |
| script_line_end(); |
| #endif |
| |
| /* Check if a sourced file hit a ":finish" command. */ |
| ! if (source_finished(getline, cookie)) |
| { |
| retval = FAIL; |
| break; |
| --- 939,950 ---- |
| } |
| #ifdef FEAT_PROFILE |
| else if (do_profiling == PROF_YES |
| ! && getline_equal(fgetline, cookie, getsourceline)) |
| script_line_end(); |
| #endif |
| |
| /* Check if a sourced file hit a ":finish" command. */ |
| ! if (source_finished(fgetline, cookie)) |
| { |
| retval = FAIL; |
| break; |
| |
| *** 954,960 **** |
| && *dbg_tick != debug_tick) |
| { |
| *breakpoint = dbg_find_breakpoint( |
| ! getline_equal(getline, cookie, getsourceline), |
| fname, sourcing_lnum); |
| *dbg_tick = debug_tick; |
| } |
| --- 955,961 ---- |
| && *dbg_tick != debug_tick) |
| { |
| *breakpoint = dbg_find_breakpoint( |
| ! getline_equal(fgetline, cookie, getsourceline), |
| fname, sourcing_lnum); |
| *dbg_tick = debug_tick; |
| } |
| |
| *** 969,975 **** |
| dbg_breakpoint(fname, sourcing_lnum); |
| /* Find next breakpoint. */ |
| *breakpoint = dbg_find_breakpoint( |
| ! getline_equal(getline, cookie, getsourceline), |
| fname, sourcing_lnum); |
| *dbg_tick = debug_tick; |
| } |
| --- 970,976 ---- |
| dbg_breakpoint(fname, sourcing_lnum); |
| /* Find next breakpoint. */ |
| *breakpoint = dbg_find_breakpoint( |
| ! getline_equal(fgetline, cookie, getsourceline), |
| fname, sourcing_lnum); |
| *dbg_tick = debug_tick; |
| } |
| |
| *** 978,984 **** |
| { |
| if (getline_is_func) |
| func_line_start(real_cookie); |
| ! else if (getline_equal(getline, cookie, getsourceline)) |
| script_line_start(); |
| } |
| # endif |
| --- 979,985 ---- |
| { |
| if (getline_is_func) |
| func_line_start(real_cookie); |
| ! else if (getline_equal(fgetline, cookie, getsourceline)) |
| script_line_start(); |
| } |
| # endif |
| |
| *** 987,993 **** |
| if (cstack.cs_looplevel > 0) |
| { |
| /* Inside a while/for loop we need to store the lines and use them |
| ! * again. Pass a different "getline" function to do_one_cmd() |
| * below, so that it stores lines in or reads them from |
| * "lines_ga". Makes it possible to define a function inside a |
| * while/for loop. */ |
| --- 988,994 ---- |
| if (cstack.cs_looplevel > 0) |
| { |
| /* Inside a while/for loop we need to store the lines and use them |
| ! * again. Pass a different "fgetline" function to do_one_cmd() |
| * below, so that it stores lines in or reads them from |
| * "lines_ga". Makes it possible to define a function inside a |
| * while/for loop. */ |
| |
| *** 995,1021 **** |
| cmd_cookie = (void *)&cmd_loop_cookie; |
| cmd_loop_cookie.lines_gap = &lines_ga; |
| cmd_loop_cookie.current_line = current_line; |
| ! cmd_loop_cookie.getline = getline; |
| cmd_loop_cookie.cookie = cookie; |
| cmd_loop_cookie.repeating = (current_line < lines_ga.ga_len); |
| } |
| else |
| { |
| ! cmd_getline = getline; |
| cmd_cookie = cookie; |
| } |
| #endif |
| |
| ! /* 2. If no line given, get an allocated line with getline(). */ |
| if (next_cmdline == NULL) |
| { |
| /* |
| * Need to set msg_didout for the first line after an ":if", |
| * otherwise the ":if" will be overwritten. |
| */ |
| ! if (count == 1 && getline_equal(getline, cookie, getexline)) |
| msg_didout = TRUE; |
| ! if (getline == NULL || (next_cmdline = getline(':', cookie, |
| #ifdef FEAT_EVAL |
| cstack.cs_idx < 0 ? 0 : (cstack.cs_idx + 1) * 2 |
| #else |
| --- 996,1022 ---- |
| cmd_cookie = (void *)&cmd_loop_cookie; |
| cmd_loop_cookie.lines_gap = &lines_ga; |
| cmd_loop_cookie.current_line = current_line; |
| ! cmd_loop_cookie.getline = fgetline; |
| cmd_loop_cookie.cookie = cookie; |
| cmd_loop_cookie.repeating = (current_line < lines_ga.ga_len); |
| } |
| else |
| { |
| ! cmd_getline = fgetline; |
| cmd_cookie = cookie; |
| } |
| #endif |
| |
| ! /* 2. If no line given, get an allocated line with fgetline(). */ |
| if (next_cmdline == NULL) |
| { |
| /* |
| * Need to set msg_didout for the first line after an ":if", |
| * otherwise the ":if" will be overwritten. |
| */ |
| ! if (count == 1 && getline_equal(fgetline, cookie, getexline)) |
| msg_didout = TRUE; |
| ! if (fgetline == NULL || (next_cmdline = fgetline(':', cookie, |
| #ifdef FEAT_EVAL |
| cstack.cs_idx < 0 ? 0 : (cstack.cs_idx + 1) * 2 |
| #else |
| |
| *** 1142,1148 **** |
| * If the command was typed, remember it for the ':' register. |
| * Do this AFTER executing the command to make :@: work. |
| */ |
| ! if (getline_equal(getline, cookie, getexline) |
| && new_last_cmdline != NULL) |
| { |
| vim_free(last_cmdline); |
| --- 1143,1149 ---- |
| * If the command was typed, remember it for the ':' register. |
| * Do this AFTER executing the command to make :@: work. |
| */ |
| ! if (getline_equal(fgetline, cookie, getexline) |
| && new_last_cmdline != NULL) |
| { |
| vim_free(last_cmdline); |
| |
| *** 1163,1169 **** |
| #ifdef FEAT_EVAL |
| /* reset did_emsg for a function that is not aborted by an error */ |
| if (did_emsg && !force_abort |
| ! && getline_equal(getline, cookie, get_func_line) |
| && !func_has_abort(real_cookie)) |
| did_emsg = FALSE; |
| |
| --- 1164,1170 ---- |
| #ifdef FEAT_EVAL |
| /* reset did_emsg for a function that is not aborted by an error */ |
| if (did_emsg && !force_abort |
| ! && getline_equal(fgetline, cookie, get_func_line) |
| && !func_has_abort(real_cookie)) |
| did_emsg = FALSE; |
| |
| |
| *** 1202,1208 **** |
| if (breakpoint != NULL) |
| { |
| *breakpoint = dbg_find_breakpoint( |
| ! getline_equal(getline, cookie, getsourceline), |
| fname, |
| ((wcmd_T *)lines_ga.ga_data)[current_line].lnum-1); |
| *dbg_tick = debug_tick; |
| --- 1203,1209 ---- |
| if (breakpoint != NULL) |
| { |
| *breakpoint = dbg_find_breakpoint( |
| ! getline_equal(fgetline, cookie, getsourceline), |
| fname, |
| ((wcmd_T *)lines_ga.ga_data)[current_line].lnum-1); |
| *dbg_tick = debug_tick; |
| |
| *** 1296,1303 **** |
| #endif |
| ) |
| && !(did_emsg && used_getline |
| ! && (getline_equal(getline, cookie, getexmodeline) |
| ! || getline_equal(getline, cookie, getexline))) |
| && (next_cmdline != NULL |
| #ifdef FEAT_EVAL |
| || cstack.cs_idx >= 0 |
| --- 1297,1304 ---- |
| #endif |
| ) |
| && !(did_emsg && used_getline |
| ! && (getline_equal(fgetline, cookie, getexmodeline) |
| ! || getline_equal(fgetline, cookie, getexline))) |
| && (next_cmdline != NULL |
| #ifdef FEAT_EVAL |
| || cstack.cs_idx >= 0 |
| |
| *** 1316,1324 **** |
| * unclosed conditional. |
| */ |
| if (!got_int && !did_throw |
| ! && ((getline_equal(getline, cookie, getsourceline) |
| ! && !source_finished(getline, cookie)) |
| ! || (getline_equal(getline, cookie, get_func_line) |
| && !func_has_ended(real_cookie)))) |
| { |
| if (cstack.cs_flags[cstack.cs_idx] & CSF_TRY) |
| --- 1317,1325 ---- |
| * unclosed conditional. |
| */ |
| if (!got_int && !did_throw |
| ! && ((getline_equal(fgetline, cookie, getsourceline) |
| ! && !source_finished(fgetline, cookie)) |
| ! || (getline_equal(fgetline, cookie, get_func_line) |
| && !func_has_ended(real_cookie)))) |
| { |
| if (cstack.cs_flags[cstack.cs_idx] & CSF_TRY) |
| |
| *** 1354,1360 **** |
| /* If a missing ":endtry", ":endwhile", ":endfor", or ":endif" or a memory |
| * lack was reported above and the error message is to be converted to an |
| * exception, do this now after rewinding the cstack. */ |
| ! do_errthrow(&cstack, getline_equal(getline, cookie, get_func_line) |
| ? (char_u *)"endfunction" : (char_u *)NULL); |
| |
| if (trylevel == 0) |
| --- 1355,1361 ---- |
| /* If a missing ":endtry", ":endwhile", ":endfor", or ":endif" or a memory |
| * lack was reported above and the error message is to be converted to an |
| * exception, do this now after rewinding the cstack. */ |
| ! do_errthrow(&cstack, getline_equal(fgetline, cookie, get_func_line) |
| ? (char_u *)"endfunction" : (char_u *)NULL); |
| |
| if (trylevel == 0) |
| |
| *** 1449,1457 **** |
| */ |
| if (did_throw) |
| need_rethrow = TRUE; |
| ! if ((getline_equal(getline, cookie, getsourceline) |
| && ex_nesting_level > source_level(real_cookie)) |
| ! || (getline_equal(getline, cookie, get_func_line) |
| && ex_nesting_level > func_level(real_cookie) + 1)) |
| { |
| if (!did_throw) |
| --- 1450,1458 ---- |
| */ |
| if (did_throw) |
| need_rethrow = TRUE; |
| ! if ((getline_equal(fgetline, cookie, getsourceline) |
| && ex_nesting_level > source_level(real_cookie)) |
| ! || (getline_equal(fgetline, cookie, get_func_line) |
| && ex_nesting_level > func_level(real_cookie) + 1)) |
| { |
| if (!did_throw) |
| |
| *** 1460,1475 **** |
| else |
| { |
| /* When leaving a function, reduce nesting level. */ |
| ! if (getline_equal(getline, cookie, get_func_line)) |
| --ex_nesting_level; |
| /* |
| * Go to debug mode when returning from a function in which we are |
| * single-stepping. |
| */ |
| ! if ((getline_equal(getline, cookie, getsourceline) |
| ! || getline_equal(getline, cookie, get_func_line)) |
| && ex_nesting_level + 1 <= debug_break_level) |
| ! do_debug(getline_equal(getline, cookie, getsourceline) |
| ? (char_u *)_("End of sourced file") |
| : (char_u *)_("End of function")); |
| } |
| --- 1461,1476 ---- |
| else |
| { |
| /* When leaving a function, reduce nesting level. */ |
| ! if (getline_equal(fgetline, cookie, get_func_line)) |
| --ex_nesting_level; |
| /* |
| * Go to debug mode when returning from a function in which we are |
| * single-stepping. |
| */ |
| ! if ((getline_equal(fgetline, cookie, getsourceline) |
| ! || getline_equal(fgetline, cookie, get_func_line)) |
| && ex_nesting_level + 1 <= debug_break_level) |
| ! do_debug(getline_equal(fgetline, cookie, getsourceline) |
| ? (char_u *)_("End of sourced file") |
| : (char_u *)_("End of function")); |
| } |
| |
| |
| |
| *** 716,717 **** |
| --- 716,719 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 56, |
| /**/ |
| |
| -- |
| Lawmakers made it obligatory for everybody to take at least one bath |
| each week -- on Saturday night. |
| [real standing law in Vermont, United States of America] |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ an exciting new programming language -- http://www.Zimbu.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |