# HG changeset patch # User Francesco Potort # Date 950218021 0 # Node ID c8b3e7e83e09f96c0c2c0e8e69b98e71cf8ede97 # Parent c3cdb8d6d50d05de3c6a929f5c4aa5ba00aa7966 2000-02-10 Francesco Potorti` * etags.c (iswhite): Redefined not to consider '\0' as white space, and use it throughout in place of isspace, thus preventing a potential signed char to int conversion problem. (MSDOS): #undefine befere redefining 2000-02-04 Francesco Potorti` * etags.c (many functions): Add prototypes. diff -r c3cdb8d6d50d -r c8b3e7e83e09 lib-src/etags.c --- a/lib-src/etags.c Thu Feb 10 20:28:26 2000 +0000 +++ b/lib-src/etags.c Thu Feb 10 21:27:01 2000 +0000 @@ -31,7 +31,7 @@ * Francesco Potorti` (pot@gnu.org) is the current maintainer. */ -char pot_etags_version[] = "@(#) pot revision number is 13.38"; +char pot_etags_version[] = "@(#) pot revision number is 13.44"; #define TRUE 1 #define FALSE 0 @@ -40,7 +40,7 @@ # define DEBUG FALSE #endif -#if defined (__STDC__) && __STDC__ +#if defined(__STDC__) && (__STDC__ || defined(__SUNPRO_C)) # define P_(proto) proto #else # define P_(proto) () @@ -60,6 +60,7 @@ #endif #ifdef MSDOS +# undef MSDOS # define MSDOS TRUE # include # include @@ -100,7 +101,7 @@ # include #else # if defined (HAVE_GETCWD) && !WINDOWSNT - extern char *getcwd (); + extern char *getcwd (char *buf, size_t size); # endif #endif /* HAVE_UNISTD_H */ @@ -189,7 +190,7 @@ typedef int bool; -typedef void Lang_function (); +typedef void Lang_function P_((FILE *)); typedef struct { @@ -234,76 +235,80 @@ /* Many compilers barf on this: Lang_function Ada_funcs; so let's write it this way */ -static void Ada_funcs P_((FILE *inf)); -static void Asm_labels P_((FILE *inf)); -static void C_entries P_((int c_ext, FILE *inf)); -static void default_C_entries P_((FILE *inf)); -static void plain_C_entries P_((FILE *inf)); -static void Cjava_entries P_((FILE *inf)); -static void Cobol_paragraphs P_((FILE *inf)); -static void Cplusplus_entries P_((FILE *inf)); -static void Cstar_entries P_((FILE *inf)); -static void Erlang_functions P_((FILE *inf)); -static void Fortran_functions P_((FILE *inf)); -static void Yacc_entries P_((FILE *inf)); -static void Lisp_functions P_((FILE *inf)); -static void Pascal_functions P_((FILE *inf)); -static void Perl_functions P_((FILE *inf)); -static void Postscript_functions P_((FILE *inf)); -static void Prolog_functions P_((FILE *inf)); -static void Python_functions P_((FILE *inf)); -static void Scheme_functions P_((FILE *inf)); -static void TeX_functions P_((FILE *inf)); -static void just_read_file P_((FILE *inf)); - -static compressor *get_compressor_from_suffix P_((char *file, char **extptr)); -static language *get_language_from_name P_((char *name)); -static language *get_language_from_interpreter P_((char *interpreter)); -static language *get_language_from_suffix P_((char *file)); -static int total_size_of_entries P_((register node *np)); -static long readline P_((linebuffer *lbp, FILE *stream)); -static long readline_internal P_((linebuffer *lbp, register FILE *stream)); -static void get_tag P_((register char *bp)); +static void Ada_funcs P_((FILE *)); +static void Asm_labels P_((FILE *)); +static void C_entries P_((int c_ext, FILE *)); +static void default_C_entries P_((FILE *)); +static void plain_C_entries P_((FILE *)); +static void Cjava_entries P_((FILE *)); +static void Cobol_paragraphs P_((FILE *)); +static void Cplusplus_entries P_((FILE *)); +static void Cstar_entries P_((FILE *)); +static void Erlang_functions P_((FILE *)); +static void Fortran_functions P_((FILE *)); +static void Yacc_entries P_((FILE *)); +static void Lisp_functions P_((FILE *)); +static void Pascal_functions P_((FILE *)); +static void Perl_functions P_((FILE *)); +static void Postscript_functions P_((FILE *)); +static void Prolog_functions P_((FILE *)); +static void Python_functions P_((FILE *)); +static void Scheme_functions P_((FILE *)); +static void TeX_functions P_((FILE *)); +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)); +int main P_((int, char **)); +static int number_len P_((long)); + +static compressor *get_compressor_from_suffix P_((char *, char **)); +static language *get_language_from_name P_((char *)); +static language *get_language_from_interpreter P_((char *)); +static language *get_language_from_suffix P_((char *)); +static int total_size_of_entries P_((node *)); +static long readline P_((linebuffer *, FILE *)); +static long readline_internal P_((linebuffer *, FILE *)); +static void get_tag P_((char *)); #ifdef ETAGS_REGEXPS -static void analyse_regex P_((char *regex_arg, bool ignore_case)); -static void add_regex P_((char *regexp_pattern, bool ignore_case, language *lan)); +static void analyse_regex P_((char *, bool)); +static void add_regex P_((char *, bool, language *)); static void free_patterns P_((void)); #endif /* ETAGS_REGEXPS */ -static void error P_((const char *s1, const char *s2)); +static void error P_((const char *, const char *)); static void suggest_asking_for_help P_((void)); -static void fatal P_((char *s1, char *s2)); -static void pfatal P_((char *s1)); -static void add_node P_((node *np, node **cur_node_p)); +static void fatal P_((char *, char *)); +static void pfatal P_((char *)); +static void add_node P_((node *, node **)); static void init P_((void)); -static void initbuffer P_((linebuffer *lbp)); -static void find_entries P_((char *file, FILE *inf)); -static void free_tree P_((register node *np)); -static void pfnote P_((char *name, bool is_func, char *linestart, - int linelen, int lno, long int cno)); -static void new_pfnote P_((char *name, int namelen, bool is_func, - char *linestart, int linelen, int lno, long int cno)); -static void process_file P_((char *file)); -static void put_entries P_((register node *np)); +static void initbuffer P_((linebuffer *)); +static void find_entries P_((char *, FILE *)); +static void free_tree P_((node *)); +static void pfnote P_((char *, bool, char *, int, int, long)); +static void new_pfnote P_((char *, int, bool, char *, int, int, long)); +static void process_file P_((char *)); +static void put_entries P_((node *)); static void takeprec P_((void)); -static char *concat P_((char *s1, char *s2, char *s3)); -static char *skip_spaces P_((char *cp)); -static char *skip_non_spaces P_((char *cp)); -static char *savenstr P_((char *cp, int len)); -static char *savestr P_((char *cp)); -static char *etags_strchr P_((const char *sp, int c)); -static char *etags_strrchr P_((const char *sp, int c)); +static char *concat P_((char *, char *, char *)); +static char *skip_spaces P_((char *)); +static char *skip_non_spaces P_((char *)); +static char *savenstr P_((char *, int)); +static char *savestr P_((char *)); +static char *etags_strchr P_((const char *, int)); +static char *etags_strrchr P_((const char *, int)); static char *etags_getcwd P_((void)); -static char *relative_filename P_((char *file, char *dir)); -static char *absolute_filename P_((char *file, char *dir)); -static char *absolute_dirname P_((char *file, char *dir)); -static bool filename_is_absolute P_((char *fn)); -static void canonicalize_filename P_((register char *fn)); -static void grow_linebuffer P_((linebuffer *lbp, int toksize)); -static long *xmalloc P_((unsigned int size)); -static long *xrealloc P_((char *ptr, unsigned int size)); +static char *relative_filename P_((char *, char *)); +static char *absolute_filename P_((char *, char *)); +static char *absolute_dirname P_((char *, char *)); +static bool filename_is_absolute P_((char *f)); +static void canonicalize_filename P_((char *)); +static void grow_linebuffer P_((linebuffer *, int)); +static long *xmalloc P_((unsigned int)); +static long *xrealloc P_((char *, unsigned int)); char searchar = '/'; /* use /.../ searches */ @@ -336,7 +341,7 @@ bool _wht[CHARS], _nin[CHARS], _itk[CHARS], _btk[CHARS], _etk[CHARS]; char /* white chars */ - *white = " \f\t\n\r", + *white = " \f\t\n\r\v", /* not in a name */ *nonam = " \f\t\n\r(=,[;", /* token ending chars */ @@ -1473,13 +1478,12 @@ iswhite(i) = notinname(i) = begtoken(i) = intoken(i) = endtoken(i) = FALSE; for (sp = white; *sp != '\0'; sp++) iswhite (*sp) = TRUE; for (sp = nonam; *sp != '\0'; sp++) notinname (*sp) = TRUE; + notinname('\0') = notinname('\n'); for (sp = begtk; *sp != '\0'; sp++) begtoken (*sp) = TRUE; + begtoken('\0') = begtoken('\n'); for (sp = midtk; *sp != '\0'; sp++) intoken (*sp) = TRUE; + intoken('\0') = intoken('\n'); for (sp = endtk; *sp != '\0'; sp++) endtoken (*sp) = TRUE; - iswhite('\0') = iswhite('\n'); - notinname('\0') = notinname('\n'); - begtoken('\0') = begtoken('\n'); - intoken('\0') = intoken('\n'); endtoken('\0') = endtoken('\n'); } @@ -1893,6 +1897,10 @@ st_C_struct, st_C_extern, st_C_enum, st_C_define, st_C_typedef, st_C_typespec }; +static unsigned int hash P_((const char *, unsigned int)); +static struct C_stab_entry * in_word_set P_((const char *, unsigned int)); +static enum sym_type C_symtype P_((char *, int, int)); + /* Feed stuff between (but not including) %[ and %] lines to: gperf -c -k 1,3 -o -p -r -t %[ @@ -2254,6 +2262,9 @@ */ int methodlen; +static bool consider_token P_((char *, int, int, int, int, int, bool *)); +static void make_C_tag P_((bool)); + /* * consider_token () * checks to see if the current token is at the start of a @@ -2276,7 +2287,7 @@ consider_token (str, len, c, c_ext, cblev, parlev, is_func_or_var) register char *str; /* IN: token pointer */ register int len; /* IN: token length */ - register char c; /* IN: first char after the token */ + register int c; /* IN: first char after the token */ int c_ext; /* IN: C extensions mask */ int cblev; /* IN: curly brace level */ int parlev; /* IN: parenthesis level */ @@ -2828,7 +2839,7 @@ if (*lp != '\0') lp += 1; while (*lp != '\0' - && !isspace (*lp) && *lp != '(') + && !iswhite (*lp) && *lp != '(') lp += 1; c = *lp++; toklen += lp - oldlp; @@ -3354,6 +3365,10 @@ /* Fortran parsing */ +static bool tail P_((char *)); +static void takeprec P_((void)); +static void getit P_((FILE *)); + static bool tail (cp) char *cp; @@ -3497,6 +3512,9 @@ * Philippe Waroquiers , 1998-04-24 * Ada parsing */ + +static void adagetit P_((FILE *, char *)); + /* Once we are positioned after an "interesting" keyword, let's get the real tag value necessary. */ static void @@ -3679,7 +3697,7 @@ cp++; while (isalnum (*cp) || *cp == '_' || *cp == '.' || *cp == '$') cp++; - if (*cp == ':' || isspace (*cp)) + if (*cp == ':' || iswhite (*cp)) { /* Found end of label, so copy it and add it to the table. */ pfnote (savenstr(lb.buffer, cp-lb.buffer), TRUE, @@ -3705,14 +3723,14 @@ { if (*cp++ == 's' && *cp++ == 'u' - && *cp++ == 'b' && isspace (*cp++)) + && *cp++ == 'b' && iswhite (*cp++)) { cp = skip_spaces (cp); if (*cp != '\0') { char *sp = cp; while (*cp != '\0' - && !isspace (*cp) && *cp != '{' && *cp != '(') + && !iswhite (*cp) && *cp != '{' && *cp != '(') cp++; pfnote (savenstr (sp, cp-sp), TRUE, lb.buffer, cp - lb.buffer + 1, lineno, linecharno); @@ -3728,7 +3746,7 @@ && *cp++ == 'c' && *cp++ == 'a' && *cp++ == 'l')) - && (*cp == '(' || isspace (*cp))) + && (*cp == '(' || iswhite (*cp))) { /* After "my" or "local", but before any following paren or space. */ char *varname = NULL; @@ -3771,10 +3789,10 @@ { if (*cp++ == 'd' && *cp++ == 'e' - && *cp++ == 'f' && isspace (*cp++)) + && *cp++ == 'f' && iswhite (*cp++)) { cp = skip_spaces (cp); - while (*cp != '\0' && !isspace (*cp) && *cp != '(' && *cp != ':') + while (*cp != '\0' && !iswhite (*cp) && *cp != '(' && *cp != ':') cp++; pfnote (NULL, TRUE, lb.buffer, cp - lb.buffer + 1, lineno, linecharno); @@ -3785,10 +3803,10 @@ && *cp++ == 'l' && *cp++ == 'a' && *cp++ == 's' - && *cp++ == 's' && isspace (*cp++)) + && *cp++ == 's' && iswhite (*cp++)) { cp = skip_spaces (cp); - while (*cp != '\0' && !isspace (*cp) && *cp != '(' && *cp != ':') + while (*cp != '\0' && !iswhite (*cp) && *cp != '(' && *cp != ':') cp++; pfnote (NULL, TRUE, lb.buffer, cp - lb.buffer + 1, lineno, linecharno); @@ -4011,6 +4029,11 @@ * lisp tag functions * look for (def or (DEF, quote or QUOTE */ + +static int L_isdef P_((char *)); +static int L_isquote P_((char *)); +static void L_getit P_((void)); + static int L_isdef (strp) register char *strp; @@ -4029,7 +4052,7 @@ && (*++strp == 'o' || *strp == 'O') && (*++strp == 't' || *strp == 'T') && (*++strp == 'e' || *strp == 'E') - && isspace (*++strp)); + && iswhite (*++strp)); } static void @@ -4049,7 +4072,7 @@ } for (cp = dbp /*+1*/; - *cp != '\0' && *cp != '(' && !isspace(*cp) && *cp != ')'; + *cp != '\0' && *cp != '(' && !iswhite(*cp) && *cp != ')'; cp++) continue; if (cp == dbp) @@ -4078,7 +4101,7 @@ /* Check for (foo::defmumble name-defined ... */ do dbp++; - while (*dbp != '\0' && !isspace (*dbp) + while (*dbp != '\0' && !iswhite (*dbp) && *dbp != ':' && *dbp != '(' && *dbp != ')'); if (*dbp == ':') { @@ -4155,7 +4178,7 @@ { bp = skip_non_spaces (bp); /* Skip over open parens and white space */ - while (isspace (*bp) || *bp == '(') + while (iswhite (*bp) || *bp == '(') bp++; get_tag (bp); } @@ -4164,7 +4187,7 @@ && (bp[2] == 'E' || bp[2] == 'e') && (bp[3] == 'T' || bp[3] == 't') && (bp[4] == '!' || bp[4] == '!') - && (isspace (bp[5]))) + && (iswhite (bp[5]))) { bp = skip_non_spaces (bp); bp = skip_spaces (bp); @@ -4193,9 +4216,9 @@ :chapter:section:subsection:subsubsection:eqno:label:ref:cite:bibitem\ :part:appendix:entry:index"; -static void TEX_mode P_((FILE *inf)); -static struct TEX_tabent *TEX_decode_env P_((char *evarname, char *defenv)); -static int TEX_Token P_((char *cp)); +static void TEX_mode P_((FILE *)); +static struct TEX_tabent *TEX_decode_env P_((char *, char *)); +static int TEX_Token P_((char *)); char TEX_esc = '\\'; char TEX_opgrp = '{'; @@ -4361,9 +4384,9 @@ * Assumes that the predicate starts at column 0. * Only the first clause of a predicate is added. */ -static int prolog_pred P_((char *s, char *last)); -static void prolog_skip_comment P_((linebuffer *plb, FILE *inf)); -static int prolog_atom P_((char *s, int pos)); +static int prolog_pred P_((char *, char *)); +static void prolog_skip_comment P_((linebuffer *, FILE *)); +static int prolog_atom P_((char *, int)); static void Prolog_functions (inf) @@ -4381,7 +4404,7 @@ { if (cp[0] == '\0') /* Empty line */ continue; - else if (isspace (cp[0])) /* Not a predicate */ + else if (iswhite (cp[0])) /* Not a predicate */ continue; else if (cp[0] == '/' && cp[1] == '*') /* comment. */ prolog_skip_comment (&lb, inf); @@ -4527,9 +4550,9 @@ * * Assumes that Erlang functions start at column 0. */ -static int erlang_func P_((char *s, char *last)); -static void erlang_attribute P_((char *s)); -static int erlang_atom P_((char *s, int pos)); +static int erlang_func P_((char *, char *)); +static void erlang_attribute P_((char *)); +static int erlang_atom P_((char *, int)); static void Erlang_functions (inf) @@ -4547,7 +4570,7 @@ { if (cp[0] == '\0') /* Empty line */ continue; - else if (isspace (cp[0])) /* Not function nor attribute */ + else if (iswhite (cp[0])) /* Not function nor attribute */ continue; else if (cp[0] == '%') /* comment */ continue; @@ -4699,6 +4722,11 @@ #ifdef ETAGS_REGEXPS +static char *scan_separators P_((char *)); +static void analyse_regex P_((char *, bool)); +static void add_regex P_((char *, bool, language *)); +static char *substitute P_((char *, char *, struct re_registers *)); + /* 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 @@ -4941,7 +4969,7 @@ return; /* Go till you get to white space or a syntactic break */ for (cp = bp + 1; - *cp != '\0' && *cp != '(' && *cp != ')' && !isspace (*cp); + *cp != '\0' && *cp != '(' && *cp != ')' && !iswhite (*cp); cp++) continue; pfnote (savenstr (bp, cp-bp), TRUE, @@ -5164,7 +5192,7 @@ skip_spaces (cp) char *cp; { - while (isspace (*cp)) /* isspace('\0')==FALSE */ + while (iswhite (*cp)) cp++; return cp; } @@ -5174,7 +5202,7 @@ skip_non_spaces (cp) char *cp; { - while (!iswhite (*cp)) /* iswhite('\0')==TRUE */ + while (*cp != '\0' && !iswhite (*cp)) cp++; return cp; }