diff options
author | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 1995-04-01 12:02:06 +0000 |
---|---|---|
committer | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 1995-04-01 12:02:06 +0000 |
commit | 45b79afeb4b80ec46e7646e052ac5eb6d83523a5 (patch) | |
tree | edc8f36367448824d407fe6a733d892632f782c0 /gcc/cccp.c | |
parent | 7f369389d45d4b14eb9abc88a9ad2ffb63e864bc (diff) | |
download | gcc-45b79afeb4b80ec46e7646e052ac5eb6d83523a5.tar.gz |
General code cleanup.
Add prototypes for static functions.
Remove unnecessary casts to (char *); add casts to (U_CHAR *).
Add parentheses suggested by `gcc -Wparentheses'.
Rename local variables as suggested by `gcc -Wshadow'.
<fcntl.h>, <stdlib.h>, <string.h>, <unistd.h>: New includes.
<sys/time.h>, <sys/resource.h>: Include only if defined(RLIMIT_STACK).
<time.h>: Include, unless <sys/time.h> already does.
(HAVE_FCNTL_H, HAVE_STDLIB_H, HAVE_SYS_TIME_H): New symbols.
(HAVE_UNISTD_H, STDC_HEADERS, TIME_WITH_SYS_TIME): Likewise.
(__attribute__, PROTO, VA_START, PRINTF_ALIST, PRINTF_DCL): New macros.
(PRINTF_PROTO{,_1,_2,_3}, DO_PROTO): Likewise.
(bcopy, bzero, bcmp): If #defined by configuration file, use that.
If STDC_HEADERS is defined, use standard C functions.
If BSTRING is defined, or USG and VMS are not defined, use
the C library. Otherwise, use my_bcopy, my_bzero, my_bcmp.
(localtime): Remove no-longer-necessary explicit declaration.
(getenv, index, rindex): Don't declare explicitly if the appropriate system
eader should declare it.
(fdopen): Remove no-longer-used declaration.
(vprintf): Define a subsitute macro if !defined(HAVE_VPRINTF).
(main): Replace `fdopen (dup (fileno (stdout)), "w"))' with `stdout'.
(get_lintcmd, rescan, create_definition): Use bcmp instead of strncmp when both
operands are known to be free of null bytes.
(check_macro_name, compare_defs, collect_expansion): Likewise.
(do_assert, compare_token_lists, assertion_lookup, do_line): Likewise.
(skip_if_group, lookup): Likewise.
(rescan): Remove unused label `startagain'.
Abort instead of printing nonsense if the stack is corrupted when there was an
unterminated successful conditional.
(pcfinclude): Include explicit double-cast through GENERICPTR to identify
particularly egregious type puns.
(create_definition, do_define, check_macro_name): Use %.*s printf format to
avoid painful copying-and-casting.
(do_once): Return void, not (unused) int.
(do_ident, do_pragma, do_sccs): Accept extra arguments so that all
directive-handler's types match.
(do_sccs): Define only if SCCS_DIRECTIVE is defined.
(skip_if_group, dump_single_macro): Add `default: break;' to keep -Wswitch
happy.
(error, warning, error_with_line, vwarning_with_line, pedwarn): Use
stdarg/vararg/vfprintf instead of passing bogus char * args around.
(pedwarn_with_line, pedwarn_with_file_and_line, fatal): Likewise.
(verror, vwarning, verror_with_line, vwarning_with_line): New fcns.
(dump_single_macro): Abort if ap points to garbage.
(make_definition, make_undef, make_assertion): Parameter now char *.
(xmalloc, xrealloc, xcalloc, savestring, index0): Make sizes size_t
instead of unsigned; make pointer parameters GENERICPTR, not char *.
(xcalloc): Use bzero to clear memory instead of using own loop.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@9278 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cccp.c')
-rw-r--r-- | gcc/cccp.c | 1009 |
1 files changed, 597 insertions, 412 deletions
diff --git a/gcc/cccp.c b/gcc/cccp.c index 54f2cd1b9cb..59d1cdd3408 100644 --- a/gcc/cccp.c +++ b/gcc/cccp.c @@ -62,33 +62,174 @@ typedef unsigned char U_CHAR; #define PATH_SEPARATOR ':' #endif -/* In case config.h defines these. */ -#undef bcopy -#undef bzero -#undef bcmp - #include <sys/types.h> #include <sys/stat.h> #include <ctype.h> #include <stdio.h> #include <signal.h> -#ifndef VMS -#ifndef USG -#include <sys/time.h> /* for __DATE__ and __TIME__ */ -#include <sys/resource.h> +/* The following symbols should be autoconfigured: + HAVE_FCNTL_H + HAVE_STDLIB_H + HAVE_SYS_TIME_H + HAVE_UNISTD_H + STDC_HEADERS + TIME_WITH_SYS_TIME + In the mean time, we'll get by with approximations based + on existing GCC configuration symbols. */ + +#ifdef POSIX +# ifndef HAVE_STDLIB_H +# define HAVE_STDLIB_H 1 +# endif +# ifndef HAVE_UNISTD_H +# define HAVE_UNISTD_H 1 +# endif +# ifndef STDC_HEADERS +# define STDC_HEADERS 1 +# endif +#endif /* defined (POSIX) */ + +#if defined (POSIX) || (defined (USG) && !defined (VMS)) +# ifndef HAVE_FCNTL_H +# define HAVE_FCNTL_H 1 +# endif +#endif + +#ifndef RLIMIT_STACK +# include <time.h> #else -#include <time.h> -#include <fcntl.h> -#endif /* USG */ -#endif /* not VMS */ +# if TIME_WITH_SYS_TIME +# include <sys/time.h> +# include <time.h> +# else +# if HAVE_SYS_TIME_H +# include <sys/time.h> +# else +# include <time.h> +# endif +# endif +# include <sys/resource.h> +#endif + +#if HAVE_FCNTL_H +# include <fcntl.h> +#endif /* This defines "errno" properly for VMS, and gives us EACCES. */ #include <errno.h> +#if HAVE_STDLIB_H +# include <stdlib.h> +#else +char *getenv (); +#endif + +#if STDC_HEADERS +# include <string.h> +# ifndef bcmp +# define bcmp(a, b, n) memcmp (a, b, n) +# endif +# ifndef bcopy +# define bcopy(s, d, n) memcpy (d, s, n) +# endif +# ifndef bzero +# define bzero(d, n) memset (d, 0, n) +# endif +#else /* !STDC_HEADERS */ +char *index (); +char *rindex (); + +# if !defined (BSTRING) && (defined (USG) || defined (VMS)) + +# ifndef bcmp +# define bcmp my_bcmp +static int +my_bcmp (a, b, n) + register char *a; + register char *b; + register unsigned n; +{ + while (n-- > 0) + if (*a++ != *b++) + return 1; + + return 0; +} +# endif /* !defined (bcmp) */ + +# ifndef bcopy +# define bcopy my_bcopy +static void +my_bcopy (s, d, n) + register char *s; + register char *d; + register unsigned n; +{ + while (n-- > 0) + *d++ = *s++; +} +# endif /* !defined (bcopy) */ + +# ifndef bzero +# define bzero my_bzero +static void +my_bzero (b, length) + register char *b; + register unsigned length; +{ + while (length-- > 0) + *b++ = 0; +} +# endif /* !defined (bzero) */ + +# endif /* !defined (BSTRING) && (defined (USG) || defined (VMS)) */ +#endif /* ! STDC_HEADERS */ + +#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 6) +# define __attribute__(x) +#endif + +#ifndef PROTO +# if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__) +# define PROTO(ARGS) ARGS +# else +# define PROTO(ARGS) () +# endif +#endif + +#if defined (__STDC__) && defined (HAVE_VPRINTF) +# include <stdarg.h> +# define VA_START(va_list, var) va_start (va_list, var) +# define PRINTF_ALIST(msg) char *msg, ... +# define PRINTF_DCL(msg) +# define PRINTF_PROTO(ARGS, m, n) PROTO (ARGS) __attribute__ ((format (printf, m, n))) +#else +# include <varargs.h> +# define VA_START(va_list, var) va_start (va_list) +# define PRINTF_ALIST(msg) msg, va_alist +# define PRINTF_DCL(msg) char *msg; va_dcl +# define PRINTF_PROTO(ARGS, m, n) () __attribute__ ((format (printf, m, n))) +# define vfprintf(file, msg, args) \ + { \ + char *a0 = va_arg(args, char *); \ + char *a1 = va_arg(args, char *); \ + char *a2 = va_arg(args, char *); \ + char *a3 = va_arg(args, char *); \ + fprintf (file, msg, a0, a1, a2, a3); \ + } +#endif + +#define PRINTF_PROTO_1(ARGS) PRINTF_PROTO(ARGS, 1, 2) +#define PRINTF_PROTO_2(ARGS) PRINTF_PROTO(ARGS, 2, 3) +#define PRINTF_PROTO_3(ARGS) PRINTF_PROTO(ARGS, 3, 4) + +#if HAVE_UNISTD_H +# include <unistd.h> +#endif + /* VMS-specific definitions */ #ifdef VMS -#include <time.h> #include <descrip.h> #define O_RDONLY 0 /* Open arg for Read/Only */ #define O_WRONLY 1 /* Open arg for Write/Only */ @@ -112,9 +253,6 @@ typedef struct { unsigned :16, :16, :16; } vms_ino_t; #define BSTRING /* VMS/GCC supplies the bstring routines */ #endif /* __GNUC__ */ #endif /* VMS */ - -extern char *index (); -extern char *rindex (); #ifndef O_RDONLY #define O_RDONLY 0 @@ -169,18 +307,9 @@ extern char *rindex (); #define INCLUDE_LEN_FUDGE 0 #endif -/* Forward declarations. */ - -char *xmalloc (); -void error (); -void warning (); - /* External declarations. */ -extern char *getenv (); -extern FILE *fdopen (); extern char *version_string; -extern struct tm *localtime (); #ifndef VMS #ifndef HAVE_STRERROR extern int sys_nerr; @@ -195,137 +324,12 @@ char *strerror (); #else /* VMS */ char *strerror (int,...); #endif -extern int parse_escape (); -extern HOST_WIDE_INT parse_c_expression (); +int parse_escape PROTO((char **)); +HOST_WIDE_INT parse_c_expression PROTO((char *)); #ifndef errno extern int errno; #endif - -/* Forward declarations. */ - -struct directive; -struct file_buf; -struct arglist; -struct argdata; - -#if defined(USG) || defined(VMS) -#ifndef BSTRING -void bcopy (); -void bzero (); -int bcmp (); -#endif -#endif - -/* These functions are declared to return int instead of void since they - are going to be placed in a table and some old compilers have trouble with - pointers to functions returning void. */ - -static int do_define (); -static int do_line (); -static int do_include (); -static int do_undef (); -static int do_error (); -static int do_pragma (); -static int do_ident (); -static int do_if (); -static int do_xifdef (); -static int do_else (); -static int do_elif (); -static int do_endif (); -static int do_sccs (); -static int do_once (); -static int do_assert (); -static int do_unassert (); -static int do_warning (); - -static void add_import (); -static void append_include_chain (); -static void deps_output (); -static void make_undef (); -static void make_definition (); -static void make_assertion (); -static void path_include (); -static void initialize_builtins (); -static void initialize_char_syntax (); -static void dump_arg_n (); -static void dump_defn_1 (); -static void delete_macro (); -static void trigraph_pcp (); -static void rescan (); -static void finclude (); -static void validate_else (); -static int comp_def_part (); -static void error_from_errno (); -static void error_with_line (); -void pedwarn (); -void pedwarn_with_line (); -static void pedwarn_with_file_and_line (); -static void fatal (); -void fancy_abort (); -static void pfatal_with_name (); -static void perror_with_name (); -static void pipe_closed (); -static void print_containing_files (); -static int lookup_import (); -static int redundant_include_p (); -static is_system_include (); -static struct file_name_map *read_name_map (); -static char *read_filename_string (); -static int open_include_file (); -static int check_preconditions (); -static void pcfinclude (); -static void pcstring_used (); -static void write_output (); -static int check_macro_name (); -static int compare_defs (); -static int compare_token_lists (); -static HOST_WIDE_INT eval_if_expression (); -static int discard_comments (); -static int change_newlines (); -static int line_for_error (); -static int hashf (); -static int file_size_and_mode (); - -static struct arglist *read_token_list (); -static void free_token_list (); - -static struct hashnode *install (); -struct hashnode *lookup (); - -static struct assertion_hashnode *assertion_install (); -static struct assertion_hashnode *assertion_lookup (); - -static char *xrealloc (); -static char *xcalloc (); -static char *savestring (); - -static void delete_assertion (); -static void macroexpand (); -static void dump_all_macros (); -static void conditional_skip (); -static void skip_if_group (); -static void output_line_directive (); - -/* Last arg to output_line_directive. */ -enum file_change_code {same_file, enter_file, leave_file}; - -static int grow_outbuf (); -static int handle_directive (); -static void memory_full (); - -static U_CHAR *macarg1 (); -static char *macarg (); - -static U_CHAR *skip_to_end_of_comment (); -static U_CHAR *skip_quoted_string (); -static U_CHAR *skip_paren_group (); -static char *quote_string (); - -static char *check_precompiled (); -/* static struct macrodef create_definition (); [moved below] */ -static void dump_single_macro (); -static void output_dots (); #ifndef FAILURE_EXIT_CODE #define FAILURE_EXIT_CODE 33 /* gnu cc command understands this */ @@ -673,9 +677,6 @@ struct macrodef U_CHAR *symnam; int symlen; }; - -static struct macrodef create_definition (); - enum sharp_token_type { NO_SHARP_TOKEN, /* token not present */ @@ -923,9 +924,11 @@ static int assertions_flag; /* `struct directive' defines one #-directive, including how to handle it. */ +#define DO_PROTO PROTO((U_CHAR *, U_CHAR *, FILE_BUF *, struct directive *)) + struct directive { int length; /* Length of name */ - int (*func)(); /* Function to handle directive */ + int (*func) DO_PROTO; /* Function to handle directive */ char *name; /* Name of directive */ enum node_type type; /* Code which describes which directive. */ char angle_brackets; /* Nonzero => <...> is special. */ @@ -933,6 +936,29 @@ struct directive { char pass_thru; /* Copy preprocessed directive to output file. */ }; +/* These functions are declared to return int instead of void since they + are going to be placed in the table and some old compilers have trouble with + pointers to functions returning void. */ + +static int do_assert DO_PROTO; +static int do_define DO_PROTO; +static int do_elif DO_PROTO; +static int do_else DO_PROTO; +static int do_endif DO_PROTO; +static int do_error DO_PROTO; +static int do_ident DO_PROTO; +static int do_if DO_PROTO; +static int do_include DO_PROTO; +static int do_line DO_PROTO; +static int do_pragma DO_PROTO; +#ifdef SCCS_DIRECTIVE +static int do_sccs DO_PROTO; +#endif +static int do_unassert DO_PROTO; +static int do_undef DO_PROTO; +static int do_warning DO_PROTO; +static int do_xifdef DO_PROTO; + /* Here is the actual list of #-directives, most-often-used first. */ static struct directive directive_table[] = { @@ -995,9 +1021,6 @@ static int dollars_in_ident; #define DOLLARS_IN_IDENTIFIERS 1 #endif -static FILE_BUF expand_to_temp_buffer (); - -static DEFINITION *collect_expansion (); /* Stack of conditionals currently in progress (including both successful and failing conditionals). */ @@ -1031,6 +1054,152 @@ static int deps_column; so don't look for #include "foo" the source-file directory. */ static int ignore_srcdir; +static int safe_read PROTO((int, char *, int)); +static void safe_write PROTO((int, char *, int)); + +int main PROTO((int, char **)); + +static void path_include PROTO((char *)); + +static U_CHAR *index0 PROTO((U_CHAR *, int, size_t)); + +static void trigraph_pcp PROTO((FILE_BUF *)); + +static void newline_fix PROTO((U_CHAR *)); +static void name_newline_fix PROTO((U_CHAR *)); + +static char *get_lintcmd PROTO((U_CHAR *, U_CHAR *, U_CHAR **, int *, int *)); + +static void rescan PROTO((FILE_BUF *, int)); + +static FILE_BUF expand_to_temp_buffer PROTO((U_CHAR *, U_CHAR *, int, int)); + +static int handle_directive PROTO((FILE_BUF *, FILE_BUF *)); + +static struct tm *timestamp PROTO((void)); +static void special_symbol PROTO((HASHNODE *, FILE_BUF *)); + +static int redundant_include_p PROTO((char *)); +static is_system_include PROTO((char *)); + +static char *read_filename_string PROTO((int, FILE *)); +static struct file_name_map *read_name_map PROTO((char *)); +static int open_include_file PROTO((char *, struct file_name_list *)); + +static void finclude PROTO((int, char *, FILE_BUF *, int, struct file_name_list *)); +static void record_control_macro PROTO((char *, U_CHAR *)); + +static int import_hash PROTO((char *)); +static int lookup_import PROTO((char *, struct file_name_list *)); +static void add_import PROTO((int, char *)); + +static char *check_precompiled PROTO((int, char *, char **)); +static int check_preconditions PROTO((char *)); +static void pcfinclude PROTO((U_CHAR *, U_CHAR *, U_CHAR *, FILE_BUF *)); +static void pcstring_used PROTO((HASHNODE *)); +static void write_output PROTO((void)); +static void pass_thru_directive PROTO((U_CHAR *, U_CHAR *, FILE_BUF *, struct directive *)); + +static MACRODEF create_definition PROTO((U_CHAR *, U_CHAR *, FILE_BUF *)); + +static int check_macro_name PROTO((U_CHAR *, char *)); +static int compare_defs PROTO((DEFINITION *, DEFINITION *)); +static int comp_def_part PROTO((int, U_CHAR *, int, U_CHAR *, int, int)); + +static DEFINITION *collect_expansion PROTO((U_CHAR *, U_CHAR *, int, struct arglist *)); + +int check_assertion PROTO((U_CHAR *, int, int, struct arglist *)); +static int compare_token_lists PROTO((struct arglist *, struct arglist *)); + +static struct arglist *read_token_list PROTO((U_CHAR **, U_CHAR *, int *)); +static void free_token_list PROTO((struct arglist *)); + +static ASSERTION_HASHNODE *assertion_install PROTO((U_CHAR *, int, int)); +static ASSERTION_HASHNODE *assertion_lookup PROTO((U_CHAR *, int, int)); +static void delete_assertion PROTO((ASSERTION_HASHNODE *)); + +static void do_once PROTO((void)); + +static HOST_WIDE_INT eval_if_expression PROTO((U_CHAR *, int)); +static void conditional_skip PROTO((FILE_BUF *, int, enum node_type, U_CHAR *, FILE_BUF *)); +static void skip_if_group PROTO((FILE_BUF *, int, FILE_BUF *)); +static void validate_else PROTO((U_CHAR *)); + +static U_CHAR *skip_to_end_of_comment PROTO((FILE_BUF *, int *, int)); +static U_CHAR *skip_quoted_string PROTO((U_CHAR *, U_CHAR *, int, int *, int *, int *)); +static char *quote_string PROTO((char *, char *)); +static U_CHAR *skip_paren_group PROTO((FILE_BUF *)); + +/* Last arg to output_line_directive. */ +enum file_change_code {same_file, enter_file, leave_file}; +static void output_line_directive PROTO((FILE_BUF *, FILE_BUF *, int, enum file_change_code)); + +static void macroexpand PROTO((HASHNODE *, FILE_BUF *)); + +struct argdata; +static char *macarg PROTO((struct argdata *, int)); + +static U_CHAR *macarg1 PROTO((U_CHAR *, U_CHAR *, int *, int *, int *, int)); + +static int discard_comments PROTO((U_CHAR *, int, int)); + +static int change_newlines PROTO((U_CHAR *, int)); + +char *my_strerror PROTO((int)); +void error PRINTF_PROTO_1((char *, ...)); +static void verror PROTO((char *, va_list)); +static void error_from_errno PROTO((char *)); +void warning PRINTF_PROTO_1((char *, ...)); +static void vwarning PROTO((char *, va_list)); +static void error_with_line PRINTF_PROTO_2((int, char *, ...)); +static void verror_with_line PROTO((int, char *, va_list)); +static void vwarning_with_line PROTO((int, char *, va_list)); +void pedwarn PRINTF_PROTO_1((char *, ...)); +void pedwarn_with_line PRINTF_PROTO_2((int, char *, ...)); +static void pedwarn_with_file_and_line PRINTF_PROTO_3((char *, int, char *, ...)); + +static void print_containing_files PROTO((void)); + +static int line_for_error PROTO((int)); +static int grow_outbuf PROTO((FILE_BUF *, int)); + +static HASHNODE *install PROTO((U_CHAR *, int, enum node_type, char *, int)); +HASHNODE *lookup PROTO((U_CHAR *, int, int)); +static void delete_macro PROTO((HASHNODE *)); +static int hashf PROTO((U_CHAR *, int, int)); + +static void dump_single_macro PROTO((HASHNODE *, FILE *)); +static void dump_all_macros PROTO((void)); +static void dump_defn_1 PROTO((U_CHAR *, int, int, FILE *)); +static void dump_arg_n PROTO((DEFINITION *, int, FILE *)); + +static void initialize_char_syntax PROTO((void)); +static void initialize_builtins PROTO((FILE_BUF *, FILE_BUF *)); + +static void make_definition PROTO((char *, FILE_BUF *)); +static void make_undef PROTO((char *, FILE_BUF *)); + +static void make_assertion PROTO((char *, char *)); + +static void append_include_chain PROTO((struct file_name_list *, struct file_name_list *)); + +static void deps_output PROTO((char *, int)); + +static void fatal PRINTF_PROTO_1((char *, ...)) __attribute__ ((noreturn)); +void fancy_abort PROTO((void)) __attribute__ ((noreturn)); +static void perror_with_name PROTO((char *)); +static void pfatal_with_name PROTO((char *)) __attribute__ ((noreturn)); +static void pipe_closed PROTO((int)) __attribute__ ((noreturn)); + +static void memory_full PROTO((void)) __attribute__ ((noreturn)); +GENERIC_PTR xmalloc PROTO((size_t)); +static GENERIC_PTR xrealloc PROTO((GENERIC_PTR, size_t)); +static GENERIC_PTR xcalloc PROTO((size_t, size_t)); +static char *savestring PROTO((char *)); + +static int file_size_and_mode PROTO((int, int *, long int *)); +static void output_dots PROTO((FILE *, int)); + /* Read LEN bytes at PTR from descriptor DESC, for file FILENAME, retrying if necessary. Return a negative value if an error occurs, otherwise return the actual number of bytes read, @@ -1093,7 +1262,7 @@ main (argc, argv) int st_mode; long st_size; char *in_fname; - char *p; + char *cp; int f, i; FILE_BUF *fp; char **pend_files = (char **) xmalloc (argc * sizeof (char *)); @@ -1143,18 +1312,19 @@ main (argc, argv) signal (SIGPIPE, pipe_closed); #endif - p = argv[0] + strlen (argv[0]); - while (p != argv[0] && p[-1] != '/' + cp = argv[0] + strlen (argv[0]); + while (cp != argv[0] && cp[-1] != '/' #ifdef DIR_SEPARATOR - && p[-1] != DIR_SEPARATOR + && cp[-1] != DIR_SEPARATOR #endif ) - --p; - progname = p; + --cp; + progname = cp; #ifdef VMS { /* Remove directories from PROGNAME. */ + char *p; char *s = progname; if ((p = rindex (s, ':')) != 0) s = p + 1; /* skip device */ @@ -1238,7 +1408,7 @@ main (argc, argv) dirtmp->next = 0; dirtmp->control_macro = 0; dirtmp->c_system_include_path = 1; - dirtmp->fname = (char *) xmalloc (strlen (argv[i+1]) + 1); + dirtmp->fname = xmalloc (strlen (argv[i+1]) + 1); strcpy (dirtmp->fname, argv[++i]); dirtmp->got_name_map = 0; @@ -1271,8 +1441,7 @@ main (argc, argv) if (i + 1 == argc) fatal ("Directory name missing after `-iwithprefix' option"); - dirtmp->fname = (char *) xmalloc (strlen (argv[i+1]) - + strlen (prefix) + 1); + dirtmp->fname = xmalloc (strlen (argv[i+1]) + strlen (prefix) + 1); strcpy (dirtmp->fname, prefix); strcat (dirtmp->fname, argv[++i]); dirtmp->got_name_map = 0; @@ -1306,8 +1475,7 @@ main (argc, argv) if (i + 1 == argc) fatal ("Directory name missing after `-iwithprefixbefore' option"); - dirtmp->fname = (char *) xmalloc (strlen (argv[i+1]) - + strlen (prefix) + 1); + dirtmp->fname = xmalloc (strlen (argv[i+1]) + strlen (prefix) + 1); strcpy (dirtmp->fname, prefix); strcat (dirtmp->fname, argv[++i]); dirtmp->got_name_map = 0; @@ -1361,7 +1529,7 @@ main (argc, argv) pcp_outfile = ((pcp_fname[0] != '-' || pcp_fname[1] != '\0') ? fopen (pcp_fname, "w") - : fdopen (dup (fileno (stdout)), "w")); + : stdout); if (pcp_outfile == 0) pfatal_with_name (pcp_fname); no_precomp = 1; @@ -1481,7 +1649,7 @@ main (argc, argv) { char *p = argv[i] + 2; char c; - while (c = *p++) { + while ((c = *p++)) { /* Arg to -d specifies what parts of macros to dump */ switch (c) { case 'M': @@ -1643,9 +1811,9 @@ main (argc, argv) /* Some people say that CPATH should replace the standard include dirs, but that seems pointless: it comes before them, so it overrides them anyway. */ - p = (char *) getenv ("CPATH"); - if (p != 0 && ! no_standard_includes) - path_include (p); + cp = getenv ("CPATH"); + if (cp && ! no_standard_includes) + path_include (cp); /* Now that dollars_in_ident is known, initialize is_idchar. */ initialize_char_syntax (); @@ -1860,7 +2028,7 @@ main (argc, argv) struct file_name_list *new = (struct file_name_list *) xmalloc (sizeof (struct file_name_list)); int this_len = strlen (specd_prefix) + strlen (p->fname) - default_len; - char *str = (char *) xmalloc (this_len + 1); + char *str = xmalloc (this_len + 1); strcpy (str, specd_prefix); strcat (str, p->fname + default_len); new->fname = str; @@ -1964,7 +2132,7 @@ main (argc, argv) while (*s != 0 && *s != ' ') s++; if (*s != 0) { deps_target = s + 1; - output_file = (char *) xmalloc (s - spec + 1); + output_file = xmalloc (s - spec + 1); bcopy (spec, output_file, s - spec); output_file[s - spec] = 0; } @@ -1981,7 +2149,7 @@ main (argc, argv) as the target of this Make-rule. */ if (print_deps) { deps_allocated_size = 200; - deps_buffer = (char *) xmalloc (deps_allocated_size); + deps_buffer = xmalloc (deps_allocated_size); deps_buffer[0] = 0; deps_size = 0; deps_column = 0; @@ -2062,7 +2230,7 @@ main (argc, argv) size = 0; fp->buf = (U_CHAR *) xmalloc (bsize + 2); for (;;) { - cnt = safe_read (f, fp->buf + size, bsize - size); + cnt = safe_read (f, (char *) fp->buf + size, bsize - size); if (cnt < 0) goto perror; /* error! */ size += cnt; if (size != bsize) break; /* End of file */ @@ -2074,7 +2242,7 @@ main (argc, argv) /* Read a file whose size we can determine in advance. For the sake of VMS, st_size is just an upper bound. */ fp->buf = (U_CHAR *) xmalloc (st_size + 2); - fp->length = safe_read (f, fp->buf, st_size); + fp->length = safe_read (f, (char *) fp->buf, st_size); if (fp->length < 0) goto perror; } fp->bufp = fp->buf; @@ -2188,12 +2356,12 @@ path_include (path) while (*q != 0 && *q != PATH_SEPARATOR) q++; if (p == q) { /* An empty name in the path stands for the current directory. */ - name = (char *) xmalloc (2); + name = xmalloc (2); name[0] = '.'; name[1] = 0; } else { /* Otherwise use the directory that is named. */ - name = (char *) xmalloc (q - p + 1); + name = xmalloc (q - p + 1); bcopy (p, name, q - p); name[q - p] = 0; } @@ -2226,18 +2394,19 @@ static U_CHAR * index0 (s, c, n) U_CHAR *s; int c; - int n; + size_t n; { + char *p = (char *) s; for (;;) { - char *q = index (s, c); + char *q = index (p, c); if (q) return (U_CHAR *) q; else { - int l = strlen (s); + size_t l = strlen (p); if (l == n) return 0; l++; - s += l; + p += l; n -= l; } } @@ -2261,7 +2430,7 @@ trigraph_pcp (buf) fptr = bptr = sptr = buf->buf; lptr = fptr + buf->length; - while ((sptr = (U_CHAR *) index0 (sptr, '?', lptr - sptr)) != NULL) { + while ((sptr = index0 (sptr, '?', (size_t) (lptr - sptr))) != NULL) { if (*++sptr != '?') continue; switch (*++sptr) { @@ -2417,19 +2586,19 @@ get_lintcmd (ibp, limit, argstart, arglen, cmdlen) linsize = limit - ibp; /* Oh, I wish C had lexical functions... hell, I'll just open-code the set */ - if ((linsize >= 10) && !strncmp (ibp, "NOTREACHED", 10)) { + if ((linsize >= 10) && !bcmp (ibp, "NOTREACHED", 10)) { *cmdlen = 10; return "NOTREACHED"; } - if ((linsize >= 8) && !strncmp (ibp, "ARGSUSED", 8)) { + if ((linsize >= 8) && !bcmp (ibp, "ARGSUSED", 8)) { *cmdlen = 8; return "ARGSUSED"; } - if ((linsize >= 11) && !strncmp (ibp, "LINTLIBRARY", 11)) { + if ((linsize >= 11) && !bcmp (ibp, "LINTLIBRARY", 11)) { *cmdlen = 11; return "LINTLIBRARY"; } - if ((linsize >= 7) && !strncmp (ibp, "VARARGS", 7)) { + if ((linsize >= 7) && !bcmp (ibp, "VARARGS", 7)) { *cmdlen = 7; ibp += 7; linsize -= 7; if ((linsize == 0) || ! isdigit (*ibp)) return "VARARGS"; @@ -3151,7 +3320,6 @@ randomchar: backed over. OBP-IDENT_LENGTH points to the identifier. */ if (!pcp_outfile || pcp_inside_if) { -startagain: for (hp = hashtab[MAKE_POS (hash) % HASHSIZE]; hp != NULL; hp = hp->next) { @@ -3367,7 +3535,7 @@ hashcollision: ending: if (if_stack != ip->if_stack) { - char *str = "unknown"; + char *str; switch (if_stack->type) { @@ -3386,6 +3554,8 @@ hashcollision: case T_ELIF: str = "elif"; break; + default: + abort (); } error_with_line (line_for_error (if_stack->lineno), @@ -3589,7 +3759,7 @@ handle_directive (ip, op) * routine, after moving the input pointer up to the next line. */ for (kt = directive_table; kt->length > 0; kt++) { - if (kt->length == ident_length && !strncmp (kt->name, ident, ident_length)) { + if (kt->length == ident_length && !bcmp (kt->name, ident, ident_length)) { register U_CHAR *buf; register U_CHAR *limit; int unterminated; @@ -3607,7 +3777,8 @@ handle_directive (ip, op) already_output = 0; keep_comments = traditional && kt->traditional_comments; /* #import is defined only in Objective C, or when on the NeXT. */ - if (kt->type == T_IMPORT && !(objc || lookup ("__NeXT__", -1, -1))) + if (kt->type == T_IMPORT + && !(objc || lookup ((U_CHAR *) "__NeXT__", -1, -1))) break; /* Find the end of this directive (first newline not backslashed @@ -4025,7 +4196,7 @@ special_symbol (hp, op) if (!is_idstart[*ip->bufp]) goto oops; - if (hp = lookup (ip->bufp, -1, -1)) { + if ((hp = lookup (ip->bufp, -1, -1))) { if (pcp_outfile && pcp_inside_if && (hp->type == T_CONST || (hp->type == T_MACRO && hp->value.defn->predefined))) @@ -4300,7 +4471,7 @@ get_filename: /* Allocate this permanently, because it gets stored in the definitions of macros. */ - fname = (char *) xmalloc (max_include_len + flen + 4); + fname = xmalloc (max_include_len + flen + 4); /* + 2 above for slash and terminating null. */ /* + 2 added for '.h' on VMS (to support '#include filename') */ @@ -4311,7 +4482,7 @@ get_filename: || *fbeg == DIR_SEPARATOR #endif ) { - strncpy (fname, fbeg, flen); + strncpy (fname, (char *) fbeg, flen); fname[flen] = 0; if (redundant_include_p (fname)) return 0; @@ -4338,7 +4509,7 @@ get_filename: } else { fname[0] = 0; } - strncat (fname, fbeg, flen); + strncat (fname, (char *) fbeg, flen); #ifdef VMS /* Change this 1/2 Unix 1/2 VMS file specification into a full VMS file specification */ @@ -4378,7 +4549,7 @@ get_filename: if (f < 0) { /* A file that was not found. */ - strncpy (fname, fbeg, flen); + strncpy (fname, (char *) fbeg, flen); fname[flen] = 0; /* If generating dependencies and -MG was specified, we assume missing files are leaf files, living in the same directory as the source file @@ -4516,7 +4687,8 @@ get_filename: if (pcfbuf) { pcfname = xmalloc (strlen (pcftry) + 1); strcpy (pcfname, pcftry); - pcfinclude (pcfbuf, pcfbuflimit, fname, op); + pcfinclude ((U_CHAR *) pcfbuf, (U_CHAR *) pcfbuflimit, + (U_CHAR *) fname, op); } else finclude (f, fname, op, is_system_include (fname), searchptr); @@ -4842,7 +5014,7 @@ finclude (f, fname, op, system_header_p, dirptr) /* Read the file contents, knowing that st_size is an upper bound on the number of bytes we can read. */ - fp->length = safe_read (f, fp->buf, st_size); + fp->length = safe_read (f, (char *) fp->buf, st_size); if (fp->length < 0) goto nope; } else if (S_ISDIR (st_mode)) { @@ -4860,7 +5032,7 @@ finclude (f, fname, op, system_header_p, dirptr) fp->buf = (U_CHAR *) xmalloc (bsize + 2); for (;;) { - i = safe_read (f, fp->buf + st_size, bsize - st_size); + i = safe_read (f, (char *) fp->buf + st_size, bsize - st_size); if (i < 0) goto nope; /* error! */ st_size += i; @@ -5026,7 +5198,7 @@ add_import (fd, fname) hashval = import_hash (fname); fstat (fd, &sb); i = (struct import_file *)xmalloc (sizeof (struct import_file)); - i->name = (char *)xmalloc (strlen (fname)+1); + i->name = xmalloc (strlen (fname)+1); strcpy (i->name, fname); bcopy ((char *) &sb.st_ino, (char *) &i->inode, sizeof (sb.st_ino)); i->dev = sb.st_dev; @@ -5109,7 +5281,7 @@ check_preconditions (prec) char *lineend; while (*prec) { - lineend = (char *) index (prec, '\n'); + lineend = index (prec, '\n'); if (*prec++ != '#') { error ("Bad format encountered while reading precompiled file"); @@ -5119,7 +5291,7 @@ check_preconditions (prec) HASHNODE *hp; prec += 6; - mdef = create_definition (prec, lineend, NULL_PTR); + mdef = create_definition ((U_CHAR *) prec, (U_CHAR *) lineend, NULL_PTR); if (mdef.defn == 0) abort (); @@ -5144,7 +5316,7 @@ check_preconditions (prec) prec++; len = prec - name; - if (lookup (name, len, -1)) + if (lookup ((U_CHAR *) name, len, -1)) return 0; } else { error ("Bad format encountered while reading precompiled file"); @@ -5196,7 +5368,7 @@ pcfinclude (buf, limit, name, op) cp += 4 - ((HOST_WIDE_INT) cp & 3); /* Now get the string. */ - str = (STRINGDEF *) cp; + str = (STRINGDEF *) (GENERIC_PTR) cp; string_start = cp += sizeof (STRINGDEF); for (; *cp; cp++) /* skip the string */ @@ -5231,7 +5403,7 @@ pcfinclude (buf, limit, name, op) else /* Otherwise, for each key, */ for (; nkeys--; free (tmpbuf.buf), cp = endofthiskey + 1) { - KEYDEF *kp = (KEYDEF *) cp; + KEYDEF *kp = (KEYDEF *) (GENERIC_PTR) cp; HASHNODE *hp; /* It starts with a KEYDEF structure */ @@ -5239,7 +5411,7 @@ pcfinclude (buf, limit, name, op) /* Find the end of the key. At the end of this for loop we advance CP to the start of the next key using this variable. */ - endofthiskey = cp + strlen (cp); + endofthiskey = cp + strlen ((char *) cp); kp->str = str; /* Expand the key, and enter it into the hash table. */ @@ -5308,16 +5480,17 @@ write_output () if (next_string && cur_buf_loc - outbuf.buf == next_string->output_mark) { if (next_string->writeflag) { - len = 4 * strlen (next_string->filename) + 32; + len = 4 * strlen ((char *) next_string->filename) + 32; while (len > line_directive_len) line_directive = xrealloc (line_directive, line_directive_len *= 2); sprintf (line_directive, "\n# %d ", next_string->lineno); strcpy (quote_string (line_directive + strlen (line_directive), - next_string->filename), + (char *) next_string->filename), "\n"); safe_write (fileno (stdout), line_directive, strlen (line_directive)); - safe_write (fileno (stdout), next_string->contents, next_string->len); + safe_write (fileno (stdout), + (char *) next_string->contents, next_string->len); } next_string = next_string->chain; } @@ -5327,7 +5500,7 @@ write_output () - (cur_buf_loc - outbuf.buf)) : outbuf.bufp - cur_buf_loc); - safe_write (fileno (stdout), cur_buf_loc, len); + safe_write (fileno (stdout), (char *) cur_buf_loc, len); cur_buf_loc += len; } } @@ -5444,7 +5617,7 @@ create_definition (buf, limit, op) bp++; /* do we have a "special" rest-args extension here? */ if (limit - bp > REST_EXTENSION_LENGTH && - strncmp (rest_extension, bp, REST_EXTENSION_LENGTH) == 0) { + bcmp (rest_extension, bp, REST_EXTENSION_LENGTH) == 0) { rest_args = 1; temp->rest_args = 1; break; @@ -5477,13 +5650,9 @@ create_definition (buf, limit, op) for (otemp = temp->next; otemp != NULL; otemp = otemp->next) if (temp->length == otemp->length && - strncmp (temp->name, otemp->name, temp->length) == 0) { - U_CHAR *name; - - name = (U_CHAR *) alloca (temp->length + 1); - (void) strncpy (name, temp->name, temp->length); - name[temp->length] = '\0'; - error ("duplicate argument name `%s' in `#define'", name); + bcmp (temp->name, otemp->name, temp->length) == 0) { + error ("duplicate argument name `%.*s' in `#define'", + temp->length, temp->name); goto nope; } } @@ -5598,18 +5767,12 @@ do_define (buf, limit, op, keyword) ok = ! done_initializing; /* Print the warning if it's not ok. */ if (!ok) { - U_CHAR *msg; /* what pain... */ - /* If we are passing through #define and #undef directives, do that for this re-definition now. */ if (debug_output && op) pass_thru_directive (buf, limit, op, keyword); - msg = (U_CHAR *) alloca (mdef.symlen + 22); - *msg = '`'; - bcopy ((char *) mdef.symnam, (char *) (msg + 1), mdef.symlen); - strcpy ((char *) (msg + mdef.symlen + 1), "' redefined"); - pedwarn (msg); + pedwarn ("`%.*s' redefined", mdef.symlen, mdef.symnam); if (hp->type == T_MACRO) pedwarn_with_file_and_line (hp->value.defn->file, hp->value.defn->line, "this is the location of the previous definition"); @@ -5650,16 +5813,9 @@ check_macro_name (symname, usage) sym_length = p - symname; if (sym_length == 0) error ("invalid %s name", usage); - else if (!is_idstart[*symname]) { - U_CHAR *msg; /* what pain... */ - msg = (U_CHAR *) alloca (sym_length + 1); - bcopy ((char *) symname, (char *) msg, sym_length); - msg[sym_length] = 0; - error ("invalid %s name `%s'", usage, msg); - } else { - if (! strncmp (symname, "defined", 7) && sym_length == 7) - error ("invalid %s name `defined'", usage); - } + else if (!is_idstart[*symname] + || (sym_length == 7 && ! bcmp (symname, "defined", 7))) + error ("invalid %s name `%.*s'", usage, sym_length, symname); return sym_length; } @@ -5681,7 +5837,7 @@ compare_defs (d1, d2) return 1; for (a1 = d1->pattern, a2 = d2->pattern; a1 && a2; a1 = a1->next, a2 = a2->next) { - if (!((a1->nchars == a2->nchars && ! strncmp (p1, p2, a1->nchars)) + if (!((a1->nchars == a2->nchars && ! bcmp (p1, p2, a1->nchars)) || ! comp_def_part (first, p1, a1->nchars, p2, a2->nchars, 0)) || a1->argno != a2->argno || a1->stringify != a2->stringify @@ -5968,7 +6124,7 @@ collect_expansion (buf, end, nargs, arglist) if (arg->name[0] == c && arg->length == id_len - && strncmp (arg->name, id_beg, id_len) == 0) { + && bcmp (arg->name, id_beg, id_len) == 0) { if (expected_delimiter && warn_stringify) { if (traditional) { warning ("macro argument `%.*s' is stringified.", @@ -6116,7 +6272,7 @@ do_assert (buf, limit, op, keyword) hp = assertion_lookup (symname, sym_length, hashcode); if (hp == NULL) { - if (sym_length == 7 && ! strncmp (symname, "defined", sym_length)) + if (sym_length == 7 && ! bcmp (symname, "defined", 7)) error ("`defined' redefined as assertion"); hp = assertion_install (symname, sym_length, hashcode); } @@ -6280,7 +6436,7 @@ compare_token_lists (l1, l2) while (l1 && l2) { if (l1->length != l2->length) return 0; - if (strncmp (l1->name, l2->name, l1->length)) + if (bcmp (l1->name, l2->name, l1->length)) return 0; l1 = l1->next; l2 = l2->next; @@ -6432,7 +6588,7 @@ assertion_lookup (name, len, hash) bucket = assertion_hashtab[hash]; while (bucket) { - if (bucket->length == len && strncmp (bucket->name, name, len) == 0) + if (bucket->length == len && bcmp (bucket->name, name, len) == 0) return bucket; bucket = bucket->next; } @@ -6490,7 +6646,7 @@ do_line (buf, limit, op, keyword) /* The Newline at the end of this line remains to be processed. To put the next line at the specified line number, we must store a line number now that is one less. */ - new_lineno = atoi (bp) - 1; + new_lineno = atoi ((char *) bp) - 1; /* NEW_LINENO is one less than the actual line number here. */ if (pedantic && new_lineno < 0) @@ -6584,7 +6740,7 @@ do_line (buf, limit, op, keyword) &fname_table[hashf (fname, fname_length, FNAME_HASHSIZE)]; for (hp = *hash_bucket; hp != NULL; hp = hp->next) if (hp->length == fname_length && - strncmp (hp->value.cpval, fname, fname_length) == 0) { + bcmp (hp->value.cpval, fname, fname_length) == 0) { ip->nominal_fname = hp->value.cpval; break; } @@ -6696,7 +6852,7 @@ do_warning (buf, limit, op, keyword) /* Remember the name of the current file being read from so that we can avoid ever including it again. */ -static int +static void do_once () { int i; @@ -6719,18 +6875,18 @@ do_once () new->got_name_map = 0; new->c_system_include_path = 0; } - return 0; } /* #ident has already been copied to the output file, so just ignore it. */ static int -do_ident (buf, limit) +do_ident (buf, limit, op, keyword) U_CHAR *buf, *limit; + FILE_BUF *op; + struct directive *keyword; { FILE_BUF trybuf; int len; - FILE_BUF *op = &outbuf; /* Allow #ident in system headers, since that's not user's fault. */ if (pedantic && !instack[indepth].system_header_p) @@ -6760,11 +6916,13 @@ do_ident (buf, limit) Just check for some recognized pragmas that need validation here. */ static int -do_pragma (buf, limit) +do_pragma (buf, limit, op, keyword) U_CHAR *buf, *limit; + FILE_BUF *op; + struct directive *keyword; { SKIP_WHITE_SPACE (buf); - if (!strncmp (buf, "once", 4)) { + if (!strncmp ((char *) buf, "once", 4)) { /* Allow #pragma once in system headers, since that's not the user's fault. */ if (!instack[indepth].system_header_p) @@ -6772,7 +6930,7 @@ do_pragma (buf, limit) do_once (); } - if (!strncmp (buf, "implementation", 14)) { + if (!strncmp ((char *) buf, "implementation", 14)) { /* Be quiet about `#pragma implementation' for a file only if it hasn't been included yet. */ struct file_name_list *ptr; @@ -6782,13 +6940,13 @@ do_pragma (buf, limit) return 0; fname = p + 1; - if (p = (U_CHAR *) index (fname, '\"')) + if ((p = (U_CHAR *) index ((char *) fname, '\"'))) *p = '\0'; for (ptr = all_include_files; ptr; ptr = ptr->next) { inc_fname = (U_CHAR *) rindex (ptr->fname, '/'); inc_fname = inc_fname ? inc_fname + 1 : (U_CHAR *) ptr->fname; - if (inc_fname && !strcmp (inc_fname, fname)) + if (inc_fname && !strcmp ((char *) inc_fname, (char *) fname)) warning ("`#pragma implementation' for `%s' appears after file is included", fname); } @@ -6824,15 +6982,22 @@ nope: } #endif +#ifdef SCCS_DIRECTIVE + /* Just ignore #sccs, on systems where we define it at all. */ static int -do_sccs () +do_sccs (buf, limit, op, keyword) + U_CHAR *buf, *limit; + FILE_BUF *op; + struct directive *keyword; { if (pedantic) pedwarn ("ANSI C does not allow `#sccs'"); return 0; } + +#endif /* defined (SCCS_DIRECTIVE) */ /* * handle #if directive by @@ -6917,13 +7082,14 @@ eval_if_expression (buf, length) HASHNODE *save_defined; HOST_WIDE_INT value; - save_defined = install ("defined", -1, T_SPEC_DEFINED, NULL_PTR, -1); + save_defined = install ((U_CHAR *) "defined", -1, T_SPEC_DEFINED, + NULL_PTR, -1); pcp_inside_if = 1; temp_obuf = expand_to_temp_buffer (buf, buf + length, 0, 1); pcp_inside_if = 0; delete_macro (save_defined); /* clean up special symbol */ - value = parse_c_expression (temp_obuf.buf); + value = parse_c_expression ((char *) temp_obuf.buf); free (temp_obuf.buf); @@ -7261,7 +7427,7 @@ skip_if_group (ip, any, op) for (kt = directive_table; kt->length >= 0; kt++) { IF_STACK_FRAME *temp; if (ident_length == kt->length - && strncmp (cp, kt->name, kt->length) == 0) { + && bcmp (cp, kt->name, kt->length) == 0) { /* If we are asked to return on next directive, do so now. */ if (any) goto done; @@ -7300,6 +7466,9 @@ skip_if_group (ip, any, op) if_stack = if_stack->next; free (temp); break; + + default: + break; } break; } @@ -8690,9 +8859,20 @@ my_strerror (errnum) */ void -error (msg, arg1, arg2, arg3) +error (PRINTF_ALIST (msg)) + PRINTF_DCL (msg) +{ + va_list args; + + VA_START (args, msg); + verror (msg, args); + va_end (args); +} + +static void +verror (msg, args) char *msg; - char *arg1, *arg2, *arg3; + va_list args; { int i; FILE_BUF *ip = NULL; @@ -8707,7 +8887,7 @@ error (msg, arg1, arg2, arg3) if (ip != NULL) fprintf (stderr, "%s:%d: ", ip->nominal_fname, ip->lineno); - fprintf (stderr, msg, arg1, arg2, arg3); + vfprintf (stderr, msg, args); fprintf (stderr, "\n"); errors++; } @@ -8740,9 +8920,20 @@ error_from_errno (name) /* Print error message but don't count it. */ void -warning (msg, arg1, arg2, arg3) +warning (PRINTF_ALIST (msg)) + PRINTF_DCL (msg) +{ + va_list args; + + VA_START (args, msg); + vwarning (msg, args); + va_end (args); +} + +static void +vwarning (msg, args) char *msg; - char *arg1, *arg2, *arg3; + va_list args; { int i; FILE_BUF *ip = NULL; @@ -8764,15 +8955,31 @@ warning (msg, arg1, arg2, arg3) if (ip != NULL) fprintf (stderr, "%s:%d: ", ip->nominal_fname, ip->lineno); fprintf (stderr, "warning: "); - fprintf (stderr, msg, arg1, arg2, arg3); + vfprintf (stderr, msg, args); fprintf (stderr, "\n"); } static void -error_with_line (line, msg, arg1, arg2, arg3) +#if defined (__STDC__) && defined (HAVE_VPRINTF) +error_with_line (int line, PRINTF_ALIST (msg)) +#else +error_with_line (line, PRINTF_ALIST (msg)) + int line; + PRINTF_DCL (msg) +#endif +{ + va_list args; + + VA_START (args, msg); + verror_with_line (line, msg, args); + va_end (args); +} + +static void +verror_with_line (line, msg, args) int line; char *msg; - char *arg1, *arg2, *arg3; + va_list args; { int i; FILE_BUF *ip = NULL; @@ -8787,16 +8994,16 @@ error_with_line (line, msg, arg1, arg2, arg3) if (ip != NULL) fprintf (stderr, "%s:%d: ", ip->nominal_fname, line); - fprintf (stderr, msg, arg1, arg2, arg3); + vfprintf (stderr, msg, args); fprintf (stderr, "\n"); errors++; } static void -warning_with_line (line, msg, arg1, arg2, arg3) +vwarning_with_line (line, msg, args) int line; char *msg; - char *arg1, *arg2, *arg3; + va_list args; { int i; FILE_BUF *ip = NULL; @@ -8818,45 +9025,60 @@ warning_with_line (line, msg, arg1, arg2, arg3) if (ip != NULL) fprintf (stderr, "%s:%d: ", ip->nominal_fname, line); fprintf (stderr, "warning: "); - fprintf (stderr, msg, arg1, arg2, arg3); + vfprintf (stderr, msg, args); fprintf (stderr, "\n"); } /* print an error message and maybe count it. */ void -pedwarn (msg, arg1, arg2, arg3) - char *msg; - char *arg1, *arg2, *arg3; +pedwarn (PRINTF_ALIST (msg)) + PRINTF_DCL (msg) { + va_list args; + + VA_START (args, msg); if (pedantic_errors) - error (msg, arg1, arg2, arg3); + verror (msg, args); else - warning (msg, arg1, arg2, arg3); + vwarning (msg, args); + va_end (args); } void -pedwarn_with_line (line, msg, arg1, arg2, arg3) +#if defined (__STDC__) && defined (HAVE_VPRINTF) +pedwarn_with_line (int line, PRINTF_ALIST (msg)) +#else +pedwarn_with_line (line, PRINTF_ALIST (msg)) int line; - char *msg; - char *arg1, *arg2, *arg3; + PRINTF_DCL (msg) +#endif { + va_list args; + + VA_START (args, msg); if (pedantic_errors) - error_with_line (line, msg, arg1, arg2, arg3); + verror_with_line (line, msg, args); else - warning_with_line (line, msg, arg1, arg2, arg3); + vwarning_with_line (line, msg, args); + va_end (args); } /* Report a warning (or an error if pedantic_errors) giving specified file name and line number, not current. */ static void -pedwarn_with_file_and_line (file, line, msg, arg1, arg2, arg3) +#if defined (__STDC__) && defined (HAVE_VPRINTF) +pedwarn_with_file_and_line (char *file, int line, PRINTF_ALIST (msg)) +#else +pedwarn_with_file_and_line (file, line, PRINTF_ALIST (msg)) char *file; int line; - char *msg; - char *arg1, *arg2, *arg3; + PRINTF_DCL (msg) +#endif { + va_list args; + if (!pedantic_errors && inhibit_warnings) return; if (file != NULL) @@ -8865,7 +9087,9 @@ pedwarn_with_file_and_line (file, line, msg, arg1, arg2, arg3) errors++; if (!pedantic_errors) fprintf (stderr, "warning: "); - fprintf (stderr, msg, arg1, arg2, arg3); + VA_START (args, msg); + vfprintf (stderr, msg, args); + va_end (args); fprintf (stderr, "\n"); } @@ -9068,7 +9292,7 @@ lookup (name, len, hash) bucket = hashtab[hash]; while (bucket) { - if (bucket->length == len && strncmp (bucket->name, name, len) == 0) + if (bucket->length == len && bcmp (bucket->name, name, len) == 0) return bucket; bucket = bucket->next; } @@ -9182,6 +9406,7 @@ dump_single_macro (hp, of) case WHITE_SHARP_TOKEN: fprintf (of, "# "); break; case PERCENT_COLON_TOKEN: fprintf (of, "%%:"); break; case WHITE_PERCENT_COLON_TOKEN: fprintf (of, "%%: "); break; + default: abort (); } } if (ap->raw_before) { @@ -9191,6 +9416,8 @@ dump_single_macro (hp, of) case WHITE_PERCENT_COLON_TOKEN: fprintf (of, " "); break; + default: + break; } } else { switch (ap->raw_before) { @@ -9198,6 +9425,7 @@ dump_single_macro (hp, of) case WHITE_SHARP_TOKEN: fprintf (of, "## "); break; case PERCENT_COLON_TOKEN: fprintf (of, "%%:%%:"); break; case WHITE_PERCENT_COLON_TOKEN: fprintf (of, "%%:%%: "); break; + default: abort (); } } } @@ -9210,6 +9438,7 @@ dump_single_macro (hp, of) case WHITE_SHARP_TOKEN: fprintf (of, " ##"); break; case PERCENT_COLON_TOKEN: fprintf (of, "%%:%%:"); break; case WHITE_PERCENT_COLON_TOKEN: fprintf (of, " %%:%%:"); break; + default: abort (); } concat = 1; } @@ -9282,7 +9511,7 @@ dump_arg_n (defn, argnum, of) { register U_CHAR *p = defn->args.argnames; while (argnum + 1 < defn->nargs) { - p = (U_CHAR *) index (p, ' ') + 1; + p = (U_CHAR *) index ((char *) p, ' ') + 1; argnum++; } @@ -9344,86 +9573,96 @@ initialize_builtins (inp, outp) FILE_BUF *inp; FILE_BUF *outp; { - install ("__LINE__", -1, T_SPECLINE, NULL_PTR, -1); - install ("__DATE__", -1, T_DATE, NULL_PTR, -1); - install ("__FILE__", -1, T_FILE, NULL_PTR, -1); - install ("__BASE_FILE__", -1, T_BASE_FILE, NULL_PTR, -1); - install ("__INCLUDE_LEVEL__", -1, T_INCLUDE_LEVEL, NULL_PTR, -1); - install ("__VERSION__", -1, T_VERSION, NULL_PTR, -1); + install ((U_CHAR *) "__LINE__", -1, T_SPECLINE, NULL_PTR, -1); + install ((U_CHAR *) "__DATE__", -1, T_DATE, NULL_PTR, -1); + install ((U_CHAR *) "__FILE__", -1, T_FILE, NULL_PTR, -1); + install ((U_CHAR *) "__BASE_FILE__", -1, T_BASE_FILE, NULL_PTR, -1); + install ((U_CHAR *) "__INCLUDE_LEVEL__", -1, T_INCLUDE_LEVEL, NULL_PTR, -1); + install ((U_CHAR *) "__VERSION__", -1, T_VERSION, NULL_PTR, -1); #ifndef NO_BUILTIN_SIZE_TYPE - install ("__SIZE_TYPE__", -1, T_SIZE_TYPE, NULL_PTR, -1); + install ((U_CHAR *) "__SIZE_TYPE__", -1, T_SIZE_TYPE, NULL_PTR, -1); #endif #ifndef NO_BUILTIN_PTRDIFF_TYPE - install ("__PTRDIFF_TYPE__ ", -1, T_PTRDIFF_TYPE, NULL_PTR, -1); + install ((U_CHAR *) "__PTRDIFF_TYPE__ ", -1, T_PTRDIFF_TYPE, NULL_PTR, -1); #endif - install ("__WCHAR_TYPE__", -1, T_WCHAR_TYPE, NULL_PTR, -1); - install ("__USER_LABEL_PREFIX__",-1,T_USER_LABEL_PREFIX_TYPE, NULL_PTR, -1); - install ("__REGISTER_PREFIX__", -1, T_REGISTER_PREFIX_TYPE, NULL_PTR, -1); - install ("__TIME__", -1, T_TIME, NULL_PTR, -1); + install ((U_CHAR *) "__WCHAR_TYPE__", -1, T_WCHAR_TYPE, NULL_PTR, -1); + install ((U_CHAR *) "__USER_LABEL_PREFIX__", -1, T_USER_LABEL_PREFIX_TYPE, + NULL_PTR, -1); + install ((U_CHAR *) "__REGISTER_PREFIX__", -1, T_REGISTER_PREFIX_TYPE, + NULL_PTR, -1); + install ((U_CHAR *) "__TIME__", -1, T_TIME, NULL_PTR, -1); if (!traditional) { - install ("__STDC__", -1, T_CONST, "1", -1); - install ("__STDC_VERSION__", -1, T_CONST, "199409L", -1); + install ((U_CHAR *) "__STDC__", -1, T_CONST, "1", -1); + install ((U_CHAR *) "__STDC_VERSION__", -1, T_CONST, "199409L", -1); } if (objc) - install ("__OBJC__", -1, T_CONST, "1", -1); + install ((U_CHAR *) "__OBJC__", -1, T_CONST, "1", -1); /* This is supplied using a -D by the compiler driver so that it is present only when truly compiling with GNU C. */ -/* install ("__GNUC__", -1, T_CONST, "2", -1); */ +/* install ((U_CHAR *) "__GNUC__", -1, T_CONST, "2", -1); */ if (debug_output) { char directive[2048]; + U_CHAR *udirective = (U_CHAR *) directive; register struct directive *dp = &directive_table[0]; struct tm *timebuf = timestamp (); sprintf (directive, " __BASE_FILE__ \"%s\"\n", instack[0].nominal_fname); output_line_directive (inp, outp, 0, same_file); - pass_thru_directive (directive, &directive[strlen (directive)], outp, dp); + pass_thru_directive (udirective, &udirective[strlen (directive)], + outp, dp); sprintf (directive, " __VERSION__ \"%s\"\n", version_string); output_line_directive (inp, outp, 0, same_file); - pass_thru_directive (directive, &directive[strlen (directive)], outp, dp); + pass_thru_directive (udirective, &udirective[strlen (directive)], + outp, dp); #ifndef NO_BUILTIN_SIZE_TYPE sprintf (directive, " __SIZE_TYPE__ %s\n", SIZE_TYPE); output_line_directive (inp, outp, 0, same_file); - pass_thru_directive (directive, &directive[strlen (directive)], outp, dp); + pass_thru_directive (udirective, &udirective[strlen (directive)], + outp, dp); #endif #ifndef NO_BUILTIN_PTRDIFF_TYPE sprintf (directive, " __PTRDIFF_TYPE__ %s\n", PTRDIFF_TYPE); output_line_directive (inp, outp, 0, same_file); - pass_thru_directive (directive, &directive[strlen (directive)], outp, dp); + pass_thru_directive (udirective, &udirective[strlen (directive)], + outp, dp); #endif sprintf (directive, " __WCHAR_TYPE__ %s\n", wchar_type); output_line_directive (inp, outp, 0, same_file); - pass_thru_directive (directive, &directive[strlen (directive)], outp, dp); + pass_thru_directive (udirective, &udirective[strlen (directive)], + outp, dp); sprintf (directive, " __DATE__ \"%s %2d %4d\"\n", monthnames[timebuf->tm_mon], timebuf->tm_mday, timebuf->tm_year + 1900); output_line_directive (inp, outp, 0, same_file); - pass_thru_directive (directive, &directive[strlen (directive)], outp, dp); + pass_thru_directive (udirective, &udirective[strlen (directive)], + outp, dp); sprintf (directive, " __TIME__ \"%02d:%02d:%02d\"\n", timebuf->tm_hour, timebuf->tm_min, timebuf->tm_sec); output_line_directive (inp, outp, 0, same_file); - pass_thru_directive (directive, &directive[strlen (directive)], outp, dp); + pass_thru_directive (udirective, &udirective[strlen (directive)], + outp, dp); if (!traditional) { sprintf (directive, " __STDC__ 1"); output_line_directive (inp, outp, 0, same_file); - pass_thru_directive (directive, &directive[strlen (directive)], + pass_thru_directive (udirective, &udirective[strlen (directive)], outp, dp); } if (objc) { sprintf (directive, " __OBJC__ 1"); output_line_directive (inp, outp, 0, same_file); - pass_thru_directive (directive, &directive[strlen (directive)], + pass_thru_directive (udirective, &udirective[strlen (directive)], outp, dp); } } @@ -9438,15 +9677,14 @@ initialize_builtins (inp, outp) static void make_definition (str, op) - U_CHAR *str; + char *str; FILE_BUF *op; { FILE_BUF *ip; struct directive *kt; U_CHAR *buf, *p; - buf = str; - p = str; + p = buf = (U_CHAR *) str; if (!is_idstart[*p]) { error ("malformed option `-D %s'", str); return; @@ -9457,7 +9695,7 @@ make_definition (str, op) while (is_idchar[*++p] || *p == ',' || is_hor_space[*p]) ; if (*p++ != ')') - p = str; /* Error */ + p = (U_CHAR *) str; /* Error */ } if (*p == 0) { buf = (U_CHAR *) alloca (p - buf + 4); @@ -9470,16 +9708,16 @@ make_definition (str, op) U_CHAR *q; /* Copy the entire option so we can modify it. */ buf = (U_CHAR *) alloca (2 * strlen (str) + 1); - strncpy (buf, str, p - str); + strncpy ((char *) buf, str, p - (U_CHAR *) str); /* Change the = to a space. */ - buf[p - str] = ' '; + buf[p - (U_CHAR *) str] = ' '; /* Scan for any backslash-newline and remove it. */ p++; - q = &buf[p - str]; + q = &buf[p - (U_CHAR *) str]; while (*p) { if (*p == '\"' || *p == '\'') { int unterminated = 0; - U_CHAR *p1 = skip_quoted_string (p, p + strlen (p), 0, + U_CHAR *p1 = skip_quoted_string (p, p + strlen ((char *) p), 0, NULL_PTR, NULL_PTR, &unterminated); if (unterminated) return; @@ -9507,7 +9745,7 @@ make_definition (str, op) ip->nominal_fname = ip->fname = "*Initialization*"; ip->buf = ip->bufp = buf; - ip->length = strlen (buf); + ip->length = strlen ((char *) buf); ip->lineno = 1; ip->macro = 0; ip->free_ptr = 0; @@ -9518,7 +9756,7 @@ make_definition (str, op) ; /* Pass NULL instead of OP, since this is a "predefined" macro. */ - do_define (buf, buf + strlen (buf), NULL_PTR, kt); + do_define (buf, buf + strlen ((char *) buf), NULL_PTR, kt); --indepth; } @@ -9526,7 +9764,7 @@ make_definition (str, op) static void make_undef (str, op) - U_CHAR *str; + char *str; FILE_BUF *op; { FILE_BUF *ip; @@ -9535,7 +9773,7 @@ make_undef (str, op) ip = &instack[++indepth]; ip->nominal_fname = ip->fname = "*undef*"; - ip->buf = ip->bufp = str; + ip->buf = ip->bufp = (U_CHAR *) str; ip->length = strlen (str); ip->lineno = 1; ip->macro = 0; @@ -9546,7 +9784,7 @@ make_undef (str, op) for (kt = directive_table; kt->type != T_UNDEF; kt++) ; - do_undef (str, str + strlen (str), op, kt); + do_undef ((U_CHAR *) str, (U_CHAR *) str + strlen (str), op, kt); --indepth; } @@ -9556,7 +9794,7 @@ make_undef (str, op) static void make_assertion (option, str) char *option; - U_CHAR *str; + char *str; { FILE_BUF *ip; struct directive *kt; @@ -9592,7 +9830,7 @@ make_assertion (option, str) ip->nominal_fname = ip->fname = "*Initialization*"; ip->buf = ip->bufp = buf; - ip->length = strlen (buf); + ip->length = strlen ((char *) buf); ip->lineno = 1; ip->macro = 0; ip->free_ptr = 0; @@ -9604,7 +9842,7 @@ make_assertion (option, str) /* pass NULL as output ptr to do_define since we KNOW it never does any output.... */ - do_assert (buf, buf + strlen (buf) , NULL_PTR, kt); + do_assert (buf, buf + strlen ((char *) buf) , NULL_PTR, kt); --indepth; } @@ -9669,7 +9907,7 @@ deps_output (string, spacer) if (deps_size + size + 8 > deps_allocated_size) { deps_allocated_size = (deps_size + size + 50) * 2; - deps_buffer = (char *) xrealloc (deps_buffer, deps_allocated_size); + deps_buffer = xrealloc (deps_buffer, deps_allocated_size); } if (spacer == ' ' && deps_column > 0) deps_buffer[deps_size++] = ' '; @@ -9681,50 +9919,16 @@ deps_output (string, spacer) deps_buffer[deps_size] = 0; } -#if defined(USG) || defined(VMS) -#ifndef BSTRING - -void -bzero (b, length) - register char *b; - register unsigned length; -{ - while (length-- > 0) - *b++ = 0; -} - -void -bcopy (b1, b2, length) - register char *b1; - register char *b2; - register unsigned length; -{ - while (length-- > 0) - *b2++ = *b1++; -} - -int -bcmp (b1, b2, length) /* This could be a macro! */ - register char *b1; - register char *b2; - register unsigned length; -{ - while (length-- > 0) - if (*b1++ != *b2++) - return 1; - - return 0; -} -#endif /* not BSTRING */ -#endif /* USG or VMS */ - - static void -fatal (str, arg) - char *str, *arg; +fatal (PRINTF_ALIST (msg)) + PRINTF_DCL (msg) { + va_list args; + fprintf (stderr, "%s: ", progname); - fprintf (stderr, str, arg); + VA_START (args, msg); + vfprintf (stderr, msg, args); + va_end (args); fprintf (stderr, "\n"); exit (FAILURE_EXIT_CODE); } @@ -9776,63 +9980,44 @@ memory_full () } -char * +GENERIC_PTR xmalloc (size) - unsigned size; + size_t size; { - register char *ptr = (char *) malloc (size); - if (ptr != 0) return (ptr); - memory_full (); - /*NOTREACHED*/ - return 0; + register GENERIC_PTR ptr = (GENERIC_PTR) malloc (size); + if (!ptr) + memory_full (); + return ptr; } -static char * +static GENERIC_PTR xrealloc (old, size) - char *old; - unsigned size; + GENERIC_PTR old; + size_t size; { - register char *ptr = (char *) realloc (old, size); - if (ptr != 0) return (ptr); - memory_full (); - /*NOTREACHED*/ - return 0; + register GENERIC_PTR ptr = (GENERIC_PTR) realloc (old, size); + if (!ptr) + memory_full (); + return ptr; } -static char * +static GENERIC_PTR xcalloc (number, size) - unsigned number, size; + size_t number, size; { - register unsigned total = number * size; - register char *ptr = (char *) malloc (total); - if (ptr != 0) { - if (total > 100) - bzero (ptr, total); - else { - /* It's not too long, so loop, zeroing by longs. - It must be safe because malloc values are always well aligned. */ - register long *zp = (long *) ptr; - register long *zl = (long *) (ptr + total - 4); - register int i = total - 4; - while (zp < zl) - *zp++ = 0; - if (i < 0) - i = 0; - while (i < total) - ptr[i++] = 0; - } - return ptr; - } - memory_full (); - /*NOTREACHED*/ - return 0; + register size_t total = number * size; + register GENERIC_PTR ptr = (GENERIC_PTR) malloc (total); + if (!ptr) + memory_full (); + bzero (ptr, total); + return ptr; } static char * savestring (input) char *input; { - unsigned size = strlen (input); + size_t size = strlen (input); char *output = xmalloc (size + 1); strcpy (output, input); return output; |