| To: vim-dev@vim.org |
| Subject: Patch 7.1.162 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=ISO-8859-1 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.1.162 |
| Problem: Crash when using a modifier before "while" or "for". (A.Politz) |
| Solution: Skip modifiers when checking for a loop command. |
| Files: src/proto/ex_docmd.pro, src/ex_docmd.c, src/ex_eval.c |
| |
| |
| |
| |
| |
| *** 5,10 **** |
| --- 5,11 ---- |
| int getline_equal __ARGS((char_u *(*fgetline)(int, void *, int), void *cookie, char_u *(*func)(int, void *, int))); |
| void *getline_cookie __ARGS((char_u *(*fgetline)(int, void *, int), void *cookie)); |
| int checkforcmd __ARGS((char_u **pp, char *cmd, int len)); |
| + int modifier_len __ARGS((char_u *cmd)); |
| int cmd_exists __ARGS((char_u *name)); |
| char_u *set_one_cmd_context __ARGS((expand_T *xp, char_u *buff)); |
| char_u *skip_range __ARGS((char_u *cmd, int *ctx)); |
| |
| |
| |
| *** 2963,2968 **** |
| --- 2963,3019 ---- |
| #endif |
| |
| #if defined(FEAT_EVAL) || defined(PROTO) |
| + static struct cmdmod |
| + { |
| + char *name; |
| + int minlen; |
| + int has_count; /* :123verbose :3tab */ |
| + } cmdmods[] = { |
| + {"aboveleft", 3, FALSE}, |
| + {"belowright", 3, FALSE}, |
| + {"botright", 2, FALSE}, |
| + {"browse", 3, FALSE}, |
| + {"confirm", 4, FALSE}, |
| + {"hide", 3, FALSE}, |
| + {"keepalt", 5, FALSE}, |
| + {"keepjumps", 5, FALSE}, |
| + {"keepmarks", 3, FALSE}, |
| + {"leftabove", 5, FALSE}, |
| + {"lockmarks", 3, FALSE}, |
| + {"rightbelow", 6, FALSE}, |
| + {"sandbox", 3, FALSE}, |
| + {"silent", 3, FALSE}, |
| + {"tab", 3, TRUE}, |
| + {"topleft", 2, FALSE}, |
| + {"verbose", 4, TRUE}, |
| + {"vertical", 4, FALSE}, |
| + }; |
| + |
| + /* |
| + * Return length of a command modifier (including optional count). |
| + * Return zero when it's not a modifier. |
| + */ |
| + int |
| + modifier_len(cmd) |
| + char_u *cmd; |
| + { |
| + int i, j; |
| + char_u *p = cmd; |
| + |
| + if (VIM_ISDIGIT(*cmd)) |
| + p = skipwhite(skipdigits(cmd)); |
| + for (i = 0; i < sizeof(cmdmods) / sizeof(struct cmdmod); ++i) |
| + { |
| + for (j = 0; p[j] != NUL; ++j) |
| + if (p[j] != cmdmods[i].name[j]) |
| + break; |
| + if (!isalpha(p[j]) && j >= cmdmods[i].minlen |
| + && (p == cmd || cmdmods[i].has_count)) |
| + return j + (p - cmd); |
| + } |
| + return 0; |
| + } |
| + |
| /* |
| * Return > 0 if an Ex command "name" exists. |
| * Return 2 if there is an exact match. |
| |
| *** 2977,3006 **** |
| int i; |
| int j; |
| char_u *p; |
| - static struct cmdmod |
| - { |
| - char *name; |
| - int minlen; |
| - } cmdmods[] = { |
| - {"aboveleft", 3}, |
| - {"belowright", 3}, |
| - {"botright", 2}, |
| - {"browse", 3}, |
| - {"confirm", 4}, |
| - {"hide", 3}, |
| - {"keepalt", 5}, |
| - {"keepjumps", 5}, |
| - {"keepmarks", 3}, |
| - {"leftabove", 5}, |
| - {"lockmarks", 3}, |
| - {"rightbelow", 6}, |
| - {"sandbox", 3}, |
| - {"silent", 3}, |
| - {"tab", 3}, |
| - {"topleft", 2}, |
| - {"verbose", 4}, |
| - {"vertical", 4}, |
| - }; |
| |
| /* Check command modifiers. */ |
| for (i = 0; i < sizeof(cmdmods) / sizeof(struct cmdmod); ++i) |
| --- 3028,3033 ---- |
| |
| |
| |
| *** 2269,2277 **** |
| has_loop_cmd(p) |
| char_u *p; |
| { |
| ! p = skipwhite(p); |
| ! while (*p == ':') |
| ! p = skipwhite(p + 1); |
| if ((p[0] == 'w' && p[1] == 'h') |
| || (p[0] == 'f' && p[1] == 'o' && p[2] == 'r')) |
| return TRUE; |
| --- 2269,2286 ---- |
| has_loop_cmd(p) |
| char_u *p; |
| { |
| ! int len; |
| ! |
| ! /* skip modifiers, white space and ':' */ |
| ! for (;;) |
| ! { |
| ! while (*p == ' ' || *p == '\t' || *p == ':') |
| ! ++p; |
| ! len = modifier_len(p); |
| ! if (len == 0) |
| ! break; |
| ! p += len; |
| ! } |
| if ((p[0] == 'w' && p[1] == 'h') |
| || (p[0] == 'f' && p[1] == 'o' && p[2] == 'r')) |
| return TRUE; |
| |
| |
| |
| *** 668,669 **** |
| --- 668,671 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 162, |
| /**/ |
| |
| -- |
| hundred-and-one symptoms of being an internet addict: |
| 144. You eagerly await the update of the "Cool Site of the Day." |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ download, build and distribute -- http://www.A-A-P.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |