1
0
forked from aniani/vim

updated for version 7.3.397

Problem:    ":helpgrep" does not work properly when 'encoding' is not utf-8 or
            latin1.
Solution:   Convert non-ascii lines to 'encoding'. (Yasuhiro Matsumoto)
This commit is contained in:
Bram Moolenaar
2012-01-10 16:28:45 +01:00
parent 6ee8d89cf9
commit 10b7b39b3d
5 changed files with 64 additions and 24 deletions

View File

@@ -6541,3 +6541,23 @@ put_time(fd, the_time)
#endif #endif
#endif #endif
#if (defined(FEAT_MBYTE) && defined(FEAT_QUICKFIX)) \
|| defined(FEAT_SPELL) || defined(PROTO)
/*
* Return TRUE if string "s" contains a non-ASCII character (128 or higher).
* When "s" is NULL FALSE is returned.
*/
int
has_non_ascii(s)
char_u *s;
{
char_u *p;
if (s != NULL)
for (p = s; *p != NUL; ++p)
if (*p >= 128)
return TRUE;
return FALSE;
}
#endif

View File

@@ -116,4 +116,5 @@ time_t get8ctime __ARGS((FILE *fd));
char_u *read_string __ARGS((FILE *fd, int cnt)); char_u *read_string __ARGS((FILE *fd, int cnt));
int put_bytes __ARGS((FILE *fd, long_u nr, int len)); int put_bytes __ARGS((FILE *fd, long_u nr, int len));
void put_time __ARGS((FILE *fd, time_t the_time)); void put_time __ARGS((FILE *fd, time_t the_time));
int has_non_ascii __ARGS((char_u *s));
/* vim: set ft=c : */ /* vim: set ft=c : */

View File

@@ -3914,6 +3914,16 @@ ex_helpgrep(eap)
regmatch.rm_ic = FALSE; regmatch.rm_ic = FALSE;
if (regmatch.regprog != NULL) if (regmatch.regprog != NULL)
{ {
#ifdef FEAT_MBYTE
vimconv_T vc;
/* Help files are in utf-8 or latin1, convert lines when 'encoding'
* differs. */
vc.vc_type = CONV_NONE;
if (!enc_utf8)
convert_setup(&vc, (char_u *)"utf-8", p_enc);
#endif
/* create a new quickfix list */ /* create a new quickfix list */
qf_new_list(qi, *eap->cmdlinep); qf_new_list(qi, *eap->cmdlinep);
@@ -3948,21 +3958,33 @@ ex_helpgrep(eap)
lnum = 1; lnum = 1;
while (!vim_fgets(IObuff, IOSIZE, fd) && !got_int) while (!vim_fgets(IObuff, IOSIZE, fd) && !got_int)
{ {
if (vim_regexec(&regmatch, IObuff, (colnr_T)0)) char_u *line = IObuff;
#ifdef FEAT_MBYTE
/* Convert a line if 'encoding' is not utf-8 and
* the line contains a non-ASCII character. */
if (vc.vc_type != CONV_NONE
&& has_non_ascii(IObuff)) {
line = string_convert(&vc, IObuff, NULL);
if (line == NULL)
line = IObuff;
}
#endif
if (vim_regexec(&regmatch, line, (colnr_T)0))
{ {
int l = (int)STRLEN(IObuff); int l = (int)STRLEN(line);
/* remove trailing CR, LF, spaces, etc. */ /* remove trailing CR, LF, spaces, etc. */
while (l > 0 && IObuff[l - 1] <= ' ') while (l > 0 && line[l - 1] <= ' ')
IObuff[--l] = NUL; line[--l] = NUL;
if (qf_add_entry(qi, &prevp, if (qf_add_entry(qi, &prevp,
NULL, /* dir */ NULL, /* dir */
fnames[fi], fnames[fi],
0, 0,
IObuff, line,
lnum, lnum,
(int)(regmatch.startp[0] - IObuff) (int)(regmatch.startp[0] - line)
+ 1, /* col */ + 1, /* col */
FALSE, /* vis_col */ FALSE, /* vis_col */
NULL, /* search pattern */ NULL, /* search pattern */
@@ -3972,9 +3994,17 @@ ex_helpgrep(eap)
) == FAIL) ) == FAIL)
{ {
got_int = TRUE; got_int = TRUE;
#ifdef FEAT_MBYTE
if (line != IObuff)
vim_free(line);
#endif
break; break;
} }
} }
#ifdef FEAT_MBYTE
if (line != IObuff)
vim_free(line);
#endif
++lnum; ++lnum;
line_breakcheck(); line_breakcheck();
} }
@@ -3984,7 +4014,12 @@ ex_helpgrep(eap)
FreeWild(fcount, fnames); FreeWild(fcount, fnames);
} }
} }
vim_free(regmatch.regprog); vim_free(regmatch.regprog);
#ifdef FEAT_MBYTE
if (vc.vc_type != CONV_NONE)
convert_setup(&vc, NULL, NULL);
#endif
qi->qf_lists[qi->qf_curlist].qf_nonevalid = FALSE; qi->qf_lists[qi->qf_curlist].qf_nonevalid = FALSE;
qi->qf_lists[qi->qf_curlist].qf_ptr = qi->qf_lists[qi->qf_curlist].qf_ptr =

View File

@@ -5020,7 +5020,6 @@ static void aff_check_string __ARGS((char_u *spinval, char_u *affval, char *name
static int str_equal __ARGS((char_u *s1, char_u *s2)); static int str_equal __ARGS((char_u *s1, char_u *s2));
static void add_fromto __ARGS((spellinfo_T *spin, garray_T *gap, char_u *from, char_u *to)); static void add_fromto __ARGS((spellinfo_T *spin, garray_T *gap, char_u *from, char_u *to));
static int sal_to_bool __ARGS((char_u *s)); static int sal_to_bool __ARGS((char_u *s));
static int has_non_ascii __ARGS((char_u *s));
static void spell_free_aff __ARGS((afffile_T *aff)); static void spell_free_aff __ARGS((afffile_T *aff));
static int spell_read_dic __ARGS((spellinfo_T *spin, char_u *fname, afffile_T *affile)); static int spell_read_dic __ARGS((spellinfo_T *spin, char_u *fname, afffile_T *affile));
static int get_affix_flags __ARGS((afffile_T *affile, char_u *afflist)); static int get_affix_flags __ARGS((afffile_T *affile, char_u *afflist));
@@ -6484,23 +6483,6 @@ sal_to_bool(s)
return STRCMP(s, "1") == 0 || STRCMP(s, "true") == 0; return STRCMP(s, "1") == 0 || STRCMP(s, "true") == 0;
} }
/*
* Return TRUE if string "s" contains a non-ASCII character (128 or higher).
* When "s" is NULL FALSE is returned.
*/
static int
has_non_ascii(s)
char_u *s;
{
char_u *p;
if (s != NULL)
for (p = s; *p != NUL; ++p)
if (*p >= 128)
return TRUE;
return FALSE;
}
/* /*
* Free the structure filled by spell_read_aff(). * Free the structure filled by spell_read_aff().
*/ */

View File

@@ -714,6 +714,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
397,
/**/ /**/
396, 396,
/**/ /**/