# HG changeset patch # User Francesco Potort # Date 792783115 0 # Node ID cd1c0b5e8634b2f3119a46da6ac16a96c7884913 # Parent e0de204ec865c8c5d888ae1cc40c8486561b2b35 * etags.c (C_entries): Initialise the new members of TOKEN. (C_entries): Do not allocate a new space for each token found by consider_token. Let make_tag do that instead. (make_tag): Since now TOKEN has memory of where it is taken from, this new macro substitutes both make_tag_from_new_lb and make_tag_from_oth_lb. All callers changed. (TOKEN): Add linepos and buffer members. (main): Initialise token_str. (lang_extensions): Recognise .c++ and .h++ as C++ file suffixes. (token_str): New global variable used by C_entries. diff -r e0de204ec865 -r cd1c0b5e8634 lib-src/etags.c --- a/lib-src/etags.c Tue Feb 14 17:12:41 1995 +0000 +++ b/lib-src/etags.c Tue Feb 14 17:31:55 1995 +0000 @@ -30,9 +30,9 @@ * * Francesco Potorti` (pot@cnuce.cnr.it) is the current maintainer. */ - - -char pot_etags_version[] = "@(#) pot revision number is 11.19"; +char pot_etags_version[] = "@(#) pot revision number is 11.21"; + + #ifdef MSDOS #include #include @@ -218,6 +218,7 @@ }; struct linebuffer lb; /* the current line */ +struct linebuffer token_str; /* used by C_entries as temporary area */ struct { long linepos; @@ -368,12 +369,15 @@ { "c", default_C_entries }, { "h", default_C_entries }, - /* .C or .H or .cpp or .cxx or .hxx or .hh or .cc or .cpp: a C++ file */ + /* .C or .H or .c++ or .cc or .cpp or .cxx or .h++ or .hh or .hxx: + a C++ file */ { "C", Cplusplus_entries }, { "H", Cplusplus_entries }, + { "c++", Cplusplus_entries }, { "cc", Cplusplus_entries }, { "cpp", Cplusplus_entries }, { "cxx", Cplusplus_entries }, + { "h++", Cplusplus_entries }, { "hh", Cplusplus_entries }, { "hxx", Cplusplus_entries }, @@ -857,6 +861,7 @@ init (); /* set up boolean "functions" */ initbuffer (&lb); + initbuffer (&token_str); initbuffer (&lbs[0].lb); initbuffer (&lbs[1].lb); initbuffer (&filename_lb); @@ -921,7 +926,6 @@ break; } } - if (!CTAGS) { while (nincluded_files-- > 0) @@ -1815,6 +1819,8 @@ logical named; int linelen; int lineno; + long linepos; + char *buffer; } TOKEN; #define current_lb_is_new (newndx == curndx) @@ -1848,10 +1854,8 @@ definedef = dnone; \ } while (0) -#define make_tag_from_new_lb(isfun) pfnote (tok.str, isfun, tok.named, \ - newlb.buffer, tok.linelen, tok.lineno, newlinepos) -#define make_tag_from_oth_lb(isfun) pfnote (tok.str, isfun, tok.named, \ - othlb.buffer, tok.linelen, tok.lineno, othlinepos) +#define make_tag(isfun) pfnote (savestr (token_str.buffer), isfun, \ + tok.named, tok.buffer, tok.linelen, tok.lineno, tok.linepos) void C_entries (c_ext, inf) @@ -2053,17 +2057,28 @@ && is_func) /* function defined in C++ class body */ { - char *cp = newlb.buffer + tokoff + toklen; - char c = *cp; - *cp = '\0'; - tok.str = concat (structtag, "::", - newlb.buffer + tokoff); - *cp = c; + int strsize = strlen(structtag) + 2 + toklen + 1; + while (token_str.size < strsize) + { + token_str.size *= 2; + xrealloc (token_str.buffer, token_str.size); + } + strcpy (token_str.buffer, structtag); + strcat (token_str.buffer, "::"); + strncat (token_str.buffer, + newlb.buffer+tokoff, toklen); tok.named = TRUE; } else { - tok.str = savenstr (newlb.buffer+tokoff, toklen); + while (token_str.size < toklen + 1) + { + token_str.size *= 2; + xrealloc (token_str.buffer, token_str.size); + } + strncpy (token_str.buffer, + newlb.buffer+tokoff, toklen); + token_str.buffer[toklen] = '\0'; if (structdef == stagseen || typdef == tend || (is_func @@ -2074,6 +2089,8 @@ } tok.lineno = lineno; tok.linelen = tokoff + toklen + 1; + tok.buffer = newlb.buffer; + tok.linepos = newlinepos; if (definedef == dnone && (funcdef == ftagseen @@ -2084,7 +2101,7 @@ switch_line_buffers (); } else - make_tag_from_new_lb (is_func); + make_tag (is_func); } midtoken = FALSE; } @@ -2106,7 +2123,7 @@ funcdef = finlist; continue; case flistseen: - make_tag_from_oth_lb (TRUE); + make_tag (TRUE); funcdef = fignore; break; case ftagseen: @@ -2146,7 +2163,7 @@ case ftagseen: if (yacc_rules) { - make_tag_from_oth_lb (FALSE); + make_tag (FALSE); funcdef = fignore; } break; @@ -2162,7 +2179,7 @@ switch (typdef) { case tend: - make_tag_from_oth_lb (FALSE); + make_tag (FALSE); /* FALLTHRU */ default: typdef = tnone; @@ -2186,7 +2203,7 @@ if (cblev == 0 && typdef == tend) { typdef = tignore; - make_tag_from_oth_lb (FALSE); + make_tag (FALSE); break; } if (funcdef != finlist && funcdef != fignore) @@ -2210,7 +2227,7 @@ if (*lp != '*') { typdef = tignore; - make_tag_from_oth_lb (FALSE); + make_tag (FALSE); } break; } /* switch (typdef) */ @@ -2239,7 +2256,7 @@ if (cblev == 0 && typdef == tend) { typdef = tignore; - make_tag_from_oth_lb (FALSE); + make_tag (FALSE); } } else if (parlev < 0) /* can happen due to ill-conceived #if's. */ @@ -2259,13 +2276,13 @@ case stagseen: case scolonseen: /* named struct */ structdef = sinbody; - make_tag_from_oth_lb (FALSE); + make_tag (FALSE); break; } switch (funcdef) { case flistseen: - make_tag_from_oth_lb (TRUE); + make_tag (TRUE); /* FALLTHRU */ case fignore: funcdef = fnone;