(scan_separators): Support all character escape
sequences supported by gcc. (find_entries): rewind unconditionally. (find_entries): Do not call language functions directly, now calls itself. (find_entries): Do general initialisations here. (CNL_SAVE_DEFINEDEF, C_entries, LOOP_ON_INPUT_LINES, F_getit) (Ada_getit, Pascal_functions, Pascal_functions) (prolog_skip_comment): Do not do them here. (readline_internal): Increment lineno here. (readline): Conditionally undo readline_internal increment. (readline): Do not return a value.
This commit is contained in:
parent
f0da41a610
commit
e7d3b099a2
1 changed files with 60 additions and 51 deletions
111
lib-src/etags.c
111
lib-src/etags.c
|
@ -34,7 +34,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
|||
* Francesco Potortì <pot@gnu.org> has maintained it since 1993.
|
||||
*/
|
||||
|
||||
char pot_etags_version[] = "@(#) pot revision number is 16.4";
|
||||
char pot_etags_version[] = "@(#) pot revision number is 16.10";
|
||||
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
|
@ -349,7 +349,7 @@ static compressor *get_compressor_from_suffix __P((char *, char **));
|
|||
static language *get_language_from_langname __P((const char *));
|
||||
static language *get_language_from_interpreter __P((char *));
|
||||
static language *get_language_from_filename __P((char *, bool));
|
||||
static long readline __P((linebuffer *, FILE *));
|
||||
static void readline __P((linebuffer *, FILE *));
|
||||
static long readline_internal __P((linebuffer *, FILE *));
|
||||
static bool nocase_tail __P((char *));
|
||||
static char *get_tag __P((char *));
|
||||
|
@ -711,9 +711,6 @@ linked with GNU getopt.");
|
|||
Absolute names are stored in the output file as they are.\n\
|
||||
Relative ones are stored relative to the output file's directory.\n");
|
||||
|
||||
puts ("--parse-stdin=NAME\n\
|
||||
Read from standard input and record tags as belonging to file NAME.");
|
||||
|
||||
if (!CTAGS)
|
||||
puts ("-a, --append\n\
|
||||
Append tag entries to existing tags file.");
|
||||
|
@ -784,13 +781,15 @@ Relative ones are stored relative to the output file's directory.\n");
|
|||
puts ("-R, --no-regex\n\
|
||||
Don't create tags from regexps for the following files.");
|
||||
#endif /* ETAGS_REGEXPS */
|
||||
puts ("-o FILE, --output=FILE\n\
|
||||
Write the tags to FILE.");
|
||||
puts ("-I, --ignore-indentation\n\
|
||||
Don't rely on indentation quite as much as normal. Currently,\n\
|
||||
this means not to assume that a closing brace in the first\n\
|
||||
column is the final brace of a function or structure\n\
|
||||
definition in C and C++.");
|
||||
puts ("-o FILE, --output=FILE\n\
|
||||
Write the tags to FILE.");
|
||||
puts ("--parse-stdin=NAME\n\
|
||||
Read from standard input and record tags as belonging to file NAME.");
|
||||
|
||||
if (CTAGS)
|
||||
{
|
||||
|
@ -1049,6 +1048,8 @@ main (argc, argv)
|
|||
argbuffer[current_arg].what = optarg;
|
||||
++current_arg;
|
||||
++file_count;
|
||||
if (parsing_stdin)
|
||||
fatal ("cannot parse standard input more than once", (char *)NULL);
|
||||
parsing_stdin = TRUE;
|
||||
break;
|
||||
|
||||
|
@ -1702,7 +1703,6 @@ find_entries (inf)
|
|||
/* We rewind here, even if inf may be a pipe. We fail if the
|
||||
length of the first line is longer than the pipe block size,
|
||||
which is unlikely. */
|
||||
if (parser == NULL)
|
||||
rewind (inf);
|
||||
|
||||
/* Else try to guess the language given the case insensitive file name. */
|
||||
|
@ -1750,6 +1750,11 @@ find_entries (inf)
|
|||
|
||||
if (parser != NULL)
|
||||
{
|
||||
/* Generic initialisations before reading from file. */
|
||||
lineno = 0; /* reset global line number */
|
||||
charno = 0; /* reset global char number */
|
||||
linecharno = 0; /* reset global char number of line start */
|
||||
|
||||
parser (inf);
|
||||
return;
|
||||
}
|
||||
|
@ -1757,7 +1762,7 @@ find_entries (inf)
|
|||
/* Else try Fortran. */
|
||||
old_last_node = last_node;
|
||||
curfdp->lang = get_language_from_langname ("fortran");
|
||||
Fortran_functions (inf);
|
||||
find_entries (inf);
|
||||
|
||||
if (old_last_node == last_node)
|
||||
/* No Fortran entries found. Try C. */
|
||||
|
@ -1766,7 +1771,7 @@ find_entries (inf)
|
|||
Only the file name will be recorded in the tags file. */
|
||||
rewind (inf);
|
||||
curfdp->lang = get_language_from_langname (cplusplus ? "c++" : "c");
|
||||
default_C_entries (inf);
|
||||
find_entries (inf);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -2951,9 +2956,7 @@ static struct
|
|||
#define CNL_SAVE_DEFINEDEF() \
|
||||
do { \
|
||||
curlinepos = charno; \
|
||||
lineno++; \
|
||||
linecharno = charno; \
|
||||
charno += readline (&curlb, inf); \
|
||||
readline (&curlb, inf); \
|
||||
lp = curlb.buffer; \
|
||||
quotednl = FALSE; \
|
||||
newndx = curndx; \
|
||||
|
@ -3045,8 +3048,6 @@ C_entries (c_ext, inf)
|
|||
|
||||
tokoff = toklen = typdefcblev = 0; /* keep compiler quiet */
|
||||
curndx = newndx = 0;
|
||||
lineno = 0;
|
||||
charno = 0;
|
||||
lp = curlb.buffer;
|
||||
*lp = 0;
|
||||
|
||||
|
@ -3828,12 +3829,10 @@ Yacc_entries (inf)
|
|||
|
||||
/* Useful macros. */
|
||||
#define LOOP_ON_INPUT_LINES(file_pointer, line_buffer, char_pointer) \
|
||||
for (lineno = charno = 0; /* loop initialization */ \
|
||||
for (; /* loop initialization */ \
|
||||
!feof (file_pointer) /* loop test */ \
|
||||
&& (lineno++, /* instructions at start of loop */ \
|
||||
linecharno = charno, \
|
||||
charno += readline (&line_buffer, file_pointer), \
|
||||
char_pointer = lb.buffer, \
|
||||
&& (char_pointer = lb.buffer, /* instructions at start of loop */ \
|
||||
readline (&line_buffer, file_pointer), \
|
||||
TRUE); \
|
||||
)
|
||||
#define LOOKING_AT(cp, keyword) /* keyword is a constant string */ \
|
||||
|
@ -3893,9 +3892,7 @@ F_getit (inf)
|
|||
dbp = skip_spaces (dbp);
|
||||
if (*dbp == '\0')
|
||||
{
|
||||
lineno++;
|
||||
linecharno = charno;
|
||||
charno += readline (&lb, inf);
|
||||
readline (&lb, inf);
|
||||
dbp = lb.buffer;
|
||||
if (dbp[5] != '&')
|
||||
return;
|
||||
|
@ -4010,9 +4007,7 @@ Ada_getit (inf, name_qualifier)
|
|||
if (*dbp == '\0'
|
||||
|| (dbp[0] == '-' && dbp[1] == '-'))
|
||||
{
|
||||
lineno++;
|
||||
linecharno = charno;
|
||||
charno += readline (&lb, inf);
|
||||
readline (&lb, inf);
|
||||
dbp = lb.buffer;
|
||||
}
|
||||
switch (lowcase(*dbp))
|
||||
|
@ -4456,8 +4451,6 @@ Pascal_functions (inf)
|
|||
|
||||
save_lcno = save_lineno = save_len = 0; /* keep compiler quiet */
|
||||
namebuf = NULL; /* keep compiler quiet */
|
||||
lineno = 0;
|
||||
charno = 0;
|
||||
dbp = lb.buffer;
|
||||
*dbp = '\0';
|
||||
initbuffer (&tline);
|
||||
|
@ -4474,9 +4467,7 @@ Pascal_functions (inf)
|
|||
c = *dbp++;
|
||||
if (c == '\0') /* if end of line */
|
||||
{
|
||||
lineno++;
|
||||
linecharno = charno;
|
||||
charno += readline (&lb, inf);
|
||||
readline (&lb, inf);
|
||||
dbp = lb.buffer;
|
||||
if (*dbp == '\0')
|
||||
continue;
|
||||
|
@ -4987,8 +4978,7 @@ prolog_skip_comment (plb, inf)
|
|||
for (cp = plb->buffer; *cp != '\0'; cp++)
|
||||
if (cp[0] == '*' && cp[1] == '/')
|
||||
return;
|
||||
lineno++;
|
||||
linecharno += readline (plb, inf);
|
||||
readline (plb, inf);
|
||||
}
|
||||
while (!feof(inf));
|
||||
}
|
||||
|
@ -5280,7 +5270,8 @@ static char *substitute __P((char *, char *, struct re_registers *));
|
|||
/* Take a string like "/blah/" and turn it into "blah", making sure
|
||||
that the first and last characters are the same, and handling
|
||||
quoted separator characters. Actually, stops on the occurrence of
|
||||
an unquoted separator. Also turns "\t" into a Tab character.
|
||||
an unquoted separator. Also turns "\t" into a Tab character, and
|
||||
similarly for all character escape sequences supported by Gcc.
|
||||
Returns pointer to terminating separator. Works in place. Null
|
||||
terminates name string. */
|
||||
static char *
|
||||
|
@ -5295,15 +5286,27 @@ scan_separators (name)
|
|||
{
|
||||
if (quoted)
|
||||
{
|
||||
if (*name == 't')
|
||||
*copyto++ = '\t';
|
||||
else if (*name == sep)
|
||||
*copyto++ = sep;
|
||||
else
|
||||
switch (*name)
|
||||
{
|
||||
/* Something else is quoted, so preserve the quote. */
|
||||
*copyto++ = '\\';
|
||||
*copyto++ = *name;
|
||||
case 'a': *copyto++ = '\007'; break;
|
||||
case 'b': *copyto++ = '\b'; break;
|
||||
case 'd': *copyto++ = 0177; break;
|
||||
case 'e': *copyto++ = 033; break;
|
||||
case 'f': *copyto++ = '\f'; break;
|
||||
case 'n': *copyto++ = '\n'; break;
|
||||
case 'r': *copyto++ = '\r'; break;
|
||||
case 't': *copyto++ = '\t'; break;
|
||||
case 'v': *copyto++ = '\v'; break;
|
||||
default:
|
||||
if (*name == sep)
|
||||
*copyto++ = sep;
|
||||
else
|
||||
{
|
||||
/* Something else is quoted, so preserve the quote. */
|
||||
*copyto++ = '\\';
|
||||
*copyto++ = *name;
|
||||
}
|
||||
break;
|
||||
}
|
||||
quoted = FALSE;
|
||||
}
|
||||
|
@ -5630,13 +5633,17 @@ readline_internal (lbp, stream)
|
|||
* Like readline_internal, above, but in addition try to match the
|
||||
* input line against relevant regular expressions.
|
||||
*/
|
||||
static long
|
||||
static void
|
||||
readline (lbp, stream)
|
||||
linebuffer *lbp;
|
||||
FILE *stream;
|
||||
{
|
||||
/* Read new line. */
|
||||
long result = readline_internal (lbp, stream);
|
||||
long result;
|
||||
|
||||
linecharno = charno; /* update global char number of line start */
|
||||
result = readline_internal (lbp, stream); /* read line */
|
||||
lineno += 1; /* increment global line number */
|
||||
charno += result; /* increment global char number */
|
||||
|
||||
/* Honour #line directives. */
|
||||
if (!no_line_directive)
|
||||
|
@ -5733,8 +5740,9 @@ readline (lbp, stream)
|
|||
}
|
||||
}
|
||||
free (taggedabsname);
|
||||
lineno = lno;
|
||||
return readline (lbp, stream);
|
||||
lineno = lno - 1;
|
||||
readline (lbp, stream);
|
||||
return;
|
||||
} /* if a real #line directive */
|
||||
} /* if #line is followed by a a number */
|
||||
} /* if line begins with "#line " */
|
||||
|
@ -5743,12 +5751,15 @@ readline (lbp, stream)
|
|||
if (discard_until_line_directive)
|
||||
{
|
||||
if (result > 0)
|
||||
{
|
||||
/* Do a tail recursion on ourselves, thus discarding the contents
|
||||
of the line buffer. */
|
||||
return readline (lbp, stream);
|
||||
readline (lbp, stream);
|
||||
return;
|
||||
}
|
||||
/* End of file. */
|
||||
discard_until_line_directive = FALSE;
|
||||
return 0;
|
||||
return;
|
||||
}
|
||||
} /* if #line directives should be considered */
|
||||
|
||||
|
@ -5800,8 +5811,6 @@ readline (lbp, stream)
|
|||
}
|
||||
}
|
||||
#endif /* ETAGS_REGEXPS */
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue