From b901376c0c3acfca2c002968faf4c34fef32430d Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Tue, 10 Jan 2012 16:28:45 +0100 Subject: 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) --- src/misc2.c | 20 ++++++++++++++++++++ src/proto/misc2.pro | 1 + src/quickfix.c | 47 +++++++++++++++++++++++++++++++++++++++++------ src/spell.c | 18 ------------------ src/version.c | 2 ++ 5 files changed, 64 insertions(+), 24 deletions(-) diff --git a/src/misc2.c b/src/misc2.c index 784e4889..96c3a363 100644 --- a/src/misc2.c +++ b/src/misc2.c @@ -6541,3 +6541,23 @@ put_time(fd, the_time) #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 diff --git a/src/proto/misc2.pro b/src/proto/misc2.pro index d8d3cc37..16c59183 100644 --- a/src/proto/misc2.pro +++ b/src/proto/misc2.pro @@ -116,4 +116,5 @@ time_t get8ctime __ARGS((FILE *fd)); char_u *read_string __ARGS((FILE *fd, int cnt)); int put_bytes __ARGS((FILE *fd, long_u nr, int len)); void put_time __ARGS((FILE *fd, time_t the_time)); +int has_non_ascii __ARGS((char_u *s)); /* vim: set ft=c : */ diff --git a/src/quickfix.c b/src/quickfix.c index a2935bea..794c4938 100644 --- a/src/quickfix.c +++ b/src/quickfix.c @@ -3914,6 +3914,16 @@ ex_helpgrep(eap) regmatch.rm_ic = FALSE; 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 */ qf_new_list(qi, *eap->cmdlinep); @@ -3948,21 +3958,33 @@ ex_helpgrep(eap) lnum = 1; while (!vim_fgets(IObuff, IOSIZE, fd) && !got_int) { - if (vim_regexec(®match, 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(®match, line, (colnr_T)0)) { - int l = (int)STRLEN(IObuff); + int l = (int)STRLEN(line); /* remove trailing CR, LF, spaces, etc. */ - while (l > 0 && IObuff[l - 1] <= ' ') - IObuff[--l] = NUL; + while (l > 0 && line[l - 1] <= ' ') + line[--l] = NUL; if (qf_add_entry(qi, &prevp, NULL, /* dir */ fnames[fi], 0, - IObuff, + line, lnum, - (int)(regmatch.startp[0] - IObuff) + (int)(regmatch.startp[0] - line) + 1, /* col */ FALSE, /* vis_col */ NULL, /* search pattern */ @@ -3972,9 +3994,17 @@ ex_helpgrep(eap) ) == FAIL) { got_int = TRUE; +#ifdef FEAT_MBYTE + if (line != IObuff) + vim_free(line); +#endif break; } } +#ifdef FEAT_MBYTE + if (line != IObuff) + vim_free(line); +#endif ++lnum; line_breakcheck(); } @@ -3984,7 +4014,12 @@ ex_helpgrep(eap) FreeWild(fcount, fnames); } } + 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_ptr = diff --git a/src/spell.c b/src/spell.c index 464d4d0d..f7ec0c73 100644 --- a/src/spell.c +++ b/src/spell.c @@ -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 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 has_non_ascii __ARGS((char_u *s)); 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 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 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(). */ diff --git a/src/version.c b/src/version.c index e0d926de..777c15ec 100644 --- a/src/version.c +++ b/src/version.c @@ -714,6 +714,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 397, /**/ 396, /**/ -- cgit v1.2.1