Patch 7.3.336
Problem:    When a tags file specifies an encoding different from 'enc' it
            may hang and using a pattern doesn't work.
Solution:   Convert the whole line.  Continue reading the header after the
            SORT tag.  Add test83. (Yukihiro Nakadaira)
Files:      src/tag.c, src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
            src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
            src/testdir/Make_vms.mms, src/testdir/Makefile,
            src/testdir/test83-tags2, src/testdir/test83-tags3,
            src/testdir/test83.in, src/testdir/test83.ok


*** ../vim-7.3.335/src/tag.c    2011-04-11 21:35:03.000000000 +0200
--- src/tag.c   2011-10-12 19:51:04.000000000 +0200
***************
*** 1277,1282 ****
--- 1277,1283 ----
  {
      FILE       *fp;
      char_u     *lbuf;                 /* line buffer */
+     int               lbuf_size = LSIZE;      /* length of lbuf */
      char_u     *tag_fname;            /* name of tag file */
      tagname_T tn;                     /* info for get_tagfname() */
      int               first_file;             /* trying first tag file */
***************
*** 1291,1296 ****
--- 1292,1298 ----
      char_u    *s;
      int               i;
  #ifdef FEAT_TAG_BINS
+     int               tag_file_sorted = NUL;  /* !_TAG_FILE_SORTED value */
      struct tag_search_info    /* Binary search file offsets */
      {
        off_t   low_offset;     /* offset for first char of first line that
***************
*** 1360,1372 ****
      char_u    *saved_pat = NULL;              /* copy of pat[] */
  #endif
  
-     /* Use two sets of variables for the pattern: "orgpat" holds the values
-      * for the original pattern and "convpat" converted from 'encoding' to
-      * encoding of the tags file.  "pats" point to either one of these. */
-     pat_T     *pats;
      pat_T     orgpat;                 /* holds unconverted pattern info */
  #ifdef FEAT_MBYTE
-     pat_T     convpat;                /* holds converted pattern info */
      vimconv_T vimconv;
  #endif
  
--- 1362,1369 ----
***************
*** 1390,1396 ****
  
      help_save = curbuf->b_help;
      orgpat.pat = pat;
-     pats = &orgpat;
  #ifdef FEAT_MBYTE
      vimconv.vc_type = CONV_NONE;
  #endif
--- 1387,1392 ----
***************
*** 1398,1404 ****
  /*
   * Allocate memory for the buffers that are used
   */
!     lbuf = alloc(LSIZE);
      tag_fname = alloc(MAXPATHL + 1);
  #ifdef FEAT_EMACS_TAGS
      ebuf = alloc(LSIZE);
--- 1394,1400 ----
  /*
   * Allocate memory for the buffers that are used
   */
!     lbuf = alloc(lbuf_size);
      tag_fname = alloc(MAXPATHL + 1);
  #ifdef FEAT_EMACS_TAGS
      ebuf = alloc(LSIZE);
***************
*** 1424,1453 ****
      if (help_only)                            /* want tags from help file */
        curbuf->b_help = TRUE;                  /* will be restored later */
  
!     pats->len = (int)STRLEN(pat);
  #ifdef FEAT_MULTI_LANG
      if (curbuf->b_help)
      {
        /* When "@ab" is specified use only the "ab" language, otherwise
         * search all languages. */
!       if (pats->len > 3 && pat[pats->len - 3] == '@'
!                                         && ASCII_ISALPHA(pat[pats->len - 2])
!                                        && ASCII_ISALPHA(pat[pats->len - 1]))
        {
!           saved_pat = vim_strnsave(pat, pats->len - 3);
            if (saved_pat != NULL)
            {
!               help_lang_find = &pat[pats->len - 2];
!               pats->pat = saved_pat;
!               pats->len -= 3;
            }
        }
      }
  #endif
!     if (p_tl != 0 && pats->len > p_tl)                /* adjust for 
'taglength' */
!       pats->len = p_tl;
  
!     prepare_pats(pats, has_re);
  
  #ifdef FEAT_TAG_BINS
      /* This is only to avoid a compiler warning for using search_info
--- 1420,1449 ----
      if (help_only)                            /* want tags from help file */
        curbuf->b_help = TRUE;                  /* will be restored later */
  
!     orgpat.len = (int)STRLEN(pat);
  #ifdef FEAT_MULTI_LANG
      if (curbuf->b_help)
      {
        /* When "@ab" is specified use only the "ab" language, otherwise
         * search all languages. */
!       if (orgpat.len > 3 && pat[orgpat.len - 3] == '@'
!                                         && ASCII_ISALPHA(pat[orgpat.len - 2])
!                                        && ASCII_ISALPHA(pat[orgpat.len - 1]))
        {
!           saved_pat = vim_strnsave(pat, orgpat.len - 3);
            if (saved_pat != NULL)
            {
!               help_lang_find = &pat[orgpat.len - 2];
!               orgpat.pat = saved_pat;
!               orgpat.len -= 3;
            }
        }
      }
  #endif
!     if (p_tl != 0 && orgpat.len > p_tl)               /* adjust for 
'taglength' */
!       orgpat.len = p_tl;
  
!     prepare_pats(&orgpat, has_re);
  
  #ifdef FEAT_TAG_BINS
      /* This is only to avoid a compiler warning for using search_info
***************
*** 1466,1478 ****
       * Only ignore case when TAG_NOIC not used or 'ignorecase' set.
       */
  #ifdef FEAT_TAG_BINS
!     pats->regmatch.rm_ic = ((p_ic || !noic)
!                               && (findall || pats->headlen == 0 || !p_tbs));
      for (round = 1; round <= 2; ++round)
      {
!       linear = (pats->headlen == 0 || !p_tbs || round == 2);
  #else
!       pats->regmatch.rm_ic = (p_ic || !noic);
  #endif
  
        /*
--- 1462,1474 ----
       * Only ignore case when TAG_NOIC not used or 'ignorecase' set.
       */
  #ifdef FEAT_TAG_BINS
!     orgpat.regmatch.rm_ic = ((p_ic || !noic)
!                               && (findall || orgpat.headlen == 0 || !p_tbs));
      for (round = 1; round <= 2; ++round)
      {
!       linear = (orgpat.headlen == 0 || !p_tbs || round == 2);
  #else
!       orgpat.regmatch.rm_ic = (p_ic || !noic);
  #endif
  
        /*
***************
*** 1701,1706 ****
--- 1697,1732 ----
            }
  line_read_in:
  
+ #ifdef FEAT_MBYTE
+           if (vimconv.vc_type != CONV_NONE)
+           {
+               char_u  *conv_line;
+               int     len;
+ 
+               /* Convert every line.  Converting the pattern from 'enc' to
+                * the tags file encoding doesn't work, because characters are
+                * not recognized. */
+               conv_line = string_convert(&vimconv, lbuf, NULL);
+               if (conv_line != NULL)
+               {
+                   /* Copy or swap lbuf and conv_line. */
+                   len = (int)STRLEN(conv_line) + 1;
+                   if (len > lbuf_size)
+                   {
+                       vim_free(lbuf);
+                       lbuf = conv_line;
+                       lbuf_size = len;
+                   }
+                   else
+                   {
+                       STRCPY(lbuf, conv_line);
+                       vim_free(conv_line);
+                   }
+               }
+           }
+ #endif
+ 
+ 
  #ifdef FEAT_EMACS_TAGS
            /*
             * Emacs tags line with CTRL-L: New file name on next line.
***************
*** 1770,1775 ****
--- 1796,1828 ----
             */
            if (state == TS_START)
            {
+               if (STRNCMP(lbuf, "!_TAG_", 6) <= 0)
+               {
+                   /*
+                    * Read header line.
+                    */
+ #ifdef FEAT_TAG_BINS
+                   if (STRNCMP(lbuf, "!_TAG_FILE_SORTED\t", 18) == 0)
+                       tag_file_sorted = lbuf[18];
+ #endif
+ #ifdef FEAT_MBYTE
+                   if (STRNCMP(lbuf, "!_TAG_FILE_ENCODING\t", 20) == 0)
+                   {
+                       /* Prepare to convert every line from the specified
+                        * encoding to 'encoding'. */
+                       for (p = lbuf + 20; *p > ' ' && *p < 127; ++p)
+                           ;
+                       *p = NUL;
+                       convert_setup(&vimconv, lbuf + 20, p_enc);
+                   }
+ #endif
+ 
+                   /* Read the next line.  Unrecognized flags are ignored. */
+                   continue;
+               }
+ 
+               /* Headers ends. */
+ 
  #ifdef FEAT_TAG_BINS
                /*
                 * When there is no tag head, or ignoring case, need to do a
***************
*** 1786,1809 ****
                if (linear)
  # endif
                    state = TS_LINEAR;
!               else if (STRNCMP(lbuf, "!_TAG_", 6) > 0)
                    state = TS_BINARY;
!               else if (STRNCMP(lbuf, "!_TAG_FILE_SORTED\t", 18) == 0)
!               {
!                   /* Check sorted flag */
!                   if (lbuf[18] == '1')
                        state = TS_BINARY;
!                   else if (lbuf[18] == '2')
!                   {
!                       state = TS_BINARY;
!                       sortic = TRUE;
!                       pats->regmatch.rm_ic = (p_ic || !noic);
!                   }
!                   else
!                       state = TS_LINEAR;
                }
  
!               if (state == TS_BINARY && pats->regmatch.rm_ic && !sortic)
                {
                    /* binary search won't work for ignoring case, use linear
                     * search. */
--- 1839,1858 ----
                if (linear)
  # endif
                    state = TS_LINEAR;
!               else if (tag_file_sorted == NUL)
                    state = TS_BINARY;
!               else if (tag_file_sorted == '1')
                        state = TS_BINARY;
!               else if (tag_file_sorted == '2')
!               {
!                   state = TS_BINARY;
!                   sortic = TRUE;
!                   orgpat.regmatch.rm_ic = (p_ic || !noic);
                }
+               else
+                   state = TS_LINEAR;
  
!               if (state == TS_BINARY && orgpat.regmatch.rm_ic && !sortic)
                {
                    /* binary search won't work for ignoring case, use linear
                     * search. */
***************
*** 1843,1882 ****
  #endif
            }
  
- #ifdef FEAT_MBYTE
-           if (lbuf[0] == '!' && pats == &orgpat
-                          && STRNCMP(lbuf, "!_TAG_FILE_ENCODING\t", 20) == 0)
-           {
-               /* Convert the search pattern from 'encoding' to the
-                * specified encoding. */
-               for (p = lbuf + 20; *p > ' ' && *p < 127; ++p)
-                   ;
-               *p = NUL;
-               convert_setup(&vimconv, p_enc, lbuf + 20);
-               if (vimconv.vc_type != CONV_NONE)
-               {
-                   convpat.pat = string_convert(&vimconv, pats->pat, NULL);
-                   if (convpat.pat != NULL)
-                   {
-                       pats = &convpat;
-                       pats->len = (int)STRLEN(pats->pat);
-                       prepare_pats(pats, has_re);
-                       pats->regmatch.rm_ic = orgpat.regmatch.rm_ic;
-                   }
-               }
- 
-               /* Prepare for converting a match the other way around. */
-               convert_setup(&vimconv, lbuf + 20, p_enc);
-               continue;
-           }
- #endif
- 
            /*
             * Figure out where the different strings are in this line.
             * For "normal" tags: Do a quick check if the tag matches.
             * This speeds up tag searching a lot!
             */
!           if (pats->headlen
  #ifdef FEAT_EMACS_TAGS
                            && !is_etag
  #endif
--- 1892,1903 ----
  #endif
            }
  
            /*
             * Figure out where the different strings are in this line.
             * For "normal" tags: Do a quick check if the tag matches.
             * This speeds up tag searching a lot!
             */
!           if (orgpat.headlen
  #ifdef FEAT_EMACS_TAGS
                            && !is_etag
  #endif
***************
*** 1933,1941 ****
                cmplen = (int)(tagp.tagname_end - tagp.tagname);
                if (p_tl != 0 && cmplen > p_tl)     /* adjust for 'taglength' */
                    cmplen = p_tl;
!               if (has_re && pats->headlen < cmplen)
!                   cmplen = pats->headlen;
!               else if (state == TS_LINEAR && pats->headlen != cmplen)
                    continue;
  
  #ifdef FEAT_TAG_BINS
--- 1954,1962 ----
                cmplen = (int)(tagp.tagname_end - tagp.tagname);
                if (p_tl != 0 && cmplen > p_tl)     /* adjust for 'taglength' */
                    cmplen = p_tl;
!               if (has_re && orgpat.headlen < cmplen)
!                   cmplen = orgpat.headlen;
!               else if (state == TS_LINEAR && orgpat.headlen != cmplen)
                    continue;
  
  #ifdef FEAT_TAG_BINS
***************
*** 1954,1963 ****
                     * Compare the current tag with the searched tag.
                     */
                    if (sortic)
!                       tagcmp = tag_strnicmp(tagp.tagname, pats->head,
                                                              (size_t)cmplen);
                    else
!                       tagcmp = STRNCMP(tagp.tagname, pats->head, cmplen);
  
                    /*
                     * A match with a shorter tag means to search forward.
--- 1975,1984 ----
                     * Compare the current tag with the searched tag.
                     */
                    if (sortic)
!                       tagcmp = tag_strnicmp(tagp.tagname, orgpat.head,
                                                              (size_t)cmplen);
                    else
!                       tagcmp = STRNCMP(tagp.tagname, orgpat.head, cmplen);
  
                    /*
                     * A match with a shorter tag means to search forward.
***************
*** 1965,1973 ****
                     */
                    if (tagcmp == 0)
                    {
!                       if (cmplen < pats->headlen)
                            tagcmp = -1;
!                       else if (cmplen > pats->headlen)
                            tagcmp = 1;
                    }
  
--- 1986,1994 ----
                     */
                    if (tagcmp == 0)
                    {
!                       if (cmplen < orgpat.headlen)
                            tagcmp = -1;
!                       else if (cmplen > orgpat.headlen)
                            tagcmp = 1;
                    }
  
***************
*** 2011,2017 ****
                }
                else if (state == TS_SKIP_BACK)
                {
!                   if (MB_STRNICMP(tagp.tagname, pats->head, cmplen) != 0)
                        state = TS_STEP_FORWARD;
                    else
                        /* Have to skip back more.  Restore the curr_offset
--- 2032,2038 ----
                }
                else if (state == TS_SKIP_BACK)
                {
!                   if (MB_STRNICMP(tagp.tagname, orgpat.head, cmplen) != 0)
                        state = TS_STEP_FORWARD;
                    else
                        /* Have to skip back more.  Restore the curr_offset
***************
*** 2021,2027 ****
                }
                else if (state == TS_STEP_FORWARD)
                {
!                   if (MB_STRNICMP(tagp.tagname, pats->head, cmplen) != 0)
                    {
                        if ((off_t)ftell(fp) > search_info.match_offset)
                            break;      /* past last match */
--- 2042,2048 ----
                }
                else if (state == TS_STEP_FORWARD)
                {
!                   if (MB_STRNICMP(tagp.tagname, orgpat.head, cmplen) != 0)
                    {
                        if ((off_t)ftell(fp) > search_info.match_offset)
                            break;      /* past last match */
***************
*** 2032,2038 ****
                else
  #endif
                    /* skip this match if it can't match */
!                   if (MB_STRNICMP(tagp.tagname, pats->head, cmplen) != 0)
                    continue;
  
                /*
--- 2053,2059 ----
                else
  #endif
                    /* skip this match if it can't match */
!                   if (MB_STRNICMP(tagp.tagname, orgpat.head, cmplen) != 0)
                    continue;
  
                /*
***************
*** 2083,2123 ****
            if (p_tl != 0 && cmplen > p_tl)         /* adjust for 'taglength' */
                cmplen = p_tl;
            /* if tag length does not match, don't try comparing */
!           if (pats->len != cmplen)
                match = FALSE;
            else
            {
!               if (pats->regmatch.rm_ic)
                {
!                   match = (MB_STRNICMP(tagp.tagname, pats->pat, cmplen) == 0);
                    if (match)
!                       match_no_ic = (STRNCMP(tagp.tagname, pats->pat,
                                                                cmplen) == 0);
                }
                else
!                   match = (STRNCMP(tagp.tagname, pats->pat, cmplen) == 0);
            }
  
            /*
             * Has a regexp: Also find tags matching regexp.
             */
            match_re = FALSE;
!           if (!match && pats->regmatch.regprog != NULL)
            {
                int     cc;
  
                cc = *tagp.tagname_end;
                *tagp.tagname_end = NUL;
!               match = vim_regexec(&pats->regmatch, tagp.tagname, (colnr_T)0);
                if (match)
                {
!                   matchoff = (int)(pats->regmatch.startp[0] - tagp.tagname);
!                   if (pats->regmatch.rm_ic)
                    {
!                       pats->regmatch.rm_ic = FALSE;
!                       match_no_ic = vim_regexec(&pats->regmatch, tagp.tagname,
                                                                  (colnr_T)0);
!                       pats->regmatch.rm_ic = TRUE;
                    }
                }
                *tagp.tagname_end = cc;
--- 2104,2144 ----
            if (p_tl != 0 && cmplen > p_tl)         /* adjust for 'taglength' */
                cmplen = p_tl;
            /* if tag length does not match, don't try comparing */
!           if (orgpat.len != cmplen)
                match = FALSE;
            else
            {
!               if (orgpat.regmatch.rm_ic)
                {
!                   match = (MB_STRNICMP(tagp.tagname, orgpat.pat, cmplen) == 
0);
                    if (match)
!                       match_no_ic = (STRNCMP(tagp.tagname, orgpat.pat,
                                                                cmplen) == 0);
                }
                else
!                   match = (STRNCMP(tagp.tagname, orgpat.pat, cmplen) == 0);
            }
  
            /*
             * Has a regexp: Also find tags matching regexp.
             */
            match_re = FALSE;
!           if (!match && orgpat.regmatch.regprog != NULL)
            {
                int     cc;
  
                cc = *tagp.tagname_end;
                *tagp.tagname_end = NUL;
!               match = vim_regexec(&orgpat.regmatch, tagp.tagname, (colnr_T)0);
                if (match)
                {
!                   matchoff = (int)(orgpat.regmatch.startp[0] - tagp.tagname);
!                   if (orgpat.regmatch.rm_ic)
                    {
!                       orgpat.regmatch.rm_ic = FALSE;
!                       match_no_ic = vim_regexec(&orgpat.regmatch, 
tagp.tagname,
                                                                  (colnr_T)0);
!                       orgpat.regmatch.rm_ic = TRUE;
                    }
                }
                *tagp.tagname_end = cc;
***************
*** 2174,2180 ****
                        else
                            mtt = MT_GL_OTH;
                    }
!                   if (pats->regmatch.rm_ic && !match_no_ic)
                        mtt += MT_IC_OFF;
                    if (match_re)
                        mtt += MT_RE_OFF;
--- 2195,2201 ----
                        else
                            mtt = MT_GL_OTH;
                    }
!                   if (orgpat.regmatch.rm_ic && !match_no_ic)
                        mtt += MT_IC_OFF;
                    if (match_re)
                        mtt += MT_RE_OFF;
***************
*** 2187,2221 ****
                 */
                if (ga_grow(&ga_match[mtt], 1) == OK)
                {
- #ifdef FEAT_MBYTE
-                   char_u      *conv_line = NULL;
-                   char_u      *lbuf_line = lbuf;
- 
-                   if (vimconv.vc_type != CONV_NONE)
-                   {
-                       /* Convert the tag line from the encoding of the tags
-                        * file to 'encoding'.  Then parse the line again. */
-                       conv_line = string_convert(&vimconv, lbuf, NULL);
-                       if (conv_line != NULL)
-                       {
-                           if (parse_tag_line(conv_line,
- #ifdef FEAT_EMACS_TAGS
-                                       is_etag,
- #endif
-                                       &tagp) == OK)
-                               lbuf_line = conv_line;
-                           else
-                               /* doesn't work, go back to unconverted line. */
-                               (void)parse_tag_line(lbuf,
- #ifdef FEAT_EMACS_TAGS
-                                                    is_etag,
- #endif
-                                                    &tagp);
-                       }
-                   }
- #else
- # define lbuf_line lbuf
- #endif
                    if (help_only)
                    {
  #ifdef FEAT_MULTI_LANG
--- 2208,2213 ----
***************
*** 2307,2313 ****
                         * without Emacs tags: <mtt><tag_fname><NUL><lbuf>
                         */
                        len = (int)STRLEN(tag_fname)
!                                                + (int)STRLEN(lbuf_line) + 3;
  #ifdef FEAT_EMACS_TAGS
                        if (is_etag)
                            len += (int)STRLEN(ebuf) + 1;
--- 2299,2305 ----
                         * without Emacs tags: <mtt><tag_fname><NUL><lbuf>
                         */
                        len = (int)STRLEN(tag_fname)
!                                                + (int)STRLEN(lbuf) + 3;
  #ifdef FEAT_EMACS_TAGS
                        if (is_etag)
                            len += (int)STRLEN(ebuf) + 1;
***************
*** 2337,2343 ****
                            else
                                *s++ = NUL;
  #endif
!                           STRCPY(s, lbuf_line);
                        }
                    }
  
--- 2329,2335 ----
                            else
                                *s++ = NUL;
  #endif
!                           STRCPY(s, lbuf);
                        }
                    }
  
***************
*** 2373,2382 ****
                        else
                            vim_free(mfp);
                    }
- #ifdef FEAT_MBYTE
-                   /* Note: this makes the values in "tagp" invalid! */
-                   vim_free(conv_line);
- #endif
                }
                else    /* Out of memory! Just forget about the rest. */
                {
--- 2365,2370 ----
***************
*** 2415,2433 ****
        }
  #endif
  #ifdef FEAT_MBYTE
-       if (pats == &convpat)
-       {
-           /* Go back from converted pattern to original pattern. */
-           vim_free(pats->pat);
-           vim_free(pats->regmatch.regprog);
-           orgpat.regmatch.rm_ic = pats->regmatch.rm_ic;
-           pats = &orgpat;
-       }
        if (vimconv.vc_type != CONV_NONE)
            convert_setup(&vimconv, NULL, NULL);
  #endif
  
  #ifdef FEAT_TAG_BINS
        if (sort_error)
        {
            EMSG2(_("E432: Tags file not sorted: %s"), tag_fname);
--- 2403,2414 ----
        }
  #endif
  #ifdef FEAT_MBYTE
        if (vimconv.vc_type != CONV_NONE)
            convert_setup(&vimconv, NULL, NULL);
  #endif
  
  #ifdef FEAT_TAG_BINS
+       tag_file_sorted = NUL;
        if (sort_error)
        {
            EMSG2(_("E432: Tags file not sorted: %s"), tag_fname);
***************
*** 2461,2473 ****
  #ifdef FEAT_TAG_BINS
        /* stop searching when already did a linear search, or when TAG_NOIC
         * used, and 'ignorecase' not set or already did case-ignore search */
!       if (stop_searching || linear || (!p_ic && noic) || pats->regmatch.rm_ic)
          break;
  # ifdef FEAT_CSCOPE
        if (use_cscope)
          break;
  # endif
!       pats->regmatch.rm_ic = TRUE;    /* try another time while ignoring case 
*/
      }
  #endif
  
--- 2442,2454 ----
  #ifdef FEAT_TAG_BINS
        /* stop searching when already did a linear search, or when TAG_NOIC
         * used, and 'ignorecase' not set or already did case-ignore search */
!       if (stop_searching || linear || (!p_ic && noic) || 
orgpat.regmatch.rm_ic)
          break;
  # ifdef FEAT_CSCOPE
        if (use_cscope)
          break;
  # endif
!       orgpat.regmatch.rm_ic = TRUE;   /* try another time while ignoring case 
*/
      }
  #endif
  
***************
*** 2480,2486 ****
  
  findtag_end:
      vim_free(lbuf);
!     vim_free(pats->regmatch.regprog);
      vim_free(tag_fname);
  #ifdef FEAT_EMACS_TAGS
      vim_free(ebuf);
--- 2461,2467 ----
  
  findtag_end:
      vim_free(lbuf);
!     vim_free(orgpat.regmatch.regprog);
      vim_free(tag_fname);
  #ifdef FEAT_EMACS_TAGS
      vim_free(ebuf);
*** ../vim-7.3.335/src/testdir/Make_amiga.mak   2011-07-15 21:16:54.000000000 
+0200
--- src/testdir/Make_amiga.mak  2011-10-12 19:21:00.000000000 +0200
***************
*** 29,35 ****
                test66.out test67.out test68.out test69.out test70.out \
                test71.out test72.out test73.out test74.out test75.out \
                test76.out test77.out test78.out test79.out test80.out \
!               test81.out test82.out
  
  .SUFFIXES: .in .out
  
--- 29,35 ----
                test66.out test67.out test68.out test69.out test70.out \
                test71.out test72.out test73.out test74.out test75.out \
                test76.out test77.out test78.out test79.out test80.out \
!               test81.out test82.out test83.out
  
  .SUFFIXES: .in .out
  
***************
*** 131,133 ****
--- 131,134 ----
  test80.out: test80.in
  test81.out: test81.in
  test82.out: test82.in
+ test83.out: test83.in
*** ../vim-7.3.335/src/testdir/Make_dos.mak     2011-07-15 21:16:54.000000000 
+0200
--- src/testdir/Make_dos.mak    2011-10-12 17:39:03.000000000 +0200
***************
*** 29,35 ****
                test42.out test52.out test65.out test66.out test67.out \
                test68.out test69.out test71.out test72.out test73.out \
                test74.out test75.out test76.out test77.out test78.out \
!               test79.out test80.out test81.out test82.out
  
  SCRIPTS32 =   test50.out test70.out
  
--- 29,35 ----
                test42.out test52.out test65.out test66.out test67.out \
                test68.out test69.out test71.out test72.out test73.out \
                test74.out test75.out test76.out test77.out test78.out \
!               test79.out test80.out test81.out test82.out test83.out
  
  SCRIPTS32 =   test50.out test70.out
  
*** ../vim-7.3.335/src/testdir/Make_ming.mak    2011-07-15 21:16:54.000000000 
+0200
--- src/testdir/Make_ming.mak   2011-10-12 17:39:03.000000000 +0200
***************
*** 49,55 ****
                test42.out test52.out test65.out test66.out test67.out \
                test68.out test69.out test71.out test72.out test73.out \
                test74.out test75.out test76.out test77.out test78.out \
!               test79.out test80.out test81.out test82.out
  
  SCRIPTS32 =   test50.out test70.out
  
--- 49,55 ----
                test42.out test52.out test65.out test66.out test67.out \
                test68.out test69.out test71.out test72.out test73.out \
                test74.out test75.out test76.out test77.out test78.out \
!               test79.out test80.out test81.out test82.out test83.out
  
  SCRIPTS32 =   test50.out test70.out
  
*** ../vim-7.3.335/src/testdir/Make_os2.mak     2011-07-15 21:16:54.000000000 
+0200
--- src/testdir/Make_os2.mak    2011-10-12 17:39:03.000000000 +0200
***************
*** 29,35 ****
                test66.out test67.out test68.out test69.out test70.out \
                test71.out test72.out test73.out test74.out test75.out \
                test76.out test77.out test78.out test79.out test80.out \
!               test81.out test82.out
  
  .SUFFIXES: .in .out
  
--- 29,35 ----
                test66.out test67.out test68.out test69.out test70.out \
                test71.out test72.out test73.out test74.out test75.out \
                test76.out test77.out test78.out test79.out test80.out \
!               test81.out test82.out test83.out
  
  .SUFFIXES: .in .out
  
*** ../vim-7.3.335/src/testdir/Make_vms.mms     2011-07-15 21:16:54.000000000 
+0200
--- src/testdir/Make_vms.mms    2011-10-12 17:39:03.000000000 +0200
***************
*** 76,82 ****
         test66.out test67.out test68.out test69.out \
         test71.out test72.out test74.out test75.out test76.out \
         test77.out test78.out test79.out test80.out test81.out \
!        test82.out
  
  # Known problems:
  # Test 30: a problem around mac format - unknown reason
--- 76,82 ----
         test66.out test67.out test68.out test69.out \
         test71.out test72.out test74.out test75.out test76.out \
         test77.out test78.out test79.out test80.out test81.out \
!        test82.out test83.out
  
  # Known problems:
  # Test 30: a problem around mac format - unknown reason
*** ../vim-7.3.335/src/testdir/Makefile 2011-07-15 21:16:54.000000000 +0200
--- src/testdir/Makefile        2011-10-12 17:39:03.000000000 +0200
***************
*** 26,32 ****
                test64.out test65.out test66.out test67.out test68.out \
                test69.out test70.out test71.out test72.out test73.out \
                test74.out test75.out test76.out test77.out test78.out \
!               test79.out test80.out test81.out test82.out
  
  SCRIPTS_GUI = test16.out
  
--- 26,32 ----
                test64.out test65.out test66.out test67.out test68.out \
                test69.out test70.out test71.out test72.out test73.out \
                test74.out test75.out test76.out test77.out test78.out \
!               test79.out test80.out test81.out test82.out test83.out
  
  SCRIPTS_GUI = test16.out
  
***************
*** 72,78 ****
                  fi \
                else echo $* NO OUTPUT >>test.log; \
                fi"
!       -rm -rf X* test.ok viminfo
  
  test49.out: test49.vim
  
--- 72,78 ----
                  fi \
                else echo $* NO OUTPUT >>test.log; \
                fi"
! #     -rm -rf X* test.ok viminfo
  
  test49.out: test49.vim
  
*** ../vim-7.3.335/src/testdir/test83-tags2     2011-10-12 19:49:38.000000000 
+0200
--- src/testdir/test83-tags2    2011-10-12 19:34:15.000000000 +0200
***************
*** 0 ****
--- 1,2 ----
+ !_TAG_FILE_ENCODING   cp932   //
+ ‚`‚a‚b        Xtags2.txt      /‚`‚a‚b
*** ../vim-7.3.335/src/testdir/test83-tags3     2011-10-12 19:49:38.000000000 
+0200
--- src/testdir/test83-tags3    2011-10-12 19:35:42.000000000 +0200
***************
*** 0 ****
--- 1,102 ----
+ !_TAG_FILE_SORTED     1       //
+ !_TAG_FILE_ENCODING   cp932   //
+ abc1  Xtags3.txt      /‚`‚a‚b
+ abc2  Xtags3.txt      /‚`‚a‚b
+ abc3  Xtags3.txt      /‚`‚a‚b
+ abc4  Xtags3.txt      /‚`‚a‚b
+ abc5  Xtags3.txt      /‚`‚a‚b
+ abc6  Xtags3.txt      /‚`‚a‚b
+ abc7  Xtags3.txt      /‚`‚a‚b
+ abc8  Xtags3.txt      /‚`‚a‚b
+ abc9  Xtags3.txt      /‚`‚a‚b
+ abc10 Xtags3.txt      /‚`‚a‚b
+ abc11 Xtags3.txt      /‚`‚a‚b
+ abc12 Xtags3.txt      /‚`‚a‚b
+ abc13 Xtags3.txt      /‚`‚a‚b
+ abc14 Xtags3.txt      /‚`‚a‚b
+ abc15 Xtags3.txt      /‚`‚a‚b
+ abc16 Xtags3.txt      /‚`‚a‚b
+ abc17 Xtags3.txt      /‚`‚a‚b
+ abc18 Xtags3.txt      /‚`‚a‚b
+ abc19 Xtags3.txt      /‚`‚a‚b
+ abc20 Xtags3.txt      /‚`‚a‚b
+ abc21 Xtags3.txt      /‚`‚a‚b
+ abc22 Xtags3.txt      /‚`‚a‚b
+ abc23 Xtags3.txt      /‚`‚a‚b
+ abc24 Xtags3.txt      /‚`‚a‚b
+ abc25 Xtags3.txt      /‚`‚a‚b
+ abc26 Xtags3.txt      /‚`‚a‚b
+ abc27 Xtags3.txt      /‚`‚a‚b
+ abc28 Xtags3.txt      /‚`‚a‚b
+ abc29 Xtags3.txt      /‚`‚a‚b
+ abc30 Xtags3.txt      /‚`‚a‚b
+ abc31 Xtags3.txt      /‚`‚a‚b
+ abc32 Xtags3.txt      /‚`‚a‚b
+ abc33 Xtags3.txt      /‚`‚a‚b
+ abc34 Xtags3.txt      /‚`‚a‚b
+ abc35 Xtags3.txt      /‚`‚a‚b
+ abc36 Xtags3.txt      /‚`‚a‚b
+ abc37 Xtags3.txt      /‚`‚a‚b
+ abc38 Xtags3.txt      /‚`‚a‚b
+ abc39 Xtags3.txt      /‚`‚a‚b
+ abc40 Xtags3.txt      /‚`‚a‚b
+ abc41 Xtags3.txt      /‚`‚a‚b
+ abc42 Xtags3.txt      /‚`‚a‚b
+ abc43 Xtags3.txt      /‚`‚a‚b
+ abc44 Xtags3.txt      /‚`‚a‚b
+ abc45 Xtags3.txt      /‚`‚a‚b
+ abc46 Xtags3.txt      /‚`‚a‚b
+ abc47 Xtags3.txt      /‚`‚a‚b
+ abc48 Xtags3.txt      /‚`‚a‚b
+ abc49 Xtags3.txt      /‚`‚a‚b
+ abc50 Xtags3.txt      /‚`‚a‚b
+ abc51 Xtags3.txt      /‚`‚a‚b
+ abc52 Xtags3.txt      /‚`‚a‚b
+ abc53 Xtags3.txt      /‚`‚a‚b
+ abc54 Xtags3.txt      /‚`‚a‚b
+ abc55 Xtags3.txt      /‚`‚a‚b
+ abc56 Xtags3.txt      /‚`‚a‚b
+ abc57 Xtags3.txt      /‚`‚a‚b
+ abc58 Xtags3.txt      /‚`‚a‚b
+ abc59 Xtags3.txt      /‚`‚a‚b
+ abc60 Xtags3.txt      /‚`‚a‚b
+ abc61 Xtags3.txt      /‚`‚a‚b
+ abc62 Xtags3.txt      /‚`‚a‚b
+ abc63 Xtags3.txt      /‚`‚a‚b
+ abc64 Xtags3.txt      /‚`‚a‚b
+ abc65 Xtags3.txt      /‚`‚a‚b
+ abc66 Xtags3.txt      /‚`‚a‚b
+ abc67 Xtags3.txt      /‚`‚a‚b
+ abc68 Xtags3.txt      /‚`‚a‚b
+ abc69 Xtags3.txt      /‚`‚a‚b
+ abc70 Xtags3.txt      /‚`‚a‚b
+ abc71 Xtags3.txt      /‚`‚a‚b
+ abc72 Xtags3.txt      /‚`‚a‚b
+ abc73 Xtags3.txt      /‚`‚a‚b
+ abc74 Xtags3.txt      /‚`‚a‚b
+ abc75 Xtags3.txt      /‚`‚a‚b
+ abc76 Xtags3.txt      /‚`‚a‚b
+ abc77 Xtags3.txt      /‚`‚a‚b
+ abc78 Xtags3.txt      /‚`‚a‚b
+ abc79 Xtags3.txt      /‚`‚a‚b
+ abc80 Xtags3.txt      /‚`‚a‚b
+ abc81 Xtags3.txt      /‚`‚a‚b
+ abc82 Xtags3.txt      /‚`‚a‚b
+ abc83 Xtags3.txt      /‚`‚a‚b
+ abc84 Xtags3.txt      /‚`‚a‚b
+ abc85 Xtags3.txt      /‚`‚a‚b
+ abc86 Xtags3.txt      /‚`‚a‚b
+ abc87 Xtags3.txt      /‚`‚a‚b
+ abc88 Xtags3.txt      /‚`‚a‚b
+ abc89 Xtags3.txt      /‚`‚a‚b
+ abc90 Xtags3.txt      /‚`‚a‚b
+ abc91 Xtags3.txt      /‚`‚a‚b
+ abc92 Xtags3.txt      /‚`‚a‚b
+ abc93 Xtags3.txt      /‚`‚a‚b
+ abc94 Xtags3.txt      /‚`‚a‚b
+ abc95 Xtags3.txt      /‚`‚a‚b
+ abc96 Xtags3.txt      /‚`‚a‚b
+ abc97 Xtags3.txt      /‚`‚a‚b
+ abc98 Xtags3.txt      /‚`‚a‚b
+ abc99 Xtags3.txt      /‚`‚a‚b
+ abc100        Xtags3.txt      /‚`‚a‚b
*** ../vim-7.3.335/src/testdir/test83.in        2011-10-12 19:49:38.000000000 
+0200
--- src/testdir/test83.in       2011-10-12 19:40:47.000000000 +0200
***************
*** 0 ****
--- 1,76 ----
+ Tests for tag search with !_TAG_FILE_ENCODING.
+ 
+ STARTTEST
+ :so mbyte.vim
+ :if !has('iconv')
+ : e! test.ok
+ : w! test.out
+ : qa!
+ :endif
+ :set enc=utf8
+ 
+ :/^text for tags1$/,/^text for tags1$/+1w! Xtags1.txt
+ :/^text for tags2$/,/^text for tags2$/+1w! Xtags2.txt
+ :/^text for tags3$/,/^text for tags3$/+1w! Xtags3.txt
+ :/^tags1$/+1,/^tags1-end$/-1w! Xtags1
+ 
+ ggdG
+ 
+ :call setline('.', 'Results of test83')
+ 
+ :" case1:
+ :new
+ :set tags=Xtags1
+ :let v:errmsg = ''
+ :tag abcdefghijklmnopqrs
+ :if v:errmsg =~ 'E426:' || getline('.') != 'abcdefghijklmnopqrs'
+ : close
+ : put ='case1: failed'
+ :else
+ : close
+ : put ='case1: ok'
+ :endif
+ 
+ :" case2:
+ :new
+ :set tags=test83-tags2
+ :let v:errmsg = ''
+ :tag /.BC
+ :if v:errmsg =~ 'E426:' || getline('.') != 'ABC'
+ : close
+ : put ='case2: failed'
+ :else
+ : close
+ : put ='case2: ok'
+ :endif
+ 
+ :" case3:
+ :new
+ :set tags=test83-tags3
+ :let v:errmsg = ''
+ :tag abc50
+ :if v:errmsg =~ 'E426:' || getline('.') != 'ABC'
+ : close
+ : put ='case3: failed'
+ :else
+ : close
+ : put ='case3: ok'
+ :endif
+ :close
+ 
+ :wq! test.out
+ ENDTEST
+ 
+ text for tags1
+ abcdefghijklmnopqrs
+ 
+ text for tags2
+ ABC
+ 
+ text for tags3
+ ABC
+ 
+ tags1
+ !_TAG_FILE_ENCODING   utf-8   //
+ abcdefghijklmnopqrs   Xtags1.txt      /abcdefghijklmnopqrs
+ tags1-end
*** ../vim-7.3.335/src/testdir/test83.ok        2011-10-12 19:49:38.000000000 
+0200
--- src/testdir/test83.ok       2011-10-12 17:39:03.000000000 +0200
***************
*** 0 ****
--- 1,4 ----
+ Results of test83
+ case1: ok
+ case2: ok
+ case3: ok
*** ../vim-7.3.335/src/version.c        2011-10-12 16:57:07.000000000 +0200
--- src/version.c       2011-10-12 19:45:46.000000000 +0200
***************
*** 711,712 ****
--- 711,714 ----
  {   /* Add new patch number below this line */
+ /**/
+     336,
  /**/


-- 
hundred-and-one symptoms of being an internet addict:
62. If your doorbell rings, you think that new mail has arrived.  And then
    you're disappointed that it's only someone at the door.

 /// Bram Moolenaar -- [email protected] -- 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    ///

-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

Raspunde prin e-mail lui