| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.336 |
| 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.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 |
| |
| |
| |
| |
| |
| *** 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); |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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 |
| |
| |
| |
| |
| *** 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 |
| |
| |
| |
| |
| *** 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 |
| |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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 |
| |
| |
| |
| |
| |
| --- 1,2 ---- |
| + !_TAG_FILE_ENCODING cp932 // |
| + `ab Xtags2.txt /`ab |
| |
| |
| |
| |
| --- 1,102 ---- |
| + !_TAG_FILE_SORTED 1 // |
| + !_TAG_FILE_ENCODING cp932 // |
| + abc1 Xtags3.txt /`ab |
| + abc2 Xtags3.txt /`ab |
| + abc3 Xtags3.txt /`ab |
| + abc4 Xtags3.txt /`ab |
| + abc5 Xtags3.txt /`ab |
| + abc6 Xtags3.txt /`ab |
| + abc7 Xtags3.txt /`ab |
| + abc8 Xtags3.txt /`ab |
| + abc9 Xtags3.txt /`ab |
| + abc10 Xtags3.txt /`ab |
| + abc11 Xtags3.txt /`ab |
| + abc12 Xtags3.txt /`ab |
| + abc13 Xtags3.txt /`ab |
| + abc14 Xtags3.txt /`ab |
| + abc15 Xtags3.txt /`ab |
| + abc16 Xtags3.txt /`ab |
| + abc17 Xtags3.txt /`ab |
| + abc18 Xtags3.txt /`ab |
| + abc19 Xtags3.txt /`ab |
| + abc20 Xtags3.txt /`ab |
| + abc21 Xtags3.txt /`ab |
| + abc22 Xtags3.txt /`ab |
| + abc23 Xtags3.txt /`ab |
| + abc24 Xtags3.txt /`ab |
| + abc25 Xtags3.txt /`ab |
| + abc26 Xtags3.txt /`ab |
| + abc27 Xtags3.txt /`ab |
| + abc28 Xtags3.txt /`ab |
| + abc29 Xtags3.txt /`ab |
| + abc30 Xtags3.txt /`ab |
| + abc31 Xtags3.txt /`ab |
| + abc32 Xtags3.txt /`ab |
| + abc33 Xtags3.txt /`ab |
| + abc34 Xtags3.txt /`ab |
| + abc35 Xtags3.txt /`ab |
| + abc36 Xtags3.txt /`ab |
| + abc37 Xtags3.txt /`ab |
| + abc38 Xtags3.txt /`ab |
| + abc39 Xtags3.txt /`ab |
| + abc40 Xtags3.txt /`ab |
| + abc41 Xtags3.txt /`ab |
| + abc42 Xtags3.txt /`ab |
| + abc43 Xtags3.txt /`ab |
| + abc44 Xtags3.txt /`ab |
| + abc45 Xtags3.txt /`ab |
| + abc46 Xtags3.txt /`ab |
| + abc47 Xtags3.txt /`ab |
| + abc48 Xtags3.txt /`ab |
| + abc49 Xtags3.txt /`ab |
| + abc50 Xtags3.txt /`ab |
| + abc51 Xtags3.txt /`ab |
| + abc52 Xtags3.txt /`ab |
| + abc53 Xtags3.txt /`ab |
| + abc54 Xtags3.txt /`ab |
| + abc55 Xtags3.txt /`ab |
| + abc56 Xtags3.txt /`ab |
| + abc57 Xtags3.txt /`ab |
| + abc58 Xtags3.txt /`ab |
| + abc59 Xtags3.txt /`ab |
| + abc60 Xtags3.txt /`ab |
| + abc61 Xtags3.txt /`ab |
| + abc62 Xtags3.txt /`ab |
| + abc63 Xtags3.txt /`ab |
| + abc64 Xtags3.txt /`ab |
| + abc65 Xtags3.txt /`ab |
| + abc66 Xtags3.txt /`ab |
| + abc67 Xtags3.txt /`ab |
| + abc68 Xtags3.txt /`ab |
| + abc69 Xtags3.txt /`ab |
| + abc70 Xtags3.txt /`ab |
| + abc71 Xtags3.txt /`ab |
| + abc72 Xtags3.txt /`ab |
| + abc73 Xtags3.txt /`ab |
| + abc74 Xtags3.txt /`ab |
| + abc75 Xtags3.txt /`ab |
| + abc76 Xtags3.txt /`ab |
| + abc77 Xtags3.txt /`ab |
| + abc78 Xtags3.txt /`ab |
| + abc79 Xtags3.txt /`ab |
| + abc80 Xtags3.txt /`ab |
| + abc81 Xtags3.txt /`ab |
| + abc82 Xtags3.txt /`ab |
| + abc83 Xtags3.txt /`ab |
| + abc84 Xtags3.txt /`ab |
| + abc85 Xtags3.txt /`ab |
| + abc86 Xtags3.txt /`ab |
| + abc87 Xtags3.txt /`ab |
| + abc88 Xtags3.txt /`ab |
| + abc89 Xtags3.txt /`ab |
| + abc90 Xtags3.txt /`ab |
| + abc91 Xtags3.txt /`ab |
| + abc92 Xtags3.txt /`ab |
| + abc93 Xtags3.txt /`ab |
| + abc94 Xtags3.txt /`ab |
| + abc95 Xtags3.txt /`ab |
| + abc96 Xtags3.txt /`ab |
| + abc97 Xtags3.txt /`ab |
| + abc98 Xtags3.txt /`ab |
| + abc99 Xtags3.txt /`ab |
| + abc100 Xtags3.txt /`ab |
| |
| |
| |
| |
| --- 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 |
| |
| |
| |
| |
| --- 1,4 ---- |
| + Results of test83 |
| + case1: ok |
| + case2: ok |
| + case3: ok |
| |
| |
| |
| *** 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 -- 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 /// |