Mercurial > vim
changeset 3097:738ea87c1964 v7.3.320
updated for version 7.3.320
Problem: When a 0xa0 character is in a sourced file the error message for
unrecognized command does not show the problem.
Solution: Display 0xa0 as <a0>.
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Wed, 21 Sep 2011 19:10:46 +0200 |
parents | 57585ff9888f |
children | cabd149477b2 |
files | src/ex_docmd.c src/version.c |
diffstat | 2 files changed, 41 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -61,6 +61,7 @@ static char_u *do_one_cmd __ARGS((char_u static char_u *do_one_cmd __ARGS((char_u **, int, char_u *(*fgetline)(int, void *, int), void *cookie)); static int if_level = 0; /* depth in :if */ #endif +static void append_command __ARGS((char_u *cmd)); static char_u *find_command __ARGS((exarg_T *eap, int *full)); static void ex_abbreviate __ARGS((exarg_T *eap)); @@ -2136,10 +2137,7 @@ do_one_cmd(cmdlinep, sourcing, { STRCPY(IObuff, _("E492: Not an editor command")); if (!sourcing) - { - STRCAT(IObuff, ": "); - STRNCAT(IObuff, *cmdlinep, 40); - } + append_command(*cmdlinep); errormsg = IObuff; } goto doend; @@ -2708,8 +2706,7 @@ doend: STRCPY(IObuff, errormsg); errormsg = IObuff; } - STRCAT(errormsg, ": "); - STRNCAT(errormsg, *cmdlinep, IOSIZE - STRLEN(IObuff) - 1); + append_command(*cmdlinep); } emsg(errormsg); } @@ -2797,6 +2794,42 @@ checkforcmd(pp, cmd, len) } /* + * Append "cmd" to the error message in IObuff. + * Takes care of limiting the length and handling 0xa0, which would be + * invisible otherwise. + */ + static void +append_command(cmd) + char_u *cmd; +{ + char_u *s = cmd; + char_u *d; + + STRCAT(IObuff, ": "); + d = IObuff + STRLEN(IObuff); + while (*s != NUL && d - IObuff < IOSIZE - 7) + { + if ( +#ifdef FEAT_MBYTE + enc_utf8 ? (s[0] == 0xc2 && s[1] == 0xa0) : +#endif + *s == 0xa0) + { + s += +#ifdef FEAT_MBYTE + enc_utf8 ? 2 : +#endif + 1; + STRCPY(d, "<a0>"); + d += 4; + } + else + MB_COPY_CHAR(s, d); + } + *d = NUL; +} + +/* * Find an Ex command by its name, either built-in or user. * Start of the name can be found at eap->cmd. * Returns pointer to char after the command name.