| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.397 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| 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 |
| |
| |
| |
| |
| |
| *** 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 = |
| |
| |
| |
| *** 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 ---- |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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 : */ |
| |
| |
| |
| *** 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 /// |