diff --git a/7.3.056 b/7.3.056 new file mode 100644 index 0000000..49c91b6 --- /dev/null +++ b/7.3.056 @@ -0,0 +1,542 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.3.056 +Fcc: outbox +From: Bram Moolenaar +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 + + +*** ../vim-7.3.055/src/ex_docmd.c 2010-11-10 18:59:50.000000000 +0100 +--- src/ex_docmd.c 2010-11-16 11:24:40.000000000 +0100 +*************** +*** 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")); + } +*** ../vim-7.3.055/src/version.c 2010-11-16 11:28:33.000000000 +0100 +--- src/version.c 2010-11-16 11:27:09.000000000 +0100 +*************** +*** 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 ///