Mercurial > emacs
changeset 49125:7ce72b4a2d94
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.
author | Francesco Potortì <pot@gnu.org> |
---|---|
date | Thu, 09 Jan 2003 15:21:57 +0000 |
parents | f613014bd3f4 |
children | 697ca5db73b8 |
files | lib-src/etags.c |
diffstat | 1 files changed, 204 insertions(+), 49 deletions(-) [+] |
line wrap: on
line diff
--- a/lib-src/etags.c Thu Jan 09 15:20:39 2003 +0000 +++ b/lib-src/etags.c Thu Jan 09 15:21:57 2003 +0000 @@ -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 { 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 **suffixes; /* name suffixes of this language's files */ char **filenames; /* names of this language's files */ - char **suffixes; /* name suffixes 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 @@ 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 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 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 @@ /* 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 @@ "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 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 @@ 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 @@ } 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 @@ /* 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 @@ 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 @@ 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 @@ argument *argbuffer; int current_arg, file_count; linebuffer filename_lb; + bool help_asked = FALSE; #ifdef VMS bool got_err; #endif @@ -1063,6 +1209,7 @@ { error ("-o option may only be given once.", (char *)NULL); suggest_asking_for_help (); + /* NOTREACHED */ } tagfile = optarg; break; @@ -1100,7 +1247,7 @@ break; case 'h': case 'H': - print_help (); + help_asked = TRUE; break; /* Etags options */ @@ -1119,9 +1266,10 @@ 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 @@ ++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 @@ /* * 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 @@ * Masatake Yamato <masata-y@is.aist-nara.ac.jp> (1999) */ static void -Postscript_functions (inf) +PS_functions (inf) FILE *inf; { register char *bp, *ep;