X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/0d8de0fd0a5a63cc9558b5c99f9c7f1ddcaf338a..2fdec80c2cebf486bc708c5a59b0cd52def5285b:/lib-src/ebrowse.c diff --git a/lib-src/ebrowse.c b/lib-src/ebrowse.c index a997e56cc9..9fcd54fb84 100644 --- a/lib-src/ebrowse.c +++ b/lib-src/ebrowse.c @@ -1,6 +1,6 @@ /* ebrowse.c --- parsing files for the ebrowse C++ browser -Copyright (C) 1992-2011 Free Software Foundation, Inc. +Copyright (C) 1992-2015 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -19,6 +19,7 @@ along with GNU Emacs. If not, see . */ #include +#include #include #include #include @@ -43,18 +44,13 @@ along with GNU Emacs. If not, see . */ #define READ_CHUNK_SIZE (100 * 1024) -/* The character used as a separator in path lists (like $PATH). */ - -#if defined(__MSDOS__) -#define PATH_LIST_SEPARATOR ';' -#define FILENAME_EQ(X,Y) (strcasecmp(X,Y) == 0) +#if defined (__MSDOS__) +#define FILENAME_EQ(X,Y) (strcasecmp (X,Y) == 0) #else -#if defined(WINDOWSNT) -#define PATH_LIST_SEPARATOR ';' -#define FILENAME_EQ(X,Y) (stricmp(X,Y) == 0) +#if defined (WINDOWSNT) +#define FILENAME_EQ(X,Y) (stricmp (X,Y) == 0) #else -#define PATH_LIST_SEPARATOR ':' -#define FILENAME_EQ(X,Y) (streq(X,Y)) +#define FILENAME_EQ(X,Y) (streq (X,Y)) #endif #endif /* The default output file name. */ @@ -242,7 +238,7 @@ struct member char *def_regexp; /* Regular expression matching definition. */ const char *def_filename; /* File name of definition. */ int def_pos; /* Buffer position of definition. */ - char name[1]; /* Member name. */ + char name[FLEXIBLE_ARRAY_MEMBER]; /* Member name. */ }; /* Structures of this type are used to connect class structures with @@ -261,7 +257,7 @@ struct alias struct alias *next; /* Next in list. */ struct sym *namesp; /* Namespace in which defined. */ struct link *aliasee; /* List of aliased namespaces (A::B::C...). */ - char name[1]; /* Alias name. */ + char name[FLEXIBLE_ARRAY_MEMBER]; /* Alias name. */ }; /* The structure used to describe a class in the symbol table, @@ -285,7 +281,7 @@ struct sym const char *filename; /* File in which it can be found. */ const char *sfilename; /* File in which members can be found. */ struct sym *namesp; /* Namespace in which defined. . */ - char name[1]; /* Name of the class. */ + char name[FLEXIBLE_ARRAY_MEMBER]; /* Name of the class. */ }; /* Experimental: Print info for `--position-info'. We print @@ -463,10 +459,6 @@ static struct member *add_member (struct sym *, char *, int, int, unsigned); static void class_definition (struct sym *, int, int, int); static char *operator_name (int *); static void parse_qualified_param_ident_or_type (char **); -static void usage (int) NO_RETURN; -static void version (void) NO_RETURN; - - /*********************************************************************** Utilities @@ -522,7 +514,7 @@ static char * xstrdup (char *s) { if (s) - s = strcpy (xmalloc (strlen (s) + 1), s); + return strcpy (xmalloc (strlen (s) + 1), s); return s; } @@ -576,8 +568,8 @@ add_sym (const char *name, struct sym *nested_in_class) puts (name); } - sym = (struct sym *) xmalloc (sizeof *sym + strlen (name)); - memset (sym, 0, sizeof *sym); + sym = xmalloc (offsetof (struct sym, name) + strlen (name) + 1); + memset (sym, 0, offsetof (struct sym, name)); strcpy (sym->name, name); sym->namesp = scope; sym->next = class_table[h]; @@ -861,7 +853,8 @@ add_global_decl (char *name, char *regexp, int pos, unsigned int hash, int var, static struct member * add_member (struct sym *cls, char *name, int var, int sc, unsigned int hash) { - struct member *m = (struct member *) xmalloc (sizeof *m + strlen (name)); + struct member *m = xmalloc (offsetof (struct member, name) + + strlen (name) + 1); struct member **list; struct member *p; struct member *prev; @@ -971,8 +964,8 @@ mark_inherited_virtual (void) static struct sym * make_namespace (char *name, struct sym *context) { - struct sym *s = (struct sym *) xmalloc (sizeof *s + strlen (name)); - memset (s, 0, sizeof *s); + struct sym *s = xmalloc (offsetof (struct sym, name) + strlen (name) + 1); + memset (s, 0, offsetof (struct sym, name)); strcpy (s->name, name); s->next = all_namespaces; s->namesp = context; @@ -981,7 +974,7 @@ make_namespace (char *name, struct sym *context) } -/* Find the symbol for namespace NAME. If not found, retrun NULL */ +/* Find the symbol for namespace NAME. If not found, return NULL */ static struct sym * check_namespace (char *name, struct sym *context) @@ -1055,7 +1048,7 @@ register_namespace_alias (char *new_name, struct link *old_name) if (streq (new_name, al->name) && (al->namesp == current_namespace)) return; - al = (struct alias *) xmalloc (sizeof *al + strlen (new_name)); + al = xmalloc (offsetof (struct alias, name) + strlen (new_name) + 1); strcpy (al->name, new_name); al->next = namespace_alias_table[h]; al->namesp = current_namespace; @@ -1103,7 +1096,7 @@ leave_namespace (void) /* Write string S to the output file FP in a Lisp-readable form. If S is null, write out `()'. */ -static inline void +static void putstr (const char *s, FILE *fp) { if (!s) @@ -2511,7 +2504,7 @@ member (struct sym *cls, int vis) /* A function or class may follow. */ case TEMPLATE: - MATCH(); + MATCH (); SET_FLAG (flags, F_TEMPLATE); /* Skip over template argument list */ SKIP_MATCHING_IF ('<'); @@ -2930,7 +2923,7 @@ parse_qualified_ident_or_type (char **last_id) } while (enter--) - leave_namespace(); + leave_namespace (); return cls; } @@ -3421,7 +3414,7 @@ add_search_path (char *path_list) char *start = path_list; struct search_path *p; - while (*path_list && *path_list != PATH_LIST_SEPARATOR) + while (*path_list && *path_list != SEPCHAR) ++path_list; p = (struct search_path *) xmalloc (sizeof *p); @@ -3438,7 +3431,7 @@ add_search_path (char *path_list) else search_path = search_path_tail = p; - while (*path_list == PATH_LIST_SEPARATOR) + while (*path_list == SEPCHAR) ++path_list; } } @@ -3488,7 +3481,9 @@ open_file (char *file) /* Display usage information and exit program. */ -#define USAGE "\ +static char const *const usage_message[] = + { + "\ Usage: ebrowse [options] {files}\n\ \n\ -a, --append append output to existing file\n\ @@ -3496,6 +3491,8 @@ Usage: ebrowse [options] {files}\n\ -I, --search-path=LIST set search path for input files\n\ -m, --min-regexp-length=N set minimum regexp length to N\n\ -M, --max-regexp-length=N set maximum regexp length to N\n\ +", + "\ -n, --no-nested-classes exclude nested classes\n\ -o, --output-file=FILE set output file name to FILE\n\ -p, --position-info print info about position in file\n\ @@ -3505,12 +3502,16 @@ Usage: ebrowse [options] {files}\n\ -x, --no-regexps don't record regular expressions\n\ --help display this help\n\ --version display version info\n\ +\n\ " + }; -static void +static _Noreturn void usage (int error) { - puts (USAGE); + int i; + for (i = 0; i < sizeof usage_message / sizeof *usage_message; i++) + fputs (usage_message[i], stdout); exit (error ? EXIT_FAILURE : EXIT_SUCCESS); } @@ -3522,11 +3523,10 @@ usage (int error) # define VERSION "21" #endif -static void +static _Noreturn void version (void) { - /* Makes it easier to update automatically. */ - char emacs_copyright[] = "Copyright (C) 2011 Free Software Foundation, Inc."; + char emacs_copyright[] = COPYRIGHT; printf ("ebrowse %s\n", VERSION); puts (emacs_copyright);