# HG changeset patch # User Francesco Potort # Date 1023403048 0 # Node ID 466c8ca0e543790a81235fcea995268ff7b43c37 # Parent 535f4a1db8cbcf85001c1a5ab76815356bada495 (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. diff -r 535f4a1db8cb -r 466c8ca0e543 lib-src/etags.c --- a/lib-src/etags.c Thu Jun 06 22:36:54 2002 +0000 +++ b/lib-src/etags.c Thu Jun 06 22:37:28 2002 +0000 @@ -34,7 +34,7 @@ * Francesco Potort 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 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 @@ 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 @@ 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 @@ 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 @@ /* 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 @@ 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 @@ /* 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 @@ 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 @@ #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 @@ tokoff = toklen = typdefcblev = 0; /* keep compiler quiet */ curndx = newndx = 0; - lineno = 0; - charno = 0; lp = curlb.buffer; *lp = 0; @@ -3828,12 +3829,10 @@ /* 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ /* 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 @@ { 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 @@ * 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 @@ } } 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 @@ 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 @@ } } #endif /* ETAGS_REGEXPS */ - - return result; }