X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/40f185ca85f2129ec33446791be2999d714f35ff..24e9e99693f9c9425a41fd1d879ef2827523537c:/lib-src/etags.c diff --git a/lib-src/etags.c b/lib-src/etags.c index 23527171e4..0fbade822d 100644 --- a/lib-src/etags.c +++ b/lib-src/etags.c @@ -29,15 +29,15 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Copyright (C) 1984, 1987, 1988, 1989, 1993, 1994, 1995, 1998, 1999, - 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 + 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. This file is not considered part of GNU Emacs. -This program is free software; you can redistribute it and/or modify +This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 3, or (at your option) -any later version. +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -45,9 +45,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with this program; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -Boston, MA 02110-1301, USA. */ +along with this program. If not, see . */ /* NB To comply with the above BSD license, copyright information is @@ -61,14 +59,14 @@ University of California, as described above. */ /* * Authors: - * 1983 Ctags originally by Ken Arnold. - * 1984 Fortran added by Jim Kleckner. - * 1984 Ed Pelegri-Llopart added C typedefs. - * 1985 Emacs TAGS format by Richard Stallman. - * 1989 Sam Kendall added C++. + * 1983 Ctags originally by Ken Arnold. + * 1984 Fortran added by Jim Kleckner. + * 1984 Ed Pelegri-Llopart added C typedefs. + * 1985 Emacs TAGS format by Richard Stallman. + * 1989 Sam Kendall added C++. * 1992 Joseph B. Wells improved C and C++ parsing. - * 1993 Francesco Potortì reorganised C and C++. - * 1994 Line-by-line regexp tags by Tom Tromey. + * 1993 Francesco Potortì reorganized C and C++. + * 1994 Line-by-line regexp tags by Tom Tromey. * 2001 Nested classes by Francesco Potortì (concept by Mykola Dzyuba). * 2002 #line directives by Francesco Potortì. * @@ -77,11 +75,11 @@ University of California, as described above. */ /* * If you want to add support for a new language, start by looking at the LUA - * language, which is the simplest. Alternatively, consider shipping a - * configuration file containing regexp definitions for etags. + * language, which is the simplest. Alternatively, consider distributing etags + * together with a configuration file containing regexp definitions for etags. */ -char pot_etags_version[] = "@(#) pot revision number is 17.38"; +char pot_etags_version[] = "@(#) pot revision number is 17.38.1.4"; #define TRUE 1 #define FALSE 0 @@ -174,13 +172,8 @@ char pot_etags_version[] = "@(#) pot revision number is 17.38"; extern void exit __P((int)); extern void free __P((void *)); extern void *memmove __P((void *, const void *, unsigned long)); -# ifdef VMS -# define EXIT_SUCCESS 1 -# define EXIT_FAILURE 0 -# else /* no VMS */ -# define EXIT_SUCCESS 0 -# define EXIT_FAILURE 1 -# endif +# define EXIT_SUCCESS 0 +# define EXIT_FAILURE 1 # endif #endif /* !WINDOWSNT */ @@ -899,13 +892,13 @@ etags --help --lang=ada."); # define EMACS_NAME "standalone" #endif #ifndef VERSION -# define VERSION "17.38" +# define VERSION "17.38.1.4" #endif static void print_version () { /* Makes it easier to update automatically. */ - char emacs_copyright[] = "Copyright (C) 2007 Free Software Foundation, Inc."; + char emacs_copyright[] = "Copyright (C) 2009 Free Software Foundation, Inc."; printf ("%s (%s %s)\n", (CTAGS) ? "ctags" : "etags", EMACS_NAME, VERSION); puts (emacs_copyright); @@ -1096,131 +1089,6 @@ Relative ones are stored relative to the output file's directory.\n"); } -#ifdef VMS /* VMS specific functions */ - -#define EOS '\0' - -/* This is a BUG! ANY arbitrary limit is a BUG! - Won't someone please fix this? */ -#define MAX_FILE_SPEC_LEN 255 -typedef struct { - short curlen; - char body[MAX_FILE_SPEC_LEN + 1]; -} vspec; - -/* - v1.05 nmm 26-Jun-86 fn_exp - expand specification of list of file names - returning in each successive call the next file name matching the input - spec. The function expects that each in_spec passed - to it will be processed to completion; in particular, up to and - including the call following that in which the last matching name - is returned, the function ignores the value of in_spec, and will - only start processing a new spec with the following call. - If an error occurs, on return out_spec contains the value - of in_spec when the error occurred. - - With each successive file name returned in out_spec, the - function's return value is one. When there are no more matching - names the function returns zero. If on the first call no file - matches in_spec, or there is any other error, -1 is returned. -*/ - -#include -#include -#define OUTSIZE MAX_FILE_SPEC_LEN -static short -fn_exp (out, in) - vspec *out; - char *in; -{ - static long context = 0; - static struct dsc$descriptor_s o; - static struct dsc$descriptor_s i; - static bool pass1 = TRUE; - long status; - short retval; - - if (pass1) - { - pass1 = FALSE; - o.dsc$a_pointer = (char *) out; - o.dsc$w_length = (short)OUTSIZE; - i.dsc$a_pointer = in; - i.dsc$w_length = (short)strlen(in); - i.dsc$b_dtype = DSC$K_DTYPE_T; - i.dsc$b_class = DSC$K_CLASS_S; - o.dsc$b_dtype = DSC$K_DTYPE_VT; - o.dsc$b_class = DSC$K_CLASS_VS; - } - if ((status = lib$find_file(&i, &o, &context, 0, 0)) == RMS$_NORMAL) - { - out->body[out->curlen] = EOS; - return 1; - } - else if (status == RMS$_NMF) - retval = 0; - else - { - strcpy(out->body, in); - retval = -1; - } - lib$find_file_end(&context); - pass1 = TRUE; - return retval; -} - -/* - v1.01 nmm 19-Aug-85 gfnames - return in successive calls the - name of each file specified by the provided arg expanding wildcards. -*/ -static char * -gfnames (arg, p_error) - char *arg; - bool *p_error; -{ - static vspec filename = {MAX_FILE_SPEC_LEN, "\0"}; - - switch (fn_exp (&filename, arg)) - { - case 1: - *p_error = FALSE; - return filename.body; - case 0: - *p_error = FALSE; - return NULL; - default: - *p_error = TRUE; - return filename.body; - } -} - -#ifndef OLD /* Newer versions of VMS do provide `system'. */ -system (cmd) - char *cmd; -{ - error ("%s", "system() function not implemented under VMS"); -} -#endif - -#define VERSION_DELIM ';' -char *massage_name (s) - char *s; -{ - char *start = s; - - for ( ; *s; s++) - if (*s == VERSION_DELIM) - { - *s = EOS; - break; - } - else - *s = lowcase (*s); - return start; -} -#endif /* VMS */ - - int main (argc, argv) int argc; @@ -1233,9 +1101,6 @@ main (argc, argv) int current_arg, file_count; linebuffer filename_lb; bool help_asked = FALSE; -#ifdef VMS - bool got_err; -#endif char *optstring; int opt; @@ -1386,7 +1251,7 @@ main (argc, argv) } if (tagfile == NULL) - tagfile = CTAGS ? "tags" : "TAGS"; + tagfile = savestr (CTAGS ? "tags" : "TAGS"); cwd = etags_getcwd (); /* the current working directory */ if (cwd[strlen (cwd) - 1] != '/') { @@ -1394,12 +1259,16 @@ main (argc, argv) cwd = concat (oldcwd, "/", ""); free (oldcwd); } - /* Relative file names are made relative to the current directory. */ + + /* Compute base directory for relative file names. */ if (streq (tagfile, "-") || strneq (tagfile, "/dev/", 5)) - tagfiledir = cwd; + tagfiledir = cwd; /* relative file names are relative to cwd */ else - tagfiledir = absolute_dirname (tagfile, cwd); + { + canonicalize_filename (tagfile); + tagfiledir = absolute_dirname (tagfile, cwd); + } init (); /* set up boolean "functions" */ @@ -1443,21 +1312,7 @@ main (argc, argv) analyse_regex (argbuffer[i].what); break; case at_filename: -#ifdef VMS - while ((this_file = gfnames (argbuffer[i].what, &got_err)) != NULL) - { - if (got_err) - { - error ("can't find file %s\n", this_file); - argc--, argv++; - } - else - { - this_file = massage_name (this_file); - } -#else this_file = argbuffer[i].what; -#endif /* Input file named "-" means read file names from stdin (one per line) and use them. */ if (streq (this_file, "-")) @@ -1470,9 +1325,6 @@ main (argc, argv) } else process_file_name (this_file, lang); -#ifdef VMS - } -#endif break; case at_stdin: this_file = argbuffer[i].what; @@ -1572,7 +1424,7 @@ get_compressor_from_suffix (file, extptr) compressor *compr; char *slash, *suffix; - /* This relies on FN to be after canonicalize_filename, + /* File has been processed by canonicalize_filename, so we don't need to consider backslashes on DOS_NT. */ slash = etags_strrchr (file, '/'); suffix = etags_strrchr (file, '.'); @@ -1801,8 +1653,8 @@ process_file_name (file, lang) pfatal (file); cleanup: - if (compressed_name) free (compressed_name); - if (uncompressed_name) free (uncompressed_name); + free (compressed_name); + free (uncompressed_name); last_node = NULL; curfdp = NULL; return; @@ -2181,8 +2033,7 @@ free_tree (np) { register node *node_right = np->right; free_tree (np->left); - if (np->name != NULL) - free (np->name); + free (np->name); free (np->regex); free (np); np = node_right; @@ -2197,11 +2048,11 @@ static void free_fdesc (fdp) register fdesc *fdp; { - if (fdp->infname != NULL) free (fdp->infname); - if (fdp->infabsname != NULL) free (fdp->infabsname); - if (fdp->infabsdir != NULL) free (fdp->infabsdir); - if (fdp->taggedfname != NULL) free (fdp->taggedfname); - if (fdp->prop != NULL) free (fdp->prop); + free (fdp->infname); + free (fdp->infabsname); + free (fdp->infabsdir); + free (fdp->taggedfname); + free (fdp->prop); free (fdp); } @@ -2500,6 +2351,7 @@ while, 0, st_C_ignore switch, 0, st_C_ignore return, 0, st_C_ignore __attribute__, 0, st_C_attribute +GTY, 0, st_C_attribute @interface, 0, st_C_objprot @protocol, 0, st_C_objprot @implementation,0, st_C_objimpl @@ -2563,9 +2415,9 @@ hash (str, len) 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 15, - 14, 35, 35, 35, 35, 35, 35, 35, 14, 35, - 35, 35, 35, 12, 13, 35, 35, 35, 35, 12, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 3, + 26, 35, 35, 35, 35, 35, 35, 35, 27, 35, + 35, 35, 35, 24, 0, 35, 35, 35, 35, 0, 35, 35, 35, 35, 35, 1, 35, 16, 35, 6, 23, 0, 0, 35, 22, 0, 35, 35, 5, 0, 0, 15, 1, 35, 6, 35, 8, 19, 35, 16, @@ -2605,7 +2457,7 @@ in_word_set (str, len) { enum { - TOTAL_KEYWORDS = 32, + TOTAL_KEYWORDS = 33, MIN_WORD_LENGTH = 2, MAX_WORD_LENGTH = 15, MIN_HASH_VALUE = 2, @@ -2616,7 +2468,7 @@ in_word_set (str, len) { {""}, {""}, {"if", 0, st_C_ignore}, - {""}, + {"GTY", 0, st_C_attribute}, {"@end", 0, st_C_objend}, {"union", 0, st_C_struct}, {"define", 0, st_C_define}, @@ -2845,8 +2697,7 @@ popclass_above (bracelev) nl >= 0 && cstack.bracelev[nl] >= bracelev; nl--) { - if (cstack.cname[nl] != NULL) - free (cstack.cname[nl]); + free (cstack.cname[nl]); cstack.nl = nl; } } @@ -4551,7 +4402,7 @@ Perl_functions (inf) LOOP_ON_INPUT_LINES (inf, lb, cp) { - skip_spaces(cp); + cp = skip_spaces (cp); if (LOOKING_AT (cp, "package")) { @@ -5522,8 +5373,7 @@ Prolog_functions (inf) last[len] = '\0'; } } - if (last != NULL) - free (last); + free (last); } @@ -5701,8 +5551,7 @@ Erlang_functions (inf) last[len] = '\0'; } } - if (last != NULL) - free (last); + free (last); } @@ -6032,7 +5881,7 @@ add_regex (regexp_pattern, lang) else re_set_syntax (RE_SYNTAX_EMACS); - err = re_compile_pattern (pat, strlen (regexp_pattern), patbuf); + err = re_compile_pattern (pat, strlen (pat), patbuf); if (multi_line) free (pat); if (err != NULL) @@ -6376,7 +6225,7 @@ readline (lbp, stream) discard_until_line_directive = FALSE; /* found it */ name = lbp->buffer + start; *endp = '\0'; - canonicalize_filename (name); /* for DOS */ + canonicalize_filename (name); taggedabsname = absolute_filename (name, tagfiledir); if (filename_is_absolute (name) || filename_is_absolute (curfdp->infname)) @@ -6879,7 +6728,6 @@ absolute_dirname (file, dir) char *slashp, *res; char save; - canonicalize_filename (file); slashp = etags_strrchr (file, '/'); if (slashp == NULL) return savestr (dir); @@ -6904,27 +6752,38 @@ filename_is_absolute (fn) ); } -/* Translate backslashes into slashes. Works in place. */ +/* Upcase DOS drive letter and collapse separators into single slashes. + Works in place. */ static void canonicalize_filename (fn) register char *fn; { + register char* cp; + char sep = '/'; + #ifdef DOS_NT /* Canonicalize drive letter case. */ if (fn[0] != '\0' && fn[1] == ':' && ISLOWER (fn[0])) fn[0] = upcase (fn[0]); - /* Convert backslashes to slashes. */ - for (; *fn != '\0'; fn++) - if (*fn == '\\') - *fn = '/'; -#else - /* No action. */ - fn = NULL; /* shut up the compiler */ + + sep = '\\'; #endif + + /* Collapse multiple separators into a single slash. */ + for (cp = fn; *cp != '\0'; cp++, fn++) + if (*cp == sep) + { + *fn = '/'; + while (cp[1] == sep) + cp++; + } + else + *fn = *cp; + *fn = '\0'; } -/* Initialize a linebuffer for use */ +/* Initialize a linebuffer for use. */ static void linebuffer_init (lbp) linebuffer *lbp;