changeset 3257:75217982ea46 v7.3.397

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)
author Bram Moolenaar <bram@vim.org>
date Tue, 10 Jan 2012 16:28:45 +0100
parents ba708ee8d69d
children 481fe3dd73e5
files src/misc2.c src/proto/misc2.pro src/quickfix.c src/spell.c src/version.c
diffstat 5 files changed, 64 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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 : */
--- 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 =
--- a/src/spell.c
+++ b/src/spell.c
@@ -5020,7 +5020,6 @@ static void aff_check_string __ARGS((cha
 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
--- 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,