1 /* C Compatible Compiler Preprocessor (CCCP)
2 Copyright (C) 1986, 87, 89, 92-96, 1997 Free Software Foundation, Inc.
3 Written by Paul Rubin, June 1986
4 Adapted to ANSI C, Richard Stallman, Jan 1987
6 This program is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
22 #include <sys/types.h>
28 #ifdef TIME_WITH_SYS_TIME
29 # include <sys/time.h>
33 # include <sys/time.h>
39 #ifdef HAVE_SYS_RESOURCE_H
40 # include <sys/resource.h>
64 # ifdef HAVE_STRINGS_H
69 typedef unsigned char U_CHAR
;
71 #include "gansidecl.h"
74 #ifdef NEED_DECLARATION_INDEX
75 extern char *index ();
78 #ifdef NEED_DECLARATION_RINDEX
79 extern char *rindex ();
82 #ifdef NEED_DECLARATION_GETENV
83 extern char *getenv ();
86 #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
87 # define __attribute__(x)
90 #ifndef STANDARD_INCLUDE_DIR
91 # define STANDARD_INCLUDE_DIR "/usr/include"
94 /* By default, colon separates directories in a path. */
95 #ifndef PATH_SEPARATOR
96 # define PATH_SEPARATOR ':'
99 /* By default, the suffix for object files is ".o". */
101 # define HAVE_OBJECT_SUFFIX
103 # define OBJECT_SUFFIX ".o"
106 #if defined (__STDC__) && defined (HAVE_VPRINTF)
108 # define PRINTF_ALIST(msg) char *msg, ...
109 # define PRINTF_DCL(msg)
110 # define PRINTF_PROTO(ARGS, m, n) PROTO (ARGS) __attribute__ ((format (__printf__, m, n)))
112 # include <varargs.h>
113 # define PRINTF_ALIST(msg) msg, va_alist
114 # define PRINTF_DCL(msg) char *msg; va_dcl
115 # define PRINTF_PROTO(ARGS, m, n) () __attribute__ ((format (__printf__, m, n)))
116 # define vfprintf(file, msg, args) \
118 char *a0 = va_arg(args, char *); \
119 char *a1 = va_arg(args, char *); \
120 char *a2 = va_arg(args, char *); \
121 char *a3 = va_arg(args, char *); \
122 fprintf (file, msg, a0, a1, a2, a3); \
126 #define PRINTF_PROTO_1(ARGS) PRINTF_PROTO(ARGS, 1, 2)
127 #define PRINTF_PROTO_2(ARGS) PRINTF_PROTO(ARGS, 2, 3)
128 #define PRINTF_PROTO_3(ARGS) PRINTF_PROTO(ARGS, 3, 4)
130 /* VMS-specific definitions */
133 #define open(fname,mode,prot) VMS_open (fname,mode,prot)
134 #define fopen(fname,mode) VMS_fopen (fname,mode)
135 #define freopen(fname,mode,ofile) VMS_freopen (fname,mode,ofile)
136 #define fstat(fd,stbuf) VMS_fstat (fd,stbuf)
137 static int VMS_fstat (), VMS_stat ();
138 static int VMS_open ();
139 static FILE *VMS_fopen ();
140 static FILE *VMS_freopen ();
141 static void hack_vms_include_specification ();
142 #define INO_T_EQ(a, b) (!bcmp((char *) &(a), (char *) &(b), sizeof (a)))
143 #define INO_T_HASH(a) 0
144 #define INCLUDE_LEN_FUDGE 12 /* leave room for VMS syntax conversion */
147 /* Windows does not natively support inodes, and neither does MSDOS. */
148 #if (defined (_WIN32) && ! defined (CYGWIN32)) || defined (__MSDOS__)
149 #define INO_T_EQ(a, b) 0
158 #define MIN(X,Y) ((X) < (Y) ? (X) : (Y))
159 #define MAX(X,Y) ((X) > (Y) ? (X) : (Y))
161 /* Find the largest host integer type and set its size and type.
162 Watch out: on some crazy hosts `long' is shorter than `int'. */
164 #ifndef HOST_WIDE_INT
166 # include <inttypes.h>
167 # define HOST_WIDE_INT intmax_t
169 # if (HOST_BITS_PER_LONG <= HOST_BITS_PER_INT && HOST_BITS_PER_LONGLONG <= HOST_BITS_PER_INT)
170 # define HOST_WIDE_INT int
172 # if (HOST_BITS_PER_LONGLONG <= HOST_BITS_PER_LONG || ! (defined LONG_LONG_MAX || defined LLONG_MAX))
173 # define HOST_WIDE_INT long
175 # define HOST_WIDE_INT long long
182 #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
186 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
190 #define INO_T_EQ(a, b) ((a) == (b))
194 #define INO_T_HASH(a) (a)
197 #ifndef INCLUDE_LEN_FUDGE
198 #define INCLUDE_LEN_FUDGE 0
201 /* External declarations. */
203 extern char *version_string
;
204 extern char *update_path
PROTO((char *, char *));
206 #ifndef HAVE_STRERROR
208 extern char *sys_errlist
[];
209 #else /* HAVE_STRERROR */
213 char *strerror (int,...);
215 HOST_WIDE_INT parse_escape
PROTO((char **, HOST_WIDE_INT
));
216 HOST_WIDE_INT parse_c_expression
PROTO((char *, int));
222 /* Name under which this program was invoked. */
224 static char *progname
;
226 /* Nonzero means use extra default include directories for C++. */
228 static int cplusplus
;
230 /* Nonzero means handle cplusplus style comments */
232 static int cplusplus_comments
;
234 /* Nonzero means handle #import, for objective C. */
238 /* Nonzero means this is an assembly file, and allow
239 unknown directives, which could be comments. */
243 /* Current maximum length of directory names in the search path
244 for include files. (Altered as we get more of them.) */
246 static int max_include_len
;
248 /* Nonzero means turn NOTREACHED into #pragma NOTREACHED etc */
250 static int for_lint
= 0;
252 /* Nonzero means copy comments into the output file. */
254 static int put_out_comments
= 0;
256 /* Nonzero means don't process the ANSI trigraph sequences. */
258 static int no_trigraphs
= 0;
260 /* Nonzero means print the names of included files rather than
261 the preprocessed output. 1 means just the #include "...",
262 2 means #include <...> as well. */
264 static int print_deps
= 0;
266 /* Nonzero if missing .h files in -M output are assumed to be generated
267 files and not errors. */
269 static int print_deps_missing_files
= 0;
271 /* Nonzero means print names of header files (-H). */
273 static int print_include_names
= 0;
275 /* Nonzero means don't output line number information. */
277 static int no_line_directives
;
279 /* Nonzero means output the text in failing conditionals,
280 inside #failed ... #endfailed. */
282 static int output_conditionals
;
284 /* dump_only means inhibit output of the preprocessed text
285 and instead output the definitions of all user-defined
286 macros in a form suitable for use as input to cccp.
287 dump_names means pass #define and the macro name through to output.
288 dump_definitions means pass the whole definition (plus #define) through
291 static enum {dump_none
, dump_only
, dump_names
, dump_definitions
}
292 dump_macros
= dump_none
;
294 /* Nonzero means pass all #define and #undef directives which we actually
295 process through to the output stream. This feature is used primarily
296 to allow cc1 to record the #defines and #undefs for the sake of
297 debuggers which understand about preprocessor macros, but it may
298 also be useful with -E to figure out how symbols are defined, and
299 where they are defined. */
300 static int debug_output
= 0;
302 /* Nonzero means pass #include lines through to the output,
303 even if they are ifdefed out. */
304 static int dump_includes
;
306 /* Nonzero indicates special processing used by the pcp program. The
307 special effects of this mode are:
309 Inhibit all macro expansion, except those inside #if directives.
311 Process #define directives normally, and output their contents
314 Output preconditions to pcp_outfile indicating all the relevant
315 preconditions for use of this file in a later cpp run.
317 static FILE *pcp_outfile
;
319 /* Nonzero means we are inside an IF during a -pcp run. In this mode
320 macro expansion is done, and preconditions are output for all macro
321 uses requiring them. */
322 static int pcp_inside_if
;
324 /* Nonzero means never to include precompiled files.
325 This is 1 since there's no way now to make precompiled files,
326 so it's not worth testing for them. */
327 static int no_precomp
= 1;
329 /* Nonzero means give all the error messages the ANSI standard requires. */
333 /* Nonzero means try to make failure to fit ANSI C an error. */
335 static int pedantic_errors
;
337 /* Nonzero means don't print warning messages. -w. */
339 static int inhibit_warnings
= 0;
341 /* Nonzero means warn if slash-star appears in a slash-star comment,
342 or if newline-backslash appears in a slash-slash comment. */
344 static int warn_comments
;
346 /* Nonzero means warn if a macro argument is (or would be)
347 stringified with -traditional. */
349 static int warn_stringify
;
351 /* Nonzero means warn if there are any trigraphs. */
353 static int warn_trigraphs
;
355 /* Nonzero means warn if undefined identifiers are evaluated in an #if. */
357 static int warn_undef
;
359 /* Nonzero means warn if #import is used. */
361 static int warn_import
= 1;
363 /* Nonzero means turn warnings into errors. */
365 static int warnings_are_errors
;
367 /* Nonzero means try to imitate old fashioned non-ANSI preprocessor. */
371 /* Nonzero for the 1989 C Standard, including corrigenda and amendments. */
375 /* Nonzero causes output not to be done,
376 but directives such as #define that have side effects
379 static int no_output
;
381 /* Nonzero means we should look for header.gcc files that remap file names. */
384 /* Nonzero means this file was included with a -imacros or -include
385 command line and should not be recorded as an include file. */
387 static int no_record_file
;
389 /* Nonzero means that we have finished processing the command line options.
390 This flag is used to decide whether or not to issue certain errors
393 static int done_initializing
= 0;
395 /* Line where a newline was first seen in a string constant. */
397 static int multiline_string_line
= 0;
399 /* I/O buffer structure.
400 The `fname' field is nonzero for source files and #include files
401 and for the dummy text used for -D and -U.
402 It is zero for rescanning results of macro expansion
403 and for expanding macro arguments. */
404 #define INPUT_STACK_MAX 400
405 static struct file_buf
{
407 /* Filename specified with #line directive. */
409 /* Include file description. */
410 struct include_file
*inc
;
411 /* Record where in the search path this file was found.
412 For #include_next. */
413 struct file_name_list
*dir
;
418 /* Macro that this level is the expansion of.
419 Included so that we can reenable the macro
420 at the end of this level. */
421 struct hashnode
*macro
;
422 /* Value of if_stack at start of this file.
423 Used to prohibit unmatched #endif (etc) in an include file. */
424 struct if_stack
*if_stack
;
425 /* Object to be freed at end of input at this level. */
427 /* True if this is a system header file; see is_system_include. */
428 char system_header_p
;
429 } instack
[INPUT_STACK_MAX
];
431 static int last_error_tick
; /* Incremented each time we print it. */
432 static int input_file_stack_tick
; /* Incremented when the status changes. */
434 /* Current nesting level of input sources.
435 `instack[indepth]' is the level currently being read. */
436 static int indepth
= -1;
437 #define CHECK_DEPTH(code) \
438 if (indepth >= (INPUT_STACK_MAX - 1)) \
440 error_with_line (line_for_error (instack[indepth].lineno), \
441 "macro or `#include' recursion too deep"); \
445 /* Current depth in #include directives that use <...>. */
446 static int system_include_depth
= 0;
448 typedef struct file_buf FILE_BUF
;
450 /* The output buffer. Its LENGTH field is the amount of room allocated
451 for the buffer, not the number of chars actually present. To get
452 that, subtract outbuf.buf from outbuf.bufp. */
454 #define OUTBUF_SIZE 10 /* initial size of output buffer */
455 static FILE_BUF outbuf
;
457 /* Grow output buffer OBUF points at
458 so it can hold at least NEEDED more chars. */
460 #define check_expand(OBUF, NEEDED) \
461 (((OBUF)->length - ((OBUF)->bufp - (OBUF)->buf) <= (NEEDED)) \
462 ? grow_outbuf ((OBUF), (NEEDED)) : 0)
464 struct file_name_list
466 struct file_name_list
*next
;
467 /* If the following is 1, it is a C-language system include
469 int c_system_include_path
;
470 /* Mapping of file names for this directory. */
471 struct file_name_map
*name_map
;
472 /* Non-zero if name_map is valid. */
474 /* The include directory status. */
476 /* The include prefix: "" denotes the working directory,
477 otherwise fname must end in '/'.
478 The actual size is dynamically allocated. */
482 /* #include "file" looks in source file dir, then stack. */
483 /* #include <file> just looks in the stack. */
484 /* -I directories are added to the end, then the defaults are added. */
486 static struct default_include
{
487 char *fname
; /* The name of the directory. */
488 char *component
; /* The component containing the directory */
489 int cplusplus
; /* Only look here if we're compiling C++. */
490 int cxx_aware
; /* Includes in this directory don't need to
491 be wrapped in extern "C" when compiling
493 } include_defaults_array
[]
494 #ifdef INCLUDE_DEFAULTS
498 /* Pick up GNU C++ specific include files. */
499 { GPLUSPLUS_INCLUDE_DIR
, "G++", 1, 1 },
500 { OLD_GPLUSPLUS_INCLUDE_DIR
, 0, 1, 1 },
502 /* This is the dir for fixincludes. Put it just before
503 the files that we fix. */
504 { GCC_INCLUDE_DIR
, "GCC", 0, 0 },
505 /* For cross-compilation, this dir name is generated
506 automatically in Makefile.in. */
507 { CROSS_INCLUDE_DIR
, "GCC", 0, 0 },
508 #ifdef TOOL_INCLUDE_DIR
509 /* This is another place that the target system's headers might be. */
510 { TOOL_INCLUDE_DIR
, "BINUTILS", 0, 0 },
512 #else /* not CROSS_COMPILE */
513 #ifdef LOCAL_INCLUDE_DIR
514 /* This should be /usr/local/include and should come before
515 the fixincludes-fixed header files. */
516 { LOCAL_INCLUDE_DIR
, 0, 0, 1 },
518 #ifdef TOOL_INCLUDE_DIR
519 /* This is here ahead of GCC_INCLUDE_DIR because assert.h goes here.
520 Likewise, behind LOCAL_INCLUDE_DIR, where glibc puts its assert.h. */
521 { TOOL_INCLUDE_DIR
, "BINUTILS", 0, 0 },
523 /* This is the dir for fixincludes. Put it just before
524 the files that we fix. */
525 { GCC_INCLUDE_DIR
, "GCC", 0, 0 },
526 /* Some systems have an extra dir of include files. */
527 #ifdef SYSTEM_INCLUDE_DIR
528 { SYSTEM_INCLUDE_DIR
, 0, 0, 0 },
530 #ifndef STANDARD_INCLUDE_COMPONENT
531 #define STANDARD_INCLUDE_COMPONENT 0
533 { STANDARD_INCLUDE_DIR
, STANDARD_INCLUDE_COMPONENT
, 0, 0 },
534 #endif /* not CROSS_COMPILE */
537 #endif /* no INCLUDE_DEFAULTS */
539 /* The code looks at the defaults through this pointer, rather than through
540 the constant structure above. This pointer gets changed if an environment
541 variable specifies other defaults. */
542 static struct default_include
*include_defaults
= include_defaults_array
;
544 static struct file_name_list
*include
= 0; /* First dir to search */
545 /* First dir to search for <file> */
546 /* This is the first element to use for #include <...>.
547 If it is 0, use the entire chain for such includes. */
548 static struct file_name_list
*first_bracket_include
= 0;
549 /* This is the first element in the chain that corresponds to
550 a directory of system header files. */
551 static struct file_name_list
*first_system_include
= 0;
552 static struct file_name_list
*last_include
= 0; /* Last in chain */
554 /* Chain of include directories to put at the end of the other chain. */
555 static struct file_name_list
*after_include
= 0;
556 static struct file_name_list
*last_after_include
= 0; /* Last in chain */
558 /* Chain to put at the start of the system include files. */
559 static struct file_name_list
*before_system
= 0;
560 static struct file_name_list
*last_before_system
= 0; /* Last in chain */
562 /* Directory prefix that should replace `/usr' in the standard
563 include file directories. */
564 static char *include_prefix
;
566 /* Maintain and search list of included files. */
568 struct include_file
{
569 struct include_file
*next
; /* for include_hashtab */
570 struct include_file
*next_ino
; /* for include_ino_hashtab */
572 /* If the following is the empty string, it means #pragma once
573 was seen in this include file, or #import was applied to the file.
574 Otherwise, if it is nonzero, it is a macro name.
575 Don't include the file again if that macro is defined. */
576 U_CHAR
*control_macro
;
577 /* Nonzero if the dependency on this include file has been output. */
582 /* Hash tables of files already included with #include or #import.
583 include_hashtab is by full name; include_ino_hashtab is by inode number. */
585 #define INCLUDE_HASHSIZE 61
586 static struct include_file
*include_hashtab
[INCLUDE_HASHSIZE
];
587 static struct include_file
*include_ino_hashtab
[INCLUDE_HASHSIZE
];
589 /* Global list of strings read in from precompiled files. This list
590 is kept in the order the strings are read in, with new strings being
591 added at the end through stringlist_tailp. We use this list to output
592 the strings at the end of the run.
594 static STRINGDEF
*stringlist
;
595 static STRINGDEF
**stringlist_tailp
= &stringlist
;
598 /* Structure returned by create_definition */
599 typedef struct macrodef MACRODEF
;
602 struct definition
*defn
;
607 enum sharp_token_type
{
608 NO_SHARP_TOKEN
= 0, /* token not present */
610 SHARP_TOKEN
= '#', /* token spelled with # only */
611 WHITE_SHARP_TOKEN
, /* token spelled with # and white space */
613 PERCENT_COLON_TOKEN
= '%', /* token spelled with %: only */
614 WHITE_PERCENT_COLON_TOKEN
/* token spelled with %: and white space */
617 /* Structure allocated for every #define. For a simple replacement
620 nargs = -1, the `pattern' list is null, and the expansion is just
621 the replacement text. Nargs = 0 means a functionlike macro with no args,
623 #define getchar() getc (stdin) .
624 When there are args, the expansion is the replacement text with the
625 args squashed out, and the reflist is a list describing how to
626 build the output from the input: e.g., "3 chars, then the 1st arg,
627 then 9 chars, then the 3rd arg, then 0 chars, then the 2nd arg".
628 The chars here come from the expansion. Whatever is left of the
629 expansion after the last arg-occurrence is copied after that arg.
630 Note that the reflist can be arbitrarily long---
631 its length depends on the number of times the arguments appear in
632 the replacement text, not how many args there are. Example:
633 #define f(x) x+x+x+x+x+x+x would have replacement text "++++++" and
635 { (0, 1), (1, 1), (1, 1), ..., (1, 1), NULL }
636 where (x, y) means (nchars, argno). */
638 typedef struct definition DEFINITION
;
641 int length
; /* length of expansion string */
642 int predefined
; /* True if the macro was builtin or */
643 /* came from the command line */
645 int line
; /* Line number of definition */
646 char *file
; /* File of definition */
647 char rest_args
; /* Nonzero if last arg. absorbs the rest */
649 struct reflist
*next
;
651 enum sharp_token_type stringify
; /* set if a # operator before arg */
652 enum sharp_token_type raw_before
; /* set if a ## operator before arg */
653 enum sharp_token_type raw_after
; /* set if a ## operator after arg */
655 char rest_args
; /* Nonzero if this arg. absorbs the rest */
656 int nchars
; /* Number of literal chars to copy before
657 this arg occurrence. */
658 int argno
; /* Number of arg to substitute (origin-0) */
661 /* Names of macro args, concatenated in reverse order
662 with comma-space between them.
663 The only use of this is that we warn on redefinition
664 if this differs between the old and new definitions. */
669 /* different kinds of things that can appear in the value field
670 of a hash node. Actually, this may be useless now. */
678 * special extension string that can be added to the last macro argument to
679 * allow it to absorb the "rest" of the arguments when expanded. Ex:
680 * #define wow(a, b...) process (b, a, b)
681 * { wow (1, 2, 3); } -> { process (2, 3, 1, 2, 3); }
682 * { wow (one, two); } -> { process (two, one, two); }
683 * if this "rest_arg" is used with the concat token '##' and if it is not
684 * supplied then the token attached to with ## will not be outputted. Ex:
685 * #define wow (a, b...) process (b ## , a, ## b)
686 * { wow (1, 2); } -> { process (2, 1, 2); }
687 * { wow (one); } -> { process (one); {
689 static char rest_extension
[] = "...";
690 #define REST_EXTENSION_LENGTH (sizeof (rest_extension) - 1)
692 /* The structure of a node in the hash table. The hash table
693 has entries for all tokens defined by #define directives (type T_MACRO),
694 plus some special tokens like __LINE__ (these each have their own
695 type, and the appropriate code is run when that type of node is seen.
696 It does not contain control words like "#define", which are recognized
697 by a separate piece of code. */
699 /* different flavors of hash nodes --- also used in keyword table */
701 T_DEFINE
= 1, /* the `#define' keyword */
702 T_INCLUDE
, /* the `#include' keyword */
703 T_INCLUDE_NEXT
, /* the `#include_next' keyword */
704 T_IMPORT
, /* the `#import' keyword */
705 T_IFDEF
, /* the `#ifdef' keyword */
706 T_IFNDEF
, /* the `#ifndef' keyword */
707 T_IF
, /* the `#if' keyword */
708 T_ELSE
, /* `#else' */
709 T_PRAGMA
, /* `#pragma' */
710 T_ELIF
, /* `#elif' */
711 T_UNDEF
, /* `#undef' */
712 T_LINE
, /* `#line' */
713 T_ERROR
, /* `#error' */
714 T_WARNING
, /* `#warning' */
715 T_ENDIF
, /* `#endif' */
716 T_SCCS
, /* `#sccs', used on system V. */
717 T_IDENT
, /* `#ident', used on system V. */
718 T_ASSERT
, /* `#assert', taken from system V. */
719 T_UNASSERT
, /* `#unassert', taken from system V. */
720 T_SPECLINE
, /* special symbol `__LINE__' */
721 T_DATE
, /* `__DATE__' */
722 T_FILE
, /* `__FILE__' */
723 T_BASE_FILE
, /* `__BASE_FILE__' */
724 T_INCLUDE_LEVEL
, /* `__INCLUDE_LEVEL__' */
725 T_VERSION
, /* `__VERSION__' */
726 T_SIZE_TYPE
, /* `__SIZE_TYPE__' */
727 T_PTRDIFF_TYPE
, /* `__PTRDIFF_TYPE__' */
728 T_WCHAR_TYPE
, /* `__WCHAR_TYPE__' */
729 T_USER_LABEL_PREFIX_TYPE
, /* `__USER_LABEL_PREFIX__' */
730 T_REGISTER_PREFIX_TYPE
, /* `__REGISTER_PREFIX__' */
731 T_IMMEDIATE_PREFIX_TYPE
, /* `__IMMEDIATE_PREFIX__' */
732 T_TIME
, /* `__TIME__' */
733 T_CONST
, /* Constant value, used by `__STDC__' */
734 T_MACRO
, /* macro defined by `#define' */
735 T_DISABLED
, /* macro temporarily turned off for rescan */
736 T_SPEC_DEFINED
, /* special `defined' macro for use in #if statements */
737 T_PCSTRING
, /* precompiled string (hashval is KEYDEF *) */
738 T_UNUSED
/* Used for something not defined. */
742 struct hashnode
*next
; /* double links for easy deletion */
743 struct hashnode
*prev
;
744 struct hashnode
**bucket_hdr
; /* also, a back pointer to this node's hash
745 chain is kept, in case the node is the head
746 of the chain and gets deleted. */
747 enum node_type type
; /* type of special token */
748 int length
; /* length of token, for quick comparison */
749 U_CHAR
*name
; /* the actual name */
750 union hashval value
; /* pointer to expansion, or whatever */
753 typedef struct hashnode HASHNODE
;
755 /* Some definitions for the hash table. The hash function MUST be
756 computed as shown in hashf () below. That is because the rescan
757 loop computes the hash value `on the fly' for most tokens,
758 in order to avoid the overhead of a lot of procedure calls to
759 the hashf () function. Hashf () only exists for the sake of
760 politeness, for use when speed isn't so important. */
762 #define HASHSIZE 1403
763 static HASHNODE
*hashtab
[HASHSIZE
];
764 #define HASHSTEP(old, c) ((old << 2) + c)
765 #define MAKE_POS(v) (v & 0x7fffffff) /* make number positive */
767 /* Symbols to predefine. */
769 #ifdef CPP_PREDEFINES
770 static char *predefs
= CPP_PREDEFINES
;
772 static char *predefs
= "";
775 /* We let tm.h override the types used here, to handle trivial differences
776 such as the choice of unsigned int or long unsigned int for size_t.
777 When machines start needing nontrivial differences in the size type,
778 it would be best to do something here to figure out automatically
779 from other information what type to use. */
781 /* The string value for __SIZE_TYPE__. */
784 #define SIZE_TYPE "long unsigned int"
787 /* The string value for __PTRDIFF_TYPE__. */
790 #define PTRDIFF_TYPE "long int"
793 /* The string value for __WCHAR_TYPE__. */
796 #define WCHAR_TYPE "int"
798 char * wchar_type
= WCHAR_TYPE
;
801 /* The string value for __USER_LABEL_PREFIX__ */
803 #ifndef USER_LABEL_PREFIX
804 #define USER_LABEL_PREFIX ""
807 /* The string value for __REGISTER_PREFIX__ */
809 #ifndef REGISTER_PREFIX
810 #define REGISTER_PREFIX ""
813 /* The string value for __IMMEDIATE_PREFIX__ */
815 #ifndef IMMEDIATE_PREFIX
816 #define IMMEDIATE_PREFIX ""
819 /* In the definition of a #assert name, this structure forms
820 a list of the individual values asserted.
821 Each value is itself a list of "tokens".
822 These are strings that are compared by name. */
824 struct tokenlist_list
{
825 struct tokenlist_list
*next
;
826 struct arglist
*tokens
;
829 struct assertion_hashnode
{
830 struct assertion_hashnode
*next
; /* double links for easy deletion */
831 struct assertion_hashnode
*prev
;
832 /* also, a back pointer to this node's hash
833 chain is kept, in case the node is the head
834 of the chain and gets deleted. */
835 struct assertion_hashnode
**bucket_hdr
;
836 int length
; /* length of token, for quick comparison */
837 U_CHAR
*name
; /* the actual name */
838 /* List of token-sequences. */
839 struct tokenlist_list
*value
;
842 typedef struct assertion_hashnode ASSERTION_HASHNODE
;
844 /* Some definitions for the hash table. The hash function MUST be
845 computed as shown in hashf below. That is because the rescan
846 loop computes the hash value `on the fly' for most tokens,
847 in order to avoid the overhead of a lot of procedure calls to
848 the hashf function. hashf only exists for the sake of
849 politeness, for use when speed isn't so important. */
851 #define ASSERTION_HASHSIZE 37
852 static ASSERTION_HASHNODE
*assertion_hashtab
[ASSERTION_HASHSIZE
];
854 /* Nonzero means inhibit macroexpansion of what seem to be
855 assertion tests, in rescan. For #if. */
856 static int assertions_flag
;
858 /* `struct directive' defines one #-directive, including how to handle it. */
860 #define DO_PROTO PROTO((U_CHAR *, U_CHAR *, FILE_BUF *, struct directive *))
863 int length
; /* Length of name */
864 int (*func
) DO_PROTO
; /* Function to handle directive */
865 char *name
; /* Name of directive */
866 enum node_type type
; /* Code which describes which directive. */
869 #define IS_INCLUDE_DIRECTIVE_TYPE(t) (T_INCLUDE <= (t) && (t) <= T_IMPORT)
871 /* These functions are declared to return int instead of void since they
872 are going to be placed in the table and some old compilers have trouble with
873 pointers to functions returning void. */
875 static int do_assert DO_PROTO
;
876 static int do_define DO_PROTO
;
877 static int do_elif DO_PROTO
;
878 static int do_else DO_PROTO
;
879 static int do_endif DO_PROTO
;
880 static int do_error DO_PROTO
;
881 static int do_ident DO_PROTO
;
882 static int do_if DO_PROTO
;
883 static int do_include DO_PROTO
;
884 static int do_line DO_PROTO
;
885 static int do_pragma DO_PROTO
;
886 #ifdef SCCS_DIRECTIVE
887 static int do_sccs DO_PROTO
;
889 static int do_unassert DO_PROTO
;
890 static int do_undef DO_PROTO
;
891 static int do_warning DO_PROTO
;
892 static int do_xifdef DO_PROTO
;
894 /* Here is the actual list of #-directives, most-often-used first. */
896 static struct directive directive_table
[] = {
897 { 6, do_define
, "define", T_DEFINE
},
898 { 2, do_if
, "if", T_IF
},
899 { 5, do_xifdef
, "ifdef", T_IFDEF
},
900 { 6, do_xifdef
, "ifndef", T_IFNDEF
},
901 { 5, do_endif
, "endif", T_ENDIF
},
902 { 4, do_else
, "else", T_ELSE
},
903 { 4, do_elif
, "elif", T_ELIF
},
904 { 4, do_line
, "line", T_LINE
},
905 { 7, do_include
, "include", T_INCLUDE
},
906 { 12, do_include
, "include_next", T_INCLUDE_NEXT
},
907 { 6, do_include
, "import", T_IMPORT
},
908 { 5, do_undef
, "undef", T_UNDEF
},
909 { 5, do_error
, "error", T_ERROR
},
910 { 7, do_warning
, "warning", T_WARNING
},
911 #ifdef SCCS_DIRECTIVE
912 { 4, do_sccs
, "sccs", T_SCCS
},
914 { 6, do_pragma
, "pragma", T_PRAGMA
},
915 { 5, do_ident
, "ident", T_IDENT
},
916 { 6, do_assert
, "assert", T_ASSERT
},
917 { 8, do_unassert
, "unassert", T_UNASSERT
},
918 { -1, 0, "", T_UNUSED
},
921 /* When a directive handler is called,
922 this points to the # (or the : of the %:) that started the directive. */
923 U_CHAR
*directive_start
;
925 /* table to tell if char can be part of a C identifier. */
926 U_CHAR is_idchar
[256];
927 /* table to tell if char can be first char of a c identifier. */
928 U_CHAR is_idstart
[256];
929 /* table to tell if c is horizontal space. */
930 static U_CHAR is_hor_space
[256];
931 /* table to tell if c is horizontal or vertical space. */
932 U_CHAR is_space
[256];
933 /* names of some characters */
934 static char *char_name
[256];
936 #define SKIP_WHITE_SPACE(p) do { while (is_hor_space[*p]) p++; } while (0)
937 #define SKIP_ALL_WHITE_SPACE(p) do { while (is_space[*p]) p++; } while (0)
939 static int errors
= 0; /* Error counter for exit code */
941 /* Name of output file, for error messages. */
942 static char *out_fname
;
945 /* Stack of conditionals currently in progress
946 (including both successful and failing conditionals). */
949 struct if_stack
*next
; /* for chaining to the next stack frame */
950 char *fname
; /* copied from input when frame is made */
951 int lineno
; /* similarly */
952 int if_succeeded
; /* true if a leg of this if-group
953 has been passed through rescan */
954 U_CHAR
*control_macro
; /* For #ifndef at start of file,
955 this is the macro name tested. */
956 enum node_type type
; /* type of last directive seen in this group */
958 typedef struct if_stack IF_STACK_FRAME
;
959 static IF_STACK_FRAME
*if_stack
= NULL
;
961 /* Buffer of -M output. */
962 static char *deps_buffer
;
964 /* Number of bytes allocated in above. */
965 static int deps_allocated_size
;
967 /* Number of bytes used. */
968 static int deps_size
;
970 /* Number of bytes since the last newline. */
971 static int deps_column
;
973 /* Nonzero means -I- has been seen,
974 so don't look for #include "foo" the source-file directory. */
975 static int ignore_srcdir
;
977 static int safe_read
PROTO((int, char *, int));
978 static void safe_write
PROTO((int, char *, int));
980 int main
PROTO((int, char **));
982 static void path_include
PROTO((char *));
984 static U_CHAR
*index0
PROTO((U_CHAR
*, int, size_t));
986 static void trigraph_pcp
PROTO((FILE_BUF
*));
988 static void newline_fix
PROTO((U_CHAR
*));
989 static void name_newline_fix
PROTO((U_CHAR
*));
991 static char *get_lintcmd
PROTO((U_CHAR
*, U_CHAR
*, U_CHAR
**, int *, int *));
993 static void rescan
PROTO((FILE_BUF
*, int));
995 static FILE_BUF expand_to_temp_buffer
PROTO((U_CHAR
*, U_CHAR
*, int, int));
997 static int handle_directive
PROTO((FILE_BUF
*, FILE_BUF
*));
999 static struct tm
*timestamp
PROTO((void));
1000 static void special_symbol
PROTO((HASHNODE
*, FILE_BUF
*));
1002 static int is_system_include
PROTO((char *));
1003 static char *base_name
PROTO((char *));
1004 static int absolute_filename
PROTO((char *));
1005 static size_t simplify_filename
PROTO((char *));
1007 static char *read_filename_string
PROTO((int, FILE *));
1008 static struct file_name_map
*read_name_map
PROTO((char *));
1009 static int open_include_file
PROTO((char *, struct file_name_list
*, U_CHAR
*, struct include_file
**));
1010 static char *remap_include_file
PROTO((char *, struct file_name_list
*));
1011 static int lookup_ino_include
PROTO((struct include_file
*));
1013 static void finclude
PROTO((int, struct include_file
*, FILE_BUF
*, int, struct file_name_list
*));
1014 static void record_control_macro
PROTO((struct include_file
*, U_CHAR
*));
1016 static char *check_precompiled
PROTO((int, struct stat
*, char *, char **));
1017 static int check_preconditions
PROTO((char *));
1018 static void pcfinclude
PROTO((U_CHAR
*, U_CHAR
*, U_CHAR
*, FILE_BUF
*));
1019 static void pcstring_used
PROTO((HASHNODE
*));
1020 static void write_output
PROTO((void));
1021 static void pass_thru_directive
PROTO((U_CHAR
*, U_CHAR
*, FILE_BUF
*, struct directive
*));
1023 static MACRODEF create_definition
PROTO((U_CHAR
*, U_CHAR
*, FILE_BUF
*));
1025 static int check_macro_name
PROTO((U_CHAR
*, char *));
1026 static int compare_defs
PROTO((DEFINITION
*, DEFINITION
*));
1027 static int comp_def_part
PROTO((int, U_CHAR
*, int, U_CHAR
*, int, int));
1029 static DEFINITION
*collect_expansion
PROTO((U_CHAR
*, U_CHAR
*, int, struct arglist
*));
1031 int check_assertion
PROTO((U_CHAR
*, int, int, struct arglist
*));
1032 static int compare_token_lists
PROTO((struct arglist
*, struct arglist
*));
1034 static struct arglist
*read_token_list
PROTO((U_CHAR
**, U_CHAR
*, int *));
1035 static void free_token_list
PROTO((struct arglist
*));
1037 static ASSERTION_HASHNODE
*assertion_install
PROTO((U_CHAR
*, int, int));
1038 static ASSERTION_HASHNODE
*assertion_lookup
PROTO((U_CHAR
*, int, int));
1039 static void delete_assertion
PROTO((ASSERTION_HASHNODE
*));
1041 static void do_once
PROTO((void));
1043 static HOST_WIDE_INT eval_if_expression
PROTO((U_CHAR
*, int));
1044 static void conditional_skip
PROTO((FILE_BUF
*, int, enum node_type
, U_CHAR
*, FILE_BUF
*));
1045 static void skip_if_group
PROTO((FILE_BUF
*, int, FILE_BUF
*));
1046 static void validate_else
PROTO((U_CHAR
*, U_CHAR
*));
1048 static U_CHAR
*skip_to_end_of_comment
PROTO((FILE_BUF
*, int *, int));
1049 static U_CHAR
*skip_quoted_string
PROTO((U_CHAR
*, U_CHAR
*, int, int *, int *, int *));
1050 static char *quote_string
PROTO((char *, char *));
1051 static U_CHAR
*skip_paren_group
PROTO((FILE_BUF
*));
1053 /* Last arg to output_line_directive. */
1054 enum file_change_code
{same_file
, enter_file
, leave_file
};
1055 static void output_line_directive
PROTO((FILE_BUF
*, FILE_BUF
*, int, enum file_change_code
));
1057 static void macroexpand
PROTO((HASHNODE
*, FILE_BUF
*));
1060 static char *macarg
PROTO((struct argdata
*, int));
1062 static U_CHAR
*macarg1
PROTO((U_CHAR
*, U_CHAR
*, int *, int *, int *, int));
1064 static int discard_comments
PROTO((U_CHAR
*, int, int));
1066 static int change_newlines
PROTO((U_CHAR
*, int));
1068 char *my_strerror
PROTO((int));
1069 void error
PRINTF_PROTO_1((char *, ...));
1070 static void verror
PROTO((char *, va_list));
1071 static void error_from_errno
PROTO((char *));
1072 void warning
PRINTF_PROTO_1((char *, ...));
1073 static void vwarning
PROTO((char *, va_list));
1074 static void error_with_line
PRINTF_PROTO_2((int, char *, ...));
1075 static void verror_with_line
PROTO((int, char *, va_list));
1076 static void vwarning_with_line
PROTO((int, char *, va_list));
1077 static void warning_with_line
PRINTF_PROTO_2((int, char *, ...));
1078 void pedwarn
PRINTF_PROTO_1((char *, ...));
1079 void pedwarn_with_line
PRINTF_PROTO_2((int, char *, ...));
1080 static void pedwarn_with_file_and_line
PRINTF_PROTO_3((char *, int, char *, ...));
1082 static void print_containing_files
PROTO((void));
1084 static int line_for_error
PROTO((int));
1085 static int grow_outbuf
PROTO((FILE_BUF
*, int));
1087 static HASHNODE
*install
PROTO((U_CHAR
*, int, enum node_type
, char *, int));
1088 HASHNODE
*lookup
PROTO((U_CHAR
*, int, int));
1089 static void delete_macro
PROTO((HASHNODE
*));
1090 static int hashf
PROTO((U_CHAR
*, int, int));
1092 static void dump_single_macro
PROTO((HASHNODE
*, FILE *));
1093 static void dump_all_macros
PROTO((void));
1094 static void dump_defn_1
PROTO((U_CHAR
*, int, int, FILE *));
1095 static void dump_arg_n
PROTO((DEFINITION
*, int, FILE *));
1097 static void initialize_char_syntax
PROTO((void));
1098 static void initialize_builtins
PROTO((FILE_BUF
*, FILE_BUF
*));
1100 static void make_definition
PROTO((char *, FILE_BUF
*));
1101 static void make_undef
PROTO((char *, FILE_BUF
*));
1103 static void make_assertion
PROTO((char *, char *));
1105 static struct file_name_list
*new_include_prefix
PROTO((struct file_name_list
*, char *, char *, char *));
1106 static void append_include_chain
PROTO((struct file_name_list
*, struct file_name_list
*));
1108 static int quote_string_for_make
PROTO((char *, char *));
1109 static void deps_output
PROTO((char *, int));
1111 static void fatal
PRINTF_PROTO_1((char *, ...)) __attribute__ ((noreturn
));
1112 void fancy_abort
PROTO((void)) __attribute__ ((noreturn
));
1113 static void perror_with_name
PROTO((char *));
1114 static void pfatal_with_name
PROTO((char *)) __attribute__ ((noreturn
));
1115 static void pipe_closed
PROTO((int)) __attribute__ ((noreturn
));
1117 static void memory_full
PROTO((void)) __attribute__ ((noreturn
));
1118 GENERIC_PTR xmalloc
PROTO((size_t));
1119 static GENERIC_PTR xrealloc
PROTO((GENERIC_PTR
, size_t));
1120 static GENERIC_PTR xcalloc
PROTO((size_t, size_t));
1121 static char *savestring
PROTO((char *));
1123 /* Read LEN bytes at PTR from descriptor DESC, for file FILENAME,
1124 retrying if necessary. If MAX_READ_LEN is defined, read at most
1125 that bytes at a time. Return a negative value if an error occurs,
1126 otherwise return the actual number of bytes read,
1127 which must be LEN unless end-of-file was reached. */
1130 safe_read (desc
, ptr
, len
)
1135 int left
, rcount
, nchars
;
1141 if (rcount
> MAX_READ_LEN
)
1142 rcount
= MAX_READ_LEN
;
1144 nchars
= read (desc
, ptr
, rcount
);
1161 /* Write LEN bytes at PTR to descriptor DESC,
1162 retrying if necessary, and treating any real error as fatal.
1163 If MAX_WRITE_LEN is defined, write at most that many bytes at a time. */
1166 safe_write (desc
, ptr
, len
)
1171 int wcount
, written
;
1175 #ifdef MAX_WRITE_LEN
1176 if (wcount
> MAX_WRITE_LEN
)
1177 wcount
= MAX_WRITE_LEN
;
1179 written
= write (desc
, ptr
, wcount
);
1186 pfatal_with_name (out_fname
);
1203 char **pend_files
= (char **) xmalloc (argc
* sizeof (char *));
1204 char **pend_defs
= (char **) xmalloc (argc
* sizeof (char *));
1205 char **pend_undefs
= (char **) xmalloc (argc
* sizeof (char *));
1206 char **pend_assertions
= (char **) xmalloc (argc
* sizeof (char *));
1207 char **pend_includes
= (char **) xmalloc (argc
* sizeof (char *));
1209 /* Record the option used with each element of pend_assertions.
1210 This is preparation for supporting more than one option for making
1212 char **pend_assertion_options
= (char **) xmalloc (argc
* sizeof (char *));
1213 int inhibit_predefs
= 0;
1214 int no_standard_includes
= 0;
1215 int no_standard_cplusplus_includes
= 0;
1216 int missing_newline
= 0;
1218 /* Non-0 means don't output the preprocessed program. */
1219 int inhibit_output
= 0;
1220 /* Non-0 means -v, so print the full set of include dirs. */
1223 /* File name which deps are being written to.
1224 This is 0 if deps are being written to stdout. */
1225 char *deps_file
= 0;
1226 /* Fopen file mode to open deps_file with. */
1227 char *deps_mode
= "a";
1228 /* Stream on which to print the dependency information. */
1229 FILE *deps_stream
= 0;
1230 /* Target-name to write with the dependency information. */
1231 char *deps_target
= 0;
1233 #if defined (RLIMIT_STACK) && defined (HAVE_GETRLIMIT) && defined (HAVE_SETRLIMIT)
1234 /* Get rid of any avoidable limit on stack size. */
1238 /* Set the stack limit huge so that alloca (particularly stringtab
1239 in dbxread.c) does not fail. */
1240 getrlimit (RLIMIT_STACK
, &rlim
);
1241 rlim
.rlim_cur
= rlim
.rlim_max
;
1242 setrlimit (RLIMIT_STACK
, &rlim
);
1247 signal (SIGPIPE
, pipe_closed
);
1250 progname
= base_name (argv
[0]);
1254 /* Remove extension from PROGNAME. */
1256 char *s
= progname
= savestring (progname
);
1258 if ((p
= rindex (s
, ';')) != 0) *p
= '\0'; /* strip version number */
1259 if ((p
= rindex (s
, '.')) != 0 /* strip type iff ".exe" */
1260 && (p
[1] == 'e' || p
[1] == 'E')
1261 && (p
[2] == 'x' || p
[2] == 'X')
1262 && (p
[3] == 'e' || p
[3] == 'E')
1271 /* Initialize is_idchar. */
1272 initialize_char_syntax ();
1274 no_line_directives
= 0;
1276 dump_macros
= dump_none
;
1279 cplusplus_comments
= 1;
1281 bzero ((char *) pend_files
, argc
* sizeof (char *));
1282 bzero ((char *) pend_defs
, argc
* sizeof (char *));
1283 bzero ((char *) pend_undefs
, argc
* sizeof (char *));
1284 bzero ((char *) pend_assertions
, argc
* sizeof (char *));
1285 bzero ((char *) pend_includes
, argc
* sizeof (char *));
1287 /* Process switches and find input file name. */
1289 for (i
= 1; i
< argc
; i
++) {
1290 if (argv
[i
][0] != '-') {
1291 if (out_fname
!= NULL
)
1292 fatal ("Usage: %s [switches] input output", argv
[0]);
1293 else if (in_fname
!= NULL
)
1294 out_fname
= argv
[i
];
1298 switch (argv
[i
][1]) {
1301 if (!strcmp (argv
[i
], "-include")) {
1303 fatal ("Filename missing after `-include' option");
1305 simplify_filename (pend_includes
[i
] = argv
[++i
]);
1307 if (!strcmp (argv
[i
], "-imacros")) {
1309 fatal ("Filename missing after `-imacros' option");
1311 simplify_filename (pend_files
[i
] = argv
[++i
]);
1313 if (!strcmp (argv
[i
], "-iprefix")) {
1315 fatal ("Filename missing after `-iprefix' option");
1317 include_prefix
= argv
[++i
];
1319 if (!strcmp (argv
[i
], "-ifoutput")) {
1320 output_conditionals
= 1;
1322 if (!strcmp (argv
[i
], "-isystem")) {
1323 struct file_name_list
*dirtmp
;
1325 if (! (dirtmp
= new_include_prefix (NULL_PTR
, NULL_PTR
,
1328 dirtmp
->c_system_include_path
= 1;
1330 if (before_system
== 0)
1331 before_system
= dirtmp
;
1333 last_before_system
->next
= dirtmp
;
1334 last_before_system
= dirtmp
; /* Tail follows the last one */
1336 /* Add directory to end of path for includes,
1337 with the default prefix at the front of its name. */
1338 if (!strcmp (argv
[i
], "-iwithprefix")) {
1339 struct file_name_list
*dirtmp
;
1342 if (include_prefix
!= 0)
1343 prefix
= include_prefix
;
1345 prefix
= savestring (GCC_INCLUDE_DIR
);
1346 /* Remove the `include' from /usr/local/lib/gcc.../include. */
1347 if (!strcmp (prefix
+ strlen (prefix
) - 8, "/include"))
1348 prefix
[strlen (prefix
) - 7] = 0;
1351 if (! (dirtmp
= new_include_prefix (NULL_PTR
, NULL_PTR
,
1352 prefix
, argv
[++i
])))
1355 if (after_include
== 0)
1356 after_include
= dirtmp
;
1358 last_after_include
->next
= dirtmp
;
1359 last_after_include
= dirtmp
; /* Tail follows the last one */
1361 /* Add directory to main path for includes,
1362 with the default prefix at the front of its name. */
1363 if (!strcmp (argv
[i
], "-iwithprefixbefore")) {
1364 struct file_name_list
*dirtmp
;
1367 if (include_prefix
!= 0)
1368 prefix
= include_prefix
;
1370 prefix
= savestring (GCC_INCLUDE_DIR
);
1371 /* Remove the `include' from /usr/local/lib/gcc.../include. */
1372 if (!strcmp (prefix
+ strlen (prefix
) - 8, "/include"))
1373 prefix
[strlen (prefix
) - 7] = 0;
1376 dirtmp
= new_include_prefix (NULL_PTR
, NULL_PTR
, prefix
, argv
[++i
]);
1377 append_include_chain (dirtmp
, dirtmp
);
1379 /* Add directory to end of path for includes. */
1380 if (!strcmp (argv
[i
], "-idirafter")) {
1381 struct file_name_list
*dirtmp
;
1383 if (! (dirtmp
= new_include_prefix (NULL_PTR
, NULL_PTR
,
1387 if (after_include
== 0)
1388 after_include
= dirtmp
;
1390 last_after_include
->next
= dirtmp
;
1391 last_after_include
= dirtmp
; /* Tail follows the last one */
1396 if (out_fname
!= NULL
)
1397 fatal ("Output filename specified twice");
1399 fatal ("Filename missing after -o option");
1400 out_fname
= argv
[++i
];
1401 if (!strcmp (out_fname
, "-"))
1406 if (!strcmp (argv
[i
], "-pedantic"))
1408 else if (!strcmp (argv
[i
], "-pedantic-errors")) {
1410 pedantic_errors
= 1;
1411 } else if (!strcmp (argv
[i
], "-pcp")) {
1414 fatal ("Filename missing after -pcp option");
1415 pcp_fname
= argv
[++i
];
1417 = ((pcp_fname
[0] != '-' || pcp_fname
[1] != '\0')
1418 ? fopen (pcp_fname
, "w")
1420 if (pcp_outfile
== 0)
1421 pfatal_with_name (pcp_fname
);
1427 if (!strcmp (argv
[i
], "-traditional")) {
1429 cplusplus_comments
= 0;
1430 } else if (!strcmp (argv
[i
], "-trigraphs")) {
1436 if (! strcmp (argv
[i
], "-lang-c"))
1437 cplusplus
= 0, cplusplus_comments
= 1, c89
= 0, objc
= 0;
1438 if (! strcmp (argv
[i
], "-lang-c89"))
1439 cplusplus
= 0, cplusplus_comments
= 0, c89
= 1, objc
= 0;
1440 if (! strcmp (argv
[i
], "-lang-c++"))
1441 cplusplus
= 1, cplusplus_comments
= 1, c89
= 0, objc
= 0;
1442 if (! strcmp (argv
[i
], "-lang-objc"))
1443 cplusplus
= 0, cplusplus_comments
= 1, c89
= 0, objc
= 1;
1444 if (! strcmp (argv
[i
], "-lang-objc++"))
1445 cplusplus
= 1, cplusplus_comments
= 1, c89
= 0, objc
= 1;
1446 if (! strcmp (argv
[i
], "-lang-asm"))
1448 if (! strcmp (argv
[i
], "-lint"))
1453 cplusplus
= 1, cplusplus_comments
= 1;
1457 inhibit_warnings
= 1;
1461 if (!strcmp (argv
[i
], "-Wtrigraphs"))
1463 else if (!strcmp (argv
[i
], "-Wno-trigraphs"))
1465 else if (!strcmp (argv
[i
], "-Wcomment"))
1467 else if (!strcmp (argv
[i
], "-Wno-comment"))
1469 else if (!strcmp (argv
[i
], "-Wcomments"))
1471 else if (!strcmp (argv
[i
], "-Wno-comments"))
1473 else if (!strcmp (argv
[i
], "-Wtraditional"))
1475 else if (!strcmp (argv
[i
], "-Wno-traditional"))
1477 else if (!strcmp (argv
[i
], "-Wundef"))
1479 else if (!strcmp (argv
[i
], "-Wno-undef"))
1481 else if (!strcmp (argv
[i
], "-Wimport"))
1483 else if (!strcmp (argv
[i
], "-Wno-import"))
1485 else if (!strcmp (argv
[i
], "-Werror"))
1486 warnings_are_errors
= 1;
1487 else if (!strcmp (argv
[i
], "-Wno-error"))
1488 warnings_are_errors
= 0;
1489 else if (!strcmp (argv
[i
], "-Wall"))
1497 /* The style of the choices here is a bit mixed.
1498 The chosen scheme is a hybrid of keeping all options in one string
1499 and specifying each option in a separate argument:
1500 -M|-MM|-MD file|-MMD file [-MG]. An alternative is:
1501 -M|-MM|-MD file|-MMD file|-MG|-MMG; or more concisely:
1502 -M[M][G][D file]. This is awkward to handle in specs, and is not
1504 /* ??? -MG must be specified in addition to one of -M or -MM.
1505 This can be relaxed in the future without breaking anything.
1506 The converse isn't true. */
1508 /* -MG isn't valid with -MD or -MMD. This is checked for later. */
1509 if (!strcmp (argv
[i
], "-MG"))
1511 print_deps_missing_files
= 1;
1514 if (!strcmp (argv
[i
], "-M"))
1516 else if (!strcmp (argv
[i
], "-MM"))
1518 else if (!strcmp (argv
[i
], "-MD"))
1520 else if (!strcmp (argv
[i
], "-MMD"))
1522 /* For -MD and -MMD options, write deps on file named by next arg. */
1523 if (!strcmp (argv
[i
], "-MD")
1524 || !strcmp (argv
[i
], "-MMD")) {
1526 fatal ("Filename missing after %s option", argv
[i
]);
1528 deps_file
= argv
[i
];
1531 /* For -M and -MM, write deps on standard output
1532 and suppress the usual output. */
1533 deps_stream
= stdout
;
1540 char *p
= argv
[i
] + 2;
1542 while ((c
= *p
++)) {
1543 /* Arg to -d specifies what parts of macros to dump */
1546 dump_macros
= dump_only
;
1550 dump_macros
= dump_names
;
1553 dump_macros
= dump_definitions
;
1564 if (argv
[i
][2] == '3')
1569 fprintf (stderr
, "GNU CPP version %s", version_string
);
1570 #ifdef TARGET_VERSION
1573 fprintf (stderr
, "\n");
1578 print_include_names
= 1;
1582 if (argv
[i
][2] != 0)
1583 pend_defs
[i
] = argv
[i
] + 2;
1584 else if (i
+ 1 == argc
)
1585 fatal ("Macro name missing after -D option");
1587 i
++, pend_defs
[i
] = argv
[i
];
1594 if (argv
[i
][2] != 0)
1596 else if (i
+ 1 == argc
)
1597 fatal ("Assertion missing after -A option");
1601 if (!strcmp (p
, "-")) {
1602 /* -A- eliminates all predefined macros and assertions.
1603 Let's include also any that were specified earlier
1604 on the command line. That way we can get rid of any
1605 that were passed automatically in from GCC. */
1607 inhibit_predefs
= 1;
1608 for (j
= 0; j
< i
; j
++)
1609 pend_defs
[j
] = pend_assertions
[j
] = 0;
1611 pend_assertions
[i
] = p
;
1612 pend_assertion_options
[i
] = "-A";
1617 case 'U': /* JF #undef something */
1618 if (argv
[i
][2] != 0)
1619 pend_undefs
[i
] = argv
[i
] + 2;
1620 else if (i
+ 1 == argc
)
1621 fatal ("Macro name missing after -U option");
1623 pend_undefs
[i
] = argv
[i
+1], i
++;
1627 put_out_comments
= 1;
1630 case 'E': /* -E comes from cc -E; ignore it. */
1634 no_line_directives
= 1;
1637 case '$': /* Don't include $ in identifiers. */
1638 is_idchar
['$'] = is_idstart
['$'] = 0;
1641 case 'I': /* Add directory to path for includes. */
1643 struct file_name_list
*dirtmp
;
1645 if (! ignore_srcdir
&& !strcmp (argv
[i
] + 2, "-")) {
1647 /* Don't use any preceding -I directories for #include <...>. */
1648 first_bracket_include
= 0;
1651 dirtmp
= new_include_prefix (last_include
, NULL_PTR
, "",
1652 argv
[i
][2] ? argv
[i
] + 2 : argv
[++i
]);
1653 append_include_chain (dirtmp
, dirtmp
);
1659 if (!strcmp (argv
[i
], "-nostdinc"))
1660 /* -nostdinc causes no default include directories.
1661 You must specify all include-file directories with -I. */
1662 no_standard_includes
= 1;
1663 else if (!strcmp (argv
[i
], "-nostdinc++"))
1664 /* -nostdinc++ causes no default C++-specific include directories. */
1665 no_standard_cplusplus_includes
= 1;
1666 else if (!strcmp (argv
[i
], "-noprecomp"))
1671 if (!strcmp (argv
[i
], "-remap"))
1676 /* Sun compiler passes undocumented switch "-undef".
1677 Let's assume it means to inhibit the predefined symbols. */
1678 inhibit_predefs
= 1;
1681 case '\0': /* JF handle '-' as file name meaning stdin or stdout */
1682 if (in_fname
== NULL
) {
1685 } else if (out_fname
== NULL
) {
1688 } /* else fall through into error */
1691 fatal ("Invalid option `%s'", argv
[i
]);
1696 /* Add dirs from CPATH after dirs from -I. */
1697 /* There seems to be confusion about what CPATH should do,
1698 so for the moment it is not documented. */
1699 /* Some people say that CPATH should replace the standard include dirs,
1700 but that seems pointless: it comes before them, so it overrides them
1702 cp
= getenv ("CPATH");
1703 if (cp
&& ! no_standard_includes
)
1706 /* Initialize output buffer */
1708 outbuf
.buf
= (U_CHAR
*) xmalloc (OUTBUF_SIZE
);
1709 outbuf
.bufp
= outbuf
.buf
;
1710 outbuf
.length
= OUTBUF_SIZE
;
1712 /* Do partial setup of input buffer for the sake of generating
1713 early #line directives (when -g is in effect). */
1715 fp
= &instack
[++indepth
];
1716 if (in_fname
== NULL
)
1718 fp
->nominal_fname
= fp
->fname
= in_fname
;
1721 /* In C++, wchar_t is a distinct basic type, and we can expect
1722 __wchar_t to be defined by cc1plus. */
1724 wchar_type
= "__wchar_t";
1726 /* Install __LINE__, etc. Must follow initialize_char_syntax
1727 and option processing. */
1728 initialize_builtins (fp
, &outbuf
);
1730 /* Do standard #defines and assertions
1731 that identify system and machine type. */
1733 if (!inhibit_predefs
) {
1734 char *p
= (char *) alloca (strlen (predefs
) + 1);
1735 strcpy (p
, predefs
);
1738 while (*p
== ' ' || *p
== '\t')
1740 /* Handle -D options. */
1741 if (p
[0] == '-' && p
[1] == 'D') {
1743 while (*p
&& *p
!= ' ' && *p
!= '\t')
1748 output_line_directive (fp
, &outbuf
, 0, same_file
);
1749 make_definition (q
, &outbuf
);
1750 while (*p
== ' ' || *p
== '\t')
1752 } else if (p
[0] == '-' && p
[1] == 'A') {
1753 /* Handle -A options (assertions). */
1762 past_name
= assertion
;
1763 /* Locate end of name. */
1764 while (*past_name
&& *past_name
!= ' '
1765 && *past_name
!= '\t' && *past_name
!= '(')
1767 /* Locate `(' at start of value. */
1769 while (*value
&& (*value
== ' ' || *value
== '\t'))
1771 if (*value
++ != '(')
1773 while (*value
&& (*value
== ' ' || *value
== '\t'))
1776 /* Locate end of value. */
1777 while (*past_value
&& *past_value
!= ' '
1778 && *past_value
!= '\t' && *past_value
!= ')')
1780 termination
= past_value
;
1781 while (*termination
&& (*termination
== ' ' || *termination
== '\t'))
1783 if (*termination
++ != ')')
1785 if (*termination
&& *termination
!= ' ' && *termination
!= '\t')
1787 /* Temporarily null-terminate the value. */
1788 save_char
= *termination
;
1789 *termination
= '\0';
1790 /* Install the assertion. */
1791 make_assertion ("-A", assertion
);
1792 *termination
= (char) save_char
;
1794 while (*p
== ' ' || *p
== '\t')
1802 /* Now handle the command line options. */
1804 /* Do -U's, -D's and -A's in the order they were seen. */
1805 for (i
= 1; i
< argc
; i
++) {
1806 if (pend_undefs
[i
]) {
1808 output_line_directive (fp
, &outbuf
, 0, same_file
);
1809 make_undef (pend_undefs
[i
], &outbuf
);
1813 output_line_directive (fp
, &outbuf
, 0, same_file
);
1814 make_definition (pend_defs
[i
], &outbuf
);
1816 if (pend_assertions
[i
])
1817 make_assertion (pend_assertion_options
[i
], pend_assertions
[i
]);
1820 done_initializing
= 1;
1822 { /* Read the appropriate environment variable and if it exists
1823 replace include_defaults with the listed path. */
1825 switch ((objc
<< 1) + cplusplus
)
1828 epath
= getenv ("C_INCLUDE_PATH");
1831 epath
= getenv ("CPLUS_INCLUDE_PATH");
1834 epath
= getenv ("OBJC_INCLUDE_PATH");
1837 epath
= getenv ("OBJCPLUS_INCLUDE_PATH");
1840 /* If the environment var for this language is set,
1841 add to the default list of include directories. */
1844 char *startp
, *endp
;
1846 for (num_dirs
= 1, startp
= epath
; *startp
; startp
++)
1847 if (*startp
== PATH_SEPARATOR
)
1850 = (struct default_include
*) xmalloc ((num_dirs
1851 * sizeof (struct default_include
))
1852 + sizeof (include_defaults_array
));
1853 startp
= endp
= epath
;
1857 if (c
== PATH_SEPARATOR
|| !c
) {
1859 include_defaults
[num_dirs
].fname
1860 = startp
== endp
? "." : savestring (startp
);
1862 include_defaults
[num_dirs
].component
= 0;
1863 include_defaults
[num_dirs
].cplusplus
= cplusplus
;
1864 include_defaults
[num_dirs
].cxx_aware
= 1;
1871 /* Put the usual defaults back in at the end. */
1872 bcopy ((char *) include_defaults_array
,
1873 (char *) &include_defaults
[num_dirs
],
1874 sizeof (include_defaults_array
));
1878 append_include_chain (before_system
, last_before_system
);
1879 first_system_include
= before_system
;
1881 /* Unless -fnostdinc,
1882 tack on the standard include file dirs to the specified list */
1883 if (!no_standard_includes
) {
1884 struct default_include
*p
= include_defaults
;
1885 char *specd_prefix
= include_prefix
;
1886 char *default_prefix
= savestring (GCC_INCLUDE_DIR
);
1887 int default_len
= 0;
1888 /* Remove the `include' from /usr/local/lib/gcc.../include. */
1889 if (!strcmp (default_prefix
+ strlen (default_prefix
) - 8, "/include")) {
1890 default_len
= strlen (default_prefix
) - 7;
1891 default_prefix
[default_len
] = 0;
1893 /* Search "translated" versions of GNU directories.
1894 These have /usr/local/lib/gcc... replaced by specd_prefix. */
1895 if (specd_prefix
!= 0 && default_len
!= 0)
1896 for (p
= include_defaults
; p
->fname
; p
++) {
1897 /* Some standard dirs are only for C++. */
1898 if (!p
->cplusplus
|| (cplusplus
&& !no_standard_cplusplus_includes
)) {
1899 /* Does this dir start with the prefix? */
1900 if (!strncmp (p
->fname
, default_prefix
, default_len
)) {
1901 /* Yes; change prefix and add to search list. */
1902 struct file_name_list
*new
1903 = new_include_prefix (NULL_PTR
, NULL_PTR
, specd_prefix
,
1904 p
->fname
+ default_len
);
1906 new->c_system_include_path
= !p
->cxx_aware
;
1907 append_include_chain (new, new);
1908 if (first_system_include
== 0)
1909 first_system_include
= new;
1914 /* Search ordinary names for GNU include directories. */
1915 for (p
= include_defaults
; p
->fname
; p
++) {
1916 /* Some standard dirs are only for C++. */
1917 if (!p
->cplusplus
|| (cplusplus
&& !no_standard_cplusplus_includes
)) {
1918 struct file_name_list
*new
1919 = new_include_prefix (NULL_PTR
, p
->component
, "", p
->fname
);
1921 new->c_system_include_path
= !p
->cxx_aware
;
1922 append_include_chain (new, new);
1923 if (first_system_include
== 0)
1924 first_system_include
= new;
1930 /* Tack the after_include chain at the end of the include chain. */
1931 append_include_chain (after_include
, last_after_include
);
1932 if (first_system_include
== 0)
1933 first_system_include
= after_include
;
1935 /* With -v, print the list of dirs to search. */
1937 struct file_name_list
*p
;
1938 fprintf (stderr
, "#include \"...\" search starts here:\n");
1939 for (p
= include
; p
; p
= p
->next
) {
1940 if (p
== first_bracket_include
)
1941 fprintf (stderr
, "#include <...> search starts here:\n");
1943 fprintf (stderr
, " .\n");
1944 else if (!strcmp (p
->fname
, "/") || !strcmp (p
->fname
, "//"))
1945 fprintf (stderr
, " %s\n", p
->fname
);
1947 /* Omit trailing '/'. */
1948 fprintf (stderr
, " %.*s\n", (int) strlen (p
->fname
) - 1, p
->fname
);
1950 fprintf (stderr
, "End of search list.\n");
1953 /* -MG doesn't select the form of output and must be specified with one of
1954 -M or -MM. -MG doesn't make sense with -MD or -MMD since they don't
1955 inhibit compilation. */
1956 if (print_deps_missing_files
&& (print_deps
== 0 || !inhibit_output
))
1957 fatal ("-MG must be specified with one of -M or -MM");
1959 /* Either of two environment variables can specify output of deps.
1960 Its value is either "OUTPUT_FILE" or "OUTPUT_FILE DEPS_TARGET",
1961 where OUTPUT_FILE is the file to write deps info to
1962 and DEPS_TARGET is the target to mention in the deps. */
1965 && (getenv ("SUNPRO_DEPENDENCIES") != 0
1966 || getenv ("DEPENDENCIES_OUTPUT") != 0)) {
1967 char *spec
= getenv ("DEPENDENCIES_OUTPUT");
1972 spec
= getenv ("SUNPRO_DEPENDENCIES");
1979 /* Find the space before the DEPS_TARGET, if there is one. */
1980 /* This should use index. (mrs) */
1981 while (*s
!= 0 && *s
!= ' ') s
++;
1983 deps_target
= s
+ 1;
1984 output_file
= xmalloc (s
- spec
+ 1);
1985 bcopy (spec
, output_file
, s
- spec
);
1986 output_file
[s
- spec
] = 0;
1993 deps_file
= output_file
;
1997 /* For -M, print the expected object file name
1998 as the target of this Make-rule. */
2000 deps_allocated_size
= 200;
2001 deps_buffer
= xmalloc (deps_allocated_size
);
2007 deps_output (deps_target
, ':');
2008 } else if (*in_fname
== 0) {
2009 deps_output ("-", ':');
2014 q
= base_name (in_fname
);
2016 /* Copy remainder to mungable area. */
2017 p
= (char *) alloca (strlen(q
) + 8);
2020 /* Output P, but remove known suffixes. */
2024 && p
[len
- 2] == '.'
2025 && index("cCsSm", p
[len
- 1]))
2028 && p
[len
- 3] == '.'
2029 && p
[len
- 2] == 'c'
2030 && p
[len
- 1] == 'c')
2033 && p
[len
- 4] == '.'
2034 && p
[len
- 3] == 'c'
2035 && p
[len
- 2] == 'x'
2036 && p
[len
- 1] == 'x')
2039 && p
[len
- 4] == '.'
2040 && p
[len
- 3] == 'c'
2041 && p
[len
- 2] == 'p'
2042 && p
[len
- 1] == 'p')
2045 /* Supply our own suffix. */
2046 strcpy (q
, OBJECT_SUFFIX
);
2048 deps_output (p
, ':');
2049 deps_output (in_fname
, ' ');
2053 /* Scan the -imacros files before the main input.
2054 Much like #including them, but with no_output set
2055 so that only their macro definitions matter. */
2057 no_output
++; no_record_file
++;
2058 for (i
= 1; i
< argc
; i
++)
2059 if (pend_files
[i
]) {
2060 struct include_file
*inc
;
2061 int fd
= open_include_file (pend_files
[i
], NULL_PTR
, NULL_PTR
, &inc
);
2063 perror_with_name (pend_files
[i
]);
2064 return FATAL_EXIT_CODE
;
2066 finclude (fd
, inc
, &outbuf
, 0, NULL_PTR
);
2068 no_output
--; no_record_file
--;
2070 /* Copy the entire contents of the main input file into
2071 the stacked input buffer previously allocated for it. */
2073 /* JF check for stdin */
2074 if (in_fname
== NULL
|| *in_fname
== 0) {
2077 } else if ((f
= open (in_fname
, O_RDONLY
, 0666)) < 0)
2080 if (fstat (f
, &st
) != 0)
2081 pfatal_with_name (in_fname
);
2082 fp
->nominal_fname
= fp
->fname
= in_fname
;
2084 fp
->system_header_p
= 0;
2085 /* JF all this is mine about reading pipes and ttys */
2086 if (! S_ISREG (st
.st_mode
)) {
2087 /* Read input from a file that is not a normal disk file.
2088 We cannot preallocate a buffer with the correct size,
2089 so we must read in the file a piece at the time and make it bigger. */
2094 if (S_ISDIR (st
.st_mode
))
2095 fatal ("Input file `%s' is a directory", in_fname
);
2099 fp
->buf
= (U_CHAR
*) xmalloc (bsize
+ 2);
2101 cnt
= safe_read (f
, (char *) fp
->buf
+ size
, bsize
- size
);
2102 if (cnt
< 0) goto perror
; /* error! */
2104 if (size
!= bsize
) break; /* End of file */
2106 fp
->buf
= (U_CHAR
*) xrealloc (fp
->buf
, bsize
+ 2);
2110 /* Read a file whose size we can determine in advance.
2111 For the sake of VMS, st.st_size is just an upper bound. */
2112 size_t s
= (size_t) st
.st_size
;
2113 if (s
!= st
.st_size
|| s
+ 2 < s
)
2115 fp
->buf
= (U_CHAR
*) xmalloc (s
+ 2);
2116 fp
->length
= safe_read (f
, (char *) fp
->buf
, s
);
2117 if (fp
->length
< 0) goto perror
;
2120 fp
->if_stack
= if_stack
;
2122 /* Make sure data ends with a newline. And put a null after it. */
2124 if ((fp
->length
> 0 && fp
->buf
[fp
->length
- 1] != '\n')
2125 /* Backslash-newline at end is not good enough. */
2126 || (fp
->length
> 1 && fp
->buf
[fp
->length
- 2] == '\\')) {
2127 fp
->buf
[fp
->length
++] = '\n';
2128 missing_newline
= 1;
2130 fp
->buf
[fp
->length
] = '\0';
2132 /* Unless inhibited, convert trigraphs in the input. */
2137 /* Now that we know the input file is valid, open the output. */
2139 if (!out_fname
|| !strcmp (out_fname
, ""))
2140 out_fname
= "stdout";
2141 else if (! freopen (out_fname
, "w", stdout
))
2142 pfatal_with_name (out_fname
);
2144 output_line_directive (fp
, &outbuf
, 0, same_file
);
2146 /* Scan the -include files before the main input. */
2149 for (i
= 1; i
< argc
; i
++)
2150 if (pend_includes
[i
]) {
2151 struct include_file
*inc
;
2152 int fd
= open_include_file (pend_includes
[i
], NULL_PTR
, NULL_PTR
, &inc
);
2154 perror_with_name (pend_includes
[i
]);
2155 return FATAL_EXIT_CODE
;
2157 finclude (fd
, inc
, &outbuf
, 0, NULL_PTR
);
2161 /* Scan the input, processing macros and directives. */
2163 rescan (&outbuf
, 0);
2165 if (missing_newline
)
2168 if (pedantic
&& missing_newline
)
2169 pedwarn ("file does not end in newline");
2171 /* Now we have processed the entire input
2172 Write whichever kind of output has been requested. */
2174 if (dump_macros
== dump_only
)
2176 else if (! inhibit_output
) {
2181 /* Don't actually write the deps file if compilation has failed. */
2183 if (deps_file
&& ! (deps_stream
= fopen (deps_file
, deps_mode
)))
2184 pfatal_with_name (deps_file
);
2185 fputs (deps_buffer
, deps_stream
);
2186 putc ('\n', deps_stream
);
2188 if (ferror (deps_stream
) || fclose (deps_stream
) != 0)
2189 fatal ("I/O error on output");
2194 if (pcp_outfile
&& pcp_outfile
!= stdout
2195 && (ferror (pcp_outfile
) || fclose (pcp_outfile
) != 0))
2196 fatal ("I/O error on `-pcp' output");
2198 if (ferror (stdout
) || fclose (stdout
) != 0)
2199 fatal ("I/O error on output");
2202 exit (FATAL_EXIT_CODE
);
2203 exit (SUCCESS_EXIT_CODE
);
2206 pfatal_with_name (in_fname
);
2210 /* Given a colon-separated list of file names PATH,
2211 add all the names to the search path for include files. */
2225 struct file_name_list
*dirtmp
;
2227 /* Find the end of this name. */
2228 while ((c
= *q
++) != PATH_SEPARATOR
&& c
)
2232 dirtmp
= new_include_prefix (last_include
, NULL_PTR
,
2233 "", p
== q
? "." : p
);
2235 append_include_chain (dirtmp
, dirtmp
);
2237 /* Advance past this name. */
2244 /* Return the address of the first character in S that equals C.
2245 S is an array of length N, possibly containing '\0's, and followed by '\0'.
2246 Return 0 if there is no such character. Assume that C itself is not '\0'.
2247 If we knew we could use memchr, we could just invoke memchr (S, C, N),
2248 but unfortunately memchr isn't autoconfigured yet. */
2256 char *p
= (char *) s
;
2258 char *q
= index (p
, c
);
2260 return (U_CHAR
*) q
;
2262 size_t l
= strlen (p
);
2272 /* Pre-C-Preprocessor to translate ANSI trigraph idiocy in BUF
2273 before main CCCP processing. Name `pcp' is also in honor of the
2274 drugs the trigraph designers must have been on.
2276 Using an extra pass through the buffer takes a little extra time,
2277 but is infinitely less hairy than trying to handle trigraphs inside
2278 strings, etc. everywhere, and also makes sure that trigraphs are
2279 only translated in the top level of processing. */
2285 register U_CHAR c
, *fptr
, *bptr
, *sptr
, *lptr
;
2288 fptr
= bptr
= sptr
= buf
->buf
;
2289 lptr
= fptr
+ buf
->length
;
2290 while ((sptr
= index0 (sptr
, '?', (size_t) (lptr
- sptr
))) != NULL
) {
2327 len
= sptr
- fptr
- 2;
2329 /* BSD doc says bcopy () works right for overlapping strings. In ANSI
2330 C, this will be memmove (). */
2331 if (bptr
!= fptr
&& len
> 0)
2332 bcopy ((char *) fptr
, (char *) bptr
, len
);
2338 len
= buf
->length
- (fptr
- buf
->buf
);
2339 if (bptr
!= fptr
&& len
> 0)
2340 bcopy ((char *) fptr
, (char *) bptr
, len
);
2341 buf
->length
-= fptr
- bptr
;
2342 buf
->buf
[buf
->length
] = '\0';
2343 if (warn_trigraphs
&& fptr
!= bptr
)
2344 warning_with_line (0, "%lu trigraph(s) encountered",
2345 (unsigned long) (fptr
- bptr
) / 2);
2348 /* Move all backslash-newline pairs out of embarrassing places.
2349 Exchange all such pairs following BP
2350 with any potentially-embarrassing characters that follow them.
2351 Potentially-embarrassing characters are / and *
2352 (because a backslash-newline inside a comment delimiter
2353 would cause it not to be recognized). */
2359 register U_CHAR
*p
= bp
;
2361 /* First count the backslash-newline pairs here. */
2363 while (p
[0] == '\\' && p
[1] == '\n')
2366 /* What follows the backslash-newlines is not embarrassing. */
2368 if (*p
!= '/' && *p
!= '*')
2371 /* Copy all potentially embarrassing characters
2372 that follow the backslash-newline pairs
2373 down to where the pairs originally started. */
2375 while (*p
== '*' || *p
== '/')
2378 /* Now write the same number of pairs after the embarrassing chars. */
2385 /* Like newline_fix but for use within a directive-name.
2386 Move any backslash-newlines up past any following symbol constituents. */
2389 name_newline_fix (bp
)
2392 register U_CHAR
*p
= bp
;
2394 /* First count the backslash-newline pairs here. */
2395 while (p
[0] == '\\' && p
[1] == '\n')
2398 /* What follows the backslash-newlines is not embarrassing. */
2403 /* Copy all potentially embarrassing characters
2404 that follow the backslash-newline pairs
2405 down to where the pairs originally started. */
2407 while (is_idchar
[*p
])
2410 /* Now write the same number of pairs after the embarrassing chars. */
2417 /* Look for lint commands in comments.
2419 When we come in here, ibp points into a comment. Limit is as one expects.
2420 scan within the comment -- it should start, after lwsp, with a lint command.
2421 If so that command is returned as a (constant) string.
2423 Upon return, any arg will be pointed to with argstart and will be
2424 arglen long. Note that we don't parse that arg since it will just
2425 be printed out again. */
2428 get_lintcmd (ibp
, limit
, argstart
, arglen
, cmdlen
)
2429 register U_CHAR
*ibp
;
2430 register U_CHAR
*limit
;
2431 U_CHAR
**argstart
; /* point to command arg */
2432 int *arglen
, *cmdlen
; /* how long they are */
2434 HOST_WIDE_INT linsize
;
2435 register U_CHAR
*numptr
; /* temp for arg parsing */
2439 SKIP_WHITE_SPACE (ibp
);
2441 if (ibp
>= limit
) return NULL
;
2443 linsize
= limit
- ibp
;
2445 /* Oh, I wish C had lexical functions... hell, I'll just open-code the set */
2446 if ((linsize
>= 10) && !bcmp (ibp
, "NOTREACHED", 10)) {
2448 return "NOTREACHED";
2450 if ((linsize
>= 8) && !bcmp (ibp
, "ARGSUSED", 8)) {
2454 if ((linsize
>= 11) && !bcmp (ibp
, "LINTLIBRARY", 11)) {
2456 return "LINTLIBRARY";
2458 if ((linsize
>= 7) && !bcmp (ibp
, "VARARGS", 7)) {
2460 ibp
+= 7; linsize
-= 7;
2461 if ((linsize
== 0) || ! isdigit (*ibp
)) return "VARARGS";
2463 /* OK, read a number */
2464 for (numptr
= *argstart
= ibp
; (numptr
< limit
) && isdigit (*numptr
);
2466 *arglen
= numptr
- *argstart
;
2473 * The main loop of the program.
2475 * Read characters from the input stack, transferring them to the
2478 * Macros are expanded and push levels on the input stack.
2479 * At the end of such a level it is popped off and we keep reading.
2480 * At the end of any other kind of level, we return.
2481 * #-directives are handled, except within macros.
2483 * If OUTPUT_MARKS is nonzero, keep Newline markers found in the input
2484 * and insert them when appropriate. This is set while scanning macro
2485 * arguments before substitution. It is zero when scanning for final output.
2486 * There are three types of Newline markers:
2487 * * Newline - follows a macro name that was not expanded
2488 * because it appeared inside an expansion of the same macro.
2489 * This marker prevents future expansion of that identifier.
2490 * When the input is rescanned into the final output, these are deleted.
2491 * These are also deleted by ## concatenation.
2492 * * Newline Space (or Newline and any other whitespace character)
2493 * stands for a place that tokens must be separated or whitespace
2494 * is otherwise desirable, but where the ANSI standard specifies there
2495 * is no whitespace. This marker turns into a Space (or whichever other
2496 * whitespace char appears in the marker) in the final output,
2497 * but it turns into nothing in an argument that is stringified with #.
2498 * Such stringified arguments are the only place where the ANSI standard
2499 * specifies with precision that whitespace may not appear.
2501 * During this function, IP->bufp is kept cached in IBP for speed of access.
2502 * Likewise, OP->bufp is kept in OBP. Before calling a subroutine
2503 * IBP, IP and OBP must be copied back to memory. IP and IBP are
2504 * copied back with the RECACHE macro. OBP must be copied back from OP->bufp
2505 * explicitly, and before RECACHE, since RECACHE uses OBP.
2509 rescan (op
, output_marks
)
2513 /* Character being scanned in main loop. */
2516 /* Length of pending accumulated identifier. */
2517 register int ident_length
= 0;
2519 /* Hash code of pending accumulated identifier. */
2520 register int hash
= 0;
2522 /* Current input level (&instack[indepth]). */
2525 /* Pointer for scanning input. */
2526 register U_CHAR
*ibp
;
2528 /* Pointer to end of input. End of scan is controlled by LIMIT. */
2529 register U_CHAR
*limit
;
2531 /* Pointer for storing output. */
2532 register U_CHAR
*obp
;
2534 /* REDO_CHAR is nonzero if we are processing an identifier
2535 after backing up over the terminating character.
2536 Sometimes we process an identifier without backing up over
2537 the terminating character, if the terminating character
2538 is not special. Backing up is done so that the terminating character
2539 will be dispatched on again once the identifier is dealt with. */
2542 /* 1 if within an identifier inside of which a concatenation
2543 marker (Newline -) has been seen. */
2544 int concatenated
= 0;
2546 /* While scanning a comment or a string constant,
2547 this records the line it started on, for error messages. */
2550 /* Record position of last `real' newline. */
2551 U_CHAR
*beg_of_line
;
2553 /* Pop the innermost input stack level, assuming it is a macro expansion. */
2556 do { ip->macro->type = T_MACRO; \
2557 if (ip->free_ptr) free (ip->free_ptr); \
2558 --indepth; } while (0)
2560 /* Reload `rescan's local variables that describe the current
2561 level of the input stack. */
2564 do { ip = &instack[indepth]; \
2566 limit = ip->buf + ip->length; \
2568 check_expand (op, limit - ibp); \
2570 obp = op->bufp; } while (0)
2572 if (no_output
&& instack
[indepth
].fname
!= 0)
2573 skip_if_group (&instack
[indepth
], 1, NULL
);
2580 /* Our caller must always put a null after the end of
2581 the input at each input stack level. */
2591 if (*ibp
== '\n' && !ip
->macro
) {
2592 /* At the top level, always merge lines ending with backslash-newline,
2593 even in middle of identifier. But do not merge lines in a macro,
2594 since backslash might be followed by a newline-space marker. */
2597 --obp
; /* remove backslash from obuf */
2600 /* If ANSI, backslash is just another character outside a string. */
2603 /* Otherwise, backslash suppresses specialness of following char,
2604 so copy it here to prevent the switch from seeing it.
2605 But first get any pending identifier processed. */
2606 if (ident_length
> 0)
2613 if (ident_length
|| ip
->macro
|| traditional
)
2615 while (*ibp
== '\\' && ibp
[1] == '\n') {
2621 /* Treat this %: digraph as if it were #. */
2625 if (assertions_flag
) {
2628 /* Copy #foo (bar lose) without macro expansion. */
2629 obp
[-1] = '#'; /* In case it was '%'. */
2630 SKIP_WHITE_SPACE (ibp
);
2631 while (is_idchar
[*ibp
])
2633 SKIP_WHITE_SPACE (ibp
);
2636 skip_paren_group (ip
);
2637 bcopy ((char *) ibp
, (char *) obp
, ip
->bufp
- ibp
);
2638 obp
+= ip
->bufp
- ibp
;
2644 /* If this is expanding a macro definition, don't recognize
2645 preprocessing directives. */
2648 /* If this is expand_into_temp_buffer,
2649 don't recognize them either. Warn about them
2650 only after an actual newline at this level,
2651 not at the beginning of the input level. */
2653 if (ip
->buf
!= beg_of_line
)
2654 warning ("preprocessing directive not recognized within macro arg");
2661 /* # keyword: a # must be first nonblank char on the line */
2662 if (beg_of_line
== 0)
2667 /* Scan from start of line, skipping whitespace, comments
2668 and backslash-newlines, and see if we reach this #.
2669 If not, this # is not special. */
2671 /* If -traditional, require # to be at beginning of line. */
2674 if (is_hor_space
[*bp
])
2676 else if (*bp
== '\\' && bp
[1] == '\n')
2678 else if (*bp
== '/' && bp
[1] == '*') {
2680 while (!(*bp
== '*' && bp
[1] == '/'))
2684 /* There is no point in trying to deal with C++ // comments here,
2685 because if there is one, then this # must be part of the
2686 comment and we would never reach here. */
2692 while (bp
[1] == '\\' && bp
[2] == '\n')
2696 /* %: appears at start of line; skip past the ':' too. */
2705 /* This # can start a directive. */
2707 --obp
; /* Don't copy the '#' */
2711 if (! handle_directive (ip
, op
)) {
2715 /* Not a known directive: treat it as ordinary text.
2716 IP, OP, IBP, etc. have not been changed. */
2717 if (no_output
&& instack
[indepth
].fname
) {
2718 /* If not generating expanded output,
2719 what we do with ordinary text is skip it.
2720 Discard everything until next # directive. */
2721 skip_if_group (&instack
[indepth
], 1, 0);
2726 *obp
++ = '#'; /* Copy # (even if it was originally %:). */
2727 /* Don't expand an identifier that could be a macro directive.
2728 (Section 3.8.3 of the ANSI C standard) */
2729 SKIP_WHITE_SPACE (ibp
);
2730 if (is_idstart
[*ibp
])
2733 while (is_idchar
[*ibp
])
2741 /* A # directive has been successfully processed. */
2742 /* If not generating expanded output, ignore everything until
2743 next # directive. */
2744 if (no_output
&& instack
[indepth
].fname
)
2745 skip_if_group (&instack
[indepth
], 1, 0);
2751 case '\"': /* skip quoted string */
2753 /* A single quoted string is treated like a double -- some
2754 programs (e.g., troff) are perverse this way */
2756 /* Handle any pending identifier;
2757 but the L in L'...' or L"..." is not an identifier. */
2759 && ! (ident_length
== 1 && hash
== HASHSTEP (0, 'L')))
2762 start_line
= ip
->lineno
;
2764 /* Skip ahead to a matching quote. */
2768 if (ip
->macro
!= 0) {
2769 /* try harder: this string crosses a macro expansion boundary.
2770 This can happen naturally if -traditional.
2771 Otherwise, only -D can make a macro with an unmatched quote. */
2777 error_with_line (line_for_error (start_line
),
2778 "unterminated string or character constant");
2779 error_with_line (multiline_string_line
,
2780 "possible real start of unterminated constant");
2781 multiline_string_line
= 0;
2790 /* Traditionally, end of line ends a string constant with no error.
2791 So exit the loop and record the new line. */
2797 error_with_line (line_for_error (start_line
),
2798 "unterminated character constant");
2801 if (multiline_string_line
== 0) {
2803 pedwarn_with_line (line_for_error (start_line
),
2804 "string constant runs past end of line");
2805 multiline_string_line
= ip
->lineno
- 1;
2813 /* Backslash newline is replaced by nothing at all,
2814 but keep the line counts correct. */
2819 /* ANSI stupidly requires that in \\ the second \
2820 is *not* prevented from combining with a newline. */
2821 while (*ibp
== '\\' && ibp
[1] == '\n') {
2840 if (*ibp
== '\\' && ibp
[1] == '\n')
2844 && !(cplusplus_comments
&& *ibp
== '/'))
2852 /* C++ style comment... */
2853 start_line
= ip
->lineno
;
2855 /* Comments are equivalent to spaces. */
2856 if (! put_out_comments
)
2860 U_CHAR
*before_bp
= ibp
;
2862 while (++ibp
< limit
) {
2864 if (ibp
[-1] != '\\') {
2865 if (put_out_comments
) {
2866 bcopy ((char *) before_bp
, (char *) obp
, ibp
- before_bp
);
2867 obp
+= ibp
- before_bp
;
2872 warning ("multiline `//' comment");
2874 /* Copy the newline into the output buffer, in order to
2875 avoid the pain of a #line every time a multiline comment
2877 if (!put_out_comments
)
2886 /* Ordinary C comment. Skip it, optionally copying it to output. */
2888 start_line
= ip
->lineno
;
2890 ++ibp
; /* Skip the star. */
2892 /* If this cpp is for lint, we peek inside the comments: */
2896 char *lintcmd
= get_lintcmd (ibp
, limit
, &argbp
, &arglen
, &cmdlen
);
2898 if (lintcmd
!= NULL
) {
2900 check_expand (op
, cmdlen
+ arglen
+ 14);
2902 /* I believe it is always safe to emit this newline: */
2904 bcopy ("#pragma lint ", (char *) obp
, 13);
2906 bcopy (lintcmd
, (char *) obp
, cmdlen
);
2911 bcopy (argbp
, (char *) obp
, arglen
);
2915 /* OK, now bring us back to the state we were in before we entered
2916 this branch. We need #line because the #pragma's newline always
2917 messes up the line count. */
2919 output_line_directive (ip
, op
, 0, same_file
);
2920 check_expand (op
, limit
- ibp
+ 2);
2926 /* Comments are equivalent to spaces.
2927 Note that we already output the slash; we might not want it.
2928 For -traditional, a comment is equivalent to nothing. */
2929 if (! put_out_comments
) {
2939 U_CHAR
*before_bp
= ibp
;
2944 if (ibp
[-2] == '/' && warn_comments
)
2945 warning ("`/*' within comment");
2946 if (*ibp
== '\\' && ibp
[1] == '\n')
2954 /* Copy the newline into the output buffer, in order to
2955 avoid the pain of a #line every time a multiline comment
2957 if (!put_out_comments
)
2964 error_with_line (line_for_error (start_line
),
2965 "unterminated comment");
2974 if (put_out_comments
) {
2975 bcopy ((char *) before_bp
, (char *) obp
, ibp
- before_bp
);
2976 obp
+= ibp
- before_bp
;
2982 if (! is_idchar
['$'])
2985 pedwarn ("`$' in identifier");
2988 case '0': case '1': case '2': case '3': case '4':
2989 case '5': case '6': case '7': case '8': case '9':
2990 /* If digit is not part of identifier, it starts a number,
2991 which means that following letters are not an identifier.
2992 "0x5" does not refer to an identifier "x5".
2993 So copy all alphanumerics that follow without accumulating
2994 as an identifier. Periods also, for sake of "3.e7". */
2996 if (ident_length
== 0) {
2998 while (ibp
[0] == '\\' && ibp
[1] == '\n') {
3003 if (!is_idchar
[c
] && c
!= '.') {
3008 /* A sign can be part of a preprocessing number
3009 if it follows an `e' or `p'. */
3010 if (c
== 'e' || c
== 'E' || c
== 'p' || c
== 'P') {
3011 while (ibp
[0] == '\\' && ibp
[1] == '\n') {
3015 if (*ibp
== '+' || *ibp
== '-') {
3017 /* But traditional C does not let the token go past the sign,
3018 and C89 does not allow `p'. */
3019 if (traditional
|| (c89
&& (c
== 'p' || c
== 'P')))
3029 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
3030 case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
3031 case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
3032 case 's': case 't': case 'u': case 'v': case 'w': case 'x':
3034 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
3035 case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
3036 case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
3037 case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
3041 /* Compute step of hash function, to avoid a proc call on every token */
3042 hash
= HASHSTEP (hash
, c
);
3046 if (ip
->fname
== 0 && *ibp
== '-') {
3047 /* Newline - inhibits expansion of preceding token.
3048 If expanding a macro arg, we keep the newline -.
3049 In final output, it is deleted.
3050 We recognize Newline - in macro bodies and macro args. */
3051 if (! concatenated
) {
3056 if (!output_marks
) {
3059 /* If expanding a macro arg, keep the newline -. */
3065 /* If reprocessing a macro expansion, newline is a special marker. */
3066 else if (ip
->macro
!= 0) {
3067 /* Newline White is a "funny space" to separate tokens that are
3068 supposed to be separate but without space between.
3069 Here White means any whitespace character.
3070 Newline - marks a recursive macro use that is not
3071 supposed to be expandable. */
3073 if (is_space
[*ibp
]) {
3074 /* Newline Space does not prevent expansion of preceding token
3075 so expand the preceding token and then come back. */
3076 if (ident_length
> 0)
3079 /* If generating final output, newline space makes a space. */
3080 if (!output_marks
) {
3082 /* And Newline Newline makes a newline, so count it. */
3083 if (obp
[-1] == '\n')
3086 /* If expanding a macro arg, keep the newline space.
3087 If the arg gets stringified, newline space makes nothing. */
3090 } else abort (); /* Newline followed by something random? */
3094 /* If there is a pending identifier, handle it and come back here. */
3095 if (ident_length
> 0)
3100 /* Update the line counts and output a #line if necessary. */
3103 if (ip
->lineno
!= op
->lineno
) {
3105 output_line_directive (ip
, op
, 1, same_file
);
3106 check_expand (op
, limit
- ibp
);
3111 /* Come here either after (1) a null character that is part of the input
3112 or (2) at the end of the input, because there is a null there. */
3115 /* Our input really contains a null character. */
3119 /* At end of a macro-expansion level, pop it and read next level. */
3120 if (ip
->macro
!= 0) {
3123 /* If traditional, and we have an identifier that ends here,
3124 process it now, so we get the right error for recursion. */
3125 if (traditional
&& ident_length
3126 && ! is_idchar
[*instack
[indepth
- 1].bufp
]) {
3135 /* If we don't have a pending identifier,
3136 return at end of input. */
3137 if (ident_length
== 0) {
3145 /* If we do have a pending identifier, just consider this null
3146 a special character and arrange to dispatch on it again.
3147 The second time, IDENT_LENGTH will be zero so we will return. */
3153 /* Handle the case of a character such as /, ', " or null
3154 seen following an identifier. Back over it so that
3155 after the identifier is processed the special char
3156 will be dispatched on again. */
3166 if (ident_length
> 0) {
3167 register HASHNODE
*hp
;
3169 /* We have just seen an identifier end. If it's a macro, expand it.
3171 IDENT_LENGTH is the length of the identifier
3172 and HASH is its hash code.
3174 The identifier has already been copied to the output,
3175 so if it is a macro we must remove it.
3177 If REDO_CHAR is 0, the char that terminated the identifier
3178 has been skipped in the output and the input.
3179 OBP-IDENT_LENGTH-1 points to the identifier.
3180 If the identifier is a macro, we must back over the terminator.
3182 If REDO_CHAR is 1, the terminating char has already been
3183 backed over. OBP-IDENT_LENGTH points to the identifier. */
3185 if (!pcp_outfile
|| pcp_inside_if
) {
3186 for (hp
= hashtab
[MAKE_POS (hash
) % HASHSIZE
]; hp
!= NULL
;
3189 if (hp
->length
== ident_length
) {
3190 int obufp_before_macroname
;
3191 int op_lineno_before_macroname
;
3192 register int i
= ident_length
;
3193 register U_CHAR
*p
= hp
->name
;
3194 register U_CHAR
*q
= obp
- i
;
3200 do { /* All this to avoid a strncmp () */
3205 /* We found a use of a macro name.
3206 see if the context shows it is a macro call. */
3208 /* Back up over terminating character if not already done. */
3214 /* Save this as a displacement from the beginning of the output
3215 buffer. We can not save this as a position in the output
3216 buffer, because it may get realloc'ed by RECACHE. */
3217 obufp_before_macroname
= (obp
- op
->buf
) - ident_length
;
3218 op_lineno_before_macroname
= op
->lineno
;
3220 if (hp
->type
== T_PCSTRING
) {
3221 pcstring_used (hp
); /* Mark the definition of this key
3222 as needed, ensuring that it
3224 break; /* Exit loop, since the key cannot have a
3225 definition any longer. */
3228 /* Record whether the macro is disabled. */
3229 disabled
= hp
->type
== T_DISABLED
;
3231 /* This looks like a macro ref, but if the macro was disabled,
3232 just copy its name and put in a marker if requested. */
3236 /* This error check caught useful cases such as
3237 #define foo(x,y) bar (x (y,0), y)
3240 error ("recursive use of macro `%s'", hp
->name
);
3244 check_expand (op
, limit
- ibp
+ 2);
3251 /* If macro wants an arglist, verify that a '(' follows.
3252 first skip all whitespace, copying it to the output
3253 after the macro name. Then, if there is no '(',
3254 decide this is not a macro call and leave things that way. */
3255 if ((hp
->type
== T_MACRO
|| hp
->type
== T_DISABLED
)
3256 && hp
->value
.defn
->nargs
>= 0)
3258 U_CHAR
*old_ibp
= ibp
;
3259 U_CHAR
*old_obp
= obp
;
3260 int old_iln
= ip
->lineno
;
3261 int old_oln
= op
->lineno
;
3264 /* Scan forward over whitespace, copying it to the output. */
3265 if (ibp
== limit
&& ip
->macro
!= 0) {
3270 old_iln
= ip
->lineno
;
3271 old_oln
= op
->lineno
;
3273 /* A comment: copy it unchanged or discard it. */
3274 else if (*ibp
== '/' && ibp
[1] == '*') {
3275 if (put_out_comments
) {
3278 } else if (! traditional
) {
3282 while (ibp
+ 1 != limit
3283 && !(ibp
[0] == '*' && ibp
[1] == '/')) {
3284 /* We need not worry about newline-marks,
3285 since they are never found in comments. */
3287 /* Newline in a file. Count it. */
3291 if (put_out_comments
)
3297 if (put_out_comments
) {
3302 else if (is_space
[*ibp
]) {
3304 if (ibp
[-1] == '\n') {
3305 if (ip
->macro
== 0) {
3306 /* Newline in a file. Count it. */
3309 } else if (!output_marks
) {
3310 /* A newline mark, and we don't want marks
3311 in the output. If it is newline-hyphen,
3312 discard it entirely. Otherwise, it is
3313 newline-whitechar, so keep the whitechar. */
3323 /* A newline mark; copy both chars to the output. */
3331 /* It isn't a macro call.
3332 Put back the space that we just skipped. */
3335 ip
->lineno
= old_iln
;
3336 op
->lineno
= old_oln
;
3337 /* Exit the for loop. */
3342 /* This is now known to be a macro call.
3343 Discard the macro name from the output,
3344 along with any following whitespace just copied,
3345 but preserve newlines if not outputting marks since this
3346 is more likely to do the right thing with line numbers. */
3347 obp
= op
->buf
+ obufp_before_macroname
;
3349 op
->lineno
= op_lineno_before_macroname
;
3351 int newlines
= op
->lineno
- op_lineno_before_macroname
;
3352 while (0 < newlines
--)
3356 /* Prevent accidental token-pasting with a character
3357 before the macro call. */
3358 if (!traditional
&& obp
!= op
->buf
) {
3360 case '!': case '%': case '&': case '*':
3361 case '+': case '-': case '.': case '/':
3362 case ':': case '<': case '=': case '>':
3364 /* If we are expanding a macro arg, make a newline marker
3365 to separate the tokens. If we are making real output,
3366 a plain space will do. */
3373 /* Expand the macro, reading arguments as needed,
3374 and push the expansion on the input stack. */
3377 macroexpand (hp
, op
);
3379 /* Reexamine input stack, since macroexpand has pushed
3380 a new level on it. */
3387 } /* End hash-table-search loop */
3389 ident_length
= hash
= 0; /* Stop collecting identifier */
3392 } /* End if (ident_length > 0) */
3394 } /* End per-char loop */
3396 /* Come here to return -- but first give an error message
3397 if there was an unterminated successful conditional. */
3399 if (if_stack
!= ip
->if_stack
)
3403 switch (if_stack
->type
)
3424 error_with_line (line_for_error (if_stack
->lineno
),
3425 "unterminated `#%s' conditional", str
);
3427 if_stack
= ip
->if_stack
;
3431 * Rescan a string into a temporary buffer and return the result
3432 * as a FILE_BUF. Note this function returns a struct, not a pointer.
3434 * OUTPUT_MARKS nonzero means keep Newline markers found in the input
3435 * and insert such markers when appropriate. See `rescan' for details.
3436 * OUTPUT_MARKS is 1 for macroexpanding a macro argument separately
3437 * before substitution; it is 0 for other uses.
3440 expand_to_temp_buffer (buf
, limit
, output_marks
, assertions
)
3441 U_CHAR
*buf
, *limit
;
3442 int output_marks
, assertions
;
3444 register FILE_BUF
*ip
;
3446 int length
= limit
- buf
;
3448 int odepth
= indepth
;
3449 int save_assertions_flag
= assertions_flag
;
3451 assertions_flag
= assertions
;
3456 /* Set up the input on the input stack. */
3458 buf1
= (U_CHAR
*) alloca (length
+ 1);
3460 register U_CHAR
*p1
= buf
;
3461 register U_CHAR
*p2
= buf1
;
3468 /* Set up to receive the output. */
3470 obuf
.length
= length
* 2 + 100; /* Usually enough. Why be stingy? */
3471 obuf
.bufp
= obuf
.buf
= (U_CHAR
*) xmalloc (obuf
.length
);
3472 obuf
.nominal_fname
= 0;
3479 obuf
.system_header_p
= 0;
3481 CHECK_DEPTH ({return obuf
;});
3485 ip
= &instack
[indepth
];
3487 ip
->nominal_fname
= 0;
3489 ip
->system_header_p
= 0;
3492 ip
->length
= length
;
3493 ip
->buf
= ip
->bufp
= buf1
;
3494 ip
->if_stack
= if_stack
;
3496 ip
->lineno
= obuf
.lineno
= 1;
3498 /* Scan the input, create the output. */
3499 rescan (&obuf
, output_marks
);
3501 /* Pop input stack to original state. */
3504 if (indepth
!= odepth
)
3507 /* Record the output. */
3508 obuf
.length
= obuf
.bufp
- obuf
.buf
;
3510 assertions_flag
= save_assertions_flag
;
3515 * Process a # directive. Expects IP->bufp to point after the '#', as in
3516 * `#define foo bar'. Passes to the directive handler
3517 * (do_define, do_include, etc.): the addresses of the 1st and
3518 * last chars of the directive (starting immediately after the #
3519 * keyword), plus op and the keyword table pointer. If the directive
3520 * contains comments it is copied into a temporary buffer sans comments
3521 * and the temporary buffer is passed to the directive handler instead.
3522 * Likewise for backslash-newlines.
3524 * Returns nonzero if this was a known # directive.
3525 * Otherwise, returns zero, without advancing the input pointer.
3529 handle_directive (ip
, op
)
3532 register U_CHAR
*bp
, *cp
;
3533 register struct directive
*kt
;
3534 register int ident_length
;
3537 /* Nonzero means we must copy the entire directive
3538 to get rid of comments or backslash-newlines. */
3539 int copy_directive
= 0;
3541 U_CHAR
*ident
, *after_ident
;
3545 /* Record where the directive started. do_xifdef needs this. */
3546 directive_start
= bp
- 1;
3548 /* Skip whitespace and \-newline. */
3550 if (is_hor_space
[*bp
]) {
3551 if (*bp
!= ' ' && *bp
!= '\t' && pedantic
)
3552 pedwarn ("%s in preprocessing directive", char_name
[*bp
]);
3554 } else if (*bp
== '/' && (bp
[1] == '*'
3555 || (cplusplus_comments
&& bp
[1] == '/'))) {
3557 skip_to_end_of_comment (ip
, &ip
->lineno
, 0);
3559 } else if (*bp
== '\\' && bp
[1] == '\n') {
3560 bp
+= 2; ip
->lineno
++;
3564 /* Now find end of directive name.
3565 If we encounter a backslash-newline, exchange it with any following
3566 symbol-constituents so that we end up with a contiguous name. */
3573 if (*cp
== '\\' && cp
[1] == '\n')
3574 name_newline_fix (cp
);
3580 ident_length
= cp
- bp
;
3584 /* A line of just `#' becomes blank. */
3586 if (ident_length
== 0 && *after_ident
== '\n') {
3587 ip
->bufp
= after_ident
;
3591 if (ident_length
== 0 || !is_idstart
[*ident
]) {
3593 while (is_idchar
[*p
]) {
3594 if (*p
< '0' || *p
> '9')
3598 /* Handle # followed by a line number. */
3599 if (p
!= ident
&& !is_idchar
[*p
]) {
3600 static struct directive line_directive_table
[] = {
3601 { 4, do_line
, "line", T_LINE
},
3604 pedwarn ("`#' followed by integer");
3605 after_ident
= ident
;
3606 kt
= line_directive_table
;
3610 /* Avoid error for `###' and similar cases unless -pedantic. */
3612 while (*p
== '#' || is_hor_space
[*p
]) p
++;
3614 if (pedantic
&& !lang_asm
)
3615 warning ("invalid preprocessing directive");
3621 error ("invalid preprocessing directive name");
3627 * Decode the keyword and call the appropriate expansion
3628 * routine, after moving the input pointer up to the next line.
3630 for (kt
= directive_table
; kt
->length
> 0; kt
++) {
3631 if (kt
->length
== ident_length
&& !bcmp (kt
->name
, ident
, ident_length
)) {
3632 register U_CHAR
*buf
;
3633 register U_CHAR
*limit
;
3636 int *already_output
;
3638 /* Nonzero means do not delete comments within the directive.
3639 #define needs this when -traditional. */
3644 limit
= ip
->buf
+ ip
->length
;
3647 keep_comments
= traditional
&& kt
->type
== T_DEFINE
;
3648 /* #import is defined only in Objective C, or when on the NeXT. */
3649 if (kt
->type
== T_IMPORT
3650 && !(objc
|| lookup ((U_CHAR
*) "__NeXT__", -1, -1)))
3653 /* Find the end of this directive (first newline not backslashed
3654 and not in a string or comment).
3655 Set COPY_DIRECTIVE if the directive must be copied
3656 (it contains a backslash-newline or a comment). */
3658 buf
= bp
= after_ident
;
3659 while (bp
< limit
) {
3660 register U_CHAR c
= *bp
++;
3668 } else if (traditional
)
3675 bp
= skip_quoted_string (bp
- 1, limit
, ip
->lineno
, &ip
->lineno
, ©_directive
, &unterminated
);
3676 /* Don't bother calling the directive if we already got an error
3677 message due to unterminated string. Skip everything and pretend
3678 we called the directive. */
3681 /* Traditional preprocessing permits unterminated strings. */
3690 /* <...> is special for #include. */
3692 if (! IS_INCLUDE_DIRECTIVE_TYPE (kt
->type
))
3694 while (bp
< limit
&& *bp
!= '>' && *bp
!= '\n') {
3695 if (*bp
== '\\' && bp
[1] == '\n') {
3705 if (*bp
== '\\' && bp
[1] == '\n')
3708 || (cplusplus_comments
&& *bp
== '/')) {
3709 U_CHAR
*obp
= bp
- 1;
3711 skip_to_end_of_comment (ip
, &ip
->lineno
, 0);
3713 /* No need to copy the directive because of a comment at the end;
3714 just don't include the comment in the directive. */
3715 if (!put_out_comments
) {
3717 for (p
= bp
; *p
== ' ' || *p
== '\t'; p
++)
3724 /* Don't remove the comments if -traditional. */
3725 if (! keep_comments
)
3734 pedwarn ("%s in preprocessing directive", char_name
[c
]);
3738 --bp
; /* Point to the newline */
3746 resume_p
= ip
->bufp
;
3747 /* BP is the end of the directive.
3748 RESUME_P is the next interesting data after the directive.
3749 A comment may come between. */
3751 /* If a directive should be copied through, and -C was given,
3752 pass it through before removing comments. */
3753 if (!no_output
&& put_out_comments
3754 && (kt
->type
== T_DEFINE
? dump_macros
== dump_definitions
3755 : IS_INCLUDE_DIRECTIVE_TYPE (kt
->type
) ? dump_includes
3756 : kt
->type
== T_PRAGMA
)) {
3759 /* Output directive name. */
3760 check_expand (op
, kt
->length
+ 2);
3761 /* Make sure # is at the start of a line */
3762 if (op
->bufp
> op
->buf
&& op
->bufp
[-1] != '\n') {
3767 bcopy (kt
->name
, op
->bufp
, kt
->length
);
3768 op
->bufp
+= kt
->length
;
3770 /* Output arguments. */
3772 check_expand (op
, len
);
3773 bcopy (buf
, (char *) op
->bufp
, len
);
3775 /* Take account of any (escaped) newlines just output. */
3777 if (buf
[len
] == '\n')
3780 already_output
= &junk
;
3781 } /* Don't we need a newline or #line? */
3783 if (copy_directive
) {
3784 register U_CHAR
*xp
= buf
;
3785 /* Need to copy entire directive into temp buffer before dispatching */
3787 cp
= (U_CHAR
*) alloca (bp
- buf
+ 5); /* room for directive plus
3791 /* Copy to the new buffer, deleting comments
3792 and backslash-newlines (and whitespace surrounding the latter). */
3795 register U_CHAR c
= *xp
++;
3800 abort (); /* A bare newline should never part of the line. */
3803 /* <...> is special for #include. */
3805 if (! IS_INCLUDE_DIRECTIVE_TYPE (kt
->type
))
3807 while (xp
< bp
&& c
!= '>') {
3809 if (c
== '\\' && xp
< bp
&& *xp
== '\n')
3820 if (cp
!= buf
&& is_hor_space
[cp
[-1]]) {
3821 while (cp
- 1 != buf
&& is_hor_space
[cp
[-2]])
3823 SKIP_WHITE_SPACE (xp
);
3824 } else if (is_hor_space
[*xp
]) {
3826 SKIP_WHITE_SPACE (xp
);
3828 } else if (traditional
&& xp
< bp
) {
3836 register U_CHAR
*bp1
3837 = skip_quoted_string (xp
- 1, bp
, ip
->lineno
,
3838 NULL_PTR
, NULL_PTR
, NULL_PTR
);
3852 || (cplusplus_comments
&& *xp
== '/')) {
3854 /* If we already copied the directive through,
3855 already_output != 0 prevents outputting comment now. */
3856 skip_to_end_of_comment (ip
, already_output
, 0);
3858 while (xp
!= ip
->bufp
)
3860 /* Delete or replace the slash. */
3861 else if (traditional
)
3870 /* Null-terminate the copy. */
3876 ip
->bufp
= resume_p
;
3878 /* Some directives should be written out for cc1 to process,
3879 just as if they were not defined. And sometimes we're copying
3880 directives through. */
3882 if (!no_output
&& already_output
== 0
3883 && (kt
->type
== T_DEFINE
? dump_names
<= dump_macros
3884 : IS_INCLUDE_DIRECTIVE_TYPE (kt
->type
) ? dump_includes
3885 : kt
->type
== T_PRAGMA
)) {
3888 /* Output directive name. */
3889 check_expand (op
, kt
->length
+ 1);
3891 bcopy (kt
->name
, (char *) op
->bufp
, kt
->length
);
3892 op
->bufp
+= kt
->length
;
3894 if (kt
->type
== T_DEFINE
&& dump_macros
== dump_names
) {
3895 /* Output `#define name' only. */
3898 SKIP_WHITE_SPACE (xp
);
3900 while (is_idchar
[*xp
]) xp
++;
3902 check_expand (op
, len
+ 1);
3904 bcopy (yp
, (char *) op
->bufp
, len
);
3906 /* Output entire directive. */
3908 check_expand (op
, len
);
3909 bcopy (buf
, (char *) op
->bufp
, len
);
3912 } /* Don't we need a newline or #line? */
3914 /* Call the appropriate directive handler. buf now points to
3915 either the appropriate place in the input buffer, or to
3916 the temp buffer if it was necessary to make one. cp
3917 points to the first char after the contents of the (possibly
3918 copied) directive, in either case. */
3919 (*kt
->func
) (buf
, cp
, op
, kt
);
3920 check_expand (op
, ip
->length
- (ip
->bufp
- ip
->buf
));
3926 /* It is deliberate that we don't warn about undefined directives.
3927 That is the responsibility of cc1. */
3934 static struct tm
*timebuf
;
3936 time_t t
= time ((time_t *) 0);
3937 timebuf
= localtime (&t
);
3942 static char *monthnames
[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
3943 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
3947 * expand things like __FILE__. Place the expansion into the output
3948 * buffer *without* rescanning.
3952 special_symbol (hp
, op
)
3959 FILE_BUF
*ip
= NULL
;
3962 int paren
= 0; /* For special `defined' keyword */
3964 if (pcp_outfile
&& pcp_inside_if
3965 && hp
->type
!= T_SPEC_DEFINED
&& hp
->type
!= T_CONST
)
3966 error ("Predefined macro `%s' used inside `#if' during precompilation",
3969 for (i
= indepth
; i
>= 0; i
--)
3970 if (instack
[i
].fname
!= NULL
) {
3975 error ("cccp error: not in any file?!");
3976 return; /* the show must go on */
3984 if (hp
->type
== T_FILE
)
3985 string
= ip
->nominal_fname
;
3987 string
= instack
[0].nominal_fname
;
3991 buf
= (char *) alloca (3 + 4 * strlen (string
));
3992 quote_string (buf
, string
);
4000 case T_INCLUDE_LEVEL
:
4002 for (i
= indepth
; i
>= 0; i
--)
4003 if (instack
[i
].fname
!= NULL
)
4006 buf
= (char *) alloca (8); /* Eight bytes ought to be more than enough */
4007 sprintf (buf
, "%d", true_indepth
- 1);
4011 buf
= (char *) alloca (3 + strlen (version_string
));
4012 sprintf (buf
, "\"%s\"", version_string
);
4015 #ifndef NO_BUILTIN_SIZE_TYPE
4021 #ifndef NO_BUILTIN_PTRDIFF_TYPE
4022 case T_PTRDIFF_TYPE
:
4031 case T_USER_LABEL_PREFIX_TYPE
:
4032 buf
= USER_LABEL_PREFIX
;
4035 case T_REGISTER_PREFIX_TYPE
:
4036 buf
= REGISTER_PREFIX
;
4039 case T_IMMEDIATE_PREFIX_TYPE
:
4040 buf
= IMMEDIATE_PREFIX
;
4044 buf
= hp
->value
.cpval
;
4045 #ifdef STDC_0_IN_SYSTEM_HEADERS
4046 if (ip
->system_header_p
4047 && hp
->length
== 8 && bcmp (hp
->name
, "__STDC__", 8) == 0
4048 && !lookup ((U_CHAR
*) "__STRICT_ANSI__", -1, -1))
4051 if (pcp_inside_if
&& pcp_outfile
)
4052 /* Output a precondition for this macro use */
4053 fprintf (pcp_outfile
, "#define %s %s\n", hp
->name
, buf
);
4057 buf
= (char *) alloca (10);
4058 sprintf (buf
, "%d", ip
->lineno
);
4063 buf
= (char *) alloca (20);
4064 timebuf
= timestamp ();
4065 if (hp
->type
== T_DATE
)
4066 sprintf (buf
, "\"%s %2d %4d\"", monthnames
[timebuf
->tm_mon
],
4067 timebuf
->tm_mday
, timebuf
->tm_year
+ 1900);
4069 sprintf (buf
, "\"%02d:%02d:%02d\"", timebuf
->tm_hour
, timebuf
->tm_min
,
4073 case T_SPEC_DEFINED
:
4074 buf
= " 0 "; /* Assume symbol is not defined */
4075 ip
= &instack
[indepth
];
4076 SKIP_WHITE_SPACE (ip
->bufp
);
4077 if (*ip
->bufp
== '(') {
4079 ip
->bufp
++; /* Skip over the paren */
4080 SKIP_WHITE_SPACE (ip
->bufp
);
4083 if (!is_idstart
[*ip
->bufp
])
4085 if (ip
->bufp
[0] == 'L' && (ip
->bufp
[1] == '\'' || ip
->bufp
[1] == '"'))
4087 if ((hp
= lookup (ip
->bufp
, -1, -1))) {
4088 if (pcp_outfile
&& pcp_inside_if
4089 && (hp
->type
== T_CONST
4090 || (hp
->type
== T_MACRO
&& hp
->value
.defn
->predefined
)))
4091 /* Output a precondition for this macro use. */
4092 fprintf (pcp_outfile
, "#define %s\n", hp
->name
);
4096 if (pcp_outfile
&& pcp_inside_if
) {
4097 /* Output a precondition for this macro use */
4098 U_CHAR
*cp
= ip
->bufp
;
4099 fprintf (pcp_outfile
, "#undef ");
4100 while (is_idchar
[*cp
]) /* Ick! */
4101 fputc (*cp
++, pcp_outfile
);
4102 putc ('\n', pcp_outfile
);
4104 while (is_idchar
[*ip
->bufp
])
4106 SKIP_WHITE_SPACE (ip
->bufp
);
4108 if (*ip
->bufp
!= ')')
4116 error ("`defined' without an identifier");
4120 error ("cccp error: invalid special hash type"); /* time for gdb */
4124 check_expand (op
, len
);
4125 bcopy (buf
, (char *) op
->bufp
, len
);
4132 /* Routines to handle #directives */
4134 /* Handle #include and #import.
4135 This function expects to see "fname" or <fname> on the input. */
4138 do_include (buf
, limit
, op
, keyword
)
4139 U_CHAR
*buf
, *limit
;
4141 struct directive
*keyword
;
4143 U_CHAR
*importing
= keyword
->type
== T_IMPORT
? (U_CHAR
*) "" : (U_CHAR
*) 0;
4144 int skip_dirs
= (keyword
->type
== T_INCLUDE_NEXT
);
4145 static int import_warning
= 0;
4146 char *fname
; /* Dynamically allocated fname buffer */
4149 char *fbeg
, *fend
; /* Beginning and end of fname */
4152 struct file_name_list
*search_start
= include
; /* Chain of dirs to search */
4153 struct file_name_list
*dsp
; /* First in chain, if #include "..." */
4154 struct file_name_list
*searchptr
= 0;
4157 int f
= -3; /* file number */
4158 struct include_file
*inc
= 0;
4160 int retried
= 0; /* Have already tried macro
4161 expanding the include line*/
4162 int angle_brackets
= 0; /* 0 for "...", 1 for <...> */
4164 int vaxc_include
= 0; /* 1 for token without punctuation */
4171 if (pedantic
&& !instack
[indepth
].system_header_p
)
4174 pedwarn ("ANSI C does not allow `#import'");
4176 pedwarn ("ANSI C does not allow `#include_next'");
4179 if (importing
&& warn_import
&& !inhibit_warnings
4180 && !instack
[indepth
].system_header_p
&& !import_warning
) {
4182 warning ("using `#import' is not recommended");
4183 fprintf (stderr
, "The fact that a certain header file need not be processed more than once\n");
4184 fprintf (stderr
, "should be indicated in the header file, not where it is used.\n");
4185 fprintf (stderr
, "The best way to do this is with a conditional of this form:\n\n");
4186 fprintf (stderr
, " #ifndef _FOO_H_INCLUDED\n");
4187 fprintf (stderr
, " #define _FOO_H_INCLUDED\n");
4188 fprintf (stderr
, " ... <real contents of file> ...\n");
4189 fprintf (stderr
, " #endif /* Not _FOO_H_INCLUDED */\n\n");
4190 fprintf (stderr
, "Then users can use `#include' any number of times.\n");
4191 fprintf (stderr
, "GNU C automatically avoids processing the file more than once\n");
4192 fprintf (stderr
, "when it is equipped with such a conditional.\n");
4198 SKIP_WHITE_SPACE (fin
);
4199 /* Discard trailing whitespace so we can easily see
4200 if we have parsed all the significant chars we were given. */
4201 while (limit
!= fin
&& is_hor_space
[limit
[-1]]) limit
--;
4202 fbeg
= fend
= (char *) alloca (limit
- fin
);
4208 /* Copy the operand text, concatenating the strings. */
4210 while (fin
!= limit
) {
4211 while (fin
!= limit
&& *fin
!= '\"')
4216 /* If not at the end, there had better be another string. */
4217 /* Skip just horiz space, and don't go past limit. */
4218 while (fin
!= limit
&& is_hor_space
[*fin
]) fin
++;
4219 if (fin
!= limit
&& *fin
== '\"')
4226 /* We have "filename". Figure out directory this source
4227 file is coming from and put it on the front of the list. */
4229 /* If -I- was specified, don't search current dir, only spec'd ones. */
4230 if (ignore_srcdir
) break;
4232 for (fp
= &instack
[indepth
]; fp
>= instack
; fp
--)
4237 if ((nam
= fp
->nominal_fname
) != NULL
) {
4238 /* Found a named file. Figure out dir of the file,
4239 and put it in front of the search list. */
4240 dsp
= ((struct file_name_list
*)
4241 alloca (sizeof (struct file_name_list
) + strlen (nam
)));
4242 strcpy (dsp
->fname
, nam
);
4243 simplify_filename (dsp
->fname
);
4244 nam
= base_name (dsp
->fname
);
4246 /* But for efficiency's sake, do not insert the dir
4247 if it matches the search list's first dir. */
4248 dsp
->next
= search_start
;
4249 if (!search_start
|| strcmp (dsp
->fname
, search_start
->fname
)) {
4251 n
= nam
- dsp
->fname
;
4252 if (n
+ INCLUDE_LEN_FUDGE
> max_include_len
)
4253 max_include_len
= n
+ INCLUDE_LEN_FUDGE
;
4255 dsp
[0].got_name_map
= 0;
4263 while (fin
!= limit
&& *fin
!= '>')
4265 if (*fin
== '>' && fin
+ 1 == limit
) {
4267 /* If -I-, start with the first -I dir after the -I-. */
4268 search_start
= first_bracket_include
;
4276 * Support '#include xyz' like VAX-C to allow for easy use of all the
4277 * decwindow include files. It defaults to '#include <xyz.h>' (so the
4278 * code from case '<' is repeated here) and generates a warning.
4279 * (Note: macro expansion of `xyz' takes precedence.)
4281 if (retried
&& isalpha(*(U_CHAR
*) (--fbeg
))) {
4282 while (fin
!= limit
&& (!isspace(*fin
)))
4284 warning ("VAX-C-style include specification found, use '#include <filename.h>' !");
4288 /* If -I-, start with the first -I dir after the -I-. */
4289 search_start
= first_bracket_include
;
4297 error ("`#%s' expects \"FILENAME\" or <FILENAME>", keyword
->name
);
4300 /* Expand buffer and then remove any newline markers.
4301 We can't just tell expand_to_temp_buffer to omit the markers,
4302 since it would put extra spaces in include file names. */
4305 trybuf
= expand_to_temp_buffer (buf
, limit
, 1, 0);
4307 buf
= (U_CHAR
*) alloca (trybuf
.bufp
- trybuf
.buf
+ 1);
4309 while (src
!= trybuf
.bufp
) {
4310 switch ((*limit
++ = *src
++)) {
4319 U_CHAR
*src1
= skip_quoted_string (src
- 1, trybuf
.bufp
, 0,
4320 NULL_PTR
, NULL_PTR
, NULL_PTR
);
4334 /* For #include_next, skip in the search path
4335 past the dir in which the containing file was found. */
4338 for (fp
= &instack
[indepth
]; fp
>= instack
; fp
--)
4339 if (fp
->fname
!= NULL
) {
4340 /* fp->dir is null if the containing file was specified
4341 with an absolute file name. In that case, don't skip anything. */
4343 search_start
= fp
->dir
->next
;
4349 flen
= simplify_filename (fbeg
);
4353 error ("empty file name in `#%s'", keyword
->name
);
4357 /* Allocate this permanently, because it gets stored in the definitions
4359 fname
= xmalloc (max_include_len
+ flen
+ 1);
4360 /* + 1 above for terminating null. */
4362 system_include_depth
+= angle_brackets
;
4364 /* If specified file name is absolute, just open it. */
4366 if (absolute_filename (fbeg
)) {
4367 strcpy (fname
, fbeg
);
4368 f
= open_include_file (fname
, NULL_PTR
, importing
, &inc
);
4372 struct bypass_dir
*next
;
4374 struct file_name_list
*searchptr
;
4375 } **bypass_slot
= 0;
4377 /* Search directory path, trying to open the file.
4378 Copy each filename tried into FNAME. */
4380 for (searchptr
= search_start
; searchptr
; searchptr
= searchptr
->next
) {
4382 if (searchptr
== first_bracket_include
) {
4383 /* Go to bypass directory if we know we've seen this file before. */
4384 static struct bypass_dir
*bypass_hashtab
[INCLUDE_HASHSIZE
];
4385 struct bypass_dir
*p
;
4386 bypass_slot
= &bypass_hashtab
[hashf ((U_CHAR
*) fbeg
, flen
,
4388 for (p
= *bypass_slot
; p
; p
= p
->next
)
4389 if (!strcmp (fbeg
, p
->fname
)) {
4390 searchptr
= p
->searchptr
;
4396 strcpy (fname
, searchptr
->fname
);
4397 strcat (fname
, fbeg
);
4399 /* Change this 1/2 Unix 1/2 VMS file specification into a
4400 full VMS file specification */
4401 if (searchptr
->fname
[0]) {
4402 /* Fix up the filename */
4403 hack_vms_include_specification (fname
, vaxc_include
);
4405 /* This is a normal VMS filespec, so use it unchanged. */
4406 strcpy (fname
, fbeg
);
4407 /* if it's '#include filename', add the missing .h */
4408 if (vaxc_include
&& index(fname
,'.')==NULL
) {
4409 strcat (fname
, ".h");
4413 f
= open_include_file (fname
, searchptr
, importing
, &inc
);
4415 if (bypass_slot
&& searchptr
!= first_bracket_include
) {
4416 /* This is the first time we found this include file,
4417 and we found it after first_bracket_include.
4418 Record its location so that we can bypass to here next time. */
4419 struct bypass_dir
*p
4420 = (struct bypass_dir
*) xmalloc (sizeof (struct bypass_dir
));
4421 p
->next
= *bypass_slot
;
4422 p
->fname
= fname
+ strlen (searchptr
->fname
);
4423 p
->searchptr
= searchptr
;
4429 /* Our VMS hacks can produce invalid filespecs, so don't worry
4430 about errors other than EACCES. */
4431 if (errno
== EACCES
)
4434 if (errno
!= ENOENT
&& errno
!= ENOTDIR
)
4444 /* The file was already included. */
4446 /* If generating dependencies and -MG was specified, we assume missing
4447 files are leaf files, living in the same directory as the source file
4448 or other similar place; these missing files may be generated from
4449 other files and may not exist yet (eg: y.tab.h). */
4450 } else if (print_deps_missing_files
4451 && (system_include_depth
!= 0) < print_deps
)
4453 /* If it was requested as a system header file,
4454 then assume it belongs in the first place to look for such. */
4458 char *p
= (char *) alloca (strlen (search_start
->fname
)
4459 + strlen (fbeg
) + 1);
4460 strcpy (p
, search_start
->fname
);
4462 deps_output (p
, ' ');
4467 /* Otherwise, omit the directory, as if the file existed
4468 in the directory with the source. */
4469 deps_output (fbeg
, ' ');
4472 /* If -M was specified, and this header file won't be added to the
4473 dependency list, then don't count this as an error, because we can
4474 still produce correct output. Otherwise, we can't produce correct
4475 output, because there may be dependencies we need inside the missing
4476 file, and we don't know what directory this missing file exists in. */
4477 else if (0 < print_deps
&& print_deps
<= (system_include_depth
!= 0))
4478 warning ("No include path in which to find %s", fbeg
);
4480 error_from_errno (fbeg
);
4482 error ("No include path in which to find %s", fbeg
);
4486 /* Actually process the file. */
4488 pcftry
= (char *) alloca (strlen (fname
) + 30);
4495 sprintf (pcftry
, "%s%d", fname
, pcfnum
++);
4497 pcf
= open (pcftry
, O_RDONLY
, 0666);
4502 if (fstat (pcf
, &s
) != 0)
4503 pfatal_with_name (pcftry
);
4504 if (! INO_T_EQ (inc
->st
.st_ino
, s
.st_ino
)
4505 || inc
->st
.st_dev
!= s
.st_dev
)
4507 pcfbuf
= check_precompiled (pcf
, &s
, fname
, &pcfbuflimit
);
4508 /* Don't need it any more. */
4513 /* Don't need it at all. */
4518 } while (pcf
!= -1 && !pcfbuf
);
4521 /* Actually process the file */
4523 pcfname
= xmalloc (strlen (pcftry
) + 1);
4524 strcpy (pcfname
, pcftry
);
4525 pcfinclude ((U_CHAR
*) pcfbuf
, (U_CHAR
*) pcfbuflimit
,
4526 (U_CHAR
*) fname
, op
);
4529 finclude (f
, inc
, op
, is_system_include (fname
), searchptr
);
4532 system_include_depth
-= angle_brackets
;
4537 /* Return nonzero if the given FILENAME is an absolute pathname which
4538 designates a file within one of the known "system" include file
4539 directories. We assume here that if the given FILENAME looks like
4540 it is the name of a file which resides either directly in a "system"
4541 include file directory, or within any subdirectory thereof, then the
4542 given file must be a "system" include file. This function tells us
4543 if we should suppress pedantic errors/warnings for the given FILENAME.
4545 The value is 2 if the file is a C-language system header file
4546 for which C++ should (on most systems) assume `extern "C"'. */
4549 is_system_include (filename
)
4550 register char *filename
;
4552 struct file_name_list
*searchptr
;
4554 for (searchptr
= first_system_include
; searchptr
;
4555 searchptr
= searchptr
->next
)
4556 if (! strncmp (searchptr
->fname
, filename
, strlen (searchptr
->fname
)))
4557 return searchptr
->c_system_include_path
+ 1;
4561 /* Yield the non-directory suffix of a file name. */
4569 #if defined (__MSDOS__) || defined (_WIN32)
4570 if (isalpha (s
[0]) && s
[1] == ':') s
+= 2;
4573 if ((p
= rindex (s
, ':'))) s
= p
+ 1; /* Skip device. */
4574 if ((p
= rindex (s
, ']'))) s
= p
+ 1; /* Skip directory. */
4575 if ((p
= rindex (s
, '>'))) s
= p
+ 1; /* Skip alternate (int'n'l) dir. */
4579 if ((p
= rindex (s
, '/'))) s
= p
+ 1;
4580 #ifdef DIR_SEPARATOR
4581 if ((p
= rindex (s
, DIR_SEPARATOR
))) s
= p
+ 1;
4586 /* Yield nonzero if FILENAME is absolute (i.e. not relative). */
4589 absolute_filename (filename
)
4592 #if defined (__MSDOS__) || (defined (_WIN32) && !defined (__CYGWIN32__))
4593 if (isalpha (filename
[0]) && filename
[1] == ':') filename
+= 2;
4595 #if defined (__CYGWIN32__)
4596 /* At present, any path that begins with a drive spec is absolute. */
4597 if (isalpha (filename
[0]) && filename
[1] == ':') return 1;
4599 if (filename
[0] == '/') return 1;
4600 #ifdef DIR_SEPARATOR
4601 if (filename
[0] == DIR_SEPARATOR
) return 1;
4606 /* Remove unnecessary characters from FILENAME in place,
4607 to avoid unnecessary filename aliasing.
4608 Return the length of the resulting string.
4610 Do only the simplifications allowed by Posix.
4611 It is OK to miss simplifications on non-Posix hosts,
4612 since this merely leads to suboptimal results. */
4615 simplify_filename (filename
)
4618 register char *from
= filename
;
4619 register char *to
= filename
;
4622 /* Remove redundant initial /s. */
4625 if (*++from
== '/') {
4626 if (*++from
== '/') {
4627 /* 3 or more initial /s are equivalent to 1 /. */
4628 while (*++from
== '/')
4631 /* On some hosts // differs from /; Posix allows this. */
4632 static int slashslash_vs_slash
;
4633 if (slashslash_vs_slash
== 0) {
4635 slashslash_vs_slash
= ((stat ("/", &s1
) == 0 && stat ("//", &s2
) == 0
4636 && INO_T_EQ (s1
.st_ino
, s2
.st_ino
)
4637 && s1
.st_dev
== s2
.st_dev
)
4640 if (slashslash_vs_slash
< 0)
4648 if (from
[0] == '.' && from
[1] == '/')
4651 /* Copy this component and trailing /, if any. */
4652 while ((*to
++ = *from
++) != '/') {
4654 /* Trim . component at end of nonempty name. */
4655 to
-= filename
<= to
- 3 && to
[-3] == '/' && to
[-2] == '.';
4657 /* Trim unnecessary trailing /s. */
4658 while (to0
< --to
&& to
[-1] == '/')
4662 return to
- filename
;
4667 /* Skip /s after a /. */
4668 while (*from
== '/')
4673 /* The file_name_map structure holds a mapping of file names for a
4674 particular directory. This mapping is read from the file named
4675 FILE_NAME_MAP_FILE in that directory. Such a file can be used to
4676 map filenames on a file system with severe filename restrictions,
4677 such as DOS. The format of the file name map file is just a series
4678 of lines with two tokens on each line. The first token is the name
4679 to map, and the second token is the actual name to use. */
4681 struct file_name_map
4683 struct file_name_map
*map_next
;
4688 #define FILE_NAME_MAP_FILE "header.gcc"
4690 /* Read a space delimited string of unlimited length from a stdio
4694 read_filename_string (ch
, f
)
4702 set
= alloc
= xmalloc (len
+ 1);
4706 while ((ch
= getc (f
)) != EOF
&& ! is_space
[ch
])
4708 if (set
- alloc
== len
)
4711 alloc
= xrealloc (alloc
, len
+ 1);
4712 set
= alloc
+ len
/ 2;
4722 /* Read the file name map file for DIRNAME.
4723 If DIRNAME is empty, read the map file for the working directory;
4724 otherwise DIRNAME must end in '/'. */
4726 static struct file_name_map
*
4727 read_name_map (dirname
)
4730 /* This structure holds a linked list of file name maps, one per
4732 struct file_name_map_list
4734 struct file_name_map_list
*map_list_next
;
4735 char *map_list_name
;
4736 struct file_name_map
*map_list_map
;
4738 static struct file_name_map_list
*map_list
;
4739 register struct file_name_map_list
*map_list_ptr
;
4744 for (map_list_ptr
= map_list
; map_list_ptr
;
4745 map_list_ptr
= map_list_ptr
->map_list_next
)
4746 if (! strcmp (map_list_ptr
->map_list_name
, dirname
))
4747 return map_list_ptr
->map_list_map
;
4749 map_list_ptr
= ((struct file_name_map_list
*)
4750 xmalloc (sizeof (struct file_name_map_list
)));
4751 map_list_ptr
->map_list_name
= savestring (dirname
);
4752 map_list_ptr
->map_list_map
= NULL
;
4754 dirlen
= strlen (dirname
);
4755 name
= (char *) alloca (dirlen
+ strlen (FILE_NAME_MAP_FILE
) + 1);
4756 strcpy (name
, dirname
);
4757 strcat (name
, FILE_NAME_MAP_FILE
);
4758 f
= fopen (name
, "r");
4760 map_list_ptr
->map_list_map
= NULL
;
4765 while ((ch
= getc (f
)) != EOF
)
4768 struct file_name_map
*ptr
;
4773 from
= read_filename_string (ch
, f
);
4774 while ((ch
= getc (f
)) != EOF
&& is_hor_space
[ch
])
4776 to
= read_filename_string (ch
, f
);
4778 simplify_filename (from
);
4779 tolen
= simplify_filename (to
);
4781 ptr
= ((struct file_name_map
*)
4782 xmalloc (sizeof (struct file_name_map
)));
4783 ptr
->map_from
= from
;
4785 /* Make the real filename absolute. */
4786 if (absolute_filename (to
))
4790 ptr
->map_to
= xmalloc (dirlen
+ tolen
+ 1);
4791 strcpy (ptr
->map_to
, dirname
);
4792 strcat (ptr
->map_to
, to
);
4796 ptr
->map_next
= map_list_ptr
->map_list_map
;
4797 map_list_ptr
->map_list_map
= ptr
;
4799 while ((ch
= getc (f
)) != '\n')
4806 map_list_ptr
->map_list_next
= map_list
;
4807 map_list
= map_list_ptr
;
4809 return map_list_ptr
->map_list_map
;
4812 /* Try to open include file FILENAME. SEARCHPTR is the directory
4813 being tried from the include file search path.
4814 IMPORTING is "" if we are importing, null otherwise.
4815 Return -2 if found, either a matching name or a matching inode.
4816 Otherwise, open the file and return a file descriptor if successful
4817 or -1 if unsuccessful.
4818 Unless unsuccessful, put a descriptor of the included file into *PINC.
4819 This function maps filenames on file systems based on information read by
4823 open_include_file (filename
, searchptr
, importing
, pinc
)
4825 struct file_name_list
*searchptr
;
4827 struct include_file
**pinc
;
4829 char *fname
= remap
? remap_include_file (filename
, searchptr
) : filename
;
4832 /* Look up FNAME in include_hashtab. */
4833 struct include_file
**phead
= &include_hashtab
[hashf ((U_CHAR
*) fname
,
4836 struct include_file
*inc
, *head
= *phead
;
4837 for (inc
= head
; inc
; inc
= inc
->next
)
4838 if (!strcmp (fname
, inc
->fname
))
4842 || ! inc
->control_macro
4843 || (inc
->control_macro
[0] && ! lookup (inc
->control_macro
, -1, -1))) {
4845 fd
= open (fname
, O_RDONLY
, 0);
4851 /* FNAME was not in include_hashtab; insert a new entry. */
4852 inc
= (struct include_file
*) xmalloc (sizeof (struct include_file
));
4855 inc
->control_macro
= 0;
4856 inc
->deps_output
= 0;
4857 if (fstat (fd
, &inc
->st
) != 0)
4858 pfatal_with_name (fname
);
4861 /* Look for another file with the same inode and device. */
4862 if (lookup_ino_include (inc
)
4863 && inc
->control_macro
4864 && (!inc
->control_macro
[0] || lookup (inc
->control_macro
, -1, -1))) {
4870 /* For -M, add this file to the dependencies. */
4871 if (! inc
->deps_output
&& (system_include_depth
!= 0) < print_deps
) {
4872 inc
->deps_output
= 1;
4873 deps_output (fname
, ' ');
4876 /* Handle -H option. */
4877 if (print_include_names
)
4878 fprintf (stderr
, "%*s%s\n", indepth
, "", fname
);
4882 inc
->control_macro
= importing
;
4888 /* Return the remapped name of the the include file FILENAME.
4889 SEARCHPTR is the directory being tried from the include file path. */
4892 remap_include_file (filename
, searchptr
)
4894 struct file_name_list
*searchptr
;
4896 register struct file_name_map
*map
;
4897 register char *from
;
4901 if (! searchptr
->got_name_map
)
4903 searchptr
->name_map
= read_name_map (searchptr
->fname
);
4904 searchptr
->got_name_map
= 1;
4907 /* Check the mapping for the directory we are using. */
4908 from
= filename
+ strlen (searchptr
->fname
);
4909 for (map
= searchptr
->name_map
; map
; map
= map
->map_next
)
4910 if (! strcmp (map
->map_from
, from
))
4914 from
= base_name (filename
);
4916 if (from
!= filename
|| !searchptr
)
4918 /* Try to find a mapping file for the particular directory we are
4919 looking in. Thus #include <sys/types.h> will look up sys/types.h
4920 in /usr/include/header.gcc and look up types.h in
4921 /usr/include/sys/header.gcc. */
4923 char *dir
= (char *) alloca (from
- filename
+ 1);
4924 bcopy (filename
, dir
, from
- filename
);
4925 dir
[from
- filename
] = '\0';
4927 for (map
= read_name_map (dir
); map
; map
= map
->map_next
)
4928 if (! strcmp (map
->map_from
, from
))
4935 /* Insert INC into the include file table, hashed by device and inode number.
4936 If a file with different name but same dev+ino was already in the table,
4937 return 1 and set INC's control macro to the already-known macro. */
4940 lookup_ino_include (inc
)
4941 struct include_file
*inc
;
4943 int hash
= ((unsigned) (inc
->st
.st_dev
+ INO_T_HASH (inc
->st
.st_ino
))
4944 % INCLUDE_HASHSIZE
);
4945 struct include_file
*i
= include_ino_hashtab
[hash
];
4947 include_ino_hashtab
[hash
] = inc
;
4949 for (; i
; i
= i
->next_ino
)
4950 if (INO_T_EQ (inc
->st
.st_ino
, i
->st
.st_ino
)
4951 && inc
->st
.st_dev
== i
->st
.st_dev
) {
4952 inc
->control_macro
= i
->control_macro
;
4959 /* Process file descriptor F, which corresponds to include file INC,
4961 SYSTEM_HEADER_P is 1 if this file resides in any one of the known
4962 "system" include directories (as decided by the `is_system_include'
4964 DIRPTR is the link in the dir path through which this file was found,
4965 or 0 if the file name was absolute. */
4968 finclude (f
, inc
, op
, system_header_p
, dirptr
)
4970 struct include_file
*inc
;
4972 int system_header_p
;
4973 struct file_name_list
*dirptr
;
4975 char *fname
= inc
->fname
;
4977 FILE_BUF
*fp
; /* For input stack frame */
4978 int missing_newline
= 0;
4980 CHECK_DEPTH (return;);
4982 fp
= &instack
[indepth
+ 1];
4983 bzero ((char *) fp
, sizeof (FILE_BUF
));
4984 fp
->nominal_fname
= fp
->fname
= fname
;
4988 fp
->if_stack
= if_stack
;
4989 fp
->system_header_p
= system_header_p
;
4992 if (S_ISREG (inc
->st
.st_mode
)) {
4993 size_t s
= (size_t) inc
->st
.st_size
;
4994 if (s
!= inc
->st
.st_size
|| s
+ 2 < s
)
4996 fp
->buf
= (U_CHAR
*) xmalloc (s
+ 2);
4999 /* Read the file contents, knowing that s is an upper bound
5000 on the number of bytes we can read. */
5001 fp
->length
= safe_read (f
, (char *) fp
->buf
, s
);
5002 if (fp
->length
< 0) goto nope
;
5004 else if (S_ISDIR (inc
->st
.st_mode
)) {
5005 error ("directory `%s' specified in #include", fname
);
5009 /* Cannot count its file size before reading.
5010 First read the entire file into heap and
5011 copy them into buffer on stack. */
5016 fp
->buf
= (U_CHAR
*) xmalloc (bsize
+ 2);
5019 i
= safe_read (f
, (char *) fp
->buf
+ st_size
, bsize
- st_size
);
5021 goto nope
; /* error! */
5023 if (st_size
!= bsize
)
5024 break; /* End of file */
5026 fp
->buf
= (U_CHAR
*) xrealloc (fp
->buf
, bsize
+ 2);
5029 fp
->length
= st_size
;
5032 if ((fp
->length
> 0 && fp
->buf
[fp
->length
- 1] != '\n')
5033 /* Backslash-newline at end is not good enough. */
5034 || (fp
->length
> 1 && fp
->buf
[fp
->length
- 2] == '\\')) {
5035 fp
->buf
[fp
->length
++] = '\n';
5036 missing_newline
= 1;
5038 fp
->buf
[fp
->length
] = '\0';
5040 /* Close descriptor now, so nesting does not use lots of descriptors. */
5043 /* Must do this before calling trigraph_pcp, so that the correct file name
5044 will be printed in warning messages. */
5047 input_file_stack_tick
++;
5052 output_line_directive (fp
, op
, 0, enter_file
);
5055 if (missing_newline
)
5058 if (pedantic
&& missing_newline
)
5059 pedwarn ("file does not end in newline");
5062 input_file_stack_tick
++;
5063 output_line_directive (&instack
[indepth
], op
, 0, leave_file
);
5069 perror_with_name (fname
);
5074 /* Record that inclusion of the include file INC
5075 should be controlled by the macro named MACRO_NAME.
5076 This means that trying to include the file again
5077 will do something if that macro is defined. */
5080 record_control_macro (inc
, macro_name
)
5081 struct include_file
*inc
;
5084 if (!inc
->control_macro
|| inc
->control_macro
[0])
5085 inc
->control_macro
= macro_name
;
5088 /* Load the specified precompiled header into core, and verify its
5089 preconditions. PCF indicates the file descriptor to read, which must
5090 be a regular file. *ST is its file status.
5091 FNAME indicates the file name of the original header.
5092 *LIMIT will be set to an address one past the end of the file.
5093 If the preconditions of the file are not satisfied, the buffer is
5094 freed and we return 0. If the preconditions are satisfied, return
5095 the address of the buffer following the preconditions. The buffer, in
5096 this case, should never be freed because various pieces of it will
5097 be referred to until all precompiled strings are output at the end of
5101 check_precompiled (pcf
, st
, fname
, limit
)
5114 if (S_ISREG (st
->st_mode
))
5116 size_t s
= (size_t) st
->st_size
;
5117 if (s
!= st
->st_size
|| s
+ 2 < s
)
5119 buf
= xmalloc (s
+ 2);
5120 length
= safe_read (pcf
, buf
, s
);
5127 if (length
> 0 && buf
[length
-1] != '\n')
5128 buf
[length
++] = '\n';
5131 *limit
= buf
+ length
;
5133 /* File is in core. Check the preconditions. */
5134 if (!check_preconditions (buf
))
5136 for (cp
= buf
; *cp
; cp
++)
5139 fprintf (stderr
, "Using preinclude %s\n", fname
);
5145 fprintf (stderr
, "Cannot use preinclude %s\n", fname
);
5151 /* PREC (null terminated) points to the preconditions of a
5152 precompiled header. These are a series of #define and #undef
5153 lines which must match the current contents of the hash
5157 check_preconditions (prec
)
5164 lineend
= index (prec
, '\n');
5166 if (*prec
++ != '#') {
5167 error ("Bad format encountered while reading precompiled file");
5170 if (!strncmp (prec
, "define", 6)) {
5174 mdef
= create_definition ((U_CHAR
*) prec
, (U_CHAR
*) lineend
, NULL_PTR
);
5179 if ((hp
= lookup (mdef
.symnam
, mdef
.symlen
, -1)) == NULL
5180 || (hp
->type
!= T_MACRO
&& hp
->type
!= T_CONST
)
5181 || (hp
->type
== T_MACRO
5182 && !compare_defs (mdef
.defn
, hp
->value
.defn
)
5183 && (mdef
.defn
->length
!= 2
5184 || mdef
.defn
->expansion
[0] != '\n'
5185 || mdef
.defn
->expansion
[1] != ' ')))
5187 } else if (!strncmp (prec
, "undef", 5)) {
5192 while (is_hor_space
[(U_CHAR
) *prec
])
5195 while (is_idchar
[(U_CHAR
) *prec
])
5199 if (lookup ((U_CHAR
*) name
, len
, -1))
5202 error ("Bad format encountered while reading precompiled file");
5207 /* They all passed successfully */
5211 /* Process the main body of a precompiled file. BUF points to the
5212 string section of the file, following the preconditions. LIMIT is one
5213 character past the end. NAME is the name of the file being read
5214 in. OP is the main output buffer. */
5217 pcfinclude (buf
, limit
, name
, op
)
5218 U_CHAR
*buf
, *limit
, *name
;
5225 /* First in the file comes 4 bytes indicating the number of strings, */
5226 /* in network byte order. (MSB first). */
5228 nstrings
= (nstrings
<< 8) | *cp
++;
5229 nstrings
= (nstrings
<< 8) | *cp
++;
5230 nstrings
= (nstrings
<< 8) | *cp
++;
5232 /* Looping over each string... */
5233 while (nstrings
--) {
5234 U_CHAR
*string_start
;
5235 U_CHAR
*endofthiskey
;
5239 /* Each string starts with a STRINGDEF structure (str), followed */
5240 /* by the text of the string (string_start) */
5242 /* First skip to a longword boundary */
5243 /* ??? Why a 4-byte boundary? On all machines? */
5244 /* NOTE: This works correctly even if size_t
5245 is narrower than a pointer.
5246 Do not try risky measures here to get another type to use!
5247 Do not include stddef.h--it will fail! */
5248 if ((size_t) cp
& 3)
5249 cp
+= 4 - ((size_t) cp
& 3);
5251 /* Now get the string. */
5252 str
= (STRINGDEF
*) (GENERIC_PTR
) cp
;
5253 string_start
= cp
+= sizeof (STRINGDEF
);
5255 for (; *cp
; cp
++) /* skip the string */
5258 /* We need to macro expand the string here to ensure that the
5259 proper definition environment is in place. If it were only
5260 expanded when we find out it is needed, macros necessary for
5261 its proper expansion might have had their definitions changed. */
5262 tmpbuf
= expand_to_temp_buffer (string_start
, cp
++, 0, 0);
5263 /* Lineno is already set in the precompiled file */
5264 str
->contents
= tmpbuf
.buf
;
5265 str
->len
= tmpbuf
.length
;
5267 str
->filename
= name
;
5268 str
->output_mark
= outbuf
.bufp
- outbuf
.buf
;
5271 *stringlist_tailp
= str
;
5272 stringlist_tailp
= &str
->chain
;
5274 /* Next comes a fourbyte number indicating the number of keys
5277 nkeys
= (nkeys
<< 8) | *cp
++;
5278 nkeys
= (nkeys
<< 8) | *cp
++;
5279 nkeys
= (nkeys
<< 8) | *cp
++;
5281 /* If this number is -1, then the string is mandatory. */
5285 /* Otherwise, for each key, */
5286 for (; nkeys
--; free (tmpbuf
.buf
), cp
= endofthiskey
+ 1) {
5287 KEYDEF
*kp
= (KEYDEF
*) (GENERIC_PTR
) cp
;
5290 /* It starts with a KEYDEF structure */
5291 cp
+= sizeof (KEYDEF
);
5293 /* Find the end of the key. At the end of this for loop we
5294 advance CP to the start of the next key using this variable. */
5295 endofthiskey
= cp
+ strlen ((char *) cp
);
5298 /* Expand the key, and enter it into the hash table. */
5299 tmpbuf
= expand_to_temp_buffer (cp
, endofthiskey
, 0, 0);
5300 tmpbuf
.bufp
= tmpbuf
.buf
;
5302 while (is_hor_space
[*tmpbuf
.bufp
])
5304 if (!is_idstart
[*tmpbuf
.bufp
]
5305 || tmpbuf
.bufp
== tmpbuf
.buf
+ tmpbuf
.length
) {
5310 hp
= lookup (tmpbuf
.bufp
, -1, -1);
5313 install (tmpbuf
.bufp
, -1, T_PCSTRING
, (char *) kp
, -1);
5315 else if (hp
->type
== T_PCSTRING
) {
5316 kp
->chain
= hp
->value
.keydef
;
5317 hp
->value
.keydef
= kp
;
5323 /* This output_line_directive serves to switch us back to the current
5324 input file in case some of these strings get output (which will
5325 result in line directives for the header file being output). */
5326 output_line_directive (&instack
[indepth
], op
, 0, enter_file
);
5329 /* Called from rescan when it hits a key for strings. Mark them all
5330 used and clean up. */
5338 for (kp
= hp
->value
.keydef
; kp
; kp
= kp
->chain
)
5339 kp
->str
->writeflag
= 1;
5343 /* Write the output, interspersing precompiled strings in their
5344 appropriate places. */
5349 STRINGDEF
*next_string
;
5350 U_CHAR
*cur_buf_loc
;
5351 int line_directive_len
= 80;
5352 char *line_directive
= xmalloc (line_directive_len
);
5355 /* In each run through the loop, either cur_buf_loc ==
5356 next_string_loc, in which case we print a series of strings, or
5357 it is less than next_string_loc, in which case we write some of
5359 cur_buf_loc
= outbuf
.buf
;
5360 next_string
= stringlist
;
5362 while (cur_buf_loc
< outbuf
.bufp
|| next_string
) {
5364 && cur_buf_loc
- outbuf
.buf
== next_string
->output_mark
) {
5365 if (next_string
->writeflag
) {
5366 len
= 4 * strlen ((char *) next_string
->filename
) + 32;
5367 while (len
> line_directive_len
)
5368 line_directive
= xrealloc (line_directive
,
5369 line_directive_len
*= 2);
5370 sprintf (line_directive
, "\n# %d ", next_string
->lineno
);
5371 strcpy (quote_string (line_directive
+ strlen (line_directive
),
5372 (char *) next_string
->filename
),
5374 safe_write (fileno (stdout
), line_directive
, strlen (line_directive
));
5375 safe_write (fileno (stdout
),
5376 (char *) next_string
->contents
, next_string
->len
);
5378 next_string
= next_string
->chain
;
5382 ? (next_string
->output_mark
5383 - (cur_buf_loc
- outbuf
.buf
))
5384 : outbuf
.bufp
- cur_buf_loc
);
5386 safe_write (fileno (stdout
), (char *) cur_buf_loc
, len
);
5390 free (line_directive
);
5393 /* Pass a directive through to the output file.
5394 BUF points to the contents of the directive, as a contiguous string.
5395 LIMIT points to the first character past the end of the directive.
5396 KEYWORD is the keyword-table entry for the directive. */
5399 pass_thru_directive (buf
, limit
, op
, keyword
)
5400 U_CHAR
*buf
, *limit
;
5402 struct directive
*keyword
;
5404 register unsigned keyword_length
= keyword
->length
;
5406 check_expand (op
, 1 + keyword_length
+ (limit
- buf
));
5408 bcopy (keyword
->name
, (char *) op
->bufp
, keyword_length
);
5409 op
->bufp
+= keyword_length
;
5410 if (limit
!= buf
&& buf
[0] != ' ')
5412 bcopy ((char *) buf
, (char *) op
->bufp
, limit
- buf
);
5413 op
->bufp
+= (limit
- buf
);
5416 /* Count the line we have just made in the output,
5417 to get in sync properly. */
5422 /* The arglist structure is built by do_define to tell
5423 collect_definition where the argument names begin. That
5424 is, for a define like "#define f(x,y,z) foo+x-bar*y", the arglist
5425 would contain pointers to the strings x, y, and z.
5426 Collect_definition would then build a DEFINITION node,
5427 with reflist nodes pointing to the places x, y, and z had
5428 appeared. So the arglist is just convenience data passed
5429 between these two routines. It is not kept around after
5430 the current #define has been processed and entered into the
5434 struct arglist
*next
;
5441 /* Create a DEFINITION node from a #define directive. Arguments are
5442 as for do_define. */
5445 create_definition (buf
, limit
, op
)
5446 U_CHAR
*buf
, *limit
;
5449 U_CHAR
*bp
; /* temp ptr into input buffer */
5450 U_CHAR
*symname
; /* remember where symbol name starts */
5451 int sym_length
; /* and how long it is */
5452 int line
= instack
[indepth
].lineno
;
5453 char *file
= instack
[indepth
].nominal_fname
;
5457 int arglengths
= 0; /* Accumulate lengths of arg names
5458 plus number of args. */
5463 while (is_hor_space
[*bp
])
5466 symname
= bp
; /* remember where it starts */
5467 sym_length
= check_macro_name (bp
, "macro");
5470 /* Lossage will occur if identifiers or control keywords are broken
5471 across lines using backslash. This is not the right place to take
5475 struct arglist
*arg_ptrs
= NULL
;
5478 bp
++; /* skip '(' */
5479 SKIP_WHITE_SPACE (bp
);
5481 /* Loop over macro argument names. */
5482 while (*bp
!= ')') {
5483 struct arglist
*temp
;
5485 temp
= (struct arglist
*) alloca (sizeof (struct arglist
));
5487 temp
->next
= arg_ptrs
;
5488 temp
->argno
= argno
++;
5489 temp
->rest_args
= 0;
5493 pedwarn ("another parameter follows `%s'",
5496 if (!is_idstart
[*bp
])
5497 pedwarn ("invalid character in macro parameter name");
5499 /* Find the end of the arg name. */
5500 while (is_idchar
[*bp
]) {
5502 /* do we have a "special" rest-args extension here? */
5503 if (limit
- bp
> REST_EXTENSION_LENGTH
5504 && bcmp (rest_extension
, bp
, REST_EXTENSION_LENGTH
) == 0) {
5506 temp
->rest_args
= 1;
5510 temp
->length
= bp
- temp
->name
;
5512 bp
+= REST_EXTENSION_LENGTH
;
5513 arglengths
+= temp
->length
+ 2;
5514 SKIP_WHITE_SPACE (bp
);
5515 if (temp
->length
== 0 || (*bp
!= ',' && *bp
!= ')')) {
5516 error ("badly punctuated parameter list in `#define'");
5521 SKIP_WHITE_SPACE (bp
);
5522 /* A comma at this point can only be followed by an identifier. */
5523 if (!is_idstart
[*bp
]) {
5524 error ("badly punctuated parameter list in `#define'");
5529 error ("unterminated parameter list in `#define'");
5533 struct arglist
*otemp
;
5535 for (otemp
= temp
->next
; otemp
!= NULL
; otemp
= otemp
->next
)
5536 if (temp
->length
== otemp
->length
5537 && bcmp (temp
->name
, otemp
->name
, temp
->length
) == 0) {
5538 error ("duplicate argument name `%.*s' in `#define'",
5539 temp
->length
, temp
->name
);
5545 ++bp
; /* skip paren */
5546 SKIP_WHITE_SPACE (bp
);
5547 /* now everything from bp before limit is the definition. */
5548 defn
= collect_expansion (bp
, limit
, argno
, arg_ptrs
);
5549 defn
->rest_args
= rest_args
;
5551 /* Now set defn->args.argnames to the result of concatenating
5552 the argument names in reverse order
5553 with comma-space between them. */
5554 defn
->args
.argnames
= (U_CHAR
*) xmalloc (arglengths
+ 1);
5556 struct arglist
*temp
;
5558 for (temp
= arg_ptrs
; temp
; temp
= temp
->next
) {
5559 bcopy (temp
->name
, &defn
->args
.argnames
[i
], temp
->length
);
5561 if (temp
->next
!= 0) {
5562 defn
->args
.argnames
[i
++] = ',';
5563 defn
->args
.argnames
[i
++] = ' ';
5566 defn
->args
.argnames
[i
] = 0;
5569 /* Simple expansion or empty definition. */
5573 if (is_hor_space
[*bp
]) {
5575 SKIP_WHITE_SPACE (bp
);
5576 } else if (sym_length
) {
5578 case '!': case '"': case '#': case '%': case '&': case '\'':
5579 case ')': case '*': case '+': case ',': case '-': case '.':
5580 case '/': case ':': case ';': case '<': case '=': case '>':
5581 case '?': case '[': case '\\': case ']': case '^': case '{':
5582 case '|': case '}': case '~':
5583 warning ("missing white space after `#define %.*s'",
5584 sym_length
, symname
);
5588 pedwarn ("missing white space after `#define %.*s'",
5589 sym_length
, symname
);
5594 /* Now everything from bp before limit is the definition. */
5595 defn
= collect_expansion (bp
, limit
, -1, NULL_PTR
);
5596 defn
->args
.argnames
= (U_CHAR
*) "";
5602 /* OP is null if this is a predefinition */
5603 defn
->predefined
= !op
;
5605 mdef
.symnam
= symname
;
5606 mdef
.symlen
= sym_length
;
5615 /* Process a #define directive.
5616 BUF points to the contents of the #define directive, as a contiguous string.
5617 LIMIT points to the first character past the end of the definition.
5618 KEYWORD is the keyword-table entry for #define. */
5621 do_define (buf
, limit
, op
, keyword
)
5622 U_CHAR
*buf
, *limit
;
5624 struct directive
*keyword
;
5629 /* If this is a precompiler run (with -pcp) pass thru #define directives. */
5630 if (pcp_outfile
&& op
)
5631 pass_thru_directive (buf
, limit
, op
, keyword
);
5633 mdef
= create_definition (buf
, limit
, op
);
5637 hashcode
= hashf (mdef
.symnam
, mdef
.symlen
, HASHSIZE
);
5641 if ((hp
= lookup (mdef
.symnam
, mdef
.symlen
, hashcode
)) != NULL
) {
5643 /* Redefining a precompiled key is ok. */
5644 if (hp
->type
== T_PCSTRING
)
5646 /* Redefining a macro is ok if the definitions are the same. */
5647 else if (hp
->type
== T_MACRO
)
5648 ok
= ! compare_defs (mdef
.defn
, hp
->value
.defn
);
5649 /* Redefining a constant is ok with -D. */
5650 else if (hp
->type
== T_CONST
)
5651 ok
= ! done_initializing
;
5652 /* Print the warning if it's not ok. */
5654 /* If we are passing through #define and #undef directives, do
5655 that for this re-definition now. */
5656 if (debug_output
&& op
)
5657 pass_thru_directive (buf
, limit
, op
, keyword
);
5659 pedwarn ("`%.*s' redefined", mdef
.symlen
, mdef
.symnam
);
5660 if (hp
->type
== T_MACRO
)
5661 pedwarn_with_file_and_line (hp
->value
.defn
->file
, hp
->value
.defn
->line
,
5662 "this is the location of the previous definition");
5664 /* Replace the old definition. */
5666 hp
->value
.defn
= mdef
.defn
;
5668 /* If we are passing through #define and #undef directives, do
5669 that for this new definition now. */
5670 if (debug_output
&& op
)
5671 pass_thru_directive (buf
, limit
, op
, keyword
);
5672 install (mdef
.symnam
, mdef
.symlen
, T_MACRO
,
5673 (char *) mdef
.defn
, hashcode
);
5684 /* Check a purported macro name SYMNAME, and yield its length.
5685 USAGE is the kind of name this is intended for. */
5688 check_macro_name (symname
, usage
)
5695 for (p
= symname
; is_idchar
[*p
]; p
++)
5697 sym_length
= p
- symname
;
5699 || (sym_length
== 1 && *symname
== 'L' && (*p
== '\'' || *p
== '"')))
5700 error ("invalid %s name", usage
);
5701 else if (!is_idstart
[*symname
]
5702 || (sym_length
== 7 && ! bcmp (symname
, "defined", 7)))
5703 error ("invalid %s name `%.*s'", usage
, sym_length
, symname
);
5707 /* Return zero if two DEFINITIONs are isomorphic. */
5710 compare_defs (d1
, d2
)
5711 DEFINITION
*d1
, *d2
;
5713 register struct reflist
*a1
, *a2
;
5714 register U_CHAR
*p1
= d1
->expansion
;
5715 register U_CHAR
*p2
= d2
->expansion
;
5718 if (d1
->nargs
!= d2
->nargs
)
5721 && strcmp ((char *)d1
->args
.argnames
, (char *)d2
->args
.argnames
))
5723 for (a1
= d1
->pattern
, a2
= d2
->pattern
; a1
&& a2
;
5724 a1
= a1
->next
, a2
= a2
->next
) {
5725 if (!((a1
->nchars
== a2
->nchars
&& ! bcmp (p1
, p2
, a1
->nchars
))
5726 || ! comp_def_part (first
, p1
, a1
->nchars
, p2
, a2
->nchars
, 0))
5727 || a1
->argno
!= a2
->argno
5728 || a1
->stringify
!= a2
->stringify
5729 || a1
->raw_before
!= a2
->raw_before
5730 || a1
->raw_after
!= a2
->raw_after
)
5738 if (comp_def_part (first
, p1
, d1
->length
- (p1
- d1
->expansion
),
5739 p2
, d2
->length
- (p2
- d2
->expansion
), 1))
5744 /* Return 1 if two parts of two macro definitions are effectively different.
5745 One of the parts starts at BEG1 and has LEN1 chars;
5746 the other has LEN2 chars at BEG2.
5747 Any sequence of whitespace matches any other sequence of whitespace.
5748 FIRST means these parts are the first of a macro definition;
5749 so ignore leading whitespace entirely.
5750 LAST means these parts are the last of a macro definition;
5751 so ignore trailing whitespace entirely. */
5754 comp_def_part (first
, beg1
, len1
, beg2
, len2
, last
)
5756 U_CHAR
*beg1
, *beg2
;
5760 register U_CHAR
*end1
= beg1
+ len1
;
5761 register U_CHAR
*end2
= beg2
+ len2
;
5763 while (beg1
!= end1
&& is_space
[*beg1
]) beg1
++;
5764 while (beg2
!= end2
&& is_space
[*beg2
]) beg2
++;
5767 while (beg1
!= end1
&& is_space
[end1
[-1]]) end1
--;
5768 while (beg2
!= end2
&& is_space
[end2
[-1]]) end2
--;
5770 while (beg1
!= end1
&& beg2
!= end2
) {
5771 if (is_space
[*beg1
] && is_space
[*beg2
]) {
5772 while (beg1
!= end1
&& is_space
[*beg1
]) beg1
++;
5773 while (beg2
!= end2
&& is_space
[*beg2
]) beg2
++;
5774 } else if (*beg1
== *beg2
) {
5778 return (beg1
!= end1
) || (beg2
!= end2
);
5781 /* Read a replacement list for a macro with parameters.
5782 Build the DEFINITION structure.
5783 Reads characters of text starting at BUF until END.
5784 ARGLIST specifies the formal parameters to look for
5785 in the text of the definition; NARGS is the number of args
5786 in that list, or -1 for a macro name that wants no argument list.
5787 MACRONAME is the macro name itself (so we can avoid recursive expansion)
5788 and NAMELEN is its length in characters.
5790 Note that comments, backslash-newlines, and leading white space
5791 have already been deleted from the argument. */
5793 /* If there is no trailing whitespace, a Newline Space is added at the end
5794 to prevent concatenation that would be contrary to the standard. */
5797 collect_expansion (buf
, end
, nargs
, arglist
)
5800 struct arglist
*arglist
;
5803 register U_CHAR
*p
, *limit
, *lastp
, *exp_p
;
5804 struct reflist
*endpat
= NULL
;
5805 /* Pointer to first nonspace after last ## seen. */
5807 /* Pointer to first nonspace after last single-# seen. */
5808 U_CHAR
*stringify
= 0;
5809 /* How those tokens were spelled. */
5810 enum sharp_token_type concat_sharp_token_type
= NO_SHARP_TOKEN
;
5811 enum sharp_token_type stringify_sharp_token_type
= NO_SHARP_TOKEN
;
5813 int expected_delimiter
= '\0';
5815 /* Scan thru the replacement list, ignoring comments and quoted
5816 strings, picking up on the macro calls. It does a linear search
5817 thru the arg list on every potential symbol. Profiling might say
5818 that something smarter should happen. */
5823 /* Find the beginning of the trailing whitespace. */
5826 while (p
< limit
&& is_space
[limit
[-1]]) limit
--;
5828 /* Allocate space for the text in the macro definition.
5829 Each input char may or may not need 1 byte,
5830 so this is an upper bound.
5831 The extra 3 are for invented trailing newline-marker and final null. */
5832 maxsize
= (sizeof (DEFINITION
)
5834 defn
= (DEFINITION
*) xcalloc (1, maxsize
);
5836 defn
->nargs
= nargs
;
5837 exp_p
= defn
->expansion
= (U_CHAR
*) defn
+ sizeof (DEFINITION
);
5842 : p
[0] == '%' && p
[1] == ':' && p
[2] == '%' && p
[3] == ':') {
5843 error ("`##' at start of macro definition");
5844 p
+= p
[0] == '#' ? 2 : 4;
5847 /* Process the main body of the definition. */
5849 int skipped_arg
= 0;
5850 register U_CHAR c
= *p
++;
5858 if (expected_delimiter
!= '\0') {
5859 if (c
== expected_delimiter
)
5860 expected_delimiter
= '\0';
5862 expected_delimiter
= c
;
5866 if (p
< limit
&& expected_delimiter
) {
5867 /* In a string, backslash goes through
5868 and makes next char ordinary. */
5874 if (!expected_delimiter
&& *p
== ':') {
5875 /* %: is not a digraph if preceded by an odd number of '<'s. */
5877 while (buf
< p0
&& p0
[-1] == '<')
5880 /* Treat %:%: as ## and %: as #. */
5881 if (p
[1] == '%' && p
[2] == ':') {
5883 goto sharp_sharp_token
;
5894 /* # is ordinary inside a string. */
5895 if (expected_delimiter
)
5899 /* ##: concatenate preceding and following tokens. */
5900 /* Take out the first #, discard preceding whitespace. */
5902 while (exp_p
> lastp
&& is_hor_space
[exp_p
[-1]])
5904 /* Skip the second #. */
5906 concat_sharp_token_type
= c
;
5907 if (is_hor_space
[*p
]) {
5908 concat_sharp_token_type
= c
+ 1;
5910 SKIP_WHITE_SPACE (p
);
5914 error ("`##' at end of macro definition");
5915 } else if (nargs
>= 0) {
5916 /* Single #: stringify following argument ref.
5917 Don't leave the # in the expansion. */
5920 stringify_sharp_token_type
= c
;
5921 if (is_hor_space
[*p
]) {
5922 stringify_sharp_token_type
= c
+ 1;
5924 SKIP_WHITE_SPACE (p
);
5926 if (! is_idstart
[*p
] || nargs
== 0
5927 || (*p
== 'L' && (p
[1] == '\'' || p
[1] == '"')))
5928 error ("`#' operator is not followed by a macro argument name");
5935 /* In -traditional mode, recognize arguments inside strings and
5936 and character constants, and ignore special properties of #.
5937 Arguments inside strings are considered "stringified", but no
5938 extra quote marks are supplied. */
5942 if (expected_delimiter
!= '\0') {
5943 if (c
== expected_delimiter
)
5944 expected_delimiter
= '\0';
5946 expected_delimiter
= c
;
5950 /* Backslash quotes delimiters and itself, but not macro args. */
5951 if (expected_delimiter
!= 0 && p
< limit
5952 && (*p
== expected_delimiter
|| *p
== '\\')) {
5959 if (expected_delimiter
!= '\0') /* No comments inside strings. */
5962 /* If we find a comment that wasn't removed by handle_directive,
5963 this must be -traditional. So replace the comment with
5966 while (++p
< limit
) {
5967 if (p
[0] == '*' && p
[1] == '/') {
5973 /* Mark this as a concatenation-point, as if it had been ##. */
5981 /* Handle the start of a symbol. */
5982 if (is_idchar
[c
] && nargs
> 0) {
5983 U_CHAR
*id_beg
= p
- 1;
5987 while (p
!= limit
&& is_idchar
[*p
]) p
++;
5988 id_len
= p
- id_beg
;
5991 && ! (id_len
== 1 && c
== 'L' && (*p
== '\'' || *p
== '"'))) {
5992 register struct arglist
*arg
;
5994 for (arg
= arglist
; arg
!= NULL
; arg
= arg
->next
) {
5995 struct reflist
*tpat
;
5997 if (arg
->name
[0] == c
5998 && arg
->length
== id_len
5999 && bcmp (arg
->name
, id_beg
, id_len
) == 0) {
6000 enum sharp_token_type tpat_stringify
;
6001 if (expected_delimiter
) {
6002 if (warn_stringify
) {
6004 warning ("macro argument `%.*s' is stringified.",
6007 warning ("macro arg `%.*s' would be stringified with -traditional.",
6011 /* If ANSI, don't actually substitute inside a string. */
6014 tpat_stringify
= SHARP_TOKEN
;
6017 = (stringify
== id_beg
6018 ? stringify_sharp_token_type
: NO_SHARP_TOKEN
);
6020 /* make a pat node for this arg and append it to the end of
6022 tpat
= (struct reflist
*) xmalloc (sizeof (struct reflist
));
6025 = concat
== id_beg
? concat_sharp_token_type
: NO_SHARP_TOKEN
;
6026 tpat
->raw_after
= NO_SHARP_TOKEN
;
6027 tpat
->rest_args
= arg
->rest_args
;
6028 tpat
->stringify
= tpat_stringify
;
6031 defn
->pattern
= tpat
;
6033 endpat
->next
= tpat
;
6036 tpat
->argno
= arg
->argno
;
6037 tpat
->nchars
= exp_p
- lastp
;
6039 register U_CHAR
*p1
= p
;
6040 SKIP_WHITE_SPACE (p1
);
6043 : p1
[0]=='%' && p1
[1]==':' && p1
[2]=='%' && p1
[3]==':')
6044 tpat
->raw_after
= p1
[0] + (p
!= p1
);
6046 lastp
= exp_p
; /* place to start copying from next time */
6053 /* If this was not a macro arg, copy it into the expansion. */
6054 if (! skipped_arg
) {
6055 register U_CHAR
*lim1
= p
;
6059 if (stringify
== id_beg
)
6060 error ("`#' operator should be followed by a macro argument name");
6065 if (!traditional
&& expected_delimiter
== 0) {
6066 /* If ANSI, put in a newline-space marker to prevent token pasting.
6067 But not if "inside a string" (which in ANSI mode happens only for
6075 defn
->length
= exp_p
- defn
->expansion
;
6077 /* Crash now if we overrun the allocated size. */
6078 if (defn
->length
+ 1 > maxsize
)
6082 /* This isn't worth the time it takes. */
6083 /* give back excess storage */
6084 defn
->expansion
= (U_CHAR
*) xrealloc (defn
->expansion
, defn
->length
+ 1);
6091 do_assert (buf
, limit
, op
, keyword
)
6092 U_CHAR
*buf
, *limit
;
6094 struct directive
*keyword
;
6096 U_CHAR
*bp
; /* temp ptr into input buffer */
6097 U_CHAR
*symname
; /* remember where symbol name starts */
6098 int sym_length
; /* and how long it is */
6099 struct arglist
*tokens
= NULL
;
6101 if (pedantic
&& done_initializing
&& !instack
[indepth
].system_header_p
)
6102 pedwarn ("ANSI C does not allow `#assert'");
6106 while (is_hor_space
[*bp
])
6109 symname
= bp
; /* remember where it starts */
6110 sym_length
= check_macro_name (bp
, "assertion");
6112 /* #define doesn't do this, but we should. */
6113 SKIP_WHITE_SPACE (bp
);
6115 /* Lossage will occur if identifiers or control tokens are broken
6116 across lines using backslash. This is not the right place to take
6120 error ("missing token-sequence in `#assert'");
6127 bp
++; /* skip '(' */
6128 SKIP_WHITE_SPACE (bp
);
6130 tokens
= read_token_list (&bp
, limit
, &error_flag
);
6134 error ("empty token-sequence in `#assert'");
6138 ++bp
; /* skip paren */
6139 SKIP_WHITE_SPACE (bp
);
6142 /* If this name isn't already an assertion name, make it one.
6143 Error if it was already in use in some other way. */
6146 ASSERTION_HASHNODE
*hp
;
6147 int hashcode
= hashf (symname
, sym_length
, ASSERTION_HASHSIZE
);
6148 struct tokenlist_list
*value
6149 = (struct tokenlist_list
*) xmalloc (sizeof (struct tokenlist_list
));
6151 hp
= assertion_lookup (symname
, sym_length
, hashcode
);
6153 if (sym_length
== 7 && ! bcmp (symname
, "defined", 7))
6154 error ("`defined' redefined as assertion");
6155 hp
= assertion_install (symname
, sym_length
, hashcode
);
6158 /* Add the spec'd token-sequence to the list of such. */
6159 value
->tokens
= tokens
;
6160 value
->next
= hp
->value
;
6168 do_unassert (buf
, limit
, op
, keyword
)
6169 U_CHAR
*buf
, *limit
;
6171 struct directive
*keyword
;
6173 U_CHAR
*bp
; /* temp ptr into input buffer */
6174 U_CHAR
*symname
; /* remember where symbol name starts */
6175 int sym_length
; /* and how long it is */
6177 struct arglist
*tokens
= NULL
;
6178 int tokens_specified
= 0;
6180 if (pedantic
&& done_initializing
&& !instack
[indepth
].system_header_p
)
6181 pedwarn ("ANSI C does not allow `#unassert'");
6185 while (is_hor_space
[*bp
])
6188 symname
= bp
; /* remember where it starts */
6189 sym_length
= check_macro_name (bp
, "assertion");
6191 /* #define doesn't do this, but we should. */
6192 SKIP_WHITE_SPACE (bp
);
6194 /* Lossage will occur if identifiers or control tokens are broken
6195 across lines using backslash. This is not the right place to take
6201 bp
++; /* skip '(' */
6202 SKIP_WHITE_SPACE (bp
);
6204 tokens
= read_token_list (&bp
, limit
, &error_flag
);
6208 error ("empty token list in `#unassert'");
6212 tokens_specified
= 1;
6214 ++bp
; /* skip paren */
6215 SKIP_WHITE_SPACE (bp
);
6219 ASSERTION_HASHNODE
*hp
;
6220 int hashcode
= hashf (symname
, sym_length
, ASSERTION_HASHSIZE
);
6221 struct tokenlist_list
*tail
, *prev
;
6223 hp
= assertion_lookup (symname
, sym_length
, hashcode
);
6227 /* If no token list was specified, then eliminate this assertion
6229 if (! tokens_specified
) {
6230 struct tokenlist_list
*next
;
6231 for (tail
= hp
->value
; tail
; tail
= next
) {
6233 free_token_list (tail
->tokens
);
6236 delete_assertion (hp
);
6238 /* If a list of tokens was given, then delete any matching list. */
6243 struct tokenlist_list
*next
= tail
->next
;
6244 if (compare_token_lists (tail
->tokens
, tokens
)) {
6248 hp
->value
= tail
->next
;
6249 free_token_list (tail
->tokens
);
6262 /* Test whether there is an assertion named NAME
6263 and optionally whether it has an asserted token list TOKENS.
6264 NAME is not null terminated; its length is SYM_LENGTH.
6265 If TOKENS_SPECIFIED is 0, then don't check for any token list. */
6268 check_assertion (name
, sym_length
, tokens_specified
, tokens
)
6271 int tokens_specified
;
6272 struct arglist
*tokens
;
6274 ASSERTION_HASHNODE
*hp
;
6275 int hashcode
= hashf (name
, sym_length
, ASSERTION_HASHSIZE
);
6277 if (pedantic
&& !instack
[indepth
].system_header_p
)
6278 pedwarn ("ANSI C does not allow testing assertions");
6280 hp
= assertion_lookup (name
, sym_length
, hashcode
);
6282 /* It is not an assertion; just return false. */
6285 /* If no token list was specified, then value is 1. */
6286 if (! tokens_specified
)
6290 struct tokenlist_list
*tail
;
6294 /* If a list of tokens was given,
6295 then succeed if the assertion records a matching list. */
6298 if (compare_token_lists (tail
->tokens
, tokens
))
6303 /* Fail if the assertion has no matching list. */
6308 /* Compare two lists of tokens for equality including order of tokens. */
6311 compare_token_lists (l1
, l2
)
6312 struct arglist
*l1
, *l2
;
6315 if (l1
->length
!= l2
->length
)
6317 if (bcmp (l1
->name
, l2
->name
, l1
->length
))
6323 /* Succeed if both lists end at the same time. */
6327 /* Read a space-separated list of tokens ending in a close parenthesis.
6328 Return a list of strings, in the order they were written.
6329 (In case of error, return 0 and store -1 in *ERROR_FLAG.)
6330 Parse the text starting at *BPP, and update *BPP.
6331 Don't parse beyond LIMIT. */
6333 static struct arglist
*
6334 read_token_list (bpp
, limit
, error_flag
)
6339 struct arglist
*token_ptrs
= 0;
6345 /* Loop over the assertion value tokens. */
6347 struct arglist
*temp
;
6351 /* Find the end of the token. */
6355 } else if (*bp
== ')') {
6360 } else if (*bp
== '"' || *bp
== '\'')
6361 bp
= skip_quoted_string (bp
, limit
, 0, NULL_PTR
, NULL_PTR
, &eofp
);
6363 while (! is_hor_space
[*bp
] && *bp
!= '(' && *bp
!= ')'
6364 && *bp
!= '"' && *bp
!= '\'' && bp
!= limit
)
6367 temp
= (struct arglist
*) xmalloc (sizeof (struct arglist
));
6368 temp
->name
= (U_CHAR
*) xmalloc (bp
- beg
+ 1);
6369 bcopy ((char *) beg
, (char *) temp
->name
, bp
- beg
);
6370 temp
->name
[bp
- beg
] = 0;
6371 temp
->next
= token_ptrs
;
6373 temp
->length
= bp
- beg
;
6375 SKIP_WHITE_SPACE (bp
);
6378 error ("unterminated token sequence in `#assert' or `#unassert'");
6385 /* We accumulated the names in reverse order.
6386 Now reverse them to get the proper order. */
6388 register struct arglist
*prev
= 0, *this, *next
;
6389 for (this = token_ptrs
; this; this = next
) {
6399 free_token_list (tokens
)
6400 struct arglist
*tokens
;
6403 struct arglist
*next
= tokens
->next
;
6404 free (tokens
->name
);
6410 /* Install a name in the assertion hash table.
6412 If LEN is >= 0, it is the length of the name.
6413 Otherwise, compute the length by scanning the entire name.
6415 If HASH is >= 0, it is the precomputed hash code.
6416 Otherwise, compute the hash code. */
6418 static ASSERTION_HASHNODE
*
6419 assertion_install (name
, len
, hash
)
6424 register ASSERTION_HASHNODE
*hp
;
6425 register int i
, bucket
;
6426 register U_CHAR
*p
, *q
;
6428 i
= sizeof (ASSERTION_HASHNODE
) + len
+ 1;
6429 hp
= (ASSERTION_HASHNODE
*) xmalloc (i
);
6431 hp
->bucket_hdr
= &assertion_hashtab
[bucket
];
6432 hp
->next
= assertion_hashtab
[bucket
];
6433 assertion_hashtab
[bucket
] = hp
;
6435 if (hp
->next
!= NULL
)
6436 hp
->next
->prev
= hp
;
6439 hp
->name
= ((U_CHAR
*) hp
) + sizeof (ASSERTION_HASHNODE
);
6442 for (i
= 0; i
< len
; i
++)
6448 /* Find the most recent hash node for name name (ending with first
6449 non-identifier char) installed by install
6451 If LEN is >= 0, it is the length of the name.
6452 Otherwise, compute the length by scanning the entire name.
6454 If HASH is >= 0, it is the precomputed hash code.
6455 Otherwise, compute the hash code. */
6457 static ASSERTION_HASHNODE
*
6458 assertion_lookup (name
, len
, hash
)
6463 register ASSERTION_HASHNODE
*bucket
;
6465 bucket
= assertion_hashtab
[hash
];
6467 if (bucket
->length
== len
&& bcmp (bucket
->name
, name
, len
) == 0)
6469 bucket
= bucket
->next
;
6475 delete_assertion (hp
)
6476 ASSERTION_HASHNODE
*hp
;
6479 if (hp
->prev
!= NULL
)
6480 hp
->prev
->next
= hp
->next
;
6481 if (hp
->next
!= NULL
)
6482 hp
->next
->prev
= hp
->prev
;
6484 /* Make sure that the bucket chain header that the deleted guy was
6485 on points to the right thing afterwards. */
6486 if (hp
== *hp
->bucket_hdr
)
6487 *hp
->bucket_hdr
= hp
->next
;
6493 * interpret #line directive. Remembers previously seen fnames
6494 * in its very own hash table.
6496 #define FNAME_HASHSIZE 37
6499 do_line (buf
, limit
, op
, keyword
)
6500 U_CHAR
*buf
, *limit
;
6502 struct directive
*keyword
;
6504 register U_CHAR
*bp
;
6505 FILE_BUF
*ip
= &instack
[indepth
];
6508 enum file_change_code file_change
= same_file
;
6510 /* Expand any macros. */
6511 tem
= expand_to_temp_buffer (buf
, limit
, 0, 0);
6513 /* Point to macroexpanded line, which is null-terminated now. */
6515 SKIP_WHITE_SPACE (bp
);
6517 if (!isdigit (*bp
)) {
6518 error ("invalid format `#line' directive");
6522 /* The Newline at the end of this line remains to be processed.
6523 To put the next line at the specified line number,
6524 we must store a line number now that is one less. */
6525 new_lineno
= atoi ((char *) bp
) - 1;
6527 /* NEW_LINENO is one less than the actual line number here. */
6528 if (pedantic
&& new_lineno
< 0)
6529 pedwarn ("line number out of range in `#line' directive");
6531 /* skip over the line number. */
6532 while (isdigit (*bp
))
6535 #if 0 /* #line 10"foo.c" is supposed to be allowed. */
6536 if (*bp
&& !is_space
[*bp
]) {
6537 error ("invalid format `#line' directive");
6542 SKIP_WHITE_SPACE (bp
);
6545 static HASHNODE
*fname_table
[FNAME_HASHSIZE
];
6546 HASHNODE
*hp
, **hash_bucket
;
6552 /* Turn the file name, which is a character string literal,
6553 into a null-terminated string. Do this in place. */
6556 switch ((*p
++ = *bp
++)) {
6558 error ("invalid format `#line' directive");
6563 char *bpc
= (char *) bp
;
6564 HOST_WIDE_INT c
= parse_escape (&bpc
, (HOST_WIDE_INT
) (U_CHAR
) (-1));
6565 bp
= (U_CHAR
*) bpc
;
6578 fname_length
= p
- fname
;
6580 SKIP_WHITE_SPACE (bp
);
6583 pedwarn ("garbage at end of `#line' directive");
6585 file_change
= enter_file
;
6586 else if (*bp
== '2')
6587 file_change
= leave_file
;
6588 else if (*bp
== '3')
6589 ip
->system_header_p
= 1;
6590 else if (*bp
== '4')
6591 ip
->system_header_p
= 2;
6593 error ("invalid format `#line' directive");
6598 SKIP_WHITE_SPACE (bp
);
6600 ip
->system_header_p
= 1;
6602 SKIP_WHITE_SPACE (bp
);
6605 ip
->system_header_p
= 2;
6607 SKIP_WHITE_SPACE (bp
);
6610 error ("invalid format `#line' directive");
6615 hash_bucket
= &fname_table
[hashf (fname
, fname_length
, FNAME_HASHSIZE
)];
6616 for (hp
= *hash_bucket
; hp
!= NULL
; hp
= hp
->next
)
6617 if (hp
->length
== fname_length
&&
6618 bcmp (hp
->value
.cpval
, fname
, fname_length
) == 0) {
6619 ip
->nominal_fname
= hp
->value
.cpval
;
6623 /* Didn't find it; cons up a new one. */
6624 hp
= (HASHNODE
*) xcalloc (1, sizeof (HASHNODE
) + fname_length
+ 1);
6625 hp
->next
= *hash_bucket
;
6628 hp
->length
= fname_length
;
6629 ip
->nominal_fname
= hp
->value
.cpval
= ((char *) hp
) + sizeof (HASHNODE
);
6630 bcopy (fname
, hp
->value
.cpval
, fname_length
);
6633 error ("invalid format `#line' directive");
6637 ip
->lineno
= new_lineno
;
6638 output_line_directive (ip
, op
, 0, file_change
);
6639 check_expand (op
, ip
->length
- (ip
->bufp
- ip
->buf
));
6643 /* Remove the definition of a symbol from the symbol table.
6644 according to un*x /lib/cpp, it is not an error to undef
6645 something that has no definitions, so it isn't one here either. */
6648 do_undef (buf
, limit
, op
, keyword
)
6649 U_CHAR
*buf
, *limit
;
6651 struct directive
*keyword
;
6655 U_CHAR
*orig_buf
= buf
;
6657 /* If this is a precompiler run (with -pcp) pass thru #undef directives. */
6658 if (pcp_outfile
&& op
)
6659 pass_thru_directive (buf
, limit
, op
, keyword
);
6661 SKIP_WHITE_SPACE (buf
);
6662 sym_length
= check_macro_name (buf
, "macro");
6664 while ((hp
= lookup (buf
, sym_length
, -1)) != NULL
) {
6665 /* If we are generating additional info for debugging (with -g) we
6666 need to pass through all effective #undef directives. */
6667 if (debug_output
&& op
)
6668 pass_thru_directive (orig_buf
, limit
, op
, keyword
);
6669 if (hp
->type
!= T_MACRO
)
6670 warning ("undefining `%s'", hp
->name
);
6676 SKIP_WHITE_SPACE (buf
);
6678 pedwarn ("garbage after `#undef' directive");
6683 /* Report an error detected by the program we are processing.
6684 Use the text of the line in the error message.
6685 (We use error because it prints the filename & line#.) */
6688 do_error (buf
, limit
, op
, keyword
)
6689 U_CHAR
*buf
, *limit
;
6691 struct directive
*keyword
;
6693 int length
= limit
- buf
;
6694 U_CHAR
*copy
= (U_CHAR
*) alloca (length
+ 1);
6695 bcopy ((char *) buf
, (char *) copy
, length
);
6697 SKIP_WHITE_SPACE (copy
);
6698 error ("#error %s", copy
);
6702 /* Report a warning detected by the program we are processing.
6703 Use the text of the line in the warning message, then continue.
6704 (We use error because it prints the filename & line#.) */
6707 do_warning (buf
, limit
, op
, keyword
)
6708 U_CHAR
*buf
, *limit
;
6710 struct directive
*keyword
;
6712 int length
= limit
- buf
;
6713 U_CHAR
*copy
= (U_CHAR
*) alloca (length
+ 1);
6714 bcopy ((char *) buf
, (char *) copy
, length
);
6716 SKIP_WHITE_SPACE (copy
);
6717 /* Use `pedwarn' not `warning', because #warning isn't in the C Standard;
6718 if -pedantic-errors is given, #warning should cause an error. */
6719 pedwarn ("#warning %s", copy
);
6723 /* Remember the name of the current file being read from so that we can
6724 avoid ever including it again. */
6731 for (i
= indepth
; i
>= 0; i
--)
6732 if (instack
[i
].inc
) {
6733 record_control_macro (instack
[i
].inc
, (U_CHAR
*) "");
6738 /* Report program identification. */
6741 do_ident (buf
, limit
, op
, keyword
)
6742 U_CHAR
*buf
, *limit
;
6744 struct directive
*keyword
;
6749 /* Allow #ident in system headers, since that's not user's fault. */
6750 if (pedantic
&& !instack
[indepth
].system_header_p
)
6751 pedwarn ("ANSI C does not allow `#ident'");
6753 trybuf
= expand_to_temp_buffer (buf
, limit
, 0, 0);
6755 len
= trybuf
.bufp
- buf
;
6757 /* Output expanded directive. */
6758 check_expand (op
, 7 + len
);
6759 bcopy ("#ident ", (char *) op
->bufp
, 7);
6761 bcopy ((char *) buf
, (char *) op
->bufp
, len
);
6768 /* #pragma and its argument line have already been copied to the output file.
6769 Just check for some recognized pragmas that need validation here. */
6772 do_pragma (buf
, limit
, op
, keyword
)
6773 U_CHAR
*buf
, *limit
;
6775 struct directive
*keyword
;
6777 SKIP_WHITE_SPACE (buf
);
6778 if (!strncmp ((char *) buf
, "once", 4)) {
6779 /* Allow #pragma once in system headers, since that's not the user's
6781 if (!instack
[indepth
].system_header_p
)
6782 warning ("`#pragma once' is obsolete");
6786 if (!strncmp ((char *) buf
, "implementation", 14)) {
6787 /* Be quiet about `#pragma implementation' for a file only if it hasn't
6788 been included yet. */
6791 U_CHAR
*p
= buf
+ 14, *fname
;
6792 SKIP_WHITE_SPACE (p
);
6797 if ((p
= (U_CHAR
*) index ((char *) fname
, '\"')))
6800 for (h
= 0; h
< INCLUDE_HASHSIZE
; h
++) {
6801 struct include_file
*inc
;
6802 for (inc
= include_hashtab
[h
]; inc
; inc
= inc
->next
) {
6803 if (!strcmp (base_name (inc
->fname
), (char *) fname
)) {
6804 warning ("`#pragma implementation' for \"%s\" appears after its #include",fname
);
6814 /* This was a fun hack, but #pragma seems to start to be useful.
6815 By failing to recognize it, we pass it through unchanged to cc1. */
6817 /* The behavior of the #pragma directive is implementation defined.
6818 this implementation defines it as follows. */
6824 if (open ("/dev/tty", O_RDONLY
, 0666) != 0)
6827 if (open ("/dev/tty", O_WRONLY
, 0666) != 1)
6829 execl ("/usr/games/hack", "#pragma", 0);
6830 execl ("/usr/games/rogue", "#pragma", 0);
6831 execl ("/usr/new/emacs", "-f", "hanoi", "9", "-kill", 0);
6832 execl ("/usr/local/emacs", "-f", "hanoi", "9", "-kill", 0);
6834 fatal ("You are in a maze of twisty compiler features, all different");
6838 #ifdef SCCS_DIRECTIVE
6840 /* Just ignore #sccs, on systems where we define it at all. */
6843 do_sccs (buf
, limit
, op
, keyword
)
6844 U_CHAR
*buf
, *limit
;
6846 struct directive
*keyword
;
6849 pedwarn ("ANSI C does not allow `#sccs'");
6853 #endif /* defined (SCCS_DIRECTIVE) */
6855 /* Handle #if directive by
6856 1) inserting special `defined' keyword into the hash table
6857 that gets turned into 0 or 1 by special_symbol (thus,
6858 if the luser has a symbol called `defined' already, it won't
6859 work inside the #if directive)
6860 2) rescan the input into a temporary output buffer
6861 3) pass the output buffer to the yacc parser and collect a value
6862 4) clean up the mess left from steps 1 and 2.
6863 5) call conditional_skip to skip til the next #endif (etc.),
6864 or not, depending on the value from step 3. */
6867 do_if (buf
, limit
, op
, keyword
)
6868 U_CHAR
*buf
, *limit
;
6870 struct directive
*keyword
;
6872 HOST_WIDE_INT value
;
6873 FILE_BUF
*ip
= &instack
[indepth
];
6875 value
= eval_if_expression (buf
, limit
- buf
);
6876 conditional_skip (ip
, value
== 0, T_IF
, NULL_PTR
, op
);
6880 /* Handle a #elif directive by not changing if_stack either.
6881 see the comment above do_else. */
6884 do_elif (buf
, limit
, op
, keyword
)
6885 U_CHAR
*buf
, *limit
;
6887 struct directive
*keyword
;
6889 HOST_WIDE_INT value
;
6890 FILE_BUF
*ip
= &instack
[indepth
];
6892 if (if_stack
== instack
[indepth
].if_stack
) {
6893 error ("`#elif' not within a conditional");
6896 if (if_stack
->type
!= T_IF
&& if_stack
->type
!= T_ELIF
) {
6897 error ("`#elif' after `#else'");
6898 fprintf (stderr
, " (matches line %d", if_stack
->lineno
);
6899 if (if_stack
->fname
!= NULL
&& ip
->fname
!= NULL
6900 && strcmp (if_stack
->fname
, ip
->nominal_fname
) != 0)
6901 fprintf (stderr
, ", file %s", if_stack
->fname
);
6902 fprintf (stderr
, ")\n");
6904 if_stack
->type
= T_ELIF
;
6907 if (if_stack
->if_succeeded
)
6908 skip_if_group (ip
, 0, op
);
6910 value
= eval_if_expression (buf
, limit
- buf
);
6912 skip_if_group (ip
, 0, op
);
6914 ++if_stack
->if_succeeded
; /* continue processing input */
6915 output_line_directive (ip
, op
, 1, same_file
);
6921 /* Evaluate a #if expression in BUF, of length LENGTH, then parse the
6922 result as a C expression and return the value as an int. */
6924 static HOST_WIDE_INT
6925 eval_if_expression (buf
, length
)
6930 HASHNODE
*save_defined
;
6931 HOST_WIDE_INT value
;
6933 save_defined
= install ((U_CHAR
*) "defined", -1, T_SPEC_DEFINED
,
6936 temp_obuf
= expand_to_temp_buffer (buf
, buf
+ length
, 0, 1);
6938 delete_macro (save_defined
); /* clean up special symbol */
6940 temp_obuf
.buf
[temp_obuf
.length
] = '\n';
6941 value
= parse_c_expression ((char *) temp_obuf
.buf
,
6942 warn_undef
&& !instack
[indepth
].system_header_p
);
6944 free (temp_obuf
.buf
);
6949 /* routine to handle ifdef/ifndef. Try to look up the symbol, then do
6950 or don't skip to the #endif/#else/#elif depending on what directive
6951 is actually being processed. */
6954 do_xifdef (buf
, limit
, op
, keyword
)
6955 U_CHAR
*buf
, *limit
;
6957 struct directive
*keyword
;
6960 FILE_BUF
*ip
= &instack
[indepth
];
6962 int start_of_file
= 0;
6963 U_CHAR
*control_macro
= 0;
6965 /* Detect a #ifndef at start of file (not counting comments). */
6966 if (ip
->fname
!= 0 && keyword
->type
== T_IFNDEF
) {
6967 U_CHAR
*p
= ip
->buf
;
6968 while (p
!= directive_start
) {
6972 /* Make no special provision for backslash-newline here; this is
6973 slower if backslash-newlines are present, but it's correct,
6974 and it's not worth it to tune for the rare backslash-newline. */
6976 && (*p
== '*' || (cplusplus_comments
&& *p
== '/'))) {
6977 /* Skip this comment. */
6979 U_CHAR
*save_bufp
= ip
->bufp
;
6981 p
= skip_to_end_of_comment (ip
, &junk
, 1);
6982 ip
->bufp
= save_bufp
;
6987 /* If we get here, this conditional is the beginning of the file. */
6992 /* Discard leading and trailing whitespace. */
6993 SKIP_WHITE_SPACE (buf
);
6994 while (limit
!= buf
&& is_hor_space
[limit
[-1]]) limit
--;
6996 /* Find the end of the identifier at the beginning. */
6997 for (end
= buf
; is_idchar
[*end
]; end
++);
7000 skip
= (keyword
->type
== T_IFDEF
);
7002 pedwarn (end
== limit
? "`#%s' with no argument"
7003 : "`#%s' argument starts with punctuation",
7008 if (! traditional
) {
7009 if (isdigit (buf
[0]))
7010 pedwarn ("`#%s' argument starts with a digit", keyword
->name
);
7011 else if (end
!= limit
)
7012 pedwarn ("garbage at end of `#%s' argument", keyword
->name
);
7015 hp
= lookup (buf
, end
-buf
, -1);
7018 /* Output a precondition for this macro. */
7020 && (hp
->type
== T_CONST
7021 || (hp
->type
== T_MACRO
&& hp
->value
.defn
->predefined
)))
7022 fprintf (pcp_outfile
, "#define %s\n", hp
->name
);
7025 fprintf (pcp_outfile
, "#undef ");
7026 while (is_idchar
[*cp
]) /* Ick! */
7027 fputc (*cp
++, pcp_outfile
);
7028 putc ('\n', pcp_outfile
);
7032 skip
= (hp
== NULL
) ^ (keyword
->type
== T_IFNDEF
);
7033 if (start_of_file
&& !skip
) {
7034 control_macro
= (U_CHAR
*) xmalloc (end
- buf
+ 1);
7035 bcopy ((char *) buf
, (char *) control_macro
, end
- buf
);
7036 control_macro
[end
- buf
] = 0;
7040 conditional_skip (ip
, skip
, T_IF
, control_macro
, op
);
7044 /* Push TYPE on stack; then, if SKIP is nonzero, skip ahead.
7045 If this is a #ifndef starting at the beginning of a file,
7046 CONTROL_MACRO is the macro name tested by the #ifndef.
7047 Otherwise, CONTROL_MACRO is 0. */
7050 conditional_skip (ip
, skip
, type
, control_macro
, op
)
7053 enum node_type type
;
7054 U_CHAR
*control_macro
;
7057 IF_STACK_FRAME
*temp
;
7059 temp
= (IF_STACK_FRAME
*) xcalloc (1, sizeof (IF_STACK_FRAME
));
7060 temp
->fname
= ip
->nominal_fname
;
7061 temp
->lineno
= ip
->lineno
;
7062 temp
->next
= if_stack
;
7063 temp
->control_macro
= control_macro
;
7066 if_stack
->type
= type
;
7069 skip_if_group (ip
, 0, op
);
7072 ++if_stack
->if_succeeded
;
7073 output_line_directive (ip
, &outbuf
, 1, same_file
);
7077 /* Skip to #endif, #else, or #elif. adjust line numbers, etc.
7078 Leaves input ptr at the sharp sign found.
7079 If ANY is nonzero, return at next directive of any sort. */
7082 skip_if_group (ip
, any
, op
)
7087 register U_CHAR
*bp
= ip
->bufp
, *cp
;
7088 register U_CHAR
*endb
= ip
->buf
+ ip
->length
;
7089 struct directive
*kt
;
7090 IF_STACK_FRAME
*save_if_stack
= if_stack
; /* don't pop past here */
7091 U_CHAR
*beg_of_line
= bp
;
7092 register int ident_length
;
7093 U_CHAR
*ident
, *after_ident
;
7094 /* Save info about where the group starts. */
7095 U_CHAR
*beg_of_group
= bp
;
7096 int beg_lineno
= ip
->lineno
;
7098 if (output_conditionals
&& op
!= 0) {
7099 char *ptr
= "#failed\n";
7100 int len
= strlen (ptr
);
7102 if (op
->bufp
> op
->buf
&& op
->bufp
[-1] != '\n')
7107 check_expand (op
, len
);
7108 bcopy (ptr
, (char *) op
->bufp
, len
);
7111 output_line_directive (ip
, op
, 1, 0);
7116 case '/': /* possible comment */
7117 if (*bp
== '\\' && bp
[1] == '\n')
7120 || (cplusplus_comments
&& *bp
== '/')) {
7122 bp
= skip_to_end_of_comment (ip
, &ip
->lineno
, 0);
7127 bp
= skip_quoted_string (bp
- 1, endb
, ip
->lineno
, &ip
->lineno
,
7128 NULL_PTR
, NULL_PTR
);
7131 /* Char after backslash loses its special meaning. */
7134 ++ip
->lineno
; /* But do update the line-count. */
7143 if (beg_of_line
== 0 || traditional
)
7146 while (bp
[0] == '\\' && bp
[1] == '\n')
7152 /* # keyword: a # must be first nonblank char on the line */
7153 if (beg_of_line
== 0)
7157 /* Scan from start of line, skipping whitespace, comments
7158 and backslash-newlines, and see if we reach this #.
7159 If not, this # is not special. */
7161 /* If -traditional, require # to be at beginning of line. */
7164 if (is_hor_space
[*bp
])
7166 else if (*bp
== '\\' && bp
[1] == '\n')
7168 else if (*bp
== '/' && bp
[1] == '*') {
7170 while (!(*bp
== '*' && bp
[1] == '/'))
7174 /* There is no point in trying to deal with C++ // comments here,
7175 because if there is one, then this # must be part of the
7176 comment and we would never reach here. */
7180 if (bp
!= ip
->bufp
) {
7181 bp
= ip
->bufp
+ 1; /* Reset bp to after the #. */
7185 bp
= ip
->bufp
+ 1; /* Point after the '#' */
7186 if (ip
->bufp
[0] == '%') {
7187 /* Skip past the ':' again. */
7188 while (*bp
== '\\') {
7195 /* Skip whitespace and \-newline. */
7197 if (is_hor_space
[*bp
])
7199 else if (*bp
== '\\' && bp
[1] == '\n')
7201 else if (*bp
== '/') {
7203 for (bp
+= 2; ; bp
++) {
7206 else if (*bp
== '*') {
7207 if (bp
[-1] == '/' && warn_comments
)
7208 warning ("`/*' within comment");
7214 } else if (bp
[1] == '/' && cplusplus_comments
) {
7215 for (bp
+= 2; ; bp
++) {
7220 warning ("multiline `//' comment");
7232 /* Now find end of directive name.
7233 If we encounter a backslash-newline, exchange it with any following
7234 symbol-constituents so that we end up with a contiguous name. */
7240 if (*bp
== '\\' && bp
[1] == '\n')
7241 name_newline_fix (bp
);
7247 ident_length
= bp
- cp
;
7251 /* A line of just `#' becomes blank. */
7253 if (ident_length
== 0 && *after_ident
== '\n') {
7257 if (ident_length
== 0 || !is_idstart
[*ident
]) {
7259 while (is_idchar
[*p
]) {
7260 if (*p
< '0' || *p
> '9')
7264 /* Handle # followed by a line number. */
7265 if (p
!= ident
&& !is_idchar
[*p
]) {
7267 pedwarn ("`#' followed by integer");
7271 /* Avoid error for `###' and similar cases unless -pedantic. */
7273 while (*p
== '#' || is_hor_space
[*p
]) p
++;
7275 if (pedantic
&& !lang_asm
)
7276 pedwarn ("invalid preprocessing directive");
7281 if (!lang_asm
&& pedantic
)
7282 pedwarn ("invalid preprocessing directive name");
7286 for (kt
= directive_table
; kt
->length
>= 0; kt
++) {
7287 IF_STACK_FRAME
*temp
;
7288 if (ident_length
== kt
->length
7289 && bcmp (cp
, kt
->name
, kt
->length
) == 0) {
7290 /* If we are asked to return on next directive, do so now. */
7298 temp
= (IF_STACK_FRAME
*) xcalloc (1, sizeof (IF_STACK_FRAME
));
7299 temp
->next
= if_stack
;
7301 temp
->lineno
= ip
->lineno
;
7302 temp
->fname
= ip
->nominal_fname
;
7303 temp
->type
= kt
->type
;
7307 if (pedantic
&& if_stack
!= save_if_stack
)
7308 validate_else (bp
, endb
);
7310 if (if_stack
== instack
[indepth
].if_stack
) {
7311 error ("`#%s' not within a conditional", kt
->name
);
7314 else if (if_stack
== save_if_stack
)
7315 goto done
; /* found what we came for */
7317 if (kt
->type
!= T_ENDIF
) {
7318 if (if_stack
->type
== T_ELSE
)
7319 error ("`#else' or `#elif' after `#else'");
7320 if_stack
->type
= kt
->type
;
7325 if_stack
= if_stack
->next
;
7335 /* Don't let erroneous code go by. */
7336 if (kt
->length
< 0 && !lang_asm
&& pedantic
)
7337 pedwarn ("invalid preprocessing directive name");
7342 /* after this returns, rescan will exit because ip->bufp
7343 now points to the end of the buffer.
7344 rescan is responsible for the error message also. */
7347 if (output_conditionals
&& op
!= 0) {
7348 char *ptr
= "#endfailed\n";
7349 int len
= strlen (ptr
);
7351 if (op
->bufp
> op
->buf
&& op
->bufp
[-1] != '\n')
7356 check_expand (op
, beg_of_line
- beg_of_group
);
7357 bcopy ((char *) beg_of_group
, (char *) op
->bufp
,
7358 beg_of_line
- beg_of_group
);
7359 op
->bufp
+= beg_of_line
- beg_of_group
;
7360 op
->lineno
+= ip
->lineno
- beg_lineno
;
7361 check_expand (op
, len
);
7362 bcopy (ptr
, (char *) op
->bufp
, len
);
7368 /* Handle a #else directive. Do this by just continuing processing
7369 without changing if_stack ; this is so that the error message
7370 for missing #endif's etc. will point to the original #if. It
7371 is possible that something different would be better. */
7374 do_else (buf
, limit
, op
, keyword
)
7375 U_CHAR
*buf
, *limit
;
7377 struct directive
*keyword
;
7379 FILE_BUF
*ip
= &instack
[indepth
];
7382 SKIP_WHITE_SPACE (buf
);
7384 pedwarn ("text following `#else' violates ANSI standard");
7387 if (if_stack
== instack
[indepth
].if_stack
) {
7388 error ("`#else' not within a conditional");
7391 /* #ifndef can't have its special treatment for containing the whole file
7392 if it has a #else clause. */
7393 if_stack
->control_macro
= 0;
7395 if (if_stack
->type
!= T_IF
&& if_stack
->type
!= T_ELIF
) {
7396 error ("`#else' after `#else'");
7397 fprintf (stderr
, " (matches line %d", if_stack
->lineno
);
7398 if (strcmp (if_stack
->fname
, ip
->nominal_fname
) != 0)
7399 fprintf (stderr
, ", file %s", if_stack
->fname
);
7400 fprintf (stderr
, ")\n");
7402 if_stack
->type
= T_ELSE
;
7405 if (if_stack
->if_succeeded
)
7406 skip_if_group (ip
, 0, op
);
7408 ++if_stack
->if_succeeded
; /* continue processing input */
7409 output_line_directive (ip
, op
, 1, same_file
);
7414 /* Unstack after #endif directive. */
7417 do_endif (buf
, limit
, op
, keyword
)
7418 U_CHAR
*buf
, *limit
;
7420 struct directive
*keyword
;
7423 SKIP_WHITE_SPACE (buf
);
7425 pedwarn ("text following `#endif' violates ANSI standard");
7428 if (if_stack
== instack
[indepth
].if_stack
)
7429 error ("unbalanced `#endif'");
7431 IF_STACK_FRAME
*temp
= if_stack
;
7432 if_stack
= if_stack
->next
;
7433 if (temp
->control_macro
!= 0) {
7434 /* This #endif matched a #ifndef at the start of the file.
7435 See if it is at the end of the file. */
7436 FILE_BUF
*ip
= &instack
[indepth
];
7437 U_CHAR
*p
= ip
->bufp
;
7438 U_CHAR
*ep
= ip
->buf
+ ip
->length
;
7444 && (*p
== '*' || (cplusplus_comments
&& *p
== '/'))) {
7445 /* Skip this comment. */
7447 U_CHAR
*save_bufp
= ip
->bufp
;
7449 p
= skip_to_end_of_comment (ip
, &junk
, 1);
7450 ip
->bufp
= save_bufp
;
7455 /* If we get here, this #endif ends a #ifndef
7456 that contains all of the file (aside from whitespace).
7457 Arrange not to include the file again
7458 if the macro that was tested is defined.
7460 Do not do this for the top-level file in a -include or any
7461 file in a -imacros. */
7463 && ! (indepth
== 1 && no_record_file
)
7464 && ! (no_record_file
&& no_output
))
7465 record_control_macro (ip
->inc
, temp
->control_macro
);
7469 output_line_directive (&instack
[indepth
], op
, 1, same_file
);
7474 /* When an #else or #endif is found while skipping failed conditional,
7475 if -pedantic was specified, this is called to warn about text after
7476 the directive name. P points to the first char after the directive
7480 validate_else (p
, limit
)
7482 register U_CHAR
*limit
;
7484 /* Advance P over whitespace and comments. */
7486 while (*p
== '\\' && p
[1] == '\n')
7488 if (is_hor_space
[*p
])
7490 else if (*p
== '/') {
7491 while (p
[1] == '\\' && p
[2] == '\n')
7494 /* Don't bother warning about unterminated comments
7495 since that will happen later. Just be sure to exit. */
7496 for (p
+= 2; ; p
++) {
7500 while (p
[1] == '\\' && p
[2] == '\n')
7509 else if (cplusplus_comments
&& p
[1] == '/')
7515 pedwarn ("text following `#else' or `#endif' violates ANSI standard");
7518 /* Skip a comment, assuming the input ptr immediately follows the
7519 initial slash-star. Bump *LINE_COUNTER for each newline.
7520 (The canonical line counter is &ip->lineno.)
7521 Don't use this routine (or the next one) if bumping the line
7522 counter is not sufficient to deal with newlines in the string.
7524 If NOWARN is nonzero, don't warn about slash-star inside a comment.
7525 This feature is useful when processing a comment that is going to
7526 be processed or was processed at another point in the preprocessor,
7527 to avoid a duplicate warning. Likewise for unterminated comment
7531 skip_to_end_of_comment (ip
, line_counter
, nowarn
)
7532 register FILE_BUF
*ip
;
7533 int *line_counter
; /* place to remember newlines, or NULL */
7536 register U_CHAR
*limit
= ip
->buf
+ ip
->length
;
7537 register U_CHAR
*bp
= ip
->bufp
;
7538 FILE_BUF
*op
= put_out_comments
&& !line_counter
? &outbuf
: (FILE_BUF
*) 0;
7539 int start_line
= line_counter
? *line_counter
: 0;
7541 /* JF this line_counter stuff is a crock to make sure the
7542 comment is only put out once, no matter how many times
7543 the comment is skipped. It almost works */
7546 *op
->bufp
++ = bp
[-1];
7548 if (cplusplus_comments
&& bp
[-1] == '/') {
7549 for (; bp
< limit
; bp
++) {
7553 if (!nowarn
&& warn_comments
)
7554 warning ("multiline `//' comment");
7566 while (bp
< limit
) {
7571 /* If this is the end of the file, we have an unterminated comment.
7572 Don't swallow the newline. We are guaranteed that there will be a
7573 trailing newline and various pieces assume it's there. */
7580 if (line_counter
!= NULL
)
7586 if (bp
[-2] == '/' && !nowarn
&& warn_comments
)
7587 warning ("`/*' within comment");
7588 if (*bp
== '\\' && bp
[1] == '\n')
7601 error_with_line (line_for_error (start_line
), "unterminated comment");
7606 /* Skip over a quoted string. BP points to the opening quote.
7607 Returns a pointer after the closing quote. Don't go past LIMIT.
7608 START_LINE is the line number of the starting point (but it need
7609 not be valid if the starting point is inside a macro expansion).
7611 The input stack state is not changed.
7613 If COUNT_NEWLINES is nonzero, it points to an int to increment
7614 for each newline passed.
7616 If BACKSLASH_NEWLINES_P is nonzero, store 1 thru it
7617 if we pass a backslash-newline.
7619 If EOFP is nonzero, set *EOFP to 1 if the string is unterminated. */
7622 skip_quoted_string (bp
, limit
, start_line
, count_newlines
, backslash_newlines_p
, eofp
)
7623 register U_CHAR
*bp
;
7624 register U_CHAR
*limit
;
7626 int *count_newlines
;
7627 int *backslash_newlines_p
;
7630 register U_CHAR c
, match
;
7635 error_with_line (line_for_error (start_line
),
7636 "unterminated string or character constant");
7637 error_with_line (multiline_string_line
,
7638 "possible real start of unterminated constant");
7639 multiline_string_line
= 0;
7646 while (*bp
== '\\' && bp
[1] == '\n') {
7647 if (backslash_newlines_p
)
7648 *backslash_newlines_p
= 1;
7653 if (*bp
== '\n' && count_newlines
) {
7654 if (backslash_newlines_p
)
7655 *backslash_newlines_p
= 1;
7659 } else if (c
== '\n') {
7661 /* Unterminated strings and character constants are 'valid'. */
7662 bp
--; /* Don't consume the newline. */
7667 if (match
== '\'') {
7668 error_with_line (line_for_error (start_line
),
7669 "unterminated string or character constant");
7675 /* If not traditional, then allow newlines inside strings. */
7678 if (multiline_string_line
== 0) {
7680 pedwarn_with_line (line_for_error (start_line
),
7681 "string constant runs past end of line");
7682 multiline_string_line
= start_line
;
7684 } else if (c
== match
)
7690 /* Place into DST a quoted string representing the string SRC.
7691 Return the address of DST's terminating null. */
7694 quote_string (dst
, src
)
7701 switch ((c
= *src
++))
7708 sprintf (dst
, "\\%03o", c
);
7726 /* Skip across a group of balanced parens, starting from IP->bufp.
7727 IP->bufp is updated. Use this with IP->bufp pointing at an open-paren.
7729 This does not handle newlines, because it's used for the arg of #if,
7730 where there aren't any newlines. Also, backslash-newline can't appear. */
7733 skip_paren_group (ip
)
7734 register FILE_BUF
*ip
;
7736 U_CHAR
*limit
= ip
->buf
+ ip
->length
;
7737 U_CHAR
*p
= ip
->bufp
;
7739 int lines_dummy
= 0;
7741 while (p
!= limit
) {
7751 return ip
->bufp
= p
;
7757 p
= skip_to_end_of_comment (ip
, &lines_dummy
, 0);
7765 p
= skip_quoted_string (p
- 1, limit
, 0, NULL_PTR
, NULL_PTR
, &eofp
);
7767 return ip
->bufp
= p
;
7777 /* Write out a #line directive, for instance, after an #include file.
7778 If CONDITIONAL is nonzero, we can omit the #line if it would
7779 appear to be a no-op, and we can output a few newlines instead
7780 if we want to increase the line number by a small amount.
7781 FILE_CHANGE says whether we are entering a file, leaving, or neither. */
7784 output_line_directive (ip
, op
, conditional
, file_change
)
7787 enum file_change_code file_change
;
7790 char *line_directive_buf
, *line_end
;
7792 if (no_line_directives
7793 || ip
->fname
== NULL
7795 op
->lineno
= ip
->lineno
;
7800 if (ip
->lineno
== op
->lineno
)
7803 /* If the inherited line number is a little too small,
7804 output some newlines instead of a #line directive. */
7805 if (ip
->lineno
> op
->lineno
&& ip
->lineno
< op
->lineno
+ 8) {
7806 check_expand (op
, 10);
7807 while (ip
->lineno
> op
->lineno
) {
7815 /* Output a positive line number if possible. */
7816 while (ip
->lineno
<= 0 && ip
->bufp
- ip
->buf
< ip
->length
7817 && *ip
->bufp
== '\n') {
7822 line_directive_buf
= (char *) alloca (4 * strlen (ip
->nominal_fname
) + 100);
7823 sprintf (line_directive_buf
, "# %d ", ip
->lineno
);
7824 line_end
= quote_string (line_directive_buf
+ strlen (line_directive_buf
),
7826 if (file_change
!= same_file
) {
7828 *line_end
++ = file_change
== enter_file
? '1' : '2';
7830 /* Tell cc1 if following text comes from a system header file. */
7831 if (ip
->system_header_p
) {
7835 #ifndef NO_IMPLICIT_EXTERN_C
7836 /* Tell cc1plus if following text should be treated as C. */
7837 if (ip
->system_header_p
== 2 && cplusplus
) {
7843 len
= line_end
- line_directive_buf
;
7844 check_expand (op
, len
+ 1);
7845 if (op
->bufp
> op
->buf
&& op
->bufp
[-1] != '\n')
7847 bcopy ((char *) line_directive_buf
, (char *) op
->bufp
, len
);
7849 op
->lineno
= ip
->lineno
;
7852 /* This structure represents one parsed argument in a macro call.
7853 `raw' points to the argument text as written (`raw_length' is its length).
7854 `expanded' points to the argument's macro-expansion
7855 (its length is `expand_length').
7856 `stringified_length' is the length the argument would have
7858 `use_count' is the number of times this macro arg is substituted
7859 into the macro. If the actual use count exceeds 10,
7860 the value stored is 10.
7861 `free1' and `free2', if nonzero, point to blocks to be freed
7862 when the macro argument data is no longer needed. */
7865 U_CHAR
*raw
, *expanded
;
7866 int raw_length
, expand_length
;
7867 int stringified_length
;
7868 U_CHAR
*free1
, *free2
;
7873 /* Expand a macro call.
7874 HP points to the symbol that is the macro being called.
7875 Put the result of expansion onto the input stack
7876 so that subsequent input by our caller will use it.
7878 If macro wants arguments, caller has already verified that
7879 an argument list follows; arguments come from the input stack. */
7882 macroexpand (hp
, op
)
7887 DEFINITION
*defn
= hp
->value
.defn
;
7888 register U_CHAR
*xbuf
;
7890 int start_line
= instack
[indepth
].lineno
;
7891 int rest_args
, rest_zero
;
7893 CHECK_DEPTH (return;);
7895 /* it might not actually be a macro. */
7896 if (hp
->type
!= T_MACRO
) {
7897 special_symbol (hp
, op
);
7901 /* This macro is being used inside a #if, which means it must be */
7902 /* recorded as a precondition. */
7903 if (pcp_inside_if
&& pcp_outfile
&& defn
->predefined
)
7904 dump_single_macro (hp
, pcp_outfile
);
7906 nargs
= defn
->nargs
;
7910 struct argdata
*args
;
7911 char *parse_error
= 0;
7913 args
= (struct argdata
*) alloca ((nargs
+ 1) * sizeof (struct argdata
));
7915 for (i
= 0; i
< nargs
; i
++) {
7916 args
[i
].raw
= (U_CHAR
*) "";
7917 args
[i
].expanded
= 0;
7918 args
[i
].raw_length
= args
[i
].expand_length
7919 = args
[i
].stringified_length
= 0;
7920 args
[i
].free1
= args
[i
].free2
= 0;
7921 args
[i
].use_count
= 0;
7924 /* Parse all the macro args that are supplied. I counts them.
7925 The first NARGS args are stored in ARGS.
7926 The rest are discarded.
7927 If rest_args is set then we assume macarg absorbed the rest of the args.
7932 /* Discard the open-parenthesis or comma before the next arg. */
7933 ++instack
[indepth
].bufp
;
7936 if (i
< nargs
|| (nargs
== 0 && i
== 0)) {
7937 /* If we are working on last arg which absorbs rest of args... */
7938 if (i
== nargs
- 1 && defn
->rest_args
)
7940 parse_error
= macarg (&args
[i
], rest_args
);
7943 parse_error
= macarg (NULL_PTR
, 0);
7945 error_with_line (line_for_error (start_line
), parse_error
);
7949 } while (*instack
[indepth
].bufp
!= ')');
7951 /* If we got one arg but it was just whitespace, call that 0 args. */
7953 register U_CHAR
*bp
= args
[0].raw
;
7954 register U_CHAR
*lim
= bp
+ args
[0].raw_length
;
7955 /* cpp.texi says for foo ( ) we provide one argument.
7956 However, if foo wants just 0 arguments, treat this as 0. */
7958 while (bp
!= lim
&& is_space
[*bp
]) bp
++;
7963 /* Don't output an error message if we have already output one for
7964 a parse error above. */
7966 if (nargs
== 0 && i
> 0) {
7968 error ("arguments given to macro `%s'", hp
->name
);
7969 } else if (i
< nargs
) {
7970 /* traditional C allows foo() if foo wants one argument. */
7971 if (nargs
== 1 && i
== 0 && traditional
)
7973 /* the rest args token is allowed to absorb 0 tokens */
7974 else if (i
== nargs
- 1 && defn
->rest_args
)
7976 else if (parse_error
)
7979 error ("macro `%s' used without args", hp
->name
);
7981 error ("macro `%s' used with just one arg", hp
->name
);
7983 error ("macro `%s' used with only %d args", hp
->name
, i
);
7984 } else if (i
> nargs
) {
7986 error ("macro `%s' used with too many (%d) args", hp
->name
, i
);
7989 /* Swallow the closeparen. */
7990 ++instack
[indepth
].bufp
;
7992 /* If macro wants zero args, we parsed the arglist for checking only.
7993 Read directly from the macro definition. */
7995 xbuf
= defn
->expansion
;
7996 xbuf_len
= defn
->length
;
7998 register U_CHAR
*exp
= defn
->expansion
;
7999 register int offset
; /* offset in expansion,
8000 copied a piece at a time */
8001 register int totlen
; /* total amount of exp buffer filled so far */
8003 register struct reflist
*ap
, *last_ap
;
8005 /* Macro really takes args. Compute the expansion of this call. */
8007 /* Compute length in characters of the macro's expansion.
8008 Also count number of times each arg is used. */
8009 xbuf_len
= defn
->length
;
8010 for (ap
= defn
->pattern
; ap
!= NULL
; ap
= ap
->next
) {
8012 xbuf_len
+= args
[ap
->argno
].stringified_length
;
8013 else if (ap
->raw_before
!= 0 || ap
->raw_after
!= 0 || traditional
)
8014 /* Add 4 for two newline-space markers to prevent
8015 token concatenation. */
8016 xbuf_len
+= args
[ap
->argno
].raw_length
+ 4;
8018 /* We have an ordinary (expanded) occurrence of the arg.
8019 So compute its expansion, if we have not already. */
8020 if (args
[ap
->argno
].expanded
== 0) {
8022 obuf
= expand_to_temp_buffer (args
[ap
->argno
].raw
,
8023 args
[ap
->argno
].raw
+ args
[ap
->argno
].raw_length
,
8026 args
[ap
->argno
].expanded
= obuf
.buf
;
8027 args
[ap
->argno
].expand_length
= obuf
.length
;
8028 args
[ap
->argno
].free2
= obuf
.buf
;
8031 /* Add 4 for two newline-space markers to prevent
8032 token concatenation. */
8033 xbuf_len
+= args
[ap
->argno
].expand_length
+ 4;
8035 if (args
[ap
->argno
].use_count
< 10)
8036 args
[ap
->argno
].use_count
++;
8039 xbuf
= (U_CHAR
*) xmalloc (xbuf_len
+ 1);
8041 /* Generate in XBUF the complete expansion
8042 with arguments substituted in.
8043 TOTLEN is the total size generated so far.
8044 OFFSET is the index in the definition
8045 of where we are copying from. */
8046 offset
= totlen
= 0;
8047 for (last_ap
= NULL
, ap
= defn
->pattern
; ap
!= NULL
;
8048 last_ap
= ap
, ap
= ap
->next
) {
8049 register struct argdata
*arg
= &args
[ap
->argno
];
8050 int count_before
= totlen
;
8052 /* Add chars to XBUF. */
8053 for (i
= 0; i
< ap
->nchars
; i
++, offset
++)
8054 xbuf
[totlen
++] = exp
[offset
];
8056 /* If followed by an empty rest arg with concatenation,
8057 delete the last run of nonwhite chars. */
8058 if (rest_zero
&& totlen
> count_before
8059 && ((ap
->rest_args
&& ap
->raw_before
!= 0)
8060 || (last_ap
!= NULL
&& last_ap
->rest_args
8061 && last_ap
->raw_after
!= 0))) {
8062 /* Delete final whitespace. */
8063 while (totlen
> count_before
&& is_space
[xbuf
[totlen
- 1]]) {
8067 /* Delete the nonwhites before them. */
8068 while (totlen
> count_before
&& ! is_space
[xbuf
[totlen
- 1]]) {
8073 if (ap
->stringify
!= 0) {
8074 int arglen
= arg
->raw_length
;
8080 && (c
= arg
->raw
[i
], is_space
[c
]))
8083 && (c
= arg
->raw
[arglen
- 1], is_space
[c
]))
8086 xbuf
[totlen
++] = '\"'; /* insert beginning quote */
8087 for (; i
< arglen
; i
++) {
8090 /* Special markers Newline Space
8091 generate nothing for a stringified argument. */
8092 if (c
== '\n' && arg
->raw
[i
+1] != '\n') {
8097 /* Internal sequences of whitespace are replaced by one space
8098 except within an string or char token. */
8100 && (c
== '\n' ? arg
->raw
[i
+1] == '\n' : is_space
[c
])) {
8102 /* Note that Newline Space does occur within whitespace
8103 sequences; consider it part of the sequence. */
8104 if (c
== '\n' && is_space
[arg
->raw
[i
+1]])
8106 else if (c
!= '\n' && is_space
[c
])
8123 } else if (c
== '\"' || c
== '\'')
8127 /* Escape these chars */
8128 if (c
== '\"' || (in_string
&& c
== '\\'))
8129 xbuf
[totlen
++] = '\\';
8133 sprintf ((char *) &xbuf
[totlen
], "\\%03o", (unsigned int) c
);
8138 xbuf
[totlen
++] = '\"'; /* insert ending quote */
8139 } else if (ap
->raw_before
!= 0 || ap
->raw_after
!= 0 || traditional
) {
8140 U_CHAR
*p1
= arg
->raw
;
8141 U_CHAR
*l1
= p1
+ arg
->raw_length
;
8142 if (ap
->raw_before
!= 0) {
8143 while (p1
!= l1
&& is_space
[*p1
]) p1
++;
8144 while (p1
!= l1
&& is_idchar
[*p1
])
8145 xbuf
[totlen
++] = *p1
++;
8146 /* Delete any no-reexpansion marker that follows
8147 an identifier at the beginning of the argument
8148 if the argument is concatenated with what precedes it. */
8149 if (p1
[0] == '\n' && p1
[1] == '-')
8151 } else if (!traditional
) {
8152 /* Ordinary expanded use of the argument.
8153 Put in newline-space markers to prevent token pasting. */
8154 xbuf
[totlen
++] = '\n';
8155 xbuf
[totlen
++] = ' ';
8157 if (ap
->raw_after
!= 0) {
8158 /* Arg is concatenated after: delete trailing whitespace,
8159 whitespace markers, and no-reexpansion markers. */
8161 if (is_space
[l1
[-1]]) l1
--;
8162 else if (l1
[-1] == '-') {
8163 U_CHAR
*p2
= l1
- 1;
8164 /* If a `-' is preceded by an odd number of newlines then it
8165 and the last newline are a no-reexpansion marker. */
8166 while (p2
!= p1
&& p2
[-1] == '\n') p2
--;
8167 if ((l1
- 1 - p2
) & 1) {
8176 bcopy ((char *) p1
, (char *) (xbuf
+ totlen
), l1
- p1
);
8178 if (!traditional
&& ap
->raw_after
== 0) {
8179 /* Ordinary expanded use of the argument.
8180 Put in newline-space markers to prevent token pasting. */
8181 xbuf
[totlen
++] = '\n';
8182 xbuf
[totlen
++] = ' ';
8185 /* Ordinary expanded use of the argument.
8186 Put in newline-space markers to prevent token pasting. */
8188 xbuf
[totlen
++] = '\n';
8189 xbuf
[totlen
++] = ' ';
8191 bcopy ((char *) arg
->expanded
, (char *) (xbuf
+ totlen
),
8192 arg
->expand_length
);
8193 totlen
+= arg
->expand_length
;
8195 xbuf
[totlen
++] = '\n';
8196 xbuf
[totlen
++] = ' ';
8198 /* If a macro argument with newlines is used multiple times,
8199 then only expand the newlines once. This avoids creating output
8200 lines which don't correspond to any input line, which confuses
8202 if (arg
->use_count
> 1 && arg
->newlines
> 0) {
8203 /* Don't bother doing change_newlines for subsequent
8207 = change_newlines (arg
->expanded
, arg
->expand_length
);
8211 if (totlen
> xbuf_len
)
8215 /* If there is anything left of the definition after handling
8216 the arg list, copy that in too. */
8218 for (i
= offset
; i
< defn
->length
; i
++) {
8219 /* if we've reached the end of the macro */
8222 if (! (rest_zero
&& last_ap
!= NULL
&& last_ap
->rest_args
8223 && last_ap
->raw_after
!= 0))
8224 xbuf
[totlen
++] = exp
[i
];
8230 for (i
= 0; i
< nargs
; i
++) {
8231 if (args
[i
].free1
!= 0)
8232 free (args
[i
].free1
);
8233 if (args
[i
].free2
!= 0)
8234 free (args
[i
].free2
);
8238 xbuf
= defn
->expansion
;
8239 xbuf_len
= defn
->length
;
8242 /* Now put the expansion on the input stack
8243 so our caller will commence reading from it. */
8245 register FILE_BUF
*ip2
;
8247 ip2
= &instack
[++indepth
];
8250 ip2
->nominal_fname
= 0;
8252 /* This may not be exactly correct, but will give much better error
8253 messages for nested macro calls than using a line number of zero. */
8254 ip2
->lineno
= start_line
;
8256 ip2
->length
= xbuf_len
;
8258 ip2
->free_ptr
= (nargs
> 0) ? xbuf
: 0;
8260 ip2
->if_stack
= if_stack
;
8261 ip2
->system_header_p
= 0;
8263 /* Recursive macro use sometimes works traditionally.
8264 #define foo(x,y) bar (x (y,0), y)
8268 hp
->type
= T_DISABLED
;
8272 /* Parse a macro argument and store the info on it into *ARGPTR.
8273 REST_ARGS is passed to macarg1 to make it absorb the rest of the args.
8274 Return nonzero to indicate a syntax error. */
8277 macarg (argptr
, rest_args
)
8278 register struct argdata
*argptr
;
8281 FILE_BUF
*ip
= &instack
[indepth
];
8287 /* Try to parse as much of the argument as exists at this
8288 input stack level. */
8289 U_CHAR
*bp
= macarg1 (ip
->bufp
, ip
->buf
+ ip
->length
,
8290 &paren
, &newlines
, &comments
, rest_args
);
8292 /* If we find the end of the argument at this level,
8293 set up *ARGPTR to point at it in the input stack. */
8294 if (!(ip
->fname
!= 0 && (newlines
!= 0 || comments
!= 0))
8295 && bp
!= ip
->buf
+ ip
->length
) {
8297 argptr
->raw
= ip
->bufp
;
8298 argptr
->raw_length
= bp
- ip
->bufp
;
8299 argptr
->newlines
= newlines
;
8303 /* This input stack level ends before the macro argument does.
8304 We must pop levels and keep parsing.
8305 Therefore, we must allocate a temporary buffer and copy
8306 the macro argument into it. */
8307 int bufsize
= bp
- ip
->bufp
;
8308 int extra
= newlines
;
8309 U_CHAR
*buffer
= (U_CHAR
*) xmalloc (bufsize
+ extra
+ 1);
8310 int final_start
= 0;
8312 bcopy ((char *) ip
->bufp
, (char *) buffer
, bufsize
);
8314 ip
->lineno
+= newlines
;
8316 while (bp
== ip
->buf
+ ip
->length
) {
8317 if (instack
[indepth
].macro
== 0) {
8318 result
= "unterminated macro call";
8321 ip
->macro
->type
= T_MACRO
;
8323 free (ip
->free_ptr
);
8324 ip
= &instack
[--indepth
];
8327 bp
= macarg1 (ip
->bufp
, ip
->buf
+ ip
->length
, &paren
,
8328 &newlines
, &comments
, rest_args
);
8329 final_start
= bufsize
;
8330 bufsize
+= bp
- ip
->bufp
;
8332 buffer
= (U_CHAR
*) xrealloc (buffer
, bufsize
+ extra
+ 1);
8333 bcopy ((char *) ip
->bufp
, (char *) (buffer
+ bufsize
- (bp
- ip
->bufp
)),
8336 ip
->lineno
+= newlines
;
8339 /* Now, if arg is actually wanted, record its raw form,
8340 discarding comments and duplicating newlines in whatever
8341 part of it did not come from a macro expansion.
8342 EXTRA space has been preallocated for duplicating the newlines.
8343 FINAL_START is the index of the start of that part. */
8345 argptr
->raw
= buffer
;
8346 argptr
->raw_length
= bufsize
;
8347 argptr
->free1
= buffer
;
8348 argptr
->newlines
= newlines
;
8349 if ((newlines
|| comments
) && ip
->fname
!= 0)
8352 discard_comments (argptr
->raw
+ final_start
,
8353 argptr
->raw_length
- final_start
,
8355 argptr
->raw
[argptr
->raw_length
] = 0;
8356 if (argptr
->raw_length
> bufsize
+ extra
)
8361 /* If we are not discarding this argument,
8362 macroexpand it and compute its length as stringified.
8363 All this info goes into *ARGPTR. */
8366 register U_CHAR
*buf
, *lim
;
8367 register int totlen
;
8370 lim
= buf
+ argptr
->raw_length
;
8372 while (buf
!= lim
&& is_space
[*buf
])
8374 while (buf
!= lim
&& is_space
[lim
[-1]])
8376 totlen
= traditional
? 0 : 2; /* Count opening and closing quote. */
8377 while (buf
!= lim
) {
8378 register U_CHAR c
= *buf
++;
8380 /* Internal sequences of whitespace are replaced by one space
8381 in most cases, but not always. So count all the whitespace
8382 in case we need to keep it all. */
8385 SKIP_ALL_WHITE_SPACE (buf
);
8388 if (c
== '\"' || c
== '\\') /* escape these chars */
8390 else if (!isprint (c
))
8393 argptr
->stringified_length
= totlen
;
8398 /* Scan text from START (inclusive) up to LIMIT (exclusive),
8399 counting parens in *DEPTHPTR,
8400 and return if reach LIMIT
8401 or before a `)' that would make *DEPTHPTR negative
8402 or before a comma when *DEPTHPTR is zero.
8403 Single and double quotes are matched and termination
8404 is inhibited within them. Comments also inhibit it.
8405 Value returned is pointer to stopping place.
8407 Increment *NEWLINES each time a newline is passed.
8408 REST_ARGS notifies macarg1 that it should absorb the rest of the args.
8409 Set *COMMENTS to 1 if a comment is seen. */
8412 macarg1 (start
, limit
, depthptr
, newlines
, comments
, rest_args
)
8414 register U_CHAR
*limit
;
8415 int *depthptr
, *newlines
, *comments
;
8418 register U_CHAR
*bp
= start
;
8420 while (bp
< limit
) {
8426 if (--(*depthptr
) < 0)
8430 /* Traditionally, backslash makes following char not special. */
8431 if (bp
+ 1 < limit
&& traditional
)
8434 /* But count source lines anyway. */
8443 if (bp
[1] == '\\' && bp
[2] == '\n')
8444 newline_fix (bp
+ 1);
8447 for (bp
+= 2; bp
< limit
; bp
++) {
8450 else if (*bp
== '*') {
8451 if (bp
[-1] == '/' && warn_comments
)
8452 warning ("`/*' within comment");
8453 if (bp
[1] == '\\' && bp
[2] == '\n')
8454 newline_fix (bp
+ 1);
8461 } else if (bp
[1] == '/' && cplusplus_comments
) {
8463 for (bp
+= 2; bp
< limit
; bp
++) {
8469 warning ("multiline `//' comment");
8478 for (quotec
= *bp
++; bp
+ 1 < limit
&& *bp
!= quotec
; bp
++) {
8483 while (*bp
== '\\' && bp
[1] == '\n') {
8486 } else if (*bp
== '\n') {
8495 /* if we've returned to lowest level and we aren't absorbing all args */
8496 if ((*depthptr
) == 0 && rest_args
== 0)
8506 /* Discard comments and duplicate newlines
8507 in the string of length LENGTH at START,
8508 except inside of string constants.
8509 The string is copied into itself with its beginning staying fixed.
8511 NEWLINES is the number of newlines that must be duplicated.
8512 We assume that that much extra space is available past the end
8516 discard_comments (start
, length
, newlines
)
8521 register U_CHAR
*ibp
;
8522 register U_CHAR
*obp
;
8523 register U_CHAR
*limit
;
8526 /* If we have newlines to duplicate, copy everything
8527 that many characters up. Then, in the second part,
8528 we will have room to insert the newlines
8530 NEWLINES may actually be too large, because it counts
8531 newlines in string constants, and we don't duplicate those.
8532 But that does no harm. */
8534 ibp
= start
+ length
;
8535 obp
= ibp
+ newlines
;
8537 while (limit
!= ibp
)
8541 ibp
= start
+ newlines
;
8542 limit
= start
+ length
+ newlines
;
8545 while (ibp
< limit
) {
8546 *obp
++ = c
= *ibp
++;
8549 /* Duplicate the newline. */
8561 if (*ibp
== '\\' && ibp
[1] == '\n')
8563 /* Delete any comment. */
8564 if (cplusplus_comments
&& ibp
[0] == '/') {
8565 /* Comments are equivalent to spaces. */
8568 while (ibp
< limit
&& (*ibp
!= '\n' || ibp
[-1] == '\\'))
8572 if (ibp
[0] != '*' || ibp
+ 1 >= limit
)
8574 /* Comments are equivalent to spaces.
8575 For -traditional, a comment is equivalent to nothing. */
8581 while (ibp
+ 1 < limit
) {
8583 && ibp
[1] == '\\' && ibp
[2] == '\n')
8584 newline_fix (ibp
+ 1);
8585 if (ibp
[0] == '*' && ibp
[1] == '/')
8594 /* Notice and skip strings, so that we don't
8595 think that comments start inside them,
8596 and so we don't duplicate newlines in them. */
8599 while (ibp
< limit
) {
8600 *obp
++ = c
= *ibp
++;
8603 if (c
== '\n' && quotec
== '\'')
8605 if (c
== '\\' && ibp
< limit
) {
8606 while (*ibp
== '\\' && ibp
[1] == '\n')
8619 /* Turn newlines to spaces in the string of length LENGTH at START,
8620 except inside of string constants.
8621 The string is copied into itself with its beginning staying fixed. */
8624 change_newlines (start
, length
)
8628 register U_CHAR
*ibp
;
8629 register U_CHAR
*obp
;
8630 register U_CHAR
*limit
;
8634 limit
= start
+ length
;
8637 while (ibp
< limit
) {
8638 *obp
++ = c
= *ibp
++;
8641 /* If this is a NEWLINE NEWLINE, then this is a real newline in the
8642 string. Skip past the newline and its duplicate.
8643 Put a space in the output. */
8654 /* Notice and skip strings, so that we don't delete newlines in them. */
8657 while (ibp
< limit
) {
8658 *obp
++ = c
= *ibp
++;
8661 if (c
== '\n' && quotec
== '\'')
8672 /* my_strerror - return the descriptive text associated with an
8676 my_strerror (errnum
)
8682 #ifndef HAVE_STRERROR
8683 result
= (char *) ((errnum
< sys_nerr
) ? sys_errlist
[errnum
] : 0);
8685 result
= strerror (errnum
);
8688 /* VAXCRTL's strerror() takes an optional second argument, which only
8689 matters when the first argument is EVMSERR. However, it's simplest
8690 just to pass it unconditionally. `vaxc$errno' is declared in
8691 <errno.h>, and maintained by the library in parallel with `errno'.
8692 We assume that caller's `errnum' either matches the last setting of
8693 `errno' by the library or else does not have the value `EVMSERR'. */
8695 result
= strerror (errnum
, vaxc$errno
);
8699 result
= "undocumented I/O error";
8704 /* error - print error message and increment count of errors. */
8707 error (PRINTF_ALIST (msg
))
8712 VA_START (args
, msg
);
8723 FILE_BUF
*ip
= NULL
;
8725 print_containing_files ();
8727 for (i
= indepth
; i
>= 0; i
--)
8728 if (instack
[i
].fname
!= NULL
) {
8734 fprintf (stderr
, "%s:%d: ", ip
->nominal_fname
, ip
->lineno
);
8735 vfprintf (stderr
, msg
, args
);
8736 fprintf (stderr
, "\n");
8740 /* Error including a message from `errno'. */
8743 error_from_errno (name
)
8747 FILE_BUF
*ip
= NULL
;
8749 print_containing_files ();
8751 for (i
= indepth
; i
>= 0; i
--)
8752 if (instack
[i
].fname
!= NULL
) {
8758 fprintf (stderr
, "%s:%d: ", ip
->nominal_fname
, ip
->lineno
);
8760 fprintf (stderr
, "%s: %s\n", name
, my_strerror (errno
));
8765 /* Print error message but don't count it. */
8768 warning (PRINTF_ALIST (msg
))
8773 VA_START (args
, msg
);
8774 vwarning (msg
, args
);
8779 vwarning (msg
, args
)
8784 FILE_BUF
*ip
= NULL
;
8786 if (inhibit_warnings
)
8789 if (warnings_are_errors
)
8792 print_containing_files ();
8794 for (i
= indepth
; i
>= 0; i
--)
8795 if (instack
[i
].fname
!= NULL
) {
8801 fprintf (stderr
, "%s:%d: ", ip
->nominal_fname
, ip
->lineno
);
8802 fprintf (stderr
, "warning: ");
8803 vfprintf (stderr
, msg
, args
);
8804 fprintf (stderr
, "\n");
8808 #if defined (__STDC__) && defined (HAVE_VPRINTF)
8809 error_with_line (int line
, PRINTF_ALIST (msg
))
8811 error_with_line (line
, PRINTF_ALIST (msg
))
8818 VA_START (args
, msg
);
8819 verror_with_line (line
, msg
, args
);
8824 verror_with_line (line
, msg
, args
)
8830 FILE_BUF
*ip
= NULL
;
8832 print_containing_files ();
8834 for (i
= indepth
; i
>= 0; i
--)
8835 if (instack
[i
].fname
!= NULL
) {
8841 fprintf (stderr
, "%s:%d: ", ip
->nominal_fname
, line
);
8842 vfprintf (stderr
, msg
, args
);
8843 fprintf (stderr
, "\n");
8848 #if defined (__STDC__) && defined (HAVE_VPRINTF)
8849 warning_with_line (int line
, PRINTF_ALIST (msg
))
8851 warning_with_line (line
, PRINTF_ALIST (msg
))
8858 VA_START (args
, msg
);
8859 vwarning_with_line (line
, msg
, args
);
8864 vwarning_with_line (line
, msg
, args
)
8870 FILE_BUF
*ip
= NULL
;
8872 if (inhibit_warnings
)
8875 if (warnings_are_errors
)
8878 print_containing_files ();
8880 for (i
= indepth
; i
>= 0; i
--)
8881 if (instack
[i
].fname
!= NULL
) {
8887 fprintf (stderr
, line
? "%s:%d: " : "%s: ", ip
->nominal_fname
, line
);
8888 fprintf (stderr
, "warning: ");
8889 vfprintf (stderr
, msg
, args
);
8890 fprintf (stderr
, "\n");
8893 /* Print an error message and maybe count it. */
8896 pedwarn (PRINTF_ALIST (msg
))
8901 VA_START (args
, msg
);
8902 if (pedantic_errors
)
8905 vwarning (msg
, args
);
8910 #if defined (__STDC__) && defined (HAVE_VPRINTF)
8911 pedwarn_with_line (int line
, PRINTF_ALIST (msg
))
8913 pedwarn_with_line (line
, PRINTF_ALIST (msg
))
8920 VA_START (args
, msg
);
8921 if (pedantic_errors
)
8922 verror_with_line (line
, msg
, args
);
8924 vwarning_with_line (line
, msg
, args
);
8928 /* Report a warning (or an error if pedantic_errors)
8929 giving specified file name and line number, not current. */
8932 #if defined (__STDC__) && defined (HAVE_VPRINTF)
8933 pedwarn_with_file_and_line (char *file
, int line
, PRINTF_ALIST (msg
))
8935 pedwarn_with_file_and_line (file
, line
, PRINTF_ALIST (msg
))
8943 if (!pedantic_errors
&& inhibit_warnings
)
8946 fprintf (stderr
, "%s:%d: ", file
, line
);
8947 if (pedantic_errors
)
8949 if (!pedantic_errors
)
8950 fprintf (stderr
, "warning: ");
8951 VA_START (args
, msg
);
8952 vfprintf (stderr
, msg
, args
);
8954 fprintf (stderr
, "\n");
8957 /* Print the file names and line numbers of the #include
8958 directives which led to the current file. */
8961 print_containing_files ()
8963 FILE_BUF
*ip
= NULL
;
8967 /* If stack of files hasn't changed since we last printed
8968 this info, don't repeat it. */
8969 if (last_error_tick
== input_file_stack_tick
)
8972 for (i
= indepth
; i
>= 0; i
--)
8973 if (instack
[i
].fname
!= NULL
) {
8978 /* Give up if we don't find a source file. */
8982 /* Find the other, outer source files. */
8983 for (i
--; i
>= 0; i
--)
8984 if (instack
[i
].fname
!= NULL
) {
8988 fprintf (stderr
, "In file included");
8990 fprintf (stderr
, ",\n ");
8993 fprintf (stderr
, " from %s:%d", ip
->nominal_fname
, ip
->lineno
);
8996 fprintf (stderr
, ":\n");
8998 /* Record we have printed the status as of this time. */
8999 last_error_tick
= input_file_stack_tick
;
9002 /* Return the line at which an error occurred.
9003 The error is not necessarily associated with the current spot
9004 in the input stack, so LINE says where. LINE will have been
9005 copied from ip->lineno for the current input level.
9006 If the current level is for a file, we return LINE.
9007 But if the current level is not for a file, LINE is meaningless.
9008 In that case, we return the lineno of the innermost file. */
9011 line_for_error (line
)
9017 for (i
= indepth
; i
>= 0; ) {
9018 if (instack
[i
].fname
!= 0)
9023 line1
= instack
[i
].lineno
;
9031 * If OBUF doesn't have NEEDED bytes after OPTR, make it bigger.
9033 * As things stand, nothing is ever placed in the output buffer to be
9034 * removed again except when it's KNOWN to be part of an identifier,
9035 * so flushing and moving down everything left, instead of expanding,
9039 /* You might think void was cleaner for the return type,
9040 but that would get type mismatch in check_expand in strict ANSI. */
9043 grow_outbuf (obuf
, needed
)
9044 register FILE_BUF
*obuf
;
9045 register int needed
;
9050 if (obuf
->length
- (obuf
->bufp
- obuf
->buf
) > needed
)
9053 /* Make it at least twice as big as it is now. */
9055 /* Make it have at least 150% of the free space we will need. */
9056 minsize
= (3 * needed
) / 2 + (obuf
->bufp
- obuf
->buf
);
9057 if (minsize
> obuf
->length
)
9058 obuf
->length
= minsize
;
9060 if ((p
= (U_CHAR
*) xrealloc (obuf
->buf
, obuf
->length
)) == NULL
)
9063 obuf
->bufp
= p
+ (obuf
->bufp
- obuf
->buf
);
9069 /* Symbol table for macro names and special symbols */
9072 * install a name in the main hash table, even if it is already there.
9073 * name stops with first non alphanumeric, except leading '#'.
9074 * caller must check against redefinition if that is desired.
9075 * delete_macro () removes things installed by install () in fifo order.
9076 * this is important because of the `defined' special symbol used
9077 * in #if, and also if pushdef/popdef directives are ever implemented.
9079 * If LEN is >= 0, it is the length of the name.
9080 * Otherwise, compute the length by scanning the entire name.
9082 * If HASH is >= 0, it is the precomputed hash code.
9083 * Otherwise, compute the hash code.
9087 install (name
, len
, type
, value
, hash
)
9090 enum node_type type
;
9094 register HASHNODE
*hp
;
9095 register int i
, bucket
;
9096 register U_CHAR
*p
, *q
;
9100 while (is_idchar
[*p
])
9106 hash
= hashf (name
, len
, HASHSIZE
);
9108 i
= sizeof (HASHNODE
) + len
+ 1;
9109 hp
= (HASHNODE
*) xmalloc (i
);
9111 hp
->bucket_hdr
= &hashtab
[bucket
];
9112 hp
->next
= hashtab
[bucket
];
9113 hashtab
[bucket
] = hp
;
9115 if (hp
->next
!= NULL
)
9116 hp
->next
->prev
= hp
;
9119 hp
->value
.cpval
= value
;
9120 hp
->name
= ((U_CHAR
*) hp
) + sizeof (HASHNODE
);
9123 for (i
= 0; i
< len
; i
++)
9130 * find the most recent hash node for name name (ending with first
9131 * non-identifier char) installed by install
9133 * If LEN is >= 0, it is the length of the name.
9134 * Otherwise, compute the length by scanning the entire name.
9136 * If HASH is >= 0, it is the precomputed hash code.
9137 * Otherwise, compute the hash code.
9141 lookup (name
, len
, hash
)
9146 register U_CHAR
*bp
;
9147 register HASHNODE
*bucket
;
9150 for (bp
= name
; is_idchar
[*bp
]; bp
++) ;
9155 hash
= hashf (name
, len
, HASHSIZE
);
9157 bucket
= hashtab
[hash
];
9159 if (bucket
->length
== len
&& bcmp (bucket
->name
, name
, len
) == 0)
9161 bucket
= bucket
->next
;
9167 * Delete a hash node. Some weirdness to free junk from macros.
9168 * More such weirdness will have to be added if you define more hash
9169 * types that need it.
9172 /* Note that the DEFINITION of a macro is removed from the hash table
9173 but its storage is not freed. This would be a storage leak
9174 except that it is not reasonable to keep undefining and redefining
9175 large numbers of macros many times.
9176 In any case, this is necessary, because a macro can be #undef'd
9177 in the middle of reading the arguments to a call to it.
9178 If #undef freed the DEFINITION, that would crash. */
9185 if (hp
->prev
!= NULL
)
9186 hp
->prev
->next
= hp
->next
;
9187 if (hp
->next
!= NULL
)
9188 hp
->next
->prev
= hp
->prev
;
9190 /* Make sure that the bucket chain header that the deleted guy was
9191 on points to the right thing afterwards. */
9192 if (hp
== *hp
->bucket_hdr
)
9193 *hp
->bucket_hdr
= hp
->next
;
9196 if (hp
->type
== T_MACRO
) {
9197 DEFINITION
*d
= hp
->value
.defn
;
9198 struct reflist
*ap
, *nextap
;
9200 for (ap
= d
->pattern
; ap
!= NULL
; ap
= nextap
) {
9211 * return hash function on name. must be compatible with the one
9212 * computed a step at a time, elsewhere
9216 hashf (name
, len
, hashsize
)
9217 register U_CHAR
*name
;
9224 r
= HASHSTEP (r
, *name
++);
9226 return MAKE_POS (r
) % hashsize
;
9230 /* Dump the definition of a single macro HP to OF. */
9233 dump_single_macro (hp
, of
)
9234 register HASHNODE
*hp
;
9237 register DEFINITION
*defn
= hp
->value
.defn
;
9243 /* Print the definition of the macro HP. */
9245 fprintf (of
, "#define %s", hp
->name
);
9247 if (defn
->nargs
>= 0) {
9251 for (i
= 0; i
< defn
->nargs
; i
++) {
9252 dump_arg_n (defn
, i
, of
);
9253 if (i
+ 1 < defn
->nargs
)
9263 for (ap
= defn
->pattern
; ap
!= NULL
; ap
= ap
->next
) {
9264 dump_defn_1 (defn
->expansion
, offset
, ap
->nchars
, of
);
9265 offset
+= ap
->nchars
;
9267 if (ap
->nchars
!= 0)
9269 if (ap
->stringify
) {
9270 switch (ap
->stringify
) {
9271 case SHARP_TOKEN
: fprintf (of
, "#"); break;
9272 case WHITE_SHARP_TOKEN
: fprintf (of
, "# "); break;
9273 case PERCENT_COLON_TOKEN
: fprintf (of
, "%%:"); break;
9274 case WHITE_PERCENT_COLON_TOKEN
: fprintf (of
, "%%: "); break;
9278 if (ap
->raw_before
!= 0) {
9280 switch (ap
->raw_before
) {
9281 case WHITE_SHARP_TOKEN
:
9282 case WHITE_PERCENT_COLON_TOKEN
:
9289 switch (ap
->raw_before
) {
9290 case SHARP_TOKEN
: fprintf (of
, "##"); break;
9291 case WHITE_SHARP_TOKEN
: fprintf (of
, "## "); break;
9292 case PERCENT_COLON_TOKEN
: fprintf (of
, "%%:%%:"); break;
9293 case WHITE_PERCENT_COLON_TOKEN
: fprintf (of
, "%%:%%: "); break;
9300 dump_arg_n (defn
, ap
->argno
, of
);
9301 if (!traditional
&& ap
->raw_after
!= 0) {
9302 switch (ap
->raw_after
) {
9303 case SHARP_TOKEN
: fprintf (of
, "##"); break;
9304 case WHITE_SHARP_TOKEN
: fprintf (of
, " ##"); break;
9305 case PERCENT_COLON_TOKEN
: fprintf (of
, "%%:%%:"); break;
9306 case WHITE_PERCENT_COLON_TOKEN
: fprintf (of
, " %%:%%:"); break;
9312 dump_defn_1 (defn
->expansion
, offset
, defn
->length
- offset
, of
);
9316 /* Dump all macro definitions as #defines to stdout. */
9323 for (bucket
= 0; bucket
< HASHSIZE
; bucket
++) {
9324 register HASHNODE
*hp
;
9326 for (hp
= hashtab
[bucket
]; hp
; hp
= hp
->next
) {
9327 if (hp
->type
== T_MACRO
)
9328 dump_single_macro (hp
, stdout
);
9333 /* Output to OF a substring of a macro definition.
9334 BASE is the beginning of the definition.
9335 Output characters START thru LENGTH.
9336 Unless traditional, discard newlines outside of strings, thus
9337 converting funny-space markers to ordinary spaces. */
9340 dump_defn_1 (base
, start
, length
, of
)
9346 U_CHAR
*p
= base
+ start
;
9347 U_CHAR
*limit
= base
+ start
+ length
;
9350 fwrite (p
, sizeof (*p
), length
, of
);
9353 if (*p
== '\"' || *p
=='\'') {
9354 U_CHAR
*p1
= skip_quoted_string (p
, limit
, 0, NULL_PTR
,
9355 NULL_PTR
, NULL_PTR
);
9356 fwrite (p
, sizeof (*p
), p1
- p
, of
);
9367 /* Print the name of argument number ARGNUM of macro definition DEFN
9369 Recall that DEFN->args.argnames contains all the arg names
9370 concatenated in reverse order with comma-space in between. */
9373 dump_arg_n (defn
, argnum
, of
)
9378 register U_CHAR
*p
= defn
->args
.argnames
;
9379 while (argnum
+ 1 < defn
->nargs
) {
9380 p
= (U_CHAR
*) index ((char *) p
, ' ') + 1;
9384 while (*p
&& *p
!= ',') {
9390 /* Initialize syntactic classifications of characters. */
9393 initialize_char_syntax ()
9398 * Set up is_idchar and is_idstart tables. These should be
9399 * faster than saying (is_alpha (c) || c == '_'), etc.
9400 * Set up these things before calling any routines tthat
9403 for (i
= 'a'; i
<= 'z'; i
++) {
9404 is_idchar
[i
- 'a' + 'A'] = 1;
9406 is_idstart
[i
- 'a' + 'A'] = 1;
9409 for (i
= '0'; i
<= '9'; i
++)
9412 is_idstart
['_'] = 1;
9414 is_idstart
['$'] = 1;
9416 /* horizontal space table */
9417 is_hor_space
[' '] = 1;
9418 is_hor_space
['\t'] = 1;
9419 is_hor_space
['\v'] = 1;
9420 is_hor_space
['\f'] = 1;
9421 is_hor_space
['\r'] = 1;
9430 char_name
['\v'] = "vertical tab";
9431 char_name
['\f'] = "formfeed";
9432 char_name
['\r'] = "carriage return";
9435 /* Initialize the built-in macros. */
9438 initialize_builtins (inp
, outp
)
9442 install ((U_CHAR
*) "__LINE__", -1, T_SPECLINE
, NULL_PTR
, -1);
9443 install ((U_CHAR
*) "__DATE__", -1, T_DATE
, NULL_PTR
, -1);
9444 install ((U_CHAR
*) "__FILE__", -1, T_FILE
, NULL_PTR
, -1);
9445 install ((U_CHAR
*) "__BASE_FILE__", -1, T_BASE_FILE
, NULL_PTR
, -1);
9446 install ((U_CHAR
*) "__INCLUDE_LEVEL__", -1, T_INCLUDE_LEVEL
, NULL_PTR
, -1);
9447 install ((U_CHAR
*) "__VERSION__", -1, T_VERSION
, NULL_PTR
, -1);
9448 #ifndef NO_BUILTIN_SIZE_TYPE
9449 install ((U_CHAR
*) "__SIZE_TYPE__", -1, T_SIZE_TYPE
, NULL_PTR
, -1);
9451 #ifndef NO_BUILTIN_PTRDIFF_TYPE
9452 install ((U_CHAR
*) "__PTRDIFF_TYPE__ ", -1, T_PTRDIFF_TYPE
, NULL_PTR
, -1);
9454 install ((U_CHAR
*) "__WCHAR_TYPE__", -1, T_WCHAR_TYPE
, NULL_PTR
, -1);
9455 install ((U_CHAR
*) "__USER_LABEL_PREFIX__", -1, T_USER_LABEL_PREFIX_TYPE
,
9457 install ((U_CHAR
*) "__REGISTER_PREFIX__", -1, T_REGISTER_PREFIX_TYPE
,
9459 install ((U_CHAR
*) "__IMMEDIATE_PREFIX__", -1, T_IMMEDIATE_PREFIX_TYPE
,
9461 install ((U_CHAR
*) "__TIME__", -1, T_TIME
, NULL_PTR
, -1);
9463 install ((U_CHAR
*) "__STDC__", -1, T_CONST
, "1", -1);
9464 install ((U_CHAR
*) "__STDC_VERSION__", -1, T_CONST
, "199409L", -1);
9467 install ((U_CHAR
*) "__OBJC__", -1, T_CONST
, "1", -1);
9468 /* This is supplied using a -D by the compiler driver
9469 so that it is present only when truly compiling with GNU C. */
9470 /* install ((U_CHAR *) "__GNUC__", -1, T_CONST, "2", -1); */
9471 install ((U_CHAR
*) "__HAVE_BUILTIN_SETJMP__", -1, T_CONST
, "1", -1);
9475 char directive
[2048];
9476 U_CHAR
*udirective
= (U_CHAR
*) directive
;
9477 register struct directive
*dp
= &directive_table
[0];
9478 struct tm
*timebuf
= timestamp ();
9480 sprintf (directive
, " __BASE_FILE__ \"%s\"\n",
9481 instack
[0].nominal_fname
);
9482 output_line_directive (inp
, outp
, 0, same_file
);
9483 pass_thru_directive (udirective
, &udirective
[strlen (directive
)],
9486 sprintf (directive
, " __VERSION__ \"%s\"\n", version_string
);
9487 output_line_directive (inp
, outp
, 0, same_file
);
9488 pass_thru_directive (udirective
, &udirective
[strlen (directive
)],
9491 #ifndef NO_BUILTIN_SIZE_TYPE
9492 sprintf (directive
, " __SIZE_TYPE__ %s\n", SIZE_TYPE
);
9493 output_line_directive (inp
, outp
, 0, same_file
);
9494 pass_thru_directive (udirective
, &udirective
[strlen (directive
)],
9498 #ifndef NO_BUILTIN_PTRDIFF_TYPE
9499 sprintf (directive
, " __PTRDIFF_TYPE__ %s\n", PTRDIFF_TYPE
);
9500 output_line_directive (inp
, outp
, 0, same_file
);
9501 pass_thru_directive (udirective
, &udirective
[strlen (directive
)],
9505 sprintf (directive
, " __WCHAR_TYPE__ %s\n", wchar_type
);
9506 output_line_directive (inp
, outp
, 0, same_file
);
9507 pass_thru_directive (udirective
, &udirective
[strlen (directive
)],
9510 sprintf (directive
, " __DATE__ \"%s %2d %4d\"\n",
9511 monthnames
[timebuf
->tm_mon
],
9512 timebuf
->tm_mday
, timebuf
->tm_year
+ 1900);
9513 output_line_directive (inp
, outp
, 0, same_file
);
9514 pass_thru_directive (udirective
, &udirective
[strlen (directive
)],
9517 sprintf (directive
, " __TIME__ \"%02d:%02d:%02d\"\n",
9518 timebuf
->tm_hour
, timebuf
->tm_min
, timebuf
->tm_sec
);
9519 output_line_directive (inp
, outp
, 0, same_file
);
9520 pass_thru_directive (udirective
, &udirective
[strlen (directive
)],
9525 sprintf (directive
, " __STDC__ 1");
9526 output_line_directive (inp
, outp
, 0, same_file
);
9527 pass_thru_directive (udirective
, &udirective
[strlen (directive
)],
9532 sprintf (directive
, " __OBJC__ 1");
9533 output_line_directive (inp
, outp
, 0, same_file
);
9534 pass_thru_directive (udirective
, &udirective
[strlen (directive
)],
9541 * process a given definition string, for initialization
9542 * If STR is just an identifier, define it with value 1.
9543 * If STR has anything after the identifier, then it should
9544 * be identifier=definition.
9548 make_definition (str
, op
)
9553 struct directive
*kt
;
9556 p
= buf
= (U_CHAR
*) str
;
9557 if (!is_idstart
[*p
]) {
9558 error ("malformed option `-D %s'", str
);
9561 while (is_idchar
[*++p
])
9564 while (is_idchar
[*++p
] || *p
== ',' || is_hor_space
[*p
])
9567 p
= (U_CHAR
*) str
; /* Error */
9570 buf
= (U_CHAR
*) alloca (p
- buf
+ 4);
9571 strcpy ((char *)buf
, str
);
9572 strcat ((char *)buf
, " 1");
9573 } else if (*p
!= '=') {
9574 error ("malformed option `-D %s'", str
);
9578 /* Copy the entire option so we can modify it. */
9579 buf
= (U_CHAR
*) alloca (2 * strlen (str
) + 1);
9580 strncpy ((char *) buf
, str
, p
- (U_CHAR
*) str
);
9581 /* Change the = to a space. */
9582 buf
[p
- (U_CHAR
*) str
] = ' ';
9583 /* Scan for any backslash-newline and remove it. */
9585 q
= &buf
[p
- (U_CHAR
*) str
];
9587 if (*p
== '\"' || *p
== '\'') {
9588 int unterminated
= 0;
9589 U_CHAR
*p1
= skip_quoted_string (p
, p
+ strlen ((char *) p
), 0,
9590 NULL_PTR
, NULL_PTR
, &unterminated
);
9594 if (*p
== '\\' && p
[1] == '\n')
9598 } else if (*p
== '\\' && p
[1] == '\n')
9600 /* Change newline chars into newline-markers. */
9601 else if (*p
== '\n')
9613 ip
= &instack
[++indepth
];
9614 ip
->nominal_fname
= ip
->fname
= "*Initialization*";
9616 ip
->buf
= ip
->bufp
= buf
;
9617 ip
->length
= strlen ((char *) buf
);
9621 ip
->if_stack
= if_stack
;
9622 ip
->system_header_p
= 0;
9624 for (kt
= directive_table
; kt
->type
!= T_DEFINE
; kt
++)
9627 /* Pass NULL instead of OP, since this is a "predefined" macro. */
9628 do_define (buf
, buf
+ strlen ((char *) buf
), NULL_PTR
, kt
);
9632 /* JF, this does the work for the -U option */
9635 make_undef (str
, op
)
9640 struct directive
*kt
;
9642 ip
= &instack
[++indepth
];
9643 ip
->nominal_fname
= ip
->fname
= "*undef*";
9645 ip
->buf
= ip
->bufp
= (U_CHAR
*) str
;
9646 ip
->length
= strlen (str
);
9650 ip
->if_stack
= if_stack
;
9651 ip
->system_header_p
= 0;
9653 for (kt
= directive_table
; kt
->type
!= T_UNDEF
; kt
++)
9656 do_undef ((U_CHAR
*) str
, (U_CHAR
*) str
+ strlen (str
), op
, kt
);
9660 /* Process the string STR as if it appeared as the body of a #assert.
9661 OPTION is the option name for which STR was the argument. */
9664 make_assertion (option
, str
)
9669 struct directive
*kt
;
9670 U_CHAR
*buf
, *p
, *q
;
9672 /* Copy the entire option so we can modify it. */
9673 buf
= (U_CHAR
*) alloca (strlen (str
) + 1);
9674 strcpy ((char *) buf
, str
);
9675 /* Scan for any backslash-newline and remove it. */
9678 if (*p
== '\\' && p
[1] == '\n')
9686 if (!is_idstart
[*p
]) {
9687 error ("malformed option `%s %s'", option
, str
);
9690 while (is_idchar
[*++p
])
9692 SKIP_WHITE_SPACE (p
);
9693 if (! (*p
== 0 || *p
== '(')) {
9694 error ("malformed option `%s %s'", option
, str
);
9698 ip
= &instack
[++indepth
];
9699 ip
->nominal_fname
= ip
->fname
= "*Initialization*";
9701 ip
->buf
= ip
->bufp
= buf
;
9702 ip
->length
= strlen ((char *) buf
);
9706 ip
->if_stack
= if_stack
;
9707 ip
->system_header_p
= 0;
9709 for (kt
= directive_table
; kt
->type
!= T_ASSERT
; kt
++)
9712 /* Pass NULL as output ptr to do_define since we KNOW it never does
9714 do_assert (buf
, buf
+ strlen ((char *) buf
) , NULL_PTR
, kt
);
9718 #ifndef DIR_SEPARATOR
9719 #define DIR_SEPARATOR '/'
9722 /* The previous include prefix, if any, is PREV_FILE_NAME.
9723 Translate any pathnames with COMPONENT.
9724 Allocate a new include prefix whose name is the
9725 simplified concatenation of PREFIX and NAME,
9726 with a trailing / added if needed.
9727 But return 0 if the include prefix should be ignored,
9728 e.g. because it is a duplicate of PREV_FILE_NAME. */
9730 static struct file_name_list
*
9731 new_include_prefix (prev_file_name
, component
, prefix
, name
)
9732 struct file_name_list
*prev_file_name
;
9738 fatal ("Directory name missing after command line option");
9741 /* Ignore the empty string. */
9744 prefix
= update_path (prefix
, component
);
9745 name
= update_path (name
, component
);
9748 struct file_name_list
*dir
9749 = ((struct file_name_list
*)
9750 xmalloc (sizeof (struct file_name_list
)
9751 + strlen (prefix
) + strlen (name
) + 2));
9753 strcpy (dir
->fname
, prefix
);
9754 strcat (dir
->fname
, name
);
9755 len
= simplify_filename (dir
->fname
);
9757 /* Convert directory name to a prefix. */
9758 if (dir
->fname
[len
- 1] != DIR_SEPARATOR
) {
9759 if (len
== 1 && dir
->fname
[len
- 1] == '.')
9762 dir
->fname
[len
++] = DIR_SEPARATOR
;
9763 dir
->fname
[len
] = 0;
9766 /* Ignore a directory whose name matches the previous one. */
9767 if (prev_file_name
&& !strcmp (prev_file_name
->fname
, dir
->fname
)) {
9768 /* But treat `-Idir -I- -Idir' as `-I- -Idir'. */
9769 if (!first_bracket_include
)
9770 first_bracket_include
= prev_file_name
;
9776 /* VMS can't stat dir prefixes, so skip these optimizations in VMS. */
9778 /* Add a trailing "." if there is a filename. This increases the number
9779 of systems that can stat directories. We remove it below. */
9782 dir
->fname
[len
] = '.';
9783 dir
->fname
[len
+ 1] = 0;
9786 /* Ignore a nonexistent directory. */
9787 if (stat (len
? dir
->fname
: ".", &dir
->st
) != 0) {
9788 if (errno
!= ENOENT
&& errno
!= ENOTDIR
)
9789 error_from_errno (dir
->fname
);
9795 dir
->fname
[len
] = 0;
9797 /* Ignore a directory whose identity matches the previous one. */
9799 && INO_T_EQ (prev_file_name
->st
.st_ino
, dir
->st
.st_ino
)
9800 && prev_file_name
->st
.st_dev
== dir
->st
.st_dev
) {
9801 /* But treat `-Idir -I- -Idir' as `-I- -Idir'. */
9802 if (!first_bracket_include
)
9803 first_bracket_include
= prev_file_name
;
9810 dir
->c_system_include_path
= 0;
9811 dir
->got_name_map
= 0;
9817 /* Append a chain of `struct file_name_list's
9818 to the end of the main include chain.
9819 FIRST is the beginning of the chain to append, and LAST is the end. */
9822 append_include_chain (first
, last
)
9823 struct file_name_list
*first
, *last
;
9825 struct file_name_list
*dir
;
9827 if (!first
|| !last
)
9833 last_include
->next
= first
;
9835 if (first_bracket_include
== 0)
9836 first_bracket_include
= first
;
9838 for (dir
= first
; ; dir
= dir
->next
) {
9839 int len
= strlen (dir
->fname
) + INCLUDE_LEN_FUDGE
;
9840 if (len
> max_include_len
)
9841 max_include_len
= len
;
9847 last_include
= last
;
9850 /* Place into DST a representation of the file named SRC that is suitable
9851 for `make'. Do not null-terminate DST. Return its length. */
9853 quote_string_for_make (dst
, src
)
9868 /* GNU make uses a weird quoting scheme for white space.
9869 A space or tab preceded by 2N+1 backslashes represents
9870 N backslashes followed by space; a space or tab
9871 preceded by 2N backslashes represents N backslashes at
9872 the end of a file name; and backslashes in other
9873 contexts should not be doubled. */
9875 for (q
= p
- 1; src
< q
&& q
[-1] == '\\'; q
--)
9893 /* Fall through. This can mishandle things like "$(" but
9894 there's no easy fix. */
9897 /* This can mishandle characters in the string "\0\n%*?[\\~";
9898 exactly which chars are mishandled depends on the `make' version.
9899 We know of no portable solution for this;
9900 even GNU make 3.76.1 doesn't solve the problem entirely.
9901 (Also, '\0' is mishandled due to our calling conventions.) */
9911 /* Add output to `deps_buffer' for the -M switch.
9912 STRING points to the text to be output.
9913 SPACER is ':' for targets, ' ' for dependencies. */
9916 deps_output (string
, spacer
)
9920 int size
= quote_string_for_make ((char *) 0, string
);
9925 #ifndef MAX_OUTPUT_COLUMNS
9926 #define MAX_OUTPUT_COLUMNS 72
9928 if (MAX_OUTPUT_COLUMNS
- 1 /*spacer*/ - 2 /*` \'*/ < deps_column
+ size
9929 && 1 < deps_column
) {
9930 bcopy (" \\\n ", &deps_buffer
[deps_size
], 4);
9937 if (deps_size
+ 2 * size
+ 8 > deps_allocated_size
) {
9938 deps_allocated_size
= (deps_size
+ 2 * size
+ 50) * 2;
9939 deps_buffer
= xrealloc (deps_buffer
, deps_allocated_size
);
9941 if (spacer
== ' ') {
9942 deps_buffer
[deps_size
++] = ' ';
9945 quote_string_for_make (&deps_buffer
[deps_size
], string
);
9947 deps_column
+= size
;
9948 if (spacer
== ':') {
9949 deps_buffer
[deps_size
++] = ':';
9952 deps_buffer
[deps_size
] = 0;
9956 fatal (PRINTF_ALIST (msg
))
9961 fprintf (stderr
, "%s: ", progname
);
9962 VA_START (args
, msg
);
9963 vfprintf (stderr
, msg
, args
);
9965 fprintf (stderr
, "\n");
9966 exit (FATAL_EXIT_CODE
);
9969 /* More 'friendly' abort that prints the line and file.
9970 config.h can #define abort fancy_abort if you like that sort of thing. */
9975 fatal ("Internal gcc abort.");
9979 perror_with_name (name
)
9982 fprintf (stderr
, "%s: ", progname
);
9983 fprintf (stderr
, "%s: %s\n", name
, my_strerror (errno
));
9988 pfatal_with_name (name
)
9991 perror_with_name (name
);
9995 exit (FATAL_EXIT_CODE
);
9999 /* Handler for SIGPIPE. */
10002 pipe_closed (signo
)
10003 /* If this is missing, some compilers complain. */
10006 fatal ("output pipe has been closed");
10012 fatal ("Memory exhausted.");
10020 register GENERIC_PTR ptr
= (GENERIC_PTR
) malloc (size
);
10027 xrealloc (old
, size
)
10031 register GENERIC_PTR ptr
= (GENERIC_PTR
) realloc (old
, size
);
10038 xcalloc (number
, size
)
10039 size_t number
, size
;
10041 register size_t total
= number
* size
;
10042 register GENERIC_PTR ptr
= (GENERIC_PTR
) malloc (total
);
10045 bzero (ptr
, total
);
10053 size_t size
= strlen (input
);
10054 char *output
= xmalloc (size
+ 1);
10055 strcpy (output
, input
);
10061 /* Under VMS we need to fix up the "include" specification filename so
10062 that everything following the 1st slash is changed into its correct
10063 VMS file specification. */
10066 hack_vms_include_specification (fname
, vaxc_include
)
10070 register char *cp
, *cp1
, *cp2
;
10071 int f
, check_filename_before_returning
;
10074 check_filename_before_returning
= 0;
10076 cp
= base_name (fname
);
10079 * Check if we have a vax-c style '#include filename'
10080 * and add the missing .h
10082 if (vaxc_include
&& !index (cp
,'.'))
10085 cp2
= Local
; /* initialize */
10087 /* We are trying to do a number of things here. First of all, we are
10088 trying to hammer the filenames into a standard format, such that later
10089 processing can handle them.
10091 If the file name contains something like [dir.], then it recognizes this
10092 as a root, and strips the ".]". Later processing will add whatever is
10093 needed to get things working properly.
10095 If no device is specified, then the first directory name is taken to be
10096 a device name (or a rooted logical). */
10098 /* See if we found that 1st slash */
10099 if (cp
== 0) return; /* Nothing to do!!! */
10100 if (*cp
!= '/') return; /* Nothing to do!!! */
10101 /* Point to the UNIX filename part (which needs to be fixed!) */
10103 /* If the directory spec is not rooted, we can just copy
10104 the UNIX filename part and we are done */
10105 if (((cp
- fname
) > 1) && ((cp
[-1] == ']') || (cp
[-1] == '>'))) {
10106 if (cp
[-2] != '.') {
10108 * The VMS part ends in a `]', and the preceding character is not a `.'.
10109 * We strip the `]', and then splice the two parts of the name in the
10110 * usual way. Given the default locations for include files in cccp.c,
10111 * we will only use this code if the user specifies alternate locations
10112 * with the /include (-I) switch on the command line. */
10113 cp
-= 1; /* Strip "]" */
10114 cp1
--; /* backspace */
10117 * The VMS part has a ".]" at the end, and this will not do. Later
10118 * processing will add a second directory spec, and this would be a syntax
10119 * error. Thus we strip the ".]", and thus merge the directory specs.
10120 * We also backspace cp1, so that it points to a '/'. This inhibits the
10121 * generation of the 000000 root directory spec (which does not belong here
10124 cp
-= 2; /* Strip ".]" */
10125 cp1
--; }; /* backspace */
10128 /* We drop in here if there is no VMS style directory specification yet.
10129 * If there is no device specification either, we make the first dir a
10130 * device and try that. If we do not do this, then we will be essentially
10131 * searching the users default directory (as if they did a #include "asdf.h").
10133 * Then all we need to do is to push a '[' into the output string. Later
10134 * processing will fill this in, and close the bracket.
10136 if (cp
[-1] != ':') *cp2
++ = ':'; /* dev not in spec. take first dir */
10137 *cp2
++ = '['; /* Open the directory specification */
10140 /* at this point we assume that we have the device spec, and (at least
10141 the opening "[" for a directory specification. We may have directories
10142 specified already */
10144 /* If there are no other slashes then the filename will be
10145 in the "root" directory. Otherwise, we need to add
10146 directory specifications. */
10147 if (index (cp1
, '/') == 0) {
10148 /* Just add "000000]" as the directory string */
10149 strcpy (cp2
, "000000]");
10150 cp2
+= strlen (cp2
);
10151 check_filename_before_returning
= 1; /* we might need to fool with this later */
10153 /* As long as there are still subdirectories to add, do them. */
10154 while (index (cp1
, '/') != 0) {
10155 /* If this token is "." we can ignore it */
10156 if ((cp1
[0] == '.') && (cp1
[1] == '/')) {
10160 /* Add a subdirectory spec. Do not duplicate "." */
10161 if (cp2
[-1] != '.' && cp2
[-1] != '[' && cp2
[-1] != '<')
10163 /* If this is ".." then the spec becomes "-" */
10164 if ((cp1
[0] == '.') && (cp1
[1] == '.') && (cp
[2] == '/')) {
10165 /* Add "-" and skip the ".." */
10170 /* Copy the subdirectory */
10171 while (*cp1
!= '/') *cp2
++= *cp1
++;
10172 cp1
++; /* Skip the "/" */
10174 /* Close the directory specification */
10175 if (cp2
[-1] == '.') /* no trailing periods */
10179 /* Now add the filename */
10180 while (*cp1
) *cp2
++ = *cp1
++;
10182 /* Now append it to the original VMS spec. */
10183 strcpy (cp
, Local
);
10185 /* If we put a [000000] in the filename, try to open it first. If this fails,
10186 remove the [000000], and return that name. This provides flexibility
10187 to the user in that they can use both rooted and non-rooted logical names
10188 to point to the location of the file. */
10190 if (check_filename_before_returning
) {
10191 f
= open (fname
, O_RDONLY
, 0666);
10193 /* The file name is OK as it is, so return it as is. */
10197 /* The filename did not work. Try to remove the [000000] from the name,
10199 cp
= index (fname
, '[');
10200 cp2
= index (fname
, ']') + 1;
10201 strcpy (cp
, cp2
); /* this gets rid of it */
10209 /* The following wrapper functions supply additional arguments to the VMS
10210 I/O routines to optimize performance with file handling. The arguments
10212 "mbc=16" - Set multi-block count to 16 (use a 8192 byte buffer).
10213 "deq=64" - When extending the file, extend it in chunks of 32Kbytes.
10214 "fop=tef"- Truncate unused portions of file when closing file.
10215 "shr=nil"- Disallow file sharing while file is open. */
10218 VMS_freopen (fname
, type
, oldfile
)
10223 #undef freopen /* Get back the real freopen routine. */
10224 if (strcmp (type
, "w") == 0)
10225 return freopen (fname
, type
, oldfile
,
10226 "mbc=16", "deq=64", "fop=tef", "shr=nil");
10227 return freopen (fname
, type
, oldfile
, "mbc=16");
10231 VMS_fopen (fname
, type
)
10235 #undef fopen /* Get back the real fopen routine. */
10236 /* The gcc-vms-1.42 distribution's header files prototype fopen with two
10237 fixed arguments, which matches ANSI's specification but not VAXCRTL's
10238 pre-ANSI implementation. This hack circumvents the mismatch problem. */
10239 FILE *(*vmslib_fopen
)() = (FILE *(*)()) fopen
;
10242 return (*vmslib_fopen
) (fname
, type
, "mbc=32",
10243 "deq=64", "fop=tef", "shr=nil");
10245 return (*vmslib_fopen
) (fname
, type
, "mbc=32");
10249 VMS_open (fname
, flags
, prot
)
10254 #undef open /* Get back the real open routine. */
10255 return open (fname
, flags
, prot
, "mbc=16", "deq=64", "fop=tef");
10258 /* more VMS hackery */
10262 extern unsigned long sys$
parse(), sys$
search();
10264 /* Work around another library bug. If a file is located via a searchlist,
10265 and if the device it's on is not the same device as the one specified
10266 in the first element of that searchlist, then both stat() and fstat()
10267 will fail to return info about it. `errno' will be set to EVMSERR, and
10268 `vaxc$errno' will be set to SS$_NORMAL due yet another bug in stat()!
10269 We can get around this by fully parsing the filename and then passing
10270 that absolute name to stat().
10272 Without this fix, we can end up failing to find header files, which is
10273 bad enough, but then compounding the problem by reporting the reason for
10274 failure as "normal successful completion." */
10276 #undef fstat /* Get back to the library version. */
10279 VMS_fstat (fd
, statbuf
)
10281 struct stat
*statbuf
;
10283 int result
= fstat (fd
, statbuf
);
10288 char nambuf
[NAM$C_MAXRSS
+1];
10290 if ((fp
= fdopen (fd
, "r")) != 0 && fgetname (fp
, nambuf
) != 0)
10291 result
= VMS_stat (nambuf
, statbuf
);
10292 /* No fclose(fp) here; that would close(fd) as well. */
10299 VMS_stat (name
, statbuf
)
10301 struct stat
*statbuf
;
10303 int result
= stat (name
, statbuf
);
10309 char exp_nam
[NAM$C_MAXRSS
+1], /* expanded name buffer for sys$parse */
10310 res_nam
[NAM$C_MAXRSS
+1]; /* resultant name buffer for sys$search */
10313 fab
.fab$l_fna
= (char *) name
;
10314 fab
.fab$b_fns
= (unsigned char) strlen (name
);
10315 fab
.fab$l_nam
= (void *) &nam
;
10317 nam
.nam$l_esa
= exp_nam
, nam
.nam$b_ess
= sizeof exp_nam
- 1;
10318 nam
.nam$l_rsa
= res_nam
, nam
.nam$b_rss
= sizeof res_nam
- 1;
10319 nam
.nam$b_nop
= NAM$M_PWD
| NAM$M_NOCONCEAL
;
10320 if (sys$
parse (&fab
) & 1)
10322 if (sys$
search (&fab
) & 1)
10324 res_nam
[nam
.nam$b_rsl
] = '\0';
10325 result
= stat (res_nam
, statbuf
);
10327 /* Clean up searchlist context cached by the system. */
10328 nam
.nam$b_nop
= NAM$M_SYNCHK
;
10329 fab
.fab$l_fna
= 0, fab
.fab$b_fns
= 0;
10330 (void) sys$
parse (&fab
);