To: vim_dev@googlegroups.com Subject: Patch 7.3.397 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 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) Files: src/quickfix.c, src/spell.c, src/misc2.c, src/proto/misc2.pro *** ../vim-7.3.396/src/quickfix.c 2011-12-30 15:01:55.000000000 +0100 --- src/quickfix.c 2012-01-10 16:18:51.000000000 +0100 *************** *** 3914,3919 **** --- 3914,3929 ---- 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,3968 **** lnum = 1; while (!vim_fgets(IObuff, IOSIZE, fd) && !got_int) { ! if (vim_regexec(®match, IObuff, (colnr_T)0)) { ! int l = (int)STRLEN(IObuff); /* remove trailing CR, LF, spaces, etc. */ ! while (l > 0 && IObuff[l - 1] <= ' ') ! IObuff[--l] = NUL; if (qf_add_entry(qi, &prevp, NULL, /* dir */ fnames[fi], 0, ! IObuff, lnum, ! (int)(regmatch.startp[0] - IObuff) + 1, /* col */ FALSE, /* vis_col */ NULL, /* search pattern */ --- 3958,3990 ---- lnum = 1; while (!vim_fgets(IObuff, IOSIZE, fd) && !got_int) { ! 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(line); /* remove trailing CR, LF, spaces, etc. */ ! while (l > 0 && line[l - 1] <= ' ') ! line[--l] = NUL; if (qf_add_entry(qi, &prevp, NULL, /* dir */ fnames[fi], 0, ! line, lnum, ! (int)(regmatch.startp[0] - line) + 1, /* col */ FALSE, /* vis_col */ NULL, /* search pattern */ *************** *** 3972,3980 **** --- 3994,4010 ---- ) == 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,3990 **** --- 4014,4025 ---- 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 = *** ../vim-7.3.396/src/spell.c 2011-09-02 14:18:14.000000000 +0200 --- src/spell.c 2012-01-10 16:19:33.000000000 +0100 *************** *** 5020,5026 **** 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)); --- 5020,5025 ---- *************** *** 6485,6507 **** } /* - * 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 --- 6484,6489 ---- *** ../vim-7.3.396/src/misc2.c 2011-12-08 17:49:31.000000000 +0100 --- src/misc2.c 2012-01-10 16:25:53.000000000 +0100 *************** *** 6541,6543 **** --- 6541,6563 ---- #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 *** ../vim-7.3.396/src/proto/misc2.pro 2011-07-07 16:20:45.000000000 +0200 --- src/proto/misc2.pro 2012-01-10 16:20:03.000000000 +0100 *************** *** 116,119 **** --- 116,120 ---- 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 : */ *** ../vim-7.3.396/src/version.c 2012-01-10 13:46:18.000000000 +0100 --- src/version.c 2012-01-10 16:26:32.000000000 +0100 *************** *** 716,717 **** --- 716,719 ---- { /* Add new patch number below this line */ + /**/ + 397, /**/ -- Biting someone with your natural teeth is "simple assault," while biting someone with your false teeth is "aggravated assault." [real standing law in Louisana, United States of America] /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///