summaryrefslogtreecommitdiff
path: root/lib-src
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2024-10-08 15:39:33 +0300
committerEli Zaretskii <eliz@gnu.org>2024-10-08 15:39:33 +0300
commit339ffd79862c322f5b75fed1b55d61efe90bc7a1 (patch)
treecd04c286e6c0e9346cce40bce16186490c1e4fa5 /lib-src
parent9c94363894ced4ed84014cf0dc347af7882643e6 (diff)
New command-line options for 'etags'
This adds '--no-fallback-lang' and '--no-empty-file-entries' options, and their opposites '--fallback-lang' and '--empty-file-entries'. * lib-src/etags.c (fallback_lang, empty_files): New toggles. (main): Initialize them to 'true'. (longopts) [!CTAGS]: Add the '--(no-)fallback-lang' and '--(no-)empty-file-entries' options. (find_entries): If 'fallback_lang' is false, don't attempt Fortran and C/C++ fallbacks. (print_help): Add help for new options. (main): If 'empty_files' is false, don't output file entries for files that have no tags. (Bug#73484) * doc/emacs/maintaining.texi (Create Tags Table): * etc/NEWS: * doc/man/etags.1: Document the new options. * test/manual/etags/Makefile (check): Add test for new options. * test/manual/etags/ETAGS.good_7: New file.
Diffstat (limited to 'lib-src')
-rw-r--r--lib-src/etags.c70
1 files changed, 55 insertions, 15 deletions
diff --git a/lib-src/etags.c b/lib-src/etags.c
index 4c9b954c9a3..a822a823a90 100644
--- a/lib-src/etags.c
+++ b/lib-src/etags.c
@@ -480,6 +480,8 @@ static bool ignoreindent; /* -I: ignore indentation in C */
static int packages_only; /* --packages-only: in Ada, only tag packages*/
static int class_qualify; /* -Q: produce class-qualified tags in C++/Java */
static int debug; /* --debug */
+static int fallback_lang; /* --(no-)fallback-lang: Fortran/C fallbacks */
+static int empty_files; /* --(no-)empty-file-entries */
/* STDIN is defined in LynxOS system headers */
#ifdef STDIN
@@ -530,6 +532,10 @@ static struct option longopts[] =
{ "no-defines", no_argument, NULL, 'D' },
{ "no-globals", no_argument, &globals, 0 },
{ "include", required_argument, NULL, 'i' },
+ { "no-fallback-lang", no_argument, &fallback_lang, 0 },
+ { "fallback-lang", no_argument, &fallback_lang, 1 },
+ { "no-empty-file-entries", no_argument, &empty_files, 0 },
+ { "empty-file-entries", no_argument, &empty_files, 1 },
#endif
{ NULL }
};
@@ -1039,6 +1045,20 @@ Relative ones are stored relative to the output file's directory.\n");
Do not create tag entries for members of structures\n\
in some languages.");
+ if (!CTAGS)
+ {
+ puts ("--fallback-lang\n\
+ If a file's language could not be determined, try to parse\n\
+ it as Fortran and C/C++.");
+ puts ("--no-fallback-lang\n\
+ Do not fall back to Fortran and C/C++ if a file's language\n\
+ could not be determined.");
+ puts ("--empty-file-entries\n\
+ Produce file entries for files with no tags.");
+ puts ("--no-empty-file-entries\n\
+ Do not output file entries for files with no tags.");
+ }
+
puts ("-Q, --class-qualify\n\
Qualify tag names with their class name in C++, ObjC, Java, and Perl.\n\
This produces tag names of the form \"class::member\" for C++,\n\
@@ -1161,6 +1181,15 @@ main (int argc, char **argv)
typedefs = typedefs_or_cplusplus = constantypedefs = true;
globals = members = true;
+ /* By default, fall back to Fortran/C/C++ if no language is detected by the
+ file's name. This could be reversed in a future version, but only for
+ ETAGS. */
+ fallback_lang = true;
+
+ /* By default, output file entries for files that have no tags. This affects
+ only ETAGS. */
+ empty_files = true;
+
/* When the optstring begins with a '-' getopt_long does not rearrange the
non-options arguments to be at the end, but leaves them alone. */
optstring = concat ("-ac:Cf:Il:o:Qr:RSVhH",
@@ -1388,10 +1417,13 @@ main (int argc, char **argv)
{
fdesc *fdp;
- /* Output file entries that have no tags. */
- for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
- if (!fdp->written)
- fprintf (tagf, "\f\n%s,0\n", fdp->taggedfname);
+ /* Output file entries that have no tags, unless disabled. */
+ if (empty_files)
+ {
+ for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
+ if (!fdp->written)
+ fprintf (tagf, "\f\n%s,0\n", fdp->taggedfname);
+ }
while (nincluded_files-- > 0)
fprintf (tagf, "\f\n%s,include\n", *included_files++);
@@ -1951,22 +1983,30 @@ find_entries (FILE *inf)
}
}
- /* Else try Fortran or C. */
+ /* Else try Fortran or C if that fallback is not disabled. */
if (parser == NULL)
{
- node *old_last_node = last_node;
-
- curfdp->lang = get_language_from_langname ("fortran");
- find_entries (inf);
-
- if (old_last_node == last_node)
- /* No Fortran entries found. Try C. */
+ if (fallback_lang)
{
- reset_input (inf);
- curfdp->lang = get_language_from_langname (cplusplus ? "c++" : "c");
+ node *old_last_node = last_node;
+
+ curfdp->lang = get_language_from_langname ("fortran");
find_entries (inf);
+
+ if (old_last_node == last_node)
+ /* No Fortran entries found. Try C. */
+ {
+ reset_input (inf);
+ curfdp->lang = get_language_from_langname (cplusplus
+ ? "c++" : "c");
+ find_entries (inf);
+ }
+ return;
}
- return;
+ /* If fallbacks are disabled, treat files without a language as if
+ '--language=none' was specified for them. */
+ curfdp->lang = get_language_from_langname ("none");
+ parser = curfdp->lang->function;
}
if (!no_line_directive