summaryrefslogtreecommitdiff
path: root/lib-src
diff options
context:
space:
mode:
authorFrancesco Potortì <pot@gnu.org>2003-01-09 15:21:57 +0000
committerFrancesco Potortì <pot@gnu.org>2003-01-09 15:21:57 +0000
commitc7be2339ba818e7ca6df62726d74c72c0e4df59b (patch)
tree0415e9e3dcdf070fbc5b25132cc7623da39c7962 /lib-src
parent7d25a9a817a9cb28287c273e17fa4529da36327e (diff)
downloademacs-c7be2339ba818e7ca6df62726d74c72c0e4df59b.tar.gz
changes for language-sepcific help by Philippe
Waroquiers <wao@cfmu.eurocontrol.be> applied and largely revised. (language): Added a `help' member. (arg_type): Added an at_end constant. (plain_C_suffixes): Some items removed from here. (Objc_suffixes): And put here (new constant). (Ada_help, Asm_help, default_C_help, Cplusplus_help, Cjava_help, Cobol_help, Erlang_help, Fortran_help, HTML_help, Lisp_help, Makefile_help, Objc_help, Pascal_help, Perl_help, PHP_help, PS_help, Prolog_help, Python_help, Scheme_help, TeX_help, Texinfo_help, Yacc_help, auto_help, none-help, no_lang_help): New constants. (PS_functions, PS_suffixes): Renamed from Postscript_functions and Postscript_suffixes. (lang_names): Adapted to the new language structure, new language "objc" added (was previously merged with "proc"). (print_language_names): Some help strings corrected. (print_help): Now takes an argument and possibly prints lang help. (print_help): Some help strings corrected. Documents language-specific help. (main): Only print help after having parsed all the arguments.
Diffstat (limited to 'lib-src')
-rw-r--r--lib-src/etags.c253
1 files changed, 204 insertions, 49 deletions
diff --git a/lib-src/etags.c b/lib-src/etags.c
index c0518af6034..e9f1028d222 100644
--- a/lib-src/etags.c
+++ b/lib-src/etags.c
@@ -35,7 +35,7 @@
*
*/
-char pot_etags_version[] = "@(#) pot revision number is $Revision: 16.55 $";
+char pot_etags_version[] = "@(#) pot revision number is 16.56";
#define TRUE 1
#define FALSE 0
@@ -239,11 +239,12 @@ typedef struct
typedef struct
{
char *name; /* language name */
- bool metasource; /* source used to generate other sources */
+ char *help; /* detailed help for the language */
Lang_function *function; /* parse function */
- char **filenames; /* names of this language's files */
char **suffixes; /* name suffixes of this language's files */
+ char **filenames; /* names of this language's files */
char **interpreters; /* interpreters for this language */
+ bool metasource; /* source used to generate other sources */
} language;
typedef struct fdesc
@@ -293,7 +294,8 @@ typedef struct
at_language, /* a language specification */
at_regexp, /* a regular expression */
at_filename, /* a file name */
- at_stdin /* read from stdin here */
+ at_stdin, /* read from stdin here */
+ at_end /* stop parsing the list */
} arg_type; /* argument type */
language *lang; /* language associated with the argument */
char *what; /* the argument itself */
@@ -337,7 +339,7 @@ static void Makefile_targets __P((FILE *));
static void Pascal_functions __P((FILE *));
static void Perl_functions __P((FILE *));
static void PHP_functions __P((FILE *));
-static void Postscript_functions __P((FILE *));
+static void PS_functions __P((FILE *));
static void Prolog_functions __P((FILE *));
static void Python_functions __P((FILE *));
static void Scheme_functions __P((FILE *));
@@ -348,7 +350,7 @@ static void just_read_file __P((FILE *));
static void print_language_names __P((void));
static void print_version __P((void));
-static void print_help __P((void));
+static void print_help __P((argument *));
int main __P((int, char **));
static compressor *get_compressor_from_suffix __P((char *, char **));
@@ -532,6 +534,22 @@ static compressor compressors[] =
/* Ada code */
static char *Ada_suffixes [] =
{ "ads", "adb", "ada", NULL };
+static char Ada_help [] =
+"In Ada code, functions, procedures, packages, tasks and types are\n\
+tags. Use the `--packages-only' option to create tags for\n\
+packages only.\n\
+Ada tag names have suffixes indicating the type of entity:\n\
+ Entity type: Qualifier:\n\
+ ------------ ----------\n\
+ function /f\n\
+ procedure /p\n\
+ package spec /s\n\
+ package body /b\n\
+ type /t\n\
+ task /k\n\
+Thus, `M-x find-tag <RET> bidule/b <RET>' will go directly to the\n\
+body of the package `bidule', while `M-x find-tag <RET> bidule <RET>'\n\
+will just search for any tag `bidule'.";
/* Assembly code */
static char *Asm_suffixes [] =
@@ -545,82 +563,187 @@ static char *Asm_suffixes [] =
"src", /* BSO/Tasking C compiler output */
NULL
};
+static char Asm_help [] =
+"In assembler code, labels appearing at the beginning of a line,\n\
+followed by a colon, are tags.";
+
/* Note that .c and .h can be considered C++, if the --c++ flag was
- given, or if the `class' keyowrd is met inside the file.
+ given, or if the `class' or `template' keyowrds are met inside the file.
That is why default_C_entries is called for these. */
static char *default_C_suffixes [] =
{ "c", "h", NULL };
+static char default_C_help [] =
+"In C code, any C function or typedef is a tag, and so are\n\
+definitions of `struct', `union' and `enum'. `#define' macro\n\
+definitions and `enum' constants are tags unless you specify\n\
+`--no-defines'. Global variables are tags unless you specify\n\
+`--no-globals'. Use of `--no-globals' and `--no-defines'\n\
+can make the tags table file much smaller.\n\
+You can tag function declarations and external variables by\n\
+using `--declarations', and struct members by using `--members'.";
static char *Cplusplus_suffixes [] =
{ "C", "c++", "cc", "cpp", "cxx", "H", "h++", "hh", "hpp", "hxx",
"M", /* Objective C++ */
"pdb", /* Postscript with C syntax */
NULL };
+static char Cplusplus_help [] =
+"In C++ code, all the tag constructs of C code are tagged\n\
+(use --help --lang=c --lang=c++ for full help).\n\
+In addition to C tags, member functions are also recognized, and\n\
+optionally member variables if you use the `--members' option.\n\
+Tags for variables and functions in classes are named `CLASS::VARIABLE'\n\
+and `CLASS::FUNCTION'. `operator' definitions have tag names like\n\
+`operator+'.";
static char *Cjava_suffixes [] =
{ "java", NULL };
+static char Cjava_help [] =
+"In Java code, all the tags constructs of C and C++ code are\n\
+tagged (use --help --lang=c --lang=c++ --lang=java for full help).";
+
static char *Cobol_suffixes [] =
{ "COB", "cob", NULL };
+static char Cobol_help [] =
+"In Cobol code, tags are paragraph names; that is, any word\n\
+starting in column 8 and followed by a period.";
static char *Cstar_suffixes [] =
{ "cs", "hs", NULL };
static char *Erlang_suffixes [] =
{ "erl", "hrl", NULL };
+static char Erlang_help [] =
+"In Erlang code, the tags are the functions, records and macros\n\
+defined in the file.";
static char *Fortran_suffixes [] =
{ "F", "f", "f90", "for", NULL };
+static char Fortran_help [] =
+"In Fortran code, functions, subroutines and block data are tags.";
static char *HTML_suffixes [] =
{ "htm", "html", "shtml", NULL };
+static char HTML_help [] =
+"In HTML input files, the tags are the `title' and the `h1', `h2',\n\
+`h3' headers. Also, tags are `name=' in anchors and all\n\
+occurrences of `id='.";
static char *Lisp_suffixes [] =
{ "cl", "clisp", "el", "l", "lisp", "LSP", "lsp", "ml", NULL };
+static char Lisp_help [] =
+"In Lisp code, any function defined with `defun', any variable\n\
+defined with `defvar' or `defconst', and in general the first\n\
+argument of any expression that starts with `(def' in column zero\n\
+is a tag.";
static char *Makefile_filenames [] =
{ "Makefile", "makefile", "GNUMakefile", "Makefile.in", "Makefile.am", NULL};
+static char Makefile_help [] =
+"In makefiles, targets are tags; additionally, variables are tags\n\
+unless you specify `--no-globals'.";
+
+static char *Objc_suffixes [] =
+ { "lm", /* Objective lex file */
+ "m", /* Objective C file */
+ NULL };
+static char Objc_help [] =
+"In Objective C code, tags include Objective C definitions for classes,\n\
+class categories, methods and protocols. Tags for variables and\n\
+functions in classes are named `CLASS::VARIABLE' and `CLASS::FUNCTION'.";
static char *Pascal_suffixes [] =
{ "p", "pas", NULL };
+static char Pascal_help [] =
+"In Pascal code, the tags are the functions and procedures defined\n\
+in the file.";
static char *Perl_suffixes [] =
{ "pl", "pm", NULL };
-
static char *Perl_interpreters [] =
{ "perl", "@PERL@", NULL };
+static char Perl_help [] =
+"In Perl code, the tags are the packages, subroutines and variables\n\
+defined by the `package', `sub', `my' and `local' keywords. Use\n\
+`--globals' if you want to tag global variables. Tags for\n\
+subroutines are named `PACKAGE::SUB'. The name for subroutines\n\
+defined in the default package is `main::SUB'.";
static char *PHP_suffixes [] =
{ "php", "php3", "php4", NULL };
+static char PHP_help [] =
+"In PHP code, tags are functions, classes and defines. When using\n\
+the `--members' option, vars are tags too.";
static char *plain_C_suffixes [] =
- { "lm", /* Objective lex file */
- "m", /* Objective C file */
- "pc", /* Pro*C file */
+ { "pc", /* Pro*C file */
NULL };
-static char *Postscript_suffixes [] =
+static char *PS_suffixes [] =
{ "ps", "psw", NULL }; /* .psw is for PSWrap */
+static char PS_help [] =
+"In PostScript code, the tags are the functions.";
static char *Prolog_suffixes [] =
{ "prolog", NULL };
+static char Prolog_help [] =
+"In Prolog code, tags are predicates and rules at the beginning of\n\
+line.";
static char *Python_suffixes [] =
{ "py", NULL };
+static char Python_help [] =
+"In Python code, `def' or `class' at the beginning of a line\n\
+generate a tag.";
/* Can't do the `SCM' or `scm' prefix with a version number. */
static char *Scheme_suffixes [] =
{ "oak", "sch", "scheme", "SCM", "scm", "SM", "sm", "ss", "t", NULL };
+static char Scheme_help [] =
+"In Scheme code, tags include anything defined with `def' or with a\n\
+construct whose name starts with `def'. They also include\n\
+variables set with `set!' at top level in the file.";
static char *TeX_suffixes [] =
{ "bib", "clo", "cls", "ltx", "sty", "TeX", "tex", NULL };
+static char TeX_help [] =
+"In LaTeX text, the argument of any of the commands `\\chapter',\n\
+`\\section', `\\subsection', `\\subsubsection', `\\eqno', `\\label',\n\
+`\\ref', `\\cite', `\\bibitem', `\\part', `\\appendix', `\\entry',\n\
+`\\index', `\\def', `\\newcommand', `\\renewcommand',\n\
+`\\newenvironment' or `\\renewenvironment' is a tag.\n\
+\n\
+Other commands can be specified by setting the environment variable\n\
+`TEXTAGS' to a colon-separated list like, for example,\n\
+ TEXTAGS=\"mycommand:myothercommand\".";
+
static char *Texinfo_suffixes [] =
{ "texi", "texinfo", "txi", NULL };
+static char Texinfo_help [] =
+"for texinfo files, lines starting with @node are tagged.";
static char *Yacc_suffixes [] =
{ "y", "y++", "ym", "yxx", "yy", NULL }; /* .ym is Objective yacc file */
+static char Yacc_help [] =
+"In Bison or Yacc input files, each rule defines as a tag the\n\
+nonterminal it constructs. The portions of the file that contain\n\
+C code are parsed as C code (use --help --lang=c --lang=yacc\n\
+for full help).";
+
+static char auto_help [] =
+"`auto' is not a real language, it indicates to use\n\
+a default language for files base on file name suffix and file contents.";
+
+static char none_help [] =
+"`none' is not a real language, it indicates to only do\n\
+regexp processing on files.";
+
+static char no_lang_help [] =
+"No detailed help available for this language.";
+
/*
* Table of languages.
@@ -631,32 +754,33 @@ static char *Yacc_suffixes [] =
static language lang_names [] =
{
- { "ada", FALSE, Ada_funcs, NULL, Ada_suffixes, NULL },
- { "asm", FALSE, Asm_labels, NULL, Asm_suffixes, NULL },
- { "c", FALSE, default_C_entries, NULL, default_C_suffixes, NULL },
- { "c++", FALSE, Cplusplus_entries, NULL, Cplusplus_suffixes, NULL },
- { "c*", FALSE, Cstar_entries, NULL, Cstar_suffixes, NULL },
- { "cobol", FALSE, Cobol_paragraphs, NULL, Cobol_suffixes, NULL },
- { "erlang", FALSE, Erlang_functions, NULL, Erlang_suffixes, NULL },
- { "fortran", FALSE, Fortran_functions, NULL, Fortran_suffixes, NULL },
- { "html", FALSE, HTML_labels, NULL, HTML_suffixes, NULL },
- { "java", FALSE, Cjava_entries, NULL, Cjava_suffixes, NULL },
- { "lisp", FALSE, Lisp_functions, NULL, Lisp_suffixes, NULL },
- { "makefile", FALSE, Makefile_targets, Makefile_filenames, NULL, NULL },
- { "pascal", FALSE, Pascal_functions, NULL, Pascal_suffixes, NULL },
- { "perl", FALSE, Perl_functions,NULL, Perl_suffixes, Perl_interpreters },
- { "php", FALSE, PHP_functions, NULL, PHP_suffixes, NULL },
- { "postscript",FALSE, Postscript_functions,NULL, Postscript_suffixes, NULL },
- { "proc", FALSE, plain_C_entries, NULL, plain_C_suffixes, NULL },
- { "prolog", FALSE, Prolog_functions, NULL, Prolog_suffixes, NULL },
- { "python", FALSE, Python_functions, NULL, Python_suffixes, NULL },
- { "scheme", FALSE, Scheme_functions, NULL, Scheme_suffixes, NULL },
- { "tex", FALSE, TeX_commands, NULL, TeX_suffixes, NULL },
- { "texinfo", FALSE, Texinfo_nodes, NULL, Texinfo_suffixes, NULL },
- { "yacc", TRUE, Yacc_entries, NULL, Yacc_suffixes, NULL },
- { "auto", FALSE, NULL }, /* default guessing scheme */
- { "none", FALSE, just_read_file }, /* regexp matching only */
- { NULL, FALSE, NULL } /* end of list */
+ { "ada", Ada_help, Ada_funcs, Ada_suffixes },
+ { "asm", Asm_help, Asm_labels, Asm_suffixes },
+ { "c", default_C_help, default_C_entries, default_C_suffixes },
+ { "c++", Cplusplus_help, Cplusplus_entries, Cplusplus_suffixes },
+ { "c*", no_lang_help, Cstar_entries, Cstar_suffixes },
+ { "cobol", Cobol_help, Cobol_paragraphs, Cobol_suffixes },
+ { "erlang", Erlang_help, Erlang_functions, Erlang_suffixes },
+ { "fortran", Fortran_help, Fortran_functions, Fortran_suffixes },
+ { "html", HTML_help, HTML_labels, HTML_suffixes },
+ { "java", Cjava_help, Cjava_entries, Cjava_suffixes },
+ { "lisp", Lisp_help, Lisp_functions, Lisp_suffixes },
+ { "makefile", Makefile_help,Makefile_targets,NULL,Makefile_filenames},
+ { "objc", Objc_help, plain_C_entries, Objc_suffixes },
+ { "pascal", Pascal_help, Pascal_functions, Pascal_suffixes },
+ { "perl",Perl_help,Perl_functions,Perl_suffixes,NULL,Perl_interpreters},
+ { "php", PHP_help, PHP_functions, PHP_suffixes },
+ { "postscript",PS_help, PS_functions, PS_suffixes },
+ { "proc", no_lang_help, plain_C_entries, plain_C_suffixes },
+ { "prolog", Prolog_help, Prolog_functions, Prolog_suffixes },
+ { "python", Python_help, Python_functions, Python_suffixes },
+ { "scheme", Scheme_help, Scheme_functions, Scheme_suffixes },
+ { "tex", TeX_help, TeX_commands, TeX_suffixes },
+ { "texinfo", Texinfo_help, Texinfo_nodes, Texinfo_suffixes },
+ { "yacc", Yacc_help,Yacc_entries,Yacc_suffixes,NULL,NULL,TRUE},
+ { "auto", auto_help }, /* default guessing scheme */
+ { "none", none_help, just_read_file }, /* regexp matching only */
+ { NULL } /* end of list */
};
@@ -679,14 +803,18 @@ default file names and dot suffixes:");
printf (" .%s", *ext);
puts ("");
}
- puts ("Where `auto' means use default language for files based on file\n\
+ puts ("where `auto' means use default language for files based on file\n\
name suffix, and `none' means only do regexp processing on files.\n\
If no language is specified and no matching suffix is found,\n\
the first line of the file is read for a sharp-bang (#!) sequence\n\
followed by the name of an interpreter. If no such sequence is found,\n\
Fortran is tried first; if no tags are found, C is tried next.\n\
-When parsing any C file, a \"class\" keyword switches to C++.\n\
-Compressed files are supported using gzip and bzip2.");
+When parsing any C file, a \"class\" or \"template\" keyword\n\
+switches to C++.");
+ puts ("Compressed files are supported using gzip and bzip2.\n\
+\n\
+For detailed help on a given language use, for example,\n\
+etags --help --lang=ada.");
}
#ifndef EMACS_NAME
@@ -706,8 +834,23 @@ print_version ()
}
static void
-print_help ()
+print_help (argbuffer)
+ argument *argbuffer;
{
+ bool help_for_lang = FALSE;
+
+ for (; argbuffer->arg_type != at_end; argbuffer++)
+ if (argbuffer->arg_type == at_language)
+ {
+ if (help_for_lang)
+ puts ("");
+ puts (argbuffer->lang->help);
+ help_for_lang = TRUE;
+ }
+
+ if (help_for_lang)
+ exit (GOOD);
+
printf ("Usage: %s [options] [[regex-option ...] file-name] ...\n\
\n\
These are the options accepted by %s.\n", progname, progname);
@@ -736,7 +879,7 @@ Relative ones are stored relative to the output file's directory.\n");
/* This option is mostly obsolete, because etags can now automatically
detect C++. Retained for backward compatibility and for debugging and
experimentation. In principle, we could want to tag as C++ even
- before any "class" keyword.
+ before any "class" or "template" keyword.
puts ("-C, --c++\n\
Treat files whose name suffix defaults to C language as C++ files.");
*/
@@ -775,7 +918,7 @@ Relative ones are stored relative to the output file's directory.\n");
Do not create tag entries for global variables in some\n\
languages. This makes the tags file smaller.");
puts ("--members\n\
- Create tag entries for member variables in some languages.");
+ Create tag entries for members of structures in some languages.");
#ifdef ETAGS_REGEXPS
puts ("-r REGEXP, --regex=REGEXP or --regex=@regexfile\n\
@@ -838,7 +981,9 @@ Relative ones are stored relative to the output file's directory.\n");
puts ("-V, --version\n\
Print the version of the program.\n\
-h, --help\n\
- Print this help message.");
+ Print this help message.\n\
+ Followed by one or more `--language' options prints detailed\n\
+ help about tag generation for the specified languages.");
print_language_names ();
@@ -985,6 +1130,7 @@ main (argc, argv)
argument *argbuffer;
int current_arg, file_count;
linebuffer filename_lb;
+ bool help_asked = FALSE;
#ifdef VMS
bool got_err;
#endif
@@ -1063,6 +1209,7 @@ main (argc, argv)
{
error ("-o option may only be given once.", (char *)NULL);
suggest_asking_for_help ();
+ /* NOTREACHED */
}
tagfile = optarg;
break;
@@ -1100,7 +1247,7 @@ main (argc, argv)
break;
case 'h':
case 'H':
- print_help ();
+ help_asked = TRUE;
break;
/* Etags options */
@@ -1119,9 +1266,10 @@ main (argc, argv)
case 'w': no_warnings = TRUE; break;
default:
suggest_asking_for_help ();
+ /* NOTREACHED */
}
- for (; optind < argc; ++optind)
+ for (; optind < argc; optind++)
{
argbuffer[current_arg].arg_type = at_filename;
argbuffer[current_arg].what = argv[optind];
@@ -1129,10 +1277,17 @@ main (argc, argv)
++file_count;
}
+ argbuffer[current_arg].arg_type = at_end;
+
+ if (help_asked)
+ print_help (argbuffer);
+ /* NOTREACHED */
+
if (nincluded_files == 0 && file_count == 0)
{
error ("no input files specified.", (char *)NULL);
suggest_asking_for_help ();
+ /* NOTREACHED */
}
if (tagfile == NULL)
@@ -1177,7 +1332,7 @@ main (argc, argv)
/*
* Loop through files finding functions.
*/
- for (i = 0; i < current_arg; ++i)
+ for (i = 0; i < current_arg; i++)
{
static language *lang; /* non-NULL if language is forced */
char *this_file;
@@ -4751,7 +4906,7 @@ Lisp_functions (inf)
* Masatake Yamato <masata-y@is.aist-nara.ac.jp> (1999)
*/
static void
-Postscript_functions (inf)
+PS_functions (inf)
FILE *inf;
{
register char *bp, *ep;