summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <bram@vim.org>2012-01-10 16:28:45 +0100
committerBram Moolenaar <bram@vim.org>2012-01-10 16:28:45 +0100
commitb901376c0c3acfca2c002968faf4c34fef32430d (patch)
tree9b9f56339188ec67fa54734b8ef9cd9ebdc767d8
parentbf7239ea72df4b95cd18b8aaaf24f27ba2c5c238 (diff)
downloadvim-b901376c0c3acfca2c002968faf4c34fef32430d.tar.gz
updated for version 7.3.397v7.3.397v7-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)
-rw-r--r--src/misc2.c20
-rw-r--r--src/proto/misc2.pro1
-rw-r--r--src/quickfix.c47
-rw-r--r--src/spell.c18
-rw-r--r--src/version.c2
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(&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. */
- 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));
@@ -6485,23 +6484,6 @@ sal_to_bool(s)
}
/*
- * 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().
*/
static void
diff --git a/src/version.c b/src/version.c
index e0d926de..777c15ec 100644
--- a/src/version.c
+++ b/src/version.c
@@ -715,6 +715,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 397,
+/**/
396,
/**/
395,