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.
21 In other words, you are welcome to use, share and improve this program.
22 You are forbidden to forbid anyone else to use, share and improve
23 what you give them. Help stamp out software-hoarding! */
25 typedef unsigned char U_CHAR
;
29 #include "../src/config.h"
37 /* The macro EMACS is defined when cpp is distributed as part of Emacs,
38 for the sake of machines with limited C compilers. */
41 #endif /* not EMACS */
43 #ifndef STANDARD_INCLUDE_DIR
44 #define STANDARD_INCLUDE_DIR "/usr/include"
49 /* By default, colon separates directories in a path. */
50 #ifndef PATH_SEPARATOR
51 #define PATH_SEPARATOR ':'
54 #include <sys/types.h>
60 /* The following symbols should be autoconfigured:
67 In the mean time, we'll get by with approximations based
68 on existing GCC configuration symbols. */
71 # ifndef HAVE_STDLIB_H
72 # define HAVE_STDLIB_H 1
74 # ifndef HAVE_UNISTD_H
75 # define HAVE_UNISTD_H 1
78 # define STDC_HEADERS 1
80 #endif /* defined (POSIX) */
82 #if defined (POSIX) || (defined (USG) && !defined (VMS))
84 # define HAVE_FCNTL_H 1
91 # if TIME_WITH_SYS_TIME
92 # include <sys/time.h>
96 # include <sys/time.h>
101 # include <sys/resource.h>
119 # define bcmp(a, b, n) memcmp (a, b, n)
122 # define bcopy(s, d, n) memcpy (d, s, n)
125 # define bzero(d, n) memset (d, 0, n)
127 #else /* !STDC_HEADERS */
131 # if !defined (BSTRING) && (defined (USG) || defined (VMS))
134 # define bcmp my_bcmp
147 # endif /* !defined (bcmp) */
150 # define bcopy my_bcopy
160 # endif /* !defined (bcopy) */
163 # define bzero my_bzero
167 register unsigned length
;
172 # endif /* !defined (bzero) */
174 # endif /* !defined (BSTRING) && (defined (USG) || defined (VMS)) */
175 #endif /* ! STDC_HEADERS */
177 #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
178 # define __attribute__(x)
182 # if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__)
183 # define PROTO(ARGS) ARGS
185 # define PROTO(ARGS) ()
189 #if defined (__STDC__) && defined (HAVE_VPRINTF)
191 # define VA_START(va_list, var) va_start (va_list, var)
192 # define PRINTF_ALIST(msg) char *msg, ...
193 # define PRINTF_DCL(msg)
194 # define PRINTF_PROTO(ARGS, m, n) PROTO (ARGS) __attribute__ ((format (__printf__, m, n)))
196 # include <varargs.h>
197 # define VA_START(va_list, var) va_start (va_list)
198 # define PRINTF_ALIST(msg) msg, va_alist
199 # define PRINTF_DCL(msg) char *msg; va_dcl
200 # define PRINTF_PROTO(ARGS, m, n) () __attribute__ ((format (__printf__, m, n)))
201 # define vfprintf(file, msg, args) \
203 char *a0 = va_arg(args, char *); \
204 char *a1 = va_arg(args, char *); \
205 char *a2 = va_arg(args, char *); \
206 char *a3 = va_arg(args, char *); \
207 fprintf (file, msg, a0, a1, a2, a3); \
211 #define PRINTF_PROTO_1(ARGS) PRINTF_PROTO(ARGS, 1, 2)
212 #define PRINTF_PROTO_2(ARGS) PRINTF_PROTO(ARGS, 2, 3)
213 #define PRINTF_PROTO_3(ARGS) PRINTF_PROTO(ARGS, 3, 4)
219 /* VMS-specific definitions */
222 #define open(fname,mode,prot) VMS_open (fname,mode,prot)
223 #define fopen(fname,mode) VMS_fopen (fname,mode)
224 #define freopen(fname,mode,ofile) VMS_freopen (fname,mode,ofile)
225 #define fstat(fd,stbuf) VMS_fstat (fd,stbuf)
226 static int VMS_fstat (), VMS_stat ();
227 static int VMS_open ();
228 static FILE * VMS_fopen ();
229 static FILE * VMS_freopen ();
230 static void hack_vms_include_specification ();
231 #define INO_T_EQ(a, b) (!bcmp((char *) &(a), (char *) &(b), sizeof (a)))
232 #define INO_T_HASH(a) 0
233 #define INCLUDE_LEN_FUDGE 12 /* leave room for VMS syntax conversion */
236 /* Windows does not natively support inodes, and neither does MSDOS. */
237 #if (defined (_WIN32) && ! defined (CYGWIN32)) || defined (__MSDOS__)
238 #define INO_T_EQ(a, b) 0
247 #define MIN(X,Y) ((X) < (Y) ? (X) : (Y))
248 #define MAX(X,Y) ((X) > (Y) ? (X) : (Y))
250 /* Find the largest host integer type and set its size and type.
251 Don't blindly use `long'; on some crazy hosts it is shorter than `int'. */
253 #ifndef HOST_BITS_PER_WIDE_INT
255 #if HOST_BITS_PER_LONG > HOST_BITS_PER_INT
256 #define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_LONG
257 #define HOST_WIDE_INT long
259 #define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_INT
260 #define HOST_WIDE_INT int
266 #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
270 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
274 #define INO_T_EQ(a, b) ((a) == (b))
278 #define INO_T_HASH(a) (a)
281 /* Define a generic NULL if one hasn't already been defined. */
288 #if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__)
289 #define GENERIC_PTR void *
291 #define GENERIC_PTR char *
296 #define NULL_PTR ((GENERIC_PTR) 0)
299 #ifndef INCLUDE_LEN_FUDGE
300 #define INCLUDE_LEN_FUDGE 0
303 /* External declarations. */
305 extern char *version_string
;
307 #ifndef HAVE_STRERROR
309 extern char *sys_errlist
[];
310 #else /* HAVE_STRERROR */
314 char *strerror (int,...);
316 HOST_WIDE_INT parse_escape
PROTO((char **, HOST_WIDE_INT
));
317 HOST_WIDE_INT parse_c_expression
PROTO((char *));
323 /* Name under which this program was invoked. */
325 static char *progname
;
327 /* Nonzero means use extra default include directories for C++. */
329 static int cplusplus
;
331 /* Nonzero means handle cplusplus style comments */
333 static int cplusplus_comments
;
335 /* Nonzero means handle #import, for objective C. */
339 /* Nonzero means this is an assembly file, and allow
340 unknown directives, which could be comments. */
344 /* Current maximum length of directory names in the search path
345 for include files. (Altered as we get more of them.) */
347 static int max_include_len
;
349 /* Nonzero means turn NOTREACHED into #pragma NOTREACHED etc */
351 static int for_lint
= 0;
353 /* Nonzero means copy comments into the output file. */
355 static int put_out_comments
= 0;
357 /* Nonzero means don't process the ANSI trigraph sequences. */
359 static int no_trigraphs
= 0;
361 /* Nonzero means print the names of included files rather than
362 the preprocessed output. 1 means just the #include "...",
363 2 means #include <...> as well. */
365 static int print_deps
= 0;
367 /* Nonzero if missing .h files in -M output are assumed to be generated
368 files and not errors. */
370 static int print_deps_missing_files
= 0;
372 /* Nonzero means print names of header files (-H). */
374 static int print_include_names
= 0;
376 /* Nonzero means don't output line number information. */
378 static int no_line_directives
;
380 /* Nonzero means output the text in failing conditionals,
381 inside #failed ... #endfailed. */
383 static int output_conditionals
;
385 /* dump_only means inhibit output of the preprocessed text
386 and instead output the definitions of all user-defined
387 macros in a form suitable for use as input to cccp.
388 dump_names means pass #define and the macro name through to output.
389 dump_definitions means pass the whole definition (plus #define) through
392 static enum {dump_none
, dump_only
, dump_names
, dump_definitions
}
393 dump_macros
= dump_none
;
395 /* Nonzero means pass all #define and #undef directives which we actually
396 process through to the output stream. This feature is used primarily
397 to allow cc1 to record the #defines and #undefs for the sake of
398 debuggers which understand about preprocessor macros, but it may
399 also be useful with -E to figure out how symbols are defined, and
400 where they are defined. */
401 static int debug_output
= 0;
403 /* Nonzero indicates special processing used by the pcp program. The
404 special effects of this mode are:
406 Inhibit all macro expansion, except those inside #if directives.
408 Process #define directives normally, and output their contents
411 Output preconditions to pcp_outfile indicating all the relevant
412 preconditions for use of this file in a later cpp run.
414 static FILE *pcp_outfile
;
416 /* Nonzero means we are inside an IF during a -pcp run. In this mode
417 macro expansion is done, and preconditions are output for all macro
418 uses requiring them. */
419 static int pcp_inside_if
;
421 /* Nonzero means never to include precompiled files.
422 This is 1 since there's no way now to make precompiled files,
423 so it's not worth testing for them. */
424 static int no_precomp
= 1;
426 /* Nonzero means give all the error messages the ANSI standard requires. */
430 /* Nonzero means try to make failure to fit ANSI C an error. */
432 static int pedantic_errors
;
434 /* Nonzero means don't print warning messages. -w. */
436 static int inhibit_warnings
= 0;
438 /* Nonzero means warn if slash-star appears in a slash-star comment,
439 or if newline-backslash appears in a slash-slash comment. */
441 static int warn_comments
;
443 /* Nonzero means warn if a macro argument is (or would be)
444 stringified with -traditional. */
446 static int warn_stringify
;
448 /* Nonzero means warn if there are any trigraphs. */
450 static int warn_trigraphs
;
452 /* Nonzero means warn if undefined identifiers are evaluated in an #if. */
456 /* Nonzero means warn if #import is used. */
458 static int warn_import
= 1;
460 /* Nonzero means turn warnings into errors. */
462 static int warnings_are_errors
;
464 /* Nonzero means try to imitate old fashioned non-ANSI preprocessor. */
468 /* Nonzero for the 1989 C Standard, including corrigenda and amendments. */
472 /* Nonzero causes output not to be done,
473 but directives such as #define that have side effects
476 static int no_output
;
478 /* Nonzero means this file was included with a -imacros or -include
479 command line and should not be recorded as an include file. */
481 static int no_record_file
;
483 /* Nonzero means that we have finished processing the command line options.
484 This flag is used to decide whether or not to issue certain errors
487 static int done_initializing
= 0;
489 /* Line where a newline was first seen in a string constant. */
491 static int multiline_string_line
= 0;
493 /* I/O buffer structure.
494 The `fname' field is nonzero for source files and #include files
495 and for the dummy text used for -D and -U.
496 It is zero for rescanning results of macro expansion
497 and for expanding macro arguments. */
498 #define INPUT_STACK_MAX 400
499 static struct file_buf
{
501 /* Filename specified with #line directive. */
503 /* Include file description. */
504 struct include_file
*inc
;
505 /* Record where in the search path this file was found.
506 For #include_next. */
507 struct file_name_list
*dir
;
512 /* Macro that this level is the expansion of.
513 Included so that we can reenable the macro
514 at the end of this level. */
515 struct hashnode
*macro
;
516 /* Value of if_stack at start of this file.
517 Used to prohibit unmatched #endif (etc) in an include file. */
518 struct if_stack
*if_stack
;
519 /* Object to be freed at end of input at this level. */
521 /* True if this is a header file included using <FILENAME>. */
522 char system_header_p
;
523 } instack
[INPUT_STACK_MAX
];
525 static int last_error_tick
; /* Incremented each time we print it. */
526 static int input_file_stack_tick
; /* Incremented when the status changes. */
528 /* Current nesting level of input sources.
529 `instack[indepth]' is the level currently being read. */
530 static int indepth
= -1;
531 #define CHECK_DEPTH(code) \
532 if (indepth >= (INPUT_STACK_MAX - 1)) \
534 error_with_line (line_for_error (instack[indepth].lineno), \
535 "macro or `#include' recursion too deep"); \
539 /* Current depth in #include directives that use <...>. */
540 static int system_include_depth
= 0;
542 typedef struct file_buf FILE_BUF
;
544 /* The output buffer. Its LENGTH field is the amount of room allocated
545 for the buffer, not the number of chars actually present. To get
546 that, subtract outbuf.buf from outbuf.bufp. */
548 #define OUTBUF_SIZE 10 /* initial size of output buffer */
549 static FILE_BUF outbuf
;
551 /* Grow output buffer OBUF points at
552 so it can hold at least NEEDED more chars. */
554 #define check_expand(OBUF, NEEDED) \
555 (((OBUF)->length - ((OBUF)->bufp - (OBUF)->buf) <= (NEEDED)) \
556 ? grow_outbuf ((OBUF), (NEEDED)) : 0)
558 struct file_name_list
560 struct file_name_list
*next
;
561 /* If the following is 1, it is a C-language system include
563 int c_system_include_path
;
564 /* Mapping of file names for this directory. */
565 struct file_name_map
*name_map
;
566 /* Non-zero if name_map is valid. */
568 /* The include directory status. */
570 /* The include prefix: "" denotes the working directory,
571 otherwise fname must end in '/'.
572 The actual size is dynamically allocated. */
576 /* #include "file" looks in source file dir, then stack. */
577 /* #include <file> just looks in the stack. */
578 /* -I directories are added to the end, then the defaults are added. */
580 static struct default_include
{
581 char *fname
; /* The name of the directory. */
582 int cplusplus
; /* Only look here if we're compiling C++. */
583 int cxx_aware
; /* Includes in this directory don't need to
584 be wrapped in extern "C" when compiling
586 } include_defaults_array
[]
587 #ifdef INCLUDE_DEFAULTS
591 /* Pick up GNU C++ specific include files. */
592 { GPLUSPLUS_INCLUDE_DIR
, 1, 1 },
593 { OLD_GPLUSPLUS_INCLUDE_DIR
, 1, 1 },
595 /* This is the dir for fixincludes. Put it just before
596 the files that we fix. */
597 { GCC_INCLUDE_DIR
, 0, 0 },
598 /* For cross-compilation, this dir name is generated
599 automatically in Makefile.in. */
600 { CROSS_INCLUDE_DIR
, 0, 0 },
601 #ifdef TOOL_INCLUDE_DIR
602 /* This is another place that the target system's headers might be. */
603 { TOOL_INCLUDE_DIR
, 0, 0 },
605 #else /* not CROSS_COMPILE */
606 #ifdef LOCAL_INCLUDE_DIR
607 /* This should be /usr/local/include and should come before
608 the fixincludes-fixed header files. */
609 { LOCAL_INCLUDE_DIR
, 0, 1 },
611 #ifdef TOOL_INCLUDE_DIR
612 /* This is here ahead of GCC_INCLUDE_DIR because assert.h goes here.
613 Likewise, behind LOCAL_INCLUDE_DIR, where glibc puts its assert.h. */
614 { TOOL_INCLUDE_DIR
, 0, 0 },
616 /* This is the dir for fixincludes. Put it just before
617 the files that we fix. */
618 { GCC_INCLUDE_DIR
, 0, 0 },
619 /* Some systems have an extra dir of include files. */
620 #ifdef SYSTEM_INCLUDE_DIR
621 { SYSTEM_INCLUDE_DIR
, 0, 0 },
623 { STANDARD_INCLUDE_DIR
, 0, 0 },
624 #endif /* not CROSS_COMPILE */
627 #endif /* no INCLUDE_DEFAULTS */
629 /* The code looks at the defaults through this pointer, rather than through
630 the constant structure above. This pointer gets changed if an environment
631 variable specifies other defaults. */
632 static struct default_include
*include_defaults
= include_defaults_array
;
634 static struct file_name_list
*include
= 0; /* First dir to search */
635 /* First dir to search for <file> */
636 /* This is the first element to use for #include <...>.
637 If it is 0, use the entire chain for such includes. */
638 static struct file_name_list
*first_bracket_include
= 0;
639 /* This is the first element in the chain that corresponds to
640 a directory of system header files. */
641 static struct file_name_list
*first_system_include
= 0;
642 static struct file_name_list
*last_include
= 0; /* Last in chain */
644 /* Chain of include directories to put at the end of the other chain. */
645 static struct file_name_list
*after_include
= 0;
646 static struct file_name_list
*last_after_include
= 0; /* Last in chain */
648 /* Chain to put at the start of the system include files. */
649 static struct file_name_list
*before_system
= 0;
650 static struct file_name_list
*last_before_system
= 0; /* Last in chain */
652 /* Directory prefix that should replace `/usr' in the standard
653 include file directories. */
654 static char *include_prefix
;
656 /* Maintain and search list of included files. */
658 struct include_file
{
659 struct include_file
*next
; /* for include_hashtab */
660 struct include_file
*next_ino
; /* for include_ino_hashtab */
662 /* If the following is the empty string, it means #pragma once
663 was seen in this include file, or #import was applied to the file.
664 Otherwise, if it is nonzero, it is a macro name.
665 Don't include the file again if that macro is defined. */
666 U_CHAR
*control_macro
;
667 /* Nonzero if the dependency on this include file has been output. */
672 /* Hash tables of files already included with #include or #import.
673 include_hashtab is by full name; include_ino_hashtab is by inode number. */
675 #define INCLUDE_HASHSIZE 61
676 static struct include_file
*include_hashtab
[INCLUDE_HASHSIZE
];
677 static struct include_file
*include_ino_hashtab
[INCLUDE_HASHSIZE
];
679 /* Global list of strings read in from precompiled files. This list
680 is kept in the order the strings are read in, with new strings being
681 added at the end through stringlist_tailp. We use this list to output
682 the strings at the end of the run.
684 static STRINGDEF
*stringlist
;
685 static STRINGDEF
**stringlist_tailp
= &stringlist
;
688 /* Structure returned by create_definition */
689 typedef struct macrodef MACRODEF
;
692 struct definition
*defn
;
697 enum sharp_token_type
{
698 NO_SHARP_TOKEN
= 0, /* token not present */
700 SHARP_TOKEN
= '#', /* token spelled with # only */
701 WHITE_SHARP_TOKEN
, /* token spelled with # and white space */
703 PERCENT_COLON_TOKEN
= '%', /* token spelled with %: only */
704 WHITE_PERCENT_COLON_TOKEN
/* token spelled with %: and white space */
707 /* Structure allocated for every #define. For a simple replacement
710 nargs = -1, the `pattern' list is null, and the expansion is just
711 the replacement text. Nargs = 0 means a functionlike macro with no args,
713 #define getchar() getc (stdin) .
714 When there are args, the expansion is the replacement text with the
715 args squashed out, and the reflist is a list describing how to
716 build the output from the input: e.g., "3 chars, then the 1st arg,
717 then 9 chars, then the 3rd arg, then 0 chars, then the 2nd arg".
718 The chars here come from the expansion. Whatever is left of the
719 expansion after the last arg-occurrence is copied after that arg.
720 Note that the reflist can be arbitrarily long---
721 its length depends on the number of times the arguments appear in
722 the replacement text, not how many args there are. Example:
723 #define f(x) x+x+x+x+x+x+x would have replacement text "++++++" and
725 { (0, 1), (1, 1), (1, 1), ..., (1, 1), NULL }
726 where (x, y) means (nchars, argno). */
728 typedef struct definition DEFINITION
;
731 int length
; /* length of expansion string */
732 int predefined
; /* True if the macro was builtin or */
733 /* came from the command line */
735 int line
; /* Line number of definition */
736 char *file
; /* File of definition */
737 char rest_args
; /* Nonzero if last arg. absorbs the rest */
739 struct reflist
*next
;
741 enum sharp_token_type stringify
; /* set if a # operator before arg */
742 enum sharp_token_type raw_before
; /* set if a ## operator before arg */
743 enum sharp_token_type raw_after
; /* set if a ## operator after arg */
745 char rest_args
; /* Nonzero if this arg. absorbs the rest */
746 int nchars
; /* Number of literal chars to copy before
747 this arg occurrence. */
748 int argno
; /* Number of arg to substitute (origin-0) */
751 /* Names of macro args, concatenated in reverse order
752 with comma-space between them.
753 The only use of this is that we warn on redefinition
754 if this differs between the old and new definitions. */
759 /* different kinds of things that can appear in the value field
760 of a hash node. Actually, this may be useless now. */
768 * special extension string that can be added to the last macro argument to
769 * allow it to absorb the "rest" of the arguments when expanded. Ex:
770 * #define wow(a, b...) process (b, a, b)
771 * { wow (1, 2, 3); } -> { process (2, 3, 1, 2, 3); }
772 * { wow (one, two); } -> { process (two, one, two); }
773 * if this "rest_arg" is used with the concat token '##' and if it is not
774 * supplied then the token attached to with ## will not be outputted. Ex:
775 * #define wow (a, b...) process (b ## , a, ## b)
776 * { wow (1, 2); } -> { process (2, 1, 2); }
777 * { wow (one); } -> { process (one); {
779 static char rest_extension
[] = "...";
780 #define REST_EXTENSION_LENGTH (sizeof (rest_extension) - 1)
782 /* The structure of a node in the hash table. The hash table
783 has entries for all tokens defined by #define directives (type T_MACRO),
784 plus some special tokens like __LINE__ (these each have their own
785 type, and the appropriate code is run when that type of node is seen.
786 It does not contain control words like "#define", which are recognized
787 by a separate piece of code. */
789 /* different flavors of hash nodes --- also used in keyword table */
791 T_DEFINE
= 1, /* the `#define' keyword */
792 T_INCLUDE
, /* the `#include' keyword */
793 T_INCLUDE_NEXT
, /* the `#include_next' keyword */
794 T_IMPORT
, /* the `#import' keyword */
795 T_IFDEF
, /* the `#ifdef' keyword */
796 T_IFNDEF
, /* the `#ifndef' keyword */
797 T_IF
, /* the `#if' keyword */
798 T_ELSE
, /* `#else' */
799 T_PRAGMA
, /* `#pragma' */
800 T_ELIF
, /* `#elif' */
801 T_UNDEF
, /* `#undef' */
802 T_LINE
, /* `#line' */
803 T_ERROR
, /* `#error' */
804 T_WARNING
, /* `#warning' */
805 T_ENDIF
, /* `#endif' */
806 T_SCCS
, /* `#sccs', used on system V. */
807 T_IDENT
, /* `#ident', used on system V. */
808 T_ASSERT
, /* `#assert', taken from system V. */
809 T_UNASSERT
, /* `#unassert', taken from system V. */
810 T_SPECLINE
, /* special symbol `__LINE__' */
811 T_DATE
, /* `__DATE__' */
812 T_FILE
, /* `__FILE__' */
813 T_BASE_FILE
, /* `__BASE_FILE__' */
814 T_INCLUDE_LEVEL
, /* `__INCLUDE_LEVEL__' */
815 T_VERSION
, /* `__VERSION__' */
816 T_SIZE_TYPE
, /* `__SIZE_TYPE__' */
817 T_PTRDIFF_TYPE
, /* `__PTRDIFF_TYPE__' */
818 T_WCHAR_TYPE
, /* `__WCHAR_TYPE__' */
819 T_USER_LABEL_PREFIX_TYPE
, /* `__USER_LABEL_PREFIX__' */
820 T_REGISTER_PREFIX_TYPE
, /* `__REGISTER_PREFIX__' */
821 T_IMMEDIATE_PREFIX_TYPE
, /* `__IMMEDIATE_PREFIX__' */
822 T_TIME
, /* `__TIME__' */
823 T_CONST
, /* Constant value, used by `__STDC__' */
824 T_MACRO
, /* macro defined by `#define' */
825 T_DISABLED
, /* macro temporarily turned off for rescan */
826 T_SPEC_DEFINED
, /* special `defined' macro for use in #if statements */
827 T_PCSTRING
, /* precompiled string (hashval is KEYDEF *) */
828 T_UNUSED
/* Used for something not defined. */
832 struct hashnode
*next
; /* double links for easy deletion */
833 struct hashnode
*prev
;
834 struct hashnode
**bucket_hdr
; /* also, a back pointer to this node's hash
835 chain is kept, in case the node is the head
836 of the chain and gets deleted. */
837 enum node_type type
; /* type of special token */
838 int length
; /* length of token, for quick comparison */
839 U_CHAR
*name
; /* the actual name */
840 union hashval value
; /* pointer to expansion, or whatever */
843 typedef struct hashnode HASHNODE
;
845 /* Some definitions for the hash table. The hash function MUST be
846 computed as shown in hashf () below. That is because the rescan
847 loop computes the hash value `on the fly' for most tokens,
848 in order to avoid the overhead of a lot of procedure calls to
849 the hashf () function. Hashf () only exists for the sake of
850 politeness, for use when speed isn't so important. */
852 #define HASHSIZE 1403
853 static HASHNODE
*hashtab
[HASHSIZE
];
854 #define HASHSTEP(old, c) ((old << 2) + c)
855 #define MAKE_POS(v) (v & 0x7fffffff) /* make number positive */
857 /* Symbols to predefine. */
859 #ifdef CPP_PREDEFINES
860 static char *predefs
= CPP_PREDEFINES
;
862 static char *predefs
= "";
865 /* We let tm.h override the types used here, to handle trivial differences
866 such as the choice of unsigned int or long unsigned int for size_t.
867 When machines start needing nontrivial differences in the size type,
868 it would be best to do something here to figure out automatically
869 from other information what type to use. */
871 /* The string value for __SIZE_TYPE__. */
874 #define SIZE_TYPE "long unsigned int"
877 /* The string value for __PTRDIFF_TYPE__. */
880 #define PTRDIFF_TYPE "long int"
883 /* The string value for __WCHAR_TYPE__. */
886 #define WCHAR_TYPE "int"
888 char * wchar_type
= WCHAR_TYPE
;
891 /* The string value for __USER_LABEL_PREFIX__ */
893 #ifndef USER_LABEL_PREFIX
894 #define USER_LABEL_PREFIX ""
897 /* The string value for __REGISTER_PREFIX__ */
899 #ifndef REGISTER_PREFIX
900 #define REGISTER_PREFIX ""
903 /* The string value for __IMMEDIATE_PREFIX__ */
905 #ifndef IMMEDIATE_PREFIX
906 #define IMMEDIATE_PREFIX ""
909 /* In the definition of a #assert name, this structure forms
910 a list of the individual values asserted.
911 Each value is itself a list of "tokens".
912 These are strings that are compared by name. */
914 struct tokenlist_list
{
915 struct tokenlist_list
*next
;
916 struct arglist
*tokens
;
919 struct assertion_hashnode
{
920 struct assertion_hashnode
*next
; /* double links for easy deletion */
921 struct assertion_hashnode
*prev
;
922 /* also, a back pointer to this node's hash
923 chain is kept, in case the node is the head
924 of the chain and gets deleted. */
925 struct assertion_hashnode
**bucket_hdr
;
926 int length
; /* length of token, for quick comparison */
927 U_CHAR
*name
; /* the actual name */
928 /* List of token-sequences. */
929 struct tokenlist_list
*value
;
932 typedef struct assertion_hashnode ASSERTION_HASHNODE
;
934 /* Some definitions for the hash table. The hash function MUST be
935 computed as shown in hashf below. That is because the rescan
936 loop computes the hash value `on the fly' for most tokens,
937 in order to avoid the overhead of a lot of procedure calls to
938 the hashf function. hashf only exists for the sake of
939 politeness, for use when speed isn't so important. */
941 #define ASSERTION_HASHSIZE 37
942 static ASSERTION_HASHNODE
*assertion_hashtab
[ASSERTION_HASHSIZE
];
944 /* Nonzero means inhibit macroexpansion of what seem to be
945 assertion tests, in rescan. For #if. */
946 static int assertions_flag
;
948 /* `struct directive' defines one #-directive, including how to handle it. */
950 #define DO_PROTO PROTO((U_CHAR *, U_CHAR *, FILE_BUF *, struct directive *))
953 int length
; /* Length of name */
954 int (*func
) DO_PROTO
; /* Function to handle directive */
955 char *name
; /* Name of directive */
956 enum node_type type
; /* Code which describes which directive. */
957 char angle_brackets
; /* Nonzero => <...> is special. */
958 char traditional_comments
; /* Nonzero: keep comments if -traditional. */
959 char pass_thru
; /* Copy directive to output:
960 if 1, copy if dumping definitions;
961 if 2, always copy, after preprocessing. */
964 /* These functions are declared to return int instead of void since they
965 are going to be placed in the table and some old compilers have trouble with
966 pointers to functions returning void. */
968 static int do_assert DO_PROTO
;
969 static int do_define DO_PROTO
;
970 static int do_elif DO_PROTO
;
971 static int do_else DO_PROTO
;
972 static int do_endif DO_PROTO
;
973 static int do_error DO_PROTO
;
974 static int do_ident DO_PROTO
;
975 static int do_if DO_PROTO
;
976 static int do_include DO_PROTO
;
977 static int do_line DO_PROTO
;
978 static int do_pragma DO_PROTO
;
979 #ifdef SCCS_DIRECTIVE
980 static int do_sccs DO_PROTO
;
982 static int do_unassert DO_PROTO
;
983 static int do_undef DO_PROTO
;
984 static int do_warning DO_PROTO
;
985 static int do_xifdef DO_PROTO
;
987 /* Here is the actual list of #-directives, most-often-used first. */
989 static struct directive directive_table
[] = {
990 { 6, do_define
, "define", T_DEFINE
, 0, 1, 1},
991 { 2, do_if
, "if", T_IF
},
992 { 5, do_xifdef
, "ifdef", T_IFDEF
},
993 { 6, do_xifdef
, "ifndef", T_IFNDEF
},
994 { 5, do_endif
, "endif", T_ENDIF
},
995 { 4, do_else
, "else", T_ELSE
},
996 { 4, do_elif
, "elif", T_ELIF
},
997 { 4, do_line
, "line", T_LINE
},
998 { 7, do_include
, "include", T_INCLUDE
, 1},
999 { 12, do_include
, "include_next", T_INCLUDE_NEXT
, 1},
1000 { 6, do_include
, "import", T_IMPORT
, 1},
1001 { 5, do_undef
, "undef", T_UNDEF
},
1002 { 5, do_error
, "error", T_ERROR
},
1003 { 7, do_warning
, "warning", T_WARNING
},
1004 #ifdef SCCS_DIRECTIVE
1005 { 4, do_sccs
, "sccs", T_SCCS
},
1007 { 6, do_pragma
, "pragma", T_PRAGMA
, 0, 0, 2},
1008 { 5, do_ident
, "ident", T_IDENT
},
1009 { 6, do_assert
, "assert", T_ASSERT
},
1010 { 8, do_unassert
, "unassert", T_UNASSERT
},
1011 { -1, 0, "", T_UNUSED
},
1014 /* When a directive handler is called,
1015 this points to the # (or the : of the %:) that started the directive. */
1016 U_CHAR
*directive_start
;
1018 /* table to tell if char can be part of a C identifier. */
1019 U_CHAR is_idchar
[256];
1020 /* table to tell if char can be first char of a c identifier. */
1021 U_CHAR is_idstart
[256];
1022 /* table to tell if c is horizontal space. */
1023 static U_CHAR is_hor_space
[256];
1024 /* table to tell if c is horizontal or vertical space. */
1025 U_CHAR is_space
[256];
1026 /* names of some characters */
1027 static char *char_name
[256];
1029 #define SKIP_WHITE_SPACE(p) do { while (is_hor_space[*p]) p++; } while (0)
1030 #define SKIP_ALL_WHITE_SPACE(p) do { while (is_space[*p]) p++; } while (0)
1032 static int errors
= 0; /* Error counter for exit code */
1034 /* Name of output file, for error messages. */
1035 static char *out_fname
;
1038 /* Stack of conditionals currently in progress
1039 (including both successful and failing conditionals). */
1042 struct if_stack
*next
; /* for chaining to the next stack frame */
1043 char *fname
; /* copied from input when frame is made */
1044 int lineno
; /* similarly */
1045 int if_succeeded
; /* true if a leg of this if-group
1046 has been passed through rescan */
1047 U_CHAR
*control_macro
; /* For #ifndef at start of file,
1048 this is the macro name tested. */
1049 enum node_type type
; /* type of last directive seen in this group */
1051 typedef struct if_stack IF_STACK_FRAME
;
1052 static IF_STACK_FRAME
*if_stack
= NULL
;
1054 /* Buffer of -M output. */
1055 static char *deps_buffer
;
1057 /* Number of bytes allocated in above. */
1058 static int deps_allocated_size
;
1060 /* Number of bytes used. */
1061 static int deps_size
;
1063 /* Number of bytes since the last newline. */
1064 static int deps_column
;
1066 /* Nonzero means -I- has been seen,
1067 so don't look for #include "foo" the source-file directory. */
1068 static int ignore_srcdir
;
1070 static int safe_read
PROTO((int, char *, int));
1071 static void safe_write
PROTO((int, char *, int));
1073 int main
PROTO((int, char **));
1075 static void path_include
PROTO((char *));
1077 static U_CHAR
*index0
PROTO((U_CHAR
*, int, size_t));
1079 static void trigraph_pcp
PROTO((FILE_BUF
*));
1081 static void newline_fix
PROTO((U_CHAR
*));
1082 static void name_newline_fix
PROTO((U_CHAR
*));
1084 static char *get_lintcmd
PROTO((U_CHAR
*, U_CHAR
*, U_CHAR
**, int *, int *));
1086 static void rescan
PROTO((FILE_BUF
*, int));
1088 static FILE_BUF expand_to_temp_buffer
PROTO((U_CHAR
*, U_CHAR
*, int, int));
1090 static int handle_directive
PROTO((FILE_BUF
*, FILE_BUF
*));
1092 static struct tm
*timestamp
PROTO((void));
1093 static void special_symbol
PROTO((HASHNODE
*, FILE_BUF
*));
1095 static int is_system_include
PROTO((char *));
1096 static char *base_name
PROTO((char *));
1097 static int absolute_filename
PROTO((char *));
1098 static size_t simplify_filename
PROTO((char *));
1100 static char *read_filename_string
PROTO((int, FILE *));
1101 static struct file_name_map
*read_name_map
PROTO((char *));
1102 static int open_include_file
PROTO((char *, struct file_name_list
*, U_CHAR
*, struct include_file
**));
1103 static char *remap_include_file
PROTO((char *, struct file_name_list
*));
1104 static int lookup_ino_include
PROTO((struct include_file
*));
1106 static void finclude
PROTO((int, struct include_file
*, FILE_BUF
*, int, struct file_name_list
*));
1107 static void record_control_macro
PROTO((struct include_file
*, U_CHAR
*));
1109 static char *check_precompiled
PROTO((int, struct stat
*, char *, char **));
1110 static int check_preconditions
PROTO((char *));
1111 static void pcfinclude
PROTO((U_CHAR
*, U_CHAR
*, U_CHAR
*, FILE_BUF
*));
1112 static void pcstring_used
PROTO((HASHNODE
*));
1113 static void write_output
PROTO((void));
1114 static void pass_thru_directive
PROTO((U_CHAR
*, U_CHAR
*, FILE_BUF
*, struct directive
*));
1116 static MACRODEF create_definition
PROTO((U_CHAR
*, U_CHAR
*, FILE_BUF
*));
1118 static int check_macro_name
PROTO((U_CHAR
*, char *));
1119 static int compare_defs
PROTO((DEFINITION
*, DEFINITION
*));
1120 static int comp_def_part
PROTO((int, U_CHAR
*, int, U_CHAR
*, int, int));
1122 static DEFINITION
*collect_expansion
PROTO((U_CHAR
*, U_CHAR
*, int, struct arglist
*));
1124 int check_assertion
PROTO((U_CHAR
*, int, int, struct arglist
*));
1125 static int compare_token_lists
PROTO((struct arglist
*, struct arglist
*));
1127 static struct arglist
*read_token_list
PROTO((U_CHAR
**, U_CHAR
*, int *));
1128 static void free_token_list
PROTO((struct arglist
*));
1130 static ASSERTION_HASHNODE
*assertion_install
PROTO((U_CHAR
*, int, int));
1131 static ASSERTION_HASHNODE
*assertion_lookup
PROTO((U_CHAR
*, int, int));
1132 static void delete_assertion
PROTO((ASSERTION_HASHNODE
*));
1134 static void do_once
PROTO((void));
1136 static HOST_WIDE_INT eval_if_expression
PROTO((U_CHAR
*, int));
1137 static void conditional_skip
PROTO((FILE_BUF
*, int, enum node_type
, U_CHAR
*, FILE_BUF
*));
1138 static void skip_if_group
PROTO((FILE_BUF
*, int, FILE_BUF
*));
1139 static void validate_else
PROTO((U_CHAR
*, U_CHAR
*));
1141 static U_CHAR
*skip_to_end_of_comment
PROTO((FILE_BUF
*, int *, int));
1142 static U_CHAR
*skip_quoted_string
PROTO((U_CHAR
*, U_CHAR
*, int, int *, int *, int *));
1143 static char *quote_string
PROTO((char *, char *));
1144 static U_CHAR
*skip_paren_group
PROTO((FILE_BUF
*));
1146 /* Last arg to output_line_directive. */
1147 enum file_change_code
{same_file
, enter_file
, leave_file
};
1148 static void output_line_directive
PROTO((FILE_BUF
*, FILE_BUF
*, int, enum file_change_code
));
1150 static void macroexpand
PROTO((HASHNODE
*, FILE_BUF
*));
1153 static char *macarg
PROTO((struct argdata
*, int));
1155 static U_CHAR
*macarg1
PROTO((U_CHAR
*, U_CHAR
*, int *, int *, int *, int));
1157 static int discard_comments
PROTO((U_CHAR
*, int, int));
1159 static int change_newlines
PROTO((U_CHAR
*, int));
1161 char *my_strerror
PROTO((int));
1162 void error
PRINTF_PROTO_1((char *, ...));
1163 static void verror
PROTO((char *, va_list));
1164 static void error_from_errno
PROTO((char *));
1165 void warning
PRINTF_PROTO_1((char *, ...));
1166 static void vwarning
PROTO((char *, va_list));
1167 static void error_with_line
PRINTF_PROTO_2((int, char *, ...));
1168 static void verror_with_line
PROTO((int, char *, va_list));
1169 static void vwarning_with_line
PROTO((int, char *, va_list));
1170 static void warning_with_line
PRINTF_PROTO_2((int, char *, ...));
1171 void pedwarn
PRINTF_PROTO_1((char *, ...));
1172 void pedwarn_with_line
PRINTF_PROTO_2((int, char *, ...));
1173 static void pedwarn_with_file_and_line
PRINTF_PROTO_3((char *, int, char *, ...));
1175 static void print_containing_files
PROTO((void));
1177 static int line_for_error
PROTO((int));
1178 static int grow_outbuf
PROTO((FILE_BUF
*, int));
1180 static HASHNODE
*install
PROTO((U_CHAR
*, int, enum node_type
, char *, int));
1181 HASHNODE
*lookup
PROTO((U_CHAR
*, int, int));
1182 static void delete_macro
PROTO((HASHNODE
*));
1183 static int hashf
PROTO((U_CHAR
*, int, int));
1185 static void dump_single_macro
PROTO((HASHNODE
*, FILE *));
1186 static void dump_all_macros
PROTO((void));
1187 static void dump_defn_1
PROTO((U_CHAR
*, int, int, FILE *));
1188 static void dump_arg_n
PROTO((DEFINITION
*, int, FILE *));
1190 static void initialize_char_syntax
PROTO((void));
1191 static void initialize_builtins
PROTO((FILE_BUF
*, FILE_BUF
*));
1193 static void make_definition
PROTO((char *, FILE_BUF
*));
1194 static void make_undef
PROTO((char *, FILE_BUF
*));
1196 static void make_assertion
PROTO((char *, char *));
1198 static struct file_name_list
*new_include_prefix
PROTO((struct file_name_list
*, char *, char *));
1199 static void append_include_chain
PROTO((struct file_name_list
*, struct file_name_list
*));
1201 static void deps_output
PROTO((char *, int));
1203 static void fatal
PRINTF_PROTO_1((char *, ...)) __attribute__ ((noreturn
));
1204 void fancy_abort
PROTO((void)) __attribute__ ((noreturn
));
1205 static void perror_with_name
PROTO((char *));
1206 static void pfatal_with_name
PROTO((char *)) __attribute__ ((noreturn
));
1207 static void pipe_closed
PROTO((int)) __attribute__ ((noreturn
));
1209 static void memory_full
PROTO((void)) __attribute__ ((noreturn
));
1210 GENERIC_PTR xmalloc
PROTO((size_t));
1211 static GENERIC_PTR xrealloc
PROTO((GENERIC_PTR
, size_t));
1212 static GENERIC_PTR xcalloc
PROTO((size_t, size_t));
1213 static char *savestring
PROTO((char *));
1215 /* Read LEN bytes at PTR from descriptor DESC, for file FILENAME,
1216 retrying if necessary. If MAX_READ_LEN is defined, read at most
1217 that bytes at a time. Return a negative value if an error occurs,
1218 otherwise return the actual number of bytes read,
1219 which must be LEN unless end-of-file was reached. */
1222 safe_read (desc
, ptr
, len
)
1227 int left
, rcount
, nchars
;
1233 if (rcount
> MAX_READ_LEN
)
1234 rcount
= MAX_READ_LEN
;
1236 nchars
= read (desc
, ptr
, rcount
);
1253 /* Write LEN bytes at PTR to descriptor DESC,
1254 retrying if necessary, and treating any real error as fatal.
1255 If MAX_WRITE_LEN is defined, write at most that many bytes at a time. */
1258 safe_write (desc
, ptr
, len
)
1263 int wcount
, written
;
1267 #ifdef MAX_WRITE_LEN
1268 if (wcount
> MAX_WRITE_LEN
)
1269 wcount
= MAX_WRITE_LEN
;
1271 written
= write (desc
, ptr
, wcount
);
1278 pfatal_with_name (out_fname
);
1295 char **pend_files
= (char **) xmalloc (argc
* sizeof (char *));
1296 char **pend_defs
= (char **) xmalloc (argc
* sizeof (char *));
1297 char **pend_undefs
= (char **) xmalloc (argc
* sizeof (char *));
1298 char **pend_assertions
= (char **) xmalloc (argc
* sizeof (char *));
1299 char **pend_includes
= (char **) xmalloc (argc
* sizeof (char *));
1301 /* Record the option used with each element of pend_assertions.
1302 This is preparation for supporting more than one option for making
1304 char **pend_assertion_options
= (char **) xmalloc (argc
* sizeof (char *));
1305 int inhibit_predefs
= 0;
1306 int no_standard_includes
= 0;
1307 int no_standard_cplusplus_includes
= 0;
1308 int missing_newline
= 0;
1310 /* Non-0 means don't output the preprocessed program. */
1311 int inhibit_output
= 0;
1312 /* Non-0 means -v, so print the full set of include dirs. */
1315 /* File name which deps are being written to.
1316 This is 0 if deps are being written to stdout. */
1317 char *deps_file
= 0;
1318 /* Fopen file mode to open deps_file with. */
1319 char *deps_mode
= "a";
1320 /* Stream on which to print the dependency information. */
1321 FILE *deps_stream
= 0;
1322 /* Target-name to write with the dependency information. */
1323 char *deps_target
= 0;
1326 /* Get rid of any avoidable limit on stack size. */
1330 /* Set the stack limit huge so that alloca (particularly stringtab
1331 in dbxread.c) does not fail. */
1332 getrlimit (RLIMIT_STACK
, &rlim
);
1333 rlim
.rlim_cur
= rlim
.rlim_max
;
1334 setrlimit (RLIMIT_STACK
, &rlim
);
1336 #endif /* RLIMIT_STACK defined */
1339 signal (SIGPIPE
, pipe_closed
);
1342 progname
= base_name (argv
[0]);
1346 /* Remove extension from PROGNAME. */
1348 char *s
= progname
= savestring (progname
);
1350 if ((p
= rindex (s
, ';')) != 0) *p
= '\0'; /* strip version number */
1351 if ((p
= rindex (s
, '.')) != 0 /* strip type iff ".exe" */
1352 && (p
[1] == 'e' || p
[1] == 'E')
1353 && (p
[2] == 'x' || p
[2] == 'X')
1354 && (p
[3] == 'e' || p
[3] == 'E')
1363 /* Initialize is_idchar. */
1364 initialize_char_syntax ();
1366 no_line_directives
= 0;
1368 dump_macros
= dump_none
;
1371 cplusplus_comments
= 1;
1373 bzero ((char *) pend_files
, argc
* sizeof (char *));
1374 bzero ((char *) pend_defs
, argc
* sizeof (char *));
1375 bzero ((char *) pend_undefs
, argc
* sizeof (char *));
1376 bzero ((char *) pend_assertions
, argc
* sizeof (char *));
1377 bzero ((char *) pend_includes
, argc
* sizeof (char *));
1379 /* Process switches and find input file name. */
1381 for (i
= 1; i
< argc
; i
++) {
1382 if (argv
[i
][0] != '-') {
1383 if (out_fname
!= NULL
)
1384 fatal ("Usage: %s [switches] input output", argv
[0]);
1385 else if (in_fname
!= NULL
)
1386 out_fname
= argv
[i
];
1390 switch (argv
[i
][1]) {
1393 if (!strcmp (argv
[i
], "-include")) {
1395 fatal ("Filename missing after `-include' option");
1397 simplify_filename (pend_includes
[i
] = argv
[++i
]);
1399 if (!strcmp (argv
[i
], "-imacros")) {
1401 fatal ("Filename missing after `-imacros' option");
1403 simplify_filename (pend_files
[i
] = argv
[++i
]);
1405 if (!strcmp (argv
[i
], "-iprefix")) {
1407 fatal ("Filename missing after `-iprefix' option");
1409 include_prefix
= argv
[++i
];
1411 if (!strcmp (argv
[i
], "-ifoutput")) {
1412 output_conditionals
= 1;
1414 if (!strcmp (argv
[i
], "-isystem")) {
1415 struct file_name_list
*dirtmp
;
1417 if (! (dirtmp
= new_include_prefix (NULL_PTR
, "", argv
[++i
])))
1419 dirtmp
->c_system_include_path
= 1;
1421 if (before_system
== 0)
1422 before_system
= dirtmp
;
1424 last_before_system
->next
= dirtmp
;
1425 last_before_system
= dirtmp
; /* Tail follows the last one */
1427 /* Add directory to end of path for includes,
1428 with the default prefix at the front of its name. */
1429 if (!strcmp (argv
[i
], "-iwithprefix")) {
1430 struct file_name_list
*dirtmp
;
1433 if (include_prefix
!= 0)
1434 prefix
= include_prefix
;
1436 prefix
= savestring (GCC_INCLUDE_DIR
);
1437 /* Remove the `include' from /usr/local/lib/gcc.../include. */
1438 if (!strcmp (prefix
+ strlen (prefix
) - 8, "/include"))
1439 prefix
[strlen (prefix
) - 7] = 0;
1442 if (! (dirtmp
= new_include_prefix (NULL_PTR
, prefix
, argv
[++i
])))
1445 if (after_include
== 0)
1446 after_include
= dirtmp
;
1448 last_after_include
->next
= dirtmp
;
1449 last_after_include
= dirtmp
; /* Tail follows the last one */
1451 /* Add directory to main path for includes,
1452 with the default prefix at the front of its name. */
1453 if (!strcmp (argv
[i
], "-iwithprefixbefore")) {
1454 struct file_name_list
*dirtmp
;
1457 if (include_prefix
!= 0)
1458 prefix
= include_prefix
;
1460 prefix
= savestring (GCC_INCLUDE_DIR
);
1461 /* Remove the `include' from /usr/local/lib/gcc.../include. */
1462 if (!strcmp (prefix
+ strlen (prefix
) - 8, "/include"))
1463 prefix
[strlen (prefix
) - 7] = 0;
1466 dirtmp
= new_include_prefix (NULL_PTR
, prefix
, argv
[++i
]);
1467 append_include_chain (dirtmp
, dirtmp
);
1469 /* Add directory to end of path for includes. */
1470 if (!strcmp (argv
[i
], "-idirafter")) {
1471 struct file_name_list
*dirtmp
;
1473 if (! (dirtmp
= new_include_prefix (NULL_PTR
, "", argv
[++i
])))
1476 if (after_include
== 0)
1477 after_include
= dirtmp
;
1479 last_after_include
->next
= dirtmp
;
1480 last_after_include
= dirtmp
; /* Tail follows the last one */
1485 if (out_fname
!= NULL
)
1486 fatal ("Output filename specified twice");
1488 fatal ("Filename missing after -o option");
1489 out_fname
= argv
[++i
];
1490 if (!strcmp (out_fname
, "-"))
1495 if (!strcmp (argv
[i
], "-pedantic"))
1497 else if (!strcmp (argv
[i
], "-pedantic-errors")) {
1499 pedantic_errors
= 1;
1500 } else if (!strcmp (argv
[i
], "-pcp")) {
1503 fatal ("Filename missing after -pcp option");
1504 pcp_fname
= argv
[++i
];
1506 = ((pcp_fname
[0] != '-' || pcp_fname
[1] != '\0')
1507 ? fopen (pcp_fname
, "w")
1509 if (pcp_outfile
== 0)
1510 pfatal_with_name (pcp_fname
);
1516 if (!strcmp (argv
[i
], "-traditional")) {
1518 cplusplus_comments
= 0;
1519 } else if (!strcmp (argv
[i
], "-trigraphs")) {
1525 if (! strcmp (argv
[i
], "-lang-c"))
1526 cplusplus
= 0, cplusplus_comments
= 1, c89
= 0, objc
= 0;
1527 if (! strcmp (argv
[i
], "-lang-c89"))
1528 cplusplus
= 0, cplusplus_comments
= 0, c89
= 1, objc
= 0;
1529 if (! strcmp (argv
[i
], "-lang-c++"))
1530 cplusplus
= 1, cplusplus_comments
= 1, c89
= 0, objc
= 0;
1531 if (! strcmp (argv
[i
], "-lang-objc"))
1532 cplusplus
= 0, cplusplus_comments
= 1, c89
= 0, objc
= 1;
1533 if (! strcmp (argv
[i
], "-lang-objc++"))
1534 cplusplus
= 1, cplusplus_comments
= 1, c89
= 0, objc
= 1;
1535 if (! strcmp (argv
[i
], "-lang-asm"))
1537 if (! strcmp (argv
[i
], "-lint"))
1542 cplusplus
= 1, cplusplus_comments
= 1;
1546 inhibit_warnings
= 1;
1550 if (!strcmp (argv
[i
], "-Wtrigraphs"))
1552 else if (!strcmp (argv
[i
], "-Wno-trigraphs"))
1554 else if (!strcmp (argv
[i
], "-Wcomment"))
1556 else if (!strcmp (argv
[i
], "-Wno-comment"))
1558 else if (!strcmp (argv
[i
], "-Wcomments"))
1560 else if (!strcmp (argv
[i
], "-Wno-comments"))
1562 else if (!strcmp (argv
[i
], "-Wtraditional"))
1564 else if (!strcmp (argv
[i
], "-Wno-traditional"))
1566 else if (!strcmp (argv
[i
], "-Wundef"))
1568 else if (!strcmp (argv
[i
], "-Wno-undef"))
1570 else if (!strcmp (argv
[i
], "-Wimport"))
1572 else if (!strcmp (argv
[i
], "-Wno-import"))
1574 else if (!strcmp (argv
[i
], "-Werror"))
1575 warnings_are_errors
= 1;
1576 else if (!strcmp (argv
[i
], "-Wno-error"))
1577 warnings_are_errors
= 0;
1578 else if (!strcmp (argv
[i
], "-Wall"))
1586 /* The style of the choices here is a bit mixed.
1587 The chosen scheme is a hybrid of keeping all options in one string
1588 and specifying each option in a separate argument:
1589 -M|-MM|-MD file|-MMD file [-MG]. An alternative is:
1590 -M|-MM|-MD file|-MMD file|-MG|-MMG; or more concisely:
1591 -M[M][G][D file]. This is awkward to handle in specs, and is not
1593 /* ??? -MG must be specified in addition to one of -M or -MM.
1594 This can be relaxed in the future without breaking anything.
1595 The converse isn't true. */
1597 /* -MG isn't valid with -MD or -MMD. This is checked for later. */
1598 if (!strcmp (argv
[i
], "-MG"))
1600 print_deps_missing_files
= 1;
1603 if (!strcmp (argv
[i
], "-M"))
1605 else if (!strcmp (argv
[i
], "-MM"))
1607 else if (!strcmp (argv
[i
], "-MD"))
1609 else if (!strcmp (argv
[i
], "-MMD"))
1611 /* For -MD and -MMD options, write deps on file named by next arg. */
1612 if (!strcmp (argv
[i
], "-MD")
1613 || !strcmp (argv
[i
], "-MMD")) {
1615 fatal ("Filename missing after %s option", argv
[i
]);
1617 deps_file
= argv
[i
];
1620 /* For -M and -MM, write deps on standard output
1621 and suppress the usual output. */
1622 deps_stream
= stdout
;
1629 char *p
= argv
[i
] + 2;
1631 while ((c
= *p
++)) {
1632 /* Arg to -d specifies what parts of macros to dump */
1635 dump_macros
= dump_only
;
1639 dump_macros
= dump_names
;
1642 dump_macros
= dump_definitions
;
1650 if (argv
[i
][2] == '3')
1655 fprintf (stderr
, "GNU CPP version %s", version_string
);
1656 #ifdef TARGET_VERSION
1659 fprintf (stderr
, "\n");
1664 print_include_names
= 1;
1668 if (argv
[i
][2] != 0)
1669 pend_defs
[i
] = argv
[i
] + 2;
1670 else if (i
+ 1 == argc
)
1671 fatal ("Macro name missing after -D option");
1673 i
++, pend_defs
[i
] = argv
[i
];
1680 if (argv
[i
][2] != 0)
1682 else if (i
+ 1 == argc
)
1683 fatal ("Assertion missing after -A option");
1687 if (!strcmp (p
, "-")) {
1688 /* -A- eliminates all predefined macros and assertions.
1689 Let's include also any that were specified earlier
1690 on the command line. That way we can get rid of any
1691 that were passed automatically in from GCC. */
1693 inhibit_predefs
= 1;
1694 for (j
= 0; j
< i
; j
++)
1695 pend_defs
[j
] = pend_assertions
[j
] = 0;
1697 pend_assertions
[i
] = p
;
1698 pend_assertion_options
[i
] = "-A";
1703 case 'U': /* JF #undef something */
1704 if (argv
[i
][2] != 0)
1705 pend_undefs
[i
] = argv
[i
] + 2;
1706 else if (i
+ 1 == argc
)
1707 fatal ("Macro name missing after -U option");
1709 pend_undefs
[i
] = argv
[i
+1], i
++;
1713 put_out_comments
= 1;
1716 case 'E': /* -E comes from cc -E; ignore it. */
1720 no_line_directives
= 1;
1723 case '$': /* Don't include $ in identifiers. */
1724 is_idchar
['$'] = is_idstart
['$'] = 0;
1727 case 'I': /* Add directory to path for includes. */
1729 struct file_name_list
*dirtmp
;
1731 if (! ignore_srcdir
&& !strcmp (argv
[i
] + 2, "-")) {
1733 /* Don't use any preceding -I directories for #include <...>. */
1734 first_bracket_include
= 0;
1737 dirtmp
= new_include_prefix (last_include
, "",
1738 argv
[i
][2] ? argv
[i
] + 2 : argv
[++i
]);
1739 append_include_chain (dirtmp
, dirtmp
);
1745 if (!strcmp (argv
[i
], "-nostdinc"))
1746 /* -nostdinc causes no default include directories.
1747 You must specify all include-file directories with -I. */
1748 no_standard_includes
= 1;
1749 else if (!strcmp (argv
[i
], "-nostdinc++"))
1750 /* -nostdinc++ causes no default C++-specific include directories. */
1751 no_standard_cplusplus_includes
= 1;
1752 else if (!strcmp (argv
[i
], "-noprecomp"))
1757 /* Sun compiler passes undocumented switch "-undef".
1758 Let's assume it means to inhibit the predefined symbols. */
1759 inhibit_predefs
= 1;
1762 case '\0': /* JF handle '-' as file name meaning stdin or stdout */
1763 if (in_fname
== NULL
) {
1766 } else if (out_fname
== NULL
) {
1769 } /* else fall through into error */
1772 fatal ("Invalid option `%s'", argv
[i
]);
1777 /* Add dirs from CPATH after dirs from -I. */
1778 /* There seems to be confusion about what CPATH should do,
1779 so for the moment it is not documented. */
1780 /* Some people say that CPATH should replace the standard include dirs,
1781 but that seems pointless: it comes before them, so it overrides them
1783 cp
= getenv ("CPATH");
1784 if (cp
&& ! no_standard_includes
)
1787 /* Initialize output buffer */
1789 outbuf
.buf
= (U_CHAR
*) xmalloc (OUTBUF_SIZE
);
1790 outbuf
.bufp
= outbuf
.buf
;
1791 outbuf
.length
= OUTBUF_SIZE
;
1793 /* Do partial setup of input buffer for the sake of generating
1794 early #line directives (when -g is in effect). */
1796 fp
= &instack
[++indepth
];
1797 if (in_fname
== NULL
)
1799 fp
->nominal_fname
= fp
->fname
= in_fname
;
1802 /* In C++, wchar_t is a distinct basic type, and we can expect
1803 __wchar_t to be defined by cc1plus. */
1805 wchar_type
= "__wchar_t";
1807 /* Install __LINE__, etc. Must follow initialize_char_syntax
1808 and option processing. */
1809 initialize_builtins (fp
, &outbuf
);
1811 /* Do standard #defines and assertions
1812 that identify system and machine type. */
1814 if (!inhibit_predefs
) {
1815 char *p
= (char *) alloca (strlen (predefs
) + 1);
1816 strcpy (p
, predefs
);
1819 while (*p
== ' ' || *p
== '\t')
1821 /* Handle -D options. */
1822 if (p
[0] == '-' && p
[1] == 'D') {
1824 while (*p
&& *p
!= ' ' && *p
!= '\t')
1829 output_line_directive (fp
, &outbuf
, 0, same_file
);
1830 make_definition (q
, &outbuf
);
1831 while (*p
== ' ' || *p
== '\t')
1833 } else if (p
[0] == '-' && p
[1] == 'A') {
1834 /* Handle -A options (assertions). */
1843 past_name
= assertion
;
1844 /* Locate end of name. */
1845 while (*past_name
&& *past_name
!= ' '
1846 && *past_name
!= '\t' && *past_name
!= '(')
1848 /* Locate `(' at start of value. */
1850 while (*value
&& (*value
== ' ' || *value
== '\t'))
1852 if (*value
++ != '(')
1854 while (*value
&& (*value
== ' ' || *value
== '\t'))
1857 /* Locate end of value. */
1858 while (*past_value
&& *past_value
!= ' '
1859 && *past_value
!= '\t' && *past_value
!= ')')
1861 termination
= past_value
;
1862 while (*termination
&& (*termination
== ' ' || *termination
== '\t'))
1864 if (*termination
++ != ')')
1866 if (*termination
&& *termination
!= ' ' && *termination
!= '\t')
1868 /* Temporarily null-terminate the value. */
1869 save_char
= *termination
;
1870 *termination
= '\0';
1871 /* Install the assertion. */
1872 make_assertion ("-A", assertion
);
1873 *termination
= (char) save_char
;
1875 while (*p
== ' ' || *p
== '\t')
1883 /* Now handle the command line options. */
1885 /* Do -U's, -D's and -A's in the order they were seen. */
1886 for (i
= 1; i
< argc
; i
++) {
1887 if (pend_undefs
[i
]) {
1889 output_line_directive (fp
, &outbuf
, 0, same_file
);
1890 make_undef (pend_undefs
[i
], &outbuf
);
1894 output_line_directive (fp
, &outbuf
, 0, same_file
);
1895 make_definition (pend_defs
[i
], &outbuf
);
1897 if (pend_assertions
[i
])
1898 make_assertion (pend_assertion_options
[i
], pend_assertions
[i
]);
1901 done_initializing
= 1;
1903 { /* Read the appropriate environment variable and if it exists
1904 replace include_defaults with the listed path. */
1906 switch ((objc
<< 1) + cplusplus
)
1909 epath
= getenv ("C_INCLUDE_PATH");
1912 epath
= getenv ("CPLUS_INCLUDE_PATH");
1915 epath
= getenv ("OBJC_INCLUDE_PATH");
1918 epath
= getenv ("OBJCPLUS_INCLUDE_PATH");
1921 /* If the environment var for this language is set,
1922 add to the default list of include directories. */
1925 char *startp
, *endp
;
1927 for (num_dirs
= 1, startp
= epath
; *startp
; startp
++)
1928 if (*startp
== PATH_SEPARATOR
)
1931 = (struct default_include
*) xmalloc ((num_dirs
1932 * sizeof (struct default_include
))
1933 + sizeof (include_defaults_array
));
1934 startp
= endp
= epath
;
1938 if (c
== PATH_SEPARATOR
|| !c
) {
1940 include_defaults
[num_dirs
].fname
1941 = startp
== endp
? "." : savestring (startp
);
1943 include_defaults
[num_dirs
].cplusplus
= cplusplus
;
1944 include_defaults
[num_dirs
].cxx_aware
= 1;
1951 /* Put the usual defaults back in at the end. */
1952 bcopy ((char *) include_defaults_array
,
1953 (char *) &include_defaults
[num_dirs
],
1954 sizeof (include_defaults_array
));
1958 append_include_chain (before_system
, last_before_system
);
1959 first_system_include
= before_system
;
1961 /* Unless -fnostdinc,
1962 tack on the standard include file dirs to the specified list */
1963 if (!no_standard_includes
) {
1964 struct default_include
*p
= include_defaults
;
1965 char *specd_prefix
= include_prefix
;
1966 char *default_prefix
= savestring (GCC_INCLUDE_DIR
);
1967 int default_len
= 0;
1968 /* Remove the `include' from /usr/local/lib/gcc.../include. */
1969 if (!strcmp (default_prefix
+ strlen (default_prefix
) - 8, "/include")) {
1970 default_len
= strlen (default_prefix
) - 7;
1971 default_prefix
[default_len
] = 0;
1973 /* Search "translated" versions of GNU directories.
1974 These have /usr/local/lib/gcc... replaced by specd_prefix. */
1975 if (specd_prefix
!= 0 && default_len
!= 0)
1976 for (p
= include_defaults
; p
->fname
; p
++) {
1977 /* Some standard dirs are only for C++. */
1978 if (!p
->cplusplus
|| (cplusplus
&& !no_standard_cplusplus_includes
)) {
1979 /* Does this dir start with the prefix? */
1980 if (!strncmp (p
->fname
, default_prefix
, default_len
)) {
1981 /* Yes; change prefix and add to search list. */
1982 struct file_name_list
*new
1983 = new_include_prefix (NULL_PTR
, specd_prefix
,
1984 p
->fname
+ default_len
);
1986 new->c_system_include_path
= !p
->cxx_aware
;
1987 append_include_chain (new, new);
1988 if (first_system_include
== 0)
1989 first_system_include
= new;
1994 /* Search ordinary names for GNU include directories. */
1995 for (p
= include_defaults
; p
->fname
; p
++) {
1996 /* Some standard dirs are only for C++. */
1997 if (!p
->cplusplus
|| (cplusplus
&& !no_standard_cplusplus_includes
)) {
1998 struct file_name_list
*new
1999 = new_include_prefix (NULL_PTR
, "", p
->fname
);
2001 new->c_system_include_path
= !p
->cxx_aware
;
2002 append_include_chain (new, new);
2003 if (first_system_include
== 0)
2004 first_system_include
= new;
2010 /* Tack the after_include chain at the end of the include chain. */
2011 append_include_chain (after_include
, last_after_include
);
2012 if (first_system_include
== 0)
2013 first_system_include
= after_include
;
2015 /* With -v, print the list of dirs to search. */
2017 struct file_name_list
*p
;
2018 fprintf (stderr
, "#include \"...\" search starts here:\n");
2019 for (p
= include
; p
; p
= p
->next
) {
2020 if (p
== first_bracket_include
)
2021 fprintf (stderr
, "#include <...> search starts here:\n");
2023 fprintf (stderr
, " .\n");
2024 else if (!strcmp (p
->fname
, "/") || !strcmp (p
->fname
, "//"))
2025 fprintf (stderr
, " %s\n", p
->fname
);
2027 /* Omit trailing '/'. */
2028 fprintf (stderr
, " %.*s\n", (int) strlen (p
->fname
) - 1, p
->fname
);
2030 fprintf (stderr
, "End of search list.\n");
2033 /* -MG doesn't select the form of output and must be specified with one of
2034 -M or -MM. -MG doesn't make sense with -MD or -MMD since they don't
2035 inhibit compilation. */
2036 if (print_deps_missing_files
&& (print_deps
== 0 || !inhibit_output
))
2037 fatal ("-MG must be specified with one of -M or -MM");
2039 /* Either of two environment variables can specify output of deps.
2040 Its value is either "OUTPUT_FILE" or "OUTPUT_FILE DEPS_TARGET",
2041 where OUTPUT_FILE is the file to write deps info to
2042 and DEPS_TARGET is the target to mention in the deps. */
2045 && (getenv ("SUNPRO_DEPENDENCIES") != 0
2046 || getenv ("DEPENDENCIES_OUTPUT") != 0)) {
2047 char *spec
= getenv ("DEPENDENCIES_OUTPUT");
2052 spec
= getenv ("SUNPRO_DEPENDENCIES");
2059 /* Find the space before the DEPS_TARGET, if there is one. */
2060 /* This should use index. (mrs) */
2061 while (*s
!= 0 && *s
!= ' ') s
++;
2063 deps_target
= s
+ 1;
2064 output_file
= xmalloc (s
- spec
+ 1);
2065 bcopy (spec
, output_file
, s
- spec
);
2066 output_file
[s
- spec
] = 0;
2073 deps_file
= output_file
;
2077 /* For -M, print the expected object file name
2078 as the target of this Make-rule. */
2080 deps_allocated_size
= 200;
2081 deps_buffer
= xmalloc (deps_allocated_size
);
2087 deps_output (deps_target
, ':');
2088 } else if (*in_fname
== 0) {
2089 deps_output ("-", ':');
2094 q
= base_name (in_fname
);
2096 /* Copy remainder to mungable area. */
2097 p
= (char *) alloca (strlen(q
) + 8);
2100 /* Output P, but remove known suffixes. */
2104 && p
[len
- 2] == '.'
2105 && index("cCsSm", p
[len
- 1]))
2108 && p
[len
- 3] == '.'
2109 && p
[len
- 2] == 'c'
2110 && p
[len
- 1] == 'c')
2113 && p
[len
- 4] == '.'
2114 && p
[len
- 3] == 'c'
2115 && p
[len
- 2] == 'x'
2116 && p
[len
- 1] == 'x')
2119 && p
[len
- 4] == '.'
2120 && p
[len
- 3] == 'c'
2121 && p
[len
- 2] == 'p'
2122 && p
[len
- 1] == 'p')
2125 /* Supply our own suffix. */
2132 deps_output (p
, ':');
2133 deps_output (in_fname
, ' ');
2137 /* Scan the -imacros files before the main input.
2138 Much like #including them, but with no_output set
2139 so that only their macro definitions matter. */
2141 no_output
++; no_record_file
++;
2142 for (i
= 1; i
< argc
; i
++)
2143 if (pend_files
[i
]) {
2144 struct include_file
*inc
;
2145 int fd
= open_include_file (pend_files
[i
], NULL_PTR
, NULL_PTR
, &inc
);
2147 perror_with_name (pend_files
[i
]);
2148 return FATAL_EXIT_CODE
;
2150 finclude (fd
, inc
, &outbuf
, 0, NULL_PTR
);
2152 no_output
--; no_record_file
--;
2154 /* Copy the entire contents of the main input file into
2155 the stacked input buffer previously allocated for it. */
2157 /* JF check for stdin */
2158 if (in_fname
== NULL
|| *in_fname
== 0) {
2161 } else if ((f
= open (in_fname
, O_RDONLY
, 0666)) < 0)
2164 if (fstat (f
, &st
) != 0)
2165 pfatal_with_name (in_fname
);
2166 fp
->nominal_fname
= fp
->fname
= in_fname
;
2168 fp
->system_header_p
= 0;
2169 /* JF all this is mine about reading pipes and ttys */
2170 if (! S_ISREG (st
.st_mode
)) {
2171 /* Read input from a file that is not a normal disk file.
2172 We cannot preallocate a buffer with the correct size,
2173 so we must read in the file a piece at the time and make it bigger. */
2178 if (S_ISDIR (st
.st_mode
))
2179 fatal ("Input file `%s' is a directory", in_fname
);
2183 fp
->buf
= (U_CHAR
*) xmalloc (bsize
+ 2);
2185 cnt
= safe_read (f
, (char *) fp
->buf
+ size
, bsize
- size
);
2186 if (cnt
< 0) goto perror
; /* error! */
2188 if (size
!= bsize
) break; /* End of file */
2190 fp
->buf
= (U_CHAR
*) xrealloc (fp
->buf
, bsize
+ 2);
2194 /* Read a file whose size we can determine in advance.
2195 For the sake of VMS, st.st_size is just an upper bound. */
2196 fp
->buf
= (U_CHAR
*) xmalloc (st
.st_size
+ 2);
2197 fp
->length
= safe_read (f
, (char *) fp
->buf
, st
.st_size
);
2198 if (fp
->length
< 0) goto perror
;
2201 fp
->if_stack
= if_stack
;
2203 /* Make sure data ends with a newline. And put a null after it. */
2205 if ((fp
->length
> 0 && fp
->buf
[fp
->length
- 1] != '\n')
2206 /* Backslash-newline at end is not good enough. */
2207 || (fp
->length
> 1 && fp
->buf
[fp
->length
- 2] == '\\')) {
2208 fp
->buf
[fp
->length
++] = '\n';
2209 missing_newline
= 1;
2211 fp
->buf
[fp
->length
] = '\0';
2213 /* Unless inhibited, convert trigraphs in the input. */
2218 /* Now that we know the input file is valid, open the output. */
2220 if (!out_fname
|| !strcmp (out_fname
, ""))
2221 out_fname
= "stdout";
2222 else if (! freopen (out_fname
, "w", stdout
))
2223 pfatal_with_name (out_fname
);
2225 output_line_directive (fp
, &outbuf
, 0, same_file
);
2227 /* Scan the -include files before the main input. */
2230 for (i
= 1; i
< argc
; i
++)
2231 if (pend_includes
[i
]) {
2232 struct include_file
*inc
;
2233 int fd
= open_include_file (pend_includes
[i
], NULL_PTR
, NULL_PTR
, &inc
);
2235 perror_with_name (pend_includes
[i
]);
2236 return FATAL_EXIT_CODE
;
2238 finclude (fd
, inc
, &outbuf
, 0, NULL_PTR
);
2242 /* Scan the input, processing macros and directives. */
2244 rescan (&outbuf
, 0);
2246 if (missing_newline
)
2249 if (pedantic
&& missing_newline
)
2250 pedwarn ("file does not end in newline");
2252 /* Now we have processed the entire input
2253 Write whichever kind of output has been requested. */
2255 if (dump_macros
== dump_only
)
2257 else if (! inhibit_output
) {
2262 /* Don't actually write the deps file if compilation has failed. */
2264 if (deps_file
&& ! (deps_stream
= fopen (deps_file
, deps_mode
)))
2265 pfatal_with_name (deps_file
);
2266 fputs (deps_buffer
, deps_stream
);
2267 putc ('\n', deps_stream
);
2269 if (ferror (deps_stream
) || fclose (deps_stream
) != 0)
2270 fatal ("I/O error on output");
2275 if (pcp_outfile
&& pcp_outfile
!= stdout
2276 && (ferror (pcp_outfile
) || fclose (pcp_outfile
) != 0))
2277 fatal ("I/O error on `-pcp' output");
2279 if (ferror (stdout
) || fclose (stdout
) != 0)
2280 fatal ("I/O error on output");
2283 exit (FATAL_EXIT_CODE
);
2284 exit (SUCCESS_EXIT_CODE
);
2287 pfatal_with_name (in_fname
);
2291 /* Given a colon-separated list of file names PATH,
2292 add all the names to the search path for include files. */
2306 struct file_name_list
*dirtmp
;
2308 /* Find the end of this name. */
2309 while ((c
= *q
++) != PATH_SEPARATOR
&& c
)
2313 dirtmp
= new_include_prefix (last_include
, "", p
== q
? "." : p
);
2315 append_include_chain (dirtmp
, dirtmp
);
2317 /* Advance past this name. */
2324 /* Return the address of the first character in S that equals C.
2325 S is an array of length N, possibly containing '\0's, and followed by '\0'.
2326 Return 0 if there is no such character. Assume that C itself is not '\0'.
2327 If we knew we could use memchr, we could just invoke memchr (S, C, N),
2328 but unfortunately memchr isn't autoconfigured yet. */
2336 char *p
= (char *) s
;
2338 char *q
= index (p
, c
);
2340 return (U_CHAR
*) q
;
2342 size_t l
= strlen (p
);
2352 /* Pre-C-Preprocessor to translate ANSI trigraph idiocy in BUF
2353 before main CCCP processing. Name `pcp' is also in honor of the
2354 drugs the trigraph designers must have been on.
2356 Using an extra pass through the buffer takes a little extra time,
2357 but is infinitely less hairy than trying to handle trigraphs inside
2358 strings, etc. everywhere, and also makes sure that trigraphs are
2359 only translated in the top level of processing. */
2365 register U_CHAR c
, *fptr
, *bptr
, *sptr
, *lptr
;
2368 fptr
= bptr
= sptr
= buf
->buf
;
2369 lptr
= fptr
+ buf
->length
;
2370 while ((sptr
= index0 (sptr
, '?', (size_t) (lptr
- sptr
))) != NULL
) {
2407 len
= sptr
- fptr
- 2;
2409 /* BSD doc says bcopy () works right for overlapping strings. In ANSI
2410 C, this will be memmove (). */
2411 if (bptr
!= fptr
&& len
> 0)
2412 bcopy ((char *) fptr
, (char *) bptr
, len
);
2418 len
= buf
->length
- (fptr
- buf
->buf
);
2419 if (bptr
!= fptr
&& len
> 0)
2420 bcopy ((char *) fptr
, (char *) bptr
, len
);
2421 buf
->length
-= fptr
- bptr
;
2422 buf
->buf
[buf
->length
] = '\0';
2423 if (warn_trigraphs
&& fptr
!= bptr
)
2424 warning_with_line (0, "%lu trigraph(s) encountered",
2425 (unsigned long) (fptr
- bptr
) / 2);
2428 /* Move all backslash-newline pairs out of embarrassing places.
2429 Exchange all such pairs following BP
2430 with any potentially-embarrassing characters that follow them.
2431 Potentially-embarrassing characters are / and *
2432 (because a backslash-newline inside a comment delimiter
2433 would cause it not to be recognized). */
2439 register U_CHAR
*p
= bp
;
2441 /* First count the backslash-newline pairs here. */
2443 while (p
[0] == '\\' && p
[1] == '\n')
2446 /* What follows the backslash-newlines is not embarrassing. */
2448 if (*p
!= '/' && *p
!= '*')
2451 /* Copy all potentially embarrassing characters
2452 that follow the backslash-newline pairs
2453 down to where the pairs originally started. */
2455 while (*p
== '*' || *p
== '/')
2458 /* Now write the same number of pairs after the embarrassing chars. */
2465 /* Like newline_fix but for use within a directive-name.
2466 Move any backslash-newlines up past any following symbol constituents. */
2469 name_newline_fix (bp
)
2472 register U_CHAR
*p
= bp
;
2474 /* First count the backslash-newline pairs here. */
2475 while (p
[0] == '\\' && p
[1] == '\n')
2478 /* What follows the backslash-newlines is not embarrassing. */
2483 /* Copy all potentially embarrassing characters
2484 that follow the backslash-newline pairs
2485 down to where the pairs originally started. */
2487 while (is_idchar
[*p
])
2490 /* Now write the same number of pairs after the embarrassing chars. */
2497 /* Look for lint commands in comments.
2499 When we come in here, ibp points into a comment. Limit is as one expects.
2500 scan within the comment -- it should start, after lwsp, with a lint command.
2501 If so that command is returned as a (constant) string.
2503 Upon return, any arg will be pointed to with argstart and will be
2504 arglen long. Note that we don't parse that arg since it will just
2505 be printed out again. */
2508 get_lintcmd (ibp
, limit
, argstart
, arglen
, cmdlen
)
2509 register U_CHAR
*ibp
;
2510 register U_CHAR
*limit
;
2511 U_CHAR
**argstart
; /* point to command arg */
2512 int *arglen
, *cmdlen
; /* how long they are */
2514 HOST_WIDE_INT linsize
;
2515 register U_CHAR
*numptr
; /* temp for arg parsing */
2519 SKIP_WHITE_SPACE (ibp
);
2521 if (ibp
>= limit
) return NULL
;
2523 linsize
= limit
- ibp
;
2525 /* Oh, I wish C had lexical functions... hell, I'll just open-code the set */
2526 if ((linsize
>= 10) && !bcmp (ibp
, "NOTREACHED", 10)) {
2528 return "NOTREACHED";
2530 if ((linsize
>= 8) && !bcmp (ibp
, "ARGSUSED", 8)) {
2534 if ((linsize
>= 11) && !bcmp (ibp
, "LINTLIBRARY", 11)) {
2536 return "LINTLIBRARY";
2538 if ((linsize
>= 7) && !bcmp (ibp
, "VARARGS", 7)) {
2540 ibp
+= 7; linsize
-= 7;
2541 if ((linsize
== 0) || ! isdigit (*ibp
)) return "VARARGS";
2543 /* OK, read a number */
2544 for (numptr
= *argstart
= ibp
; (numptr
< limit
) && isdigit (*numptr
);
2546 *arglen
= numptr
- *argstart
;
2553 * The main loop of the program.
2555 * Read characters from the input stack, transferring them to the
2558 * Macros are expanded and push levels on the input stack.
2559 * At the end of such a level it is popped off and we keep reading.
2560 * At the end of any other kind of level, we return.
2561 * #-directives are handled, except within macros.
2563 * If OUTPUT_MARKS is nonzero, keep Newline markers found in the input
2564 * and insert them when appropriate. This is set while scanning macro
2565 * arguments before substitution. It is zero when scanning for final output.
2566 * There are three types of Newline markers:
2567 * * Newline - follows a macro name that was not expanded
2568 * because it appeared inside an expansion of the same macro.
2569 * This marker prevents future expansion of that identifier.
2570 * When the input is rescanned into the final output, these are deleted.
2571 * These are also deleted by ## concatenation.
2572 * * Newline Space (or Newline and any other whitespace character)
2573 * stands for a place that tokens must be separated or whitespace
2574 * is otherwise desirable, but where the ANSI standard specifies there
2575 * is no whitespace. This marker turns into a Space (or whichever other
2576 * whitespace char appears in the marker) in the final output,
2577 * but it turns into nothing in an argument that is stringified with #.
2578 * Such stringified arguments are the only place where the ANSI standard
2579 * specifies with precision that whitespace may not appear.
2581 * During this function, IP->bufp is kept cached in IBP for speed of access.
2582 * Likewise, OP->bufp is kept in OBP. Before calling a subroutine
2583 * IBP, IP and OBP must be copied back to memory. IP and IBP are
2584 * copied back with the RECACHE macro. OBP must be copied back from OP->bufp
2585 * explicitly, and before RECACHE, since RECACHE uses OBP.
2589 rescan (op
, output_marks
)
2593 /* Character being scanned in main loop. */
2596 /* Length of pending accumulated identifier. */
2597 register int ident_length
= 0;
2599 /* Hash code of pending accumulated identifier. */
2600 register int hash
= 0;
2602 /* Current input level (&instack[indepth]). */
2605 /* Pointer for scanning input. */
2606 register U_CHAR
*ibp
;
2608 /* Pointer to end of input. End of scan is controlled by LIMIT. */
2609 register U_CHAR
*limit
;
2611 /* Pointer for storing output. */
2612 register U_CHAR
*obp
;
2614 /* REDO_CHAR is nonzero if we are processing an identifier
2615 after backing up over the terminating character.
2616 Sometimes we process an identifier without backing up over
2617 the terminating character, if the terminating character
2618 is not special. Backing up is done so that the terminating character
2619 will be dispatched on again once the identifier is dealt with. */
2622 /* 1 if within an identifier inside of which a concatenation
2623 marker (Newline -) has been seen. */
2624 int concatenated
= 0;
2626 /* While scanning a comment or a string constant,
2627 this records the line it started on, for error messages. */
2630 /* Record position of last `real' newline. */
2631 U_CHAR
*beg_of_line
;
2633 /* Pop the innermost input stack level, assuming it is a macro expansion. */
2636 do { ip->macro->type = T_MACRO; \
2637 if (ip->free_ptr) free (ip->free_ptr); \
2638 --indepth; } while (0)
2640 /* Reload `rescan's local variables that describe the current
2641 level of the input stack. */
2644 do { ip = &instack[indepth]; \
2646 limit = ip->buf + ip->length; \
2648 check_expand (op, limit - ibp); \
2650 obp = op->bufp; } while (0)
2652 if (no_output
&& instack
[indepth
].fname
!= 0)
2653 skip_if_group (&instack
[indepth
], 1, NULL
);
2660 /* Our caller must always put a null after the end of
2661 the input at each input stack level. */
2671 if (*ibp
== '\n' && !ip
->macro
) {
2672 /* At the top level, always merge lines ending with backslash-newline,
2673 even in middle of identifier. But do not merge lines in a macro,
2674 since backslash might be followed by a newline-space marker. */
2677 --obp
; /* remove backslash from obuf */
2680 /* If ANSI, backslash is just another character outside a string. */
2683 /* Otherwise, backslash suppresses specialness of following char,
2684 so copy it here to prevent the switch from seeing it.
2685 But first get any pending identifier processed. */
2686 if (ident_length
> 0)
2693 if (ident_length
|| ip
->macro
|| traditional
)
2695 while (*ibp
== '\\' && ibp
[1] == '\n') {
2701 /* Treat this %: digraph as if it were #. */
2705 if (assertions_flag
) {
2708 /* Copy #foo (bar lose) without macro expansion. */
2709 obp
[-1] = '#'; /* In case it was '%'. */
2710 SKIP_WHITE_SPACE (ibp
);
2711 while (is_idchar
[*ibp
])
2713 SKIP_WHITE_SPACE (ibp
);
2716 skip_paren_group (ip
);
2717 bcopy ((char *) ibp
, (char *) obp
, ip
->bufp
- ibp
);
2718 obp
+= ip
->bufp
- ibp
;
2724 /* If this is expanding a macro definition, don't recognize
2725 preprocessing directives. */
2728 /* If this is expand_into_temp_buffer,
2729 don't recognize them either. Warn about them
2730 only after an actual newline at this level,
2731 not at the beginning of the input level. */
2733 if (ip
->buf
!= beg_of_line
)
2734 warning ("preprocessing directive not recognized within macro arg");
2741 /* # keyword: a # must be first nonblank char on the line */
2742 if (beg_of_line
== 0)
2747 /* Scan from start of line, skipping whitespace, comments
2748 and backslash-newlines, and see if we reach this #.
2749 If not, this # is not special. */
2751 /* If -traditional, require # to be at beginning of line. */
2754 if (is_hor_space
[*bp
])
2756 else if (*bp
== '\\' && bp
[1] == '\n')
2758 else if (*bp
== '/' && bp
[1] == '*') {
2760 while (!(*bp
== '*' && bp
[1] == '/'))
2764 /* There is no point in trying to deal with C++ // comments here,
2765 because if there is one, then this # must be part of the
2766 comment and we would never reach here. */
2772 while (bp
[1] == '\\' && bp
[2] == '\n')
2776 /* %: appears at start of line; skip past the ':' too. */
2785 /* This # can start a directive. */
2787 --obp
; /* Don't copy the '#' */
2791 if (! handle_directive (ip
, op
)) {
2795 /* Not a known directive: treat it as ordinary text.
2796 IP, OP, IBP, etc. have not been changed. */
2797 if (no_output
&& instack
[indepth
].fname
) {
2798 /* If not generating expanded output,
2799 what we do with ordinary text is skip it.
2800 Discard everything until next # directive. */
2801 skip_if_group (&instack
[indepth
], 1, 0);
2806 *obp
++ = '#'; /* Copy # (even if it was originally %:). */
2807 /* Don't expand an identifier that could be a macro directive.
2808 (Section 3.8.3 of the ANSI C standard) */
2809 SKIP_WHITE_SPACE (ibp
);
2810 if (is_idstart
[*ibp
])
2813 while (is_idchar
[*ibp
])
2821 /* A # directive has been successfully processed. */
2822 /* If not generating expanded output, ignore everything until
2823 next # directive. */
2824 if (no_output
&& instack
[indepth
].fname
)
2825 skip_if_group (&instack
[indepth
], 1, 0);
2831 case '\"': /* skip quoted string */
2833 /* A single quoted string is treated like a double -- some
2834 programs (e.g., troff) are perverse this way */
2836 /* Handle any pending identifier;
2837 but the L in L'...' or L"..." is not an identifier. */
2839 && ! (ident_length
== 1 && hash
== HASHSTEP (0, 'L')))
2842 start_line
= ip
->lineno
;
2844 /* Skip ahead to a matching quote. */
2848 if (ip
->macro
!= 0) {
2849 /* try harder: this string crosses a macro expansion boundary.
2850 This can happen naturally if -traditional.
2851 Otherwise, only -D can make a macro with an unmatched quote. */
2857 error_with_line (line_for_error (start_line
),
2858 "unterminated string or character constant");
2859 error_with_line (multiline_string_line
,
2860 "possible real start of unterminated constant");
2861 multiline_string_line
= 0;
2870 /* Traditionally, end of line ends a string constant with no error.
2871 So exit the loop and record the new line. */
2877 error_with_line (line_for_error (start_line
),
2878 "unterminated character constant");
2881 if (multiline_string_line
== 0) {
2883 pedwarn_with_line (line_for_error (start_line
),
2884 "string constant runs past end of line");
2885 multiline_string_line
= ip
->lineno
- 1;
2893 /* Backslash newline is replaced by nothing at all,
2894 but keep the line counts correct. */
2899 /* ANSI stupidly requires that in \\ the second \
2900 is *not* prevented from combining with a newline. */
2901 while (*ibp
== '\\' && ibp
[1] == '\n') {
2920 if (*ibp
== '\\' && ibp
[1] == '\n')
2924 && !(cplusplus_comments
&& *ibp
== '/'))
2932 /* C++ style comment... */
2933 start_line
= ip
->lineno
;
2935 /* Comments are equivalent to spaces. */
2936 if (! put_out_comments
)
2940 U_CHAR
*before_bp
= ibp
;
2942 while (++ibp
< limit
) {
2944 if (ibp
[-1] != '\\') {
2945 if (put_out_comments
) {
2946 bcopy ((char *) before_bp
, (char *) obp
, ibp
- before_bp
);
2947 obp
+= ibp
- before_bp
;
2952 warning ("multiline `//' comment");
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
)
2966 /* Ordinary C comment. Skip it, optionally copying it to output. */
2968 start_line
= ip
->lineno
;
2970 ++ibp
; /* Skip the star. */
2972 /* If this cpp is for lint, we peek inside the comments: */
2976 char *lintcmd
= get_lintcmd (ibp
, limit
, &argbp
, &arglen
, &cmdlen
);
2978 if (lintcmd
!= NULL
) {
2980 check_expand (op
, cmdlen
+ arglen
+ 14);
2982 /* I believe it is always safe to emit this newline: */
2984 bcopy ("#pragma lint ", (char *) obp
, 13);
2986 bcopy (lintcmd
, (char *) obp
, cmdlen
);
2991 bcopy (argbp
, (char *) obp
, arglen
);
2995 /* OK, now bring us back to the state we were in before we entered
2996 this branch. We need #line because the #pragma's newline always
2997 messes up the line count. */
2999 output_line_directive (ip
, op
, 0, same_file
);
3000 check_expand (op
, limit
- ibp
+ 2);
3006 /* Comments are equivalent to spaces.
3007 Note that we already output the slash; we might not want it.
3008 For -traditional, a comment is equivalent to nothing. */
3009 if (! put_out_comments
) {
3019 U_CHAR
*before_bp
= ibp
;
3024 if (ibp
[-2] == '/' && warn_comments
)
3025 warning ("`/*' within comment");
3026 if (*ibp
== '\\' && ibp
[1] == '\n')
3034 /* Copy the newline into the output buffer, in order to
3035 avoid the pain of a #line every time a multiline comment
3037 if (!put_out_comments
)
3044 error_with_line (line_for_error (start_line
),
3045 "unterminated comment");
3054 if (put_out_comments
) {
3055 bcopy ((char *) before_bp
, (char *) obp
, ibp
- before_bp
);
3056 obp
+= ibp
- before_bp
;
3062 if (! is_idchar
['$'])
3065 pedwarn ("`$' in identifier");
3068 case '0': case '1': case '2': case '3': case '4':
3069 case '5': case '6': case '7': case '8': case '9':
3070 /* If digit is not part of identifier, it starts a number,
3071 which means that following letters are not an identifier.
3072 "0x5" does not refer to an identifier "x5".
3073 So copy all alphanumerics that follow without accumulating
3074 as an identifier. Periods also, for sake of "3.e7". */
3076 if (ident_length
== 0) {
3078 while (ibp
[0] == '\\' && ibp
[1] == '\n') {
3083 if (!is_idchar
[c
] && c
!= '.') {
3088 /* A sign can be part of a preprocessing number
3089 if it follows an `e' or `p'. */
3090 if (c
== 'e' || c
== 'E' || c
== 'p' || c
== 'P') {
3091 while (ibp
[0] == '\\' && ibp
[1] == '\n') {
3095 if (*ibp
== '+' || *ibp
== '-') {
3097 /* But traditional C does not let the token go past the sign,
3098 and C89 does not allow `p'. */
3099 if (traditional
|| (c89
&& (c
== 'p' || c
== 'P')))
3109 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
3110 case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
3111 case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
3112 case 's': case 't': case 'u': case 'v': case 'w': case 'x':
3114 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
3115 case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
3116 case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
3117 case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
3121 /* Compute step of hash function, to avoid a proc call on every token */
3122 hash
= HASHSTEP (hash
, c
);
3126 if (ip
->fname
== 0 && *ibp
== '-') {
3127 /* Newline - inhibits expansion of preceding token.
3128 If expanding a macro arg, we keep the newline -.
3129 In final output, it is deleted.
3130 We recognize Newline - in macro bodies and macro args. */
3131 if (! concatenated
) {
3136 if (!output_marks
) {
3139 /* If expanding a macro arg, keep the newline -. */
3145 /* If reprocessing a macro expansion, newline is a special marker. */
3146 else if (ip
->macro
!= 0) {
3147 /* Newline White is a "funny space" to separate tokens that are
3148 supposed to be separate but without space between.
3149 Here White means any whitespace character.
3150 Newline - marks a recursive macro use that is not
3151 supposed to be expandable. */
3153 if (is_space
[*ibp
]) {
3154 /* Newline Space does not prevent expansion of preceding token
3155 so expand the preceding token and then come back. */
3156 if (ident_length
> 0)
3159 /* If generating final output, newline space makes a space. */
3160 if (!output_marks
) {
3162 /* And Newline Newline makes a newline, so count it. */
3163 if (obp
[-1] == '\n')
3166 /* If expanding a macro arg, keep the newline space.
3167 If the arg gets stringified, newline space makes nothing. */
3170 } else abort (); /* Newline followed by something random? */
3174 /* If there is a pending identifier, handle it and come back here. */
3175 if (ident_length
> 0)
3180 /* Update the line counts and output a #line if necessary. */
3183 if (ip
->lineno
!= op
->lineno
) {
3185 output_line_directive (ip
, op
, 1, same_file
);
3186 check_expand (op
, limit
- ibp
);
3191 /* Come here either after (1) a null character that is part of the input
3192 or (2) at the end of the input, because there is a null there. */
3195 /* Our input really contains a null character. */
3199 /* At end of a macro-expansion level, pop it and read next level. */
3200 if (ip
->macro
!= 0) {
3203 /* If traditional, and we have an identifier that ends here,
3204 process it now, so we get the right error for recursion. */
3205 if (traditional
&& ident_length
3206 && ! is_idchar
[*instack
[indepth
- 1].bufp
]) {
3215 /* If we don't have a pending identifier,
3216 return at end of input. */
3217 if (ident_length
== 0) {
3225 /* If we do have a pending identifier, just consider this null
3226 a special character and arrange to dispatch on it again.
3227 The second time, IDENT_LENGTH will be zero so we will return. */
3233 /* Handle the case of a character such as /, ', " or null
3234 seen following an identifier. Back over it so that
3235 after the identifier is processed the special char
3236 will be dispatched on again. */
3246 if (ident_length
> 0) {
3247 register HASHNODE
*hp
;
3249 /* We have just seen an identifier end. If it's a macro, expand it.
3251 IDENT_LENGTH is the length of the identifier
3252 and HASH is its hash code.
3254 The identifier has already been copied to the output,
3255 so if it is a macro we must remove it.
3257 If REDO_CHAR is 0, the char that terminated the identifier
3258 has been skipped in the output and the input.
3259 OBP-IDENT_LENGTH-1 points to the identifier.
3260 If the identifier is a macro, we must back over the terminator.
3262 If REDO_CHAR is 1, the terminating char has already been
3263 backed over. OBP-IDENT_LENGTH points to the identifier. */
3265 if (!pcp_outfile
|| pcp_inside_if
) {
3266 for (hp
= hashtab
[MAKE_POS (hash
) % HASHSIZE
]; hp
!= NULL
;
3269 if (hp
->length
== ident_length
) {
3270 int obufp_before_macroname
;
3271 int op_lineno_before_macroname
;
3272 register int i
= ident_length
;
3273 register U_CHAR
*p
= hp
->name
;
3274 register U_CHAR
*q
= obp
- i
;
3280 do { /* All this to avoid a strncmp () */
3285 /* We found a use of a macro name.
3286 see if the context shows it is a macro call. */
3288 /* Back up over terminating character if not already done. */
3294 /* Save this as a displacement from the beginning of the output
3295 buffer. We can not save this as a position in the output
3296 buffer, because it may get realloc'ed by RECACHE. */
3297 obufp_before_macroname
= (obp
- op
->buf
) - ident_length
;
3298 op_lineno_before_macroname
= op
->lineno
;
3300 if (hp
->type
== T_PCSTRING
) {
3301 pcstring_used (hp
); /* Mark the definition of this key
3302 as needed, ensuring that it
3304 break; /* Exit loop, since the key cannot have a
3305 definition any longer. */
3308 /* Record whether the macro is disabled. */
3309 disabled
= hp
->type
== T_DISABLED
;
3311 /* This looks like a macro ref, but if the macro was disabled,
3312 just copy its name and put in a marker if requested. */
3316 /* This error check caught useful cases such as
3317 #define foo(x,y) bar (x (y,0), y)
3320 error ("recursive use of macro `%s'", hp
->name
);
3324 check_expand (op
, limit
- ibp
+ 2);
3331 /* If macro wants an arglist, verify that a '(' follows.
3332 first skip all whitespace, copying it to the output
3333 after the macro name. Then, if there is no '(',
3334 decide this is not a macro call and leave things that way. */
3335 if ((hp
->type
== T_MACRO
|| hp
->type
== T_DISABLED
)
3336 && hp
->value
.defn
->nargs
>= 0)
3338 U_CHAR
*old_ibp
= ibp
;
3339 U_CHAR
*old_obp
= obp
;
3340 int old_iln
= ip
->lineno
;
3341 int old_oln
= op
->lineno
;
3344 /* Scan forward over whitespace, copying it to the output. */
3345 if (ibp
== limit
&& ip
->macro
!= 0) {
3350 old_iln
= ip
->lineno
;
3351 old_oln
= op
->lineno
;
3353 /* A comment: copy it unchanged or discard it. */
3354 else if (*ibp
== '/' && ibp
[1] == '*') {
3355 if (put_out_comments
) {
3358 } else if (! traditional
) {
3362 while (ibp
+ 1 != limit
3363 && !(ibp
[0] == '*' && ibp
[1] == '/')) {
3364 /* We need not worry about newline-marks,
3365 since they are never found in comments. */
3367 /* Newline in a file. Count it. */
3371 if (put_out_comments
)
3377 if (put_out_comments
) {
3382 else if (is_space
[*ibp
]) {
3384 if (ibp
[-1] == '\n') {
3385 if (ip
->macro
== 0) {
3386 /* Newline in a file. Count it. */
3389 } else if (!output_marks
) {
3390 /* A newline mark, and we don't want marks
3391 in the output. If it is newline-hyphen,
3392 discard it entirely. Otherwise, it is
3393 newline-whitechar, so keep the whitechar. */
3403 /* A newline mark; copy both chars to the output. */
3411 /* It isn't a macro call.
3412 Put back the space that we just skipped. */
3415 ip
->lineno
= old_iln
;
3416 op
->lineno
= old_oln
;
3417 /* Exit the for loop. */
3422 /* This is now known to be a macro call.
3423 Discard the macro name from the output,
3424 along with any following whitespace just copied,
3425 but preserve newlines if not outputting marks since this
3426 is more likely to do the right thing with line numbers. */
3427 obp
= op
->buf
+ obufp_before_macroname
;
3429 op
->lineno
= op_lineno_before_macroname
;
3431 int newlines
= op
->lineno
- op_lineno_before_macroname
;
3432 while (0 < newlines
--)
3436 /* Prevent accidental token-pasting with a character
3437 before the macro call. */
3438 if (!traditional
&& obp
!= op
->buf
) {
3440 case '!': case '%': case '&': case '*':
3441 case '+': case '-': case '.': case '/':
3442 case ':': case '<': case '=': case '>':
3444 /* If we are expanding a macro arg, make a newline marker
3445 to separate the tokens. If we are making real output,
3446 a plain space will do. */
3453 /* Expand the macro, reading arguments as needed,
3454 and push the expansion on the input stack. */
3457 macroexpand (hp
, op
);
3459 /* Reexamine input stack, since macroexpand has pushed
3460 a new level on it. */
3467 } /* End hash-table-search loop */
3469 ident_length
= hash
= 0; /* Stop collecting identifier */
3472 } /* End if (ident_length > 0) */
3474 } /* End per-char loop */
3476 /* Come here to return -- but first give an error message
3477 if there was an unterminated successful conditional. */
3479 if (if_stack
!= ip
->if_stack
)
3483 switch (if_stack
->type
)
3504 error_with_line (line_for_error (if_stack
->lineno
),
3505 "unterminated `#%s' conditional", str
);
3507 if_stack
= ip
->if_stack
;
3511 * Rescan a string into a temporary buffer and return the result
3512 * as a FILE_BUF. Note this function returns a struct, not a pointer.
3514 * OUTPUT_MARKS nonzero means keep Newline markers found in the input
3515 * and insert such markers when appropriate. See `rescan' for details.
3516 * OUTPUT_MARKS is 1 for macroexpanding a macro argument separately
3517 * before substitution; it is 0 for other uses.
3520 expand_to_temp_buffer (buf
, limit
, output_marks
, assertions
)
3521 U_CHAR
*buf
, *limit
;
3522 int output_marks
, assertions
;
3524 register FILE_BUF
*ip
;
3526 int length
= limit
- buf
;
3528 int odepth
= indepth
;
3529 int save_assertions_flag
= assertions_flag
;
3531 assertions_flag
= assertions
;
3536 /* Set up the input on the input stack. */
3538 buf1
= (U_CHAR
*) alloca (length
+ 1);
3540 register U_CHAR
*p1
= buf
;
3541 register U_CHAR
*p2
= buf1
;
3548 /* Set up to receive the output. */
3550 obuf
.length
= length
* 2 + 100; /* Usually enough. Why be stingy? */
3551 obuf
.bufp
= obuf
.buf
= (U_CHAR
*) xmalloc (obuf
.length
);
3552 obuf
.nominal_fname
= 0;
3559 obuf
.system_header_p
= 0;
3561 CHECK_DEPTH ({return obuf
;});
3565 ip
= &instack
[indepth
];
3567 ip
->nominal_fname
= 0;
3569 ip
->system_header_p
= 0;
3572 ip
->length
= length
;
3573 ip
->buf
= ip
->bufp
= buf1
;
3574 ip
->if_stack
= if_stack
;
3576 ip
->lineno
= obuf
.lineno
= 1;
3578 /* Scan the input, create the output. */
3579 rescan (&obuf
, output_marks
);
3581 /* Pop input stack to original state. */
3584 if (indepth
!= odepth
)
3587 /* Record the output. */
3588 obuf
.length
= obuf
.bufp
- obuf
.buf
;
3590 assertions_flag
= save_assertions_flag
;
3595 * Process a # directive. Expects IP->bufp to point after the '#', as in
3596 * `#define foo bar'. Passes to the directive handler
3597 * (do_define, do_include, etc.): the addresses of the 1st and
3598 * last chars of the directive (starting immediately after the #
3599 * keyword), plus op and the keyword table pointer. If the directive
3600 * contains comments it is copied into a temporary buffer sans comments
3601 * and the temporary buffer is passed to the directive handler instead.
3602 * Likewise for backslash-newlines.
3604 * Returns nonzero if this was a known # directive.
3605 * Otherwise, returns zero, without advancing the input pointer.
3609 handle_directive (ip
, op
)
3612 register U_CHAR
*bp
, *cp
;
3613 register struct directive
*kt
;
3614 register int ident_length
;
3617 /* Nonzero means we must copy the entire directive
3618 to get rid of comments or backslash-newlines. */
3619 int copy_directive
= 0;
3621 U_CHAR
*ident
, *after_ident
;
3625 /* Record where the directive started. do_xifdef needs this. */
3626 directive_start
= bp
- 1;
3628 /* Skip whitespace and \-newline. */
3630 if (is_hor_space
[*bp
]) {
3631 if (*bp
!= ' ' && *bp
!= '\t' && pedantic
)
3632 pedwarn ("%s in preprocessing directive", char_name
[*bp
]);
3634 } else if (*bp
== '/' && (bp
[1] == '*'
3635 || (cplusplus_comments
&& bp
[1] == '/'))) {
3637 skip_to_end_of_comment (ip
, &ip
->lineno
, 0);
3639 } else if (*bp
== '\\' && bp
[1] == '\n') {
3640 bp
+= 2; ip
->lineno
++;
3644 /* Now find end of directive name.
3645 If we encounter a backslash-newline, exchange it with any following
3646 symbol-constituents so that we end up with a contiguous name. */
3653 if (*cp
== '\\' && cp
[1] == '\n')
3654 name_newline_fix (cp
);
3660 ident_length
= cp
- bp
;
3664 /* A line of just `#' becomes blank. */
3666 if (ident_length
== 0 && *after_ident
== '\n') {
3667 ip
->bufp
= after_ident
;
3671 if (ident_length
== 0 || !is_idstart
[*ident
]) {
3673 while (is_idchar
[*p
]) {
3674 if (*p
< '0' || *p
> '9')
3678 /* Handle # followed by a line number. */
3679 if (p
!= ident
&& !is_idchar
[*p
]) {
3680 static struct directive line_directive_table
[] = {
3681 { 4, do_line
, "line", T_LINE
},
3684 pedwarn ("`#' followed by integer");
3685 after_ident
= ident
;
3686 kt
= line_directive_table
;
3690 /* Avoid error for `###' and similar cases unless -pedantic. */
3692 while (*p
== '#' || is_hor_space
[*p
]) p
++;
3694 if (pedantic
&& !lang_asm
)
3695 warning ("invalid preprocessing directive");
3701 error ("invalid preprocessing directive name");
3707 * Decode the keyword and call the appropriate expansion
3708 * routine, after moving the input pointer up to the next line.
3710 for (kt
= directive_table
; kt
->length
> 0; kt
++) {
3711 if (kt
->length
== ident_length
&& !bcmp (kt
->name
, ident
, ident_length
)) {
3712 register U_CHAR
*buf
;
3713 register U_CHAR
*limit
;
3716 int *already_output
;
3718 /* Nonzero means do not delete comments within the directive.
3719 #define needs this when -traditional. */
3724 limit
= ip
->buf
+ ip
->length
;
3727 keep_comments
= traditional
&& kt
->traditional_comments
;
3728 /* #import is defined only in Objective C, or when on the NeXT. */
3729 if (kt
->type
== T_IMPORT
3730 && !(objc
|| lookup ((U_CHAR
*) "__NeXT__", -1, -1)))
3733 /* Find the end of this directive (first newline not backslashed
3734 and not in a string or comment).
3735 Set COPY_DIRECTIVE if the directive must be copied
3736 (it contains a backslash-newline or a comment). */
3738 buf
= bp
= after_ident
;
3739 while (bp
< limit
) {
3740 register U_CHAR c
= *bp
++;
3748 } else if (traditional
)
3755 bp
= skip_quoted_string (bp
- 1, limit
, ip
->lineno
, &ip
->lineno
, ©_directive
, &unterminated
);
3756 /* Don't bother calling the directive if we already got an error
3757 message due to unterminated string. Skip everything and pretend
3758 we called the directive. */
3761 /* Traditional preprocessing permits unterminated strings. */
3770 /* <...> is special for #include. */
3772 if (!kt
->angle_brackets
)
3774 while (bp
< limit
&& *bp
!= '>' && *bp
!= '\n') {
3775 if (*bp
== '\\' && bp
[1] == '\n') {
3785 if (*bp
== '\\' && bp
[1] == '\n')
3788 || (cplusplus_comments
&& *bp
== '/')) {
3789 U_CHAR
*obp
= bp
- 1;
3791 skip_to_end_of_comment (ip
, &ip
->lineno
, 0);
3793 /* No need to copy the directive because of a comment at the end;
3794 just don't include the comment in the directive. */
3795 if (!put_out_comments
) {
3797 for (p
= bp
; *p
== ' ' || *p
== '\t'; p
++)
3804 /* Don't remove the comments if -traditional. */
3805 if (! keep_comments
)
3814 pedwarn ("%s in preprocessing directive", char_name
[c
]);
3818 --bp
; /* Point to the newline */
3826 resume_p
= ip
->bufp
;
3827 /* BP is the end of the directive.
3828 RESUME_P is the next interesting data after the directive.
3829 A comment may come between. */
3831 /* If a directive should be copied through, and -E was given,
3832 pass it through before removing comments. */
3833 if (!no_output
&& put_out_comments
3834 && (dump_macros
!= dump_definitions
) < kt
->pass_thru
) {
3837 /* Output directive name. */
3838 check_expand (op
, kt
->length
+ 2);
3839 /* Make sure # is at the start of a line */
3840 if (op
->bufp
> op
->buf
&& op
->bufp
[-1] != '\n') {
3845 bcopy (kt
->name
, op
->bufp
, kt
->length
);
3846 op
->bufp
+= kt
->length
;
3848 /* Output arguments. */
3850 check_expand (op
, len
);
3851 bcopy (buf
, (char *) op
->bufp
, len
);
3853 /* Take account of any (escaped) newlines just output. */
3855 if (buf
[len
] == '\n')
3858 already_output
= &junk
;
3859 } /* Don't we need a newline or #line? */
3861 if (copy_directive
) {
3862 register U_CHAR
*xp
= buf
;
3863 /* Need to copy entire directive into temp buffer before dispatching */
3865 cp
= (U_CHAR
*) alloca (bp
- buf
+ 5); /* room for directive plus
3869 /* Copy to the new buffer, deleting comments
3870 and backslash-newlines (and whitespace surrounding the latter). */
3873 register U_CHAR c
= *xp
++;
3878 abort (); /* A bare newline should never part of the line. */
3881 /* <...> is special for #include. */
3883 if (!kt
->angle_brackets
)
3885 while (xp
< bp
&& c
!= '>') {
3887 if (c
== '\\' && xp
< bp
&& *xp
== '\n')
3898 if (cp
!= buf
&& is_hor_space
[cp
[-1]]) {
3899 while (cp
- 1 != buf
&& is_hor_space
[cp
[-2]])
3901 SKIP_WHITE_SPACE (xp
);
3902 } else if (is_hor_space
[*xp
]) {
3904 SKIP_WHITE_SPACE (xp
);
3906 } else if (traditional
&& xp
< bp
) {
3914 register U_CHAR
*bp1
3915 = skip_quoted_string (xp
- 1, bp
, ip
->lineno
,
3916 NULL_PTR
, NULL_PTR
, NULL_PTR
);
3930 || (cplusplus_comments
&& *xp
== '/')) {
3932 /* If we already copied the directive through,
3933 already_output != 0 prevents outputting comment now. */
3934 skip_to_end_of_comment (ip
, already_output
, 0);
3936 while (xp
!= ip
->bufp
)
3938 /* Delete or replace the slash. */
3939 else if (traditional
)
3948 /* Null-terminate the copy. */
3954 ip
->bufp
= resume_p
;
3956 /* Some directives should be written out for cc1 to process,
3957 just as if they were not defined. And sometimes we're copying
3958 definitions through. */
3960 if (!no_output
&& already_output
== 0
3961 && (dump_macros
< dump_names
) < kt
->pass_thru
) {
3964 /* Output directive name. */
3965 check_expand (op
, kt
->length
+ 1);
3967 bcopy (kt
->name
, (char *) op
->bufp
, kt
->length
);
3968 op
->bufp
+= kt
->length
;
3970 if ((dump_macros
!= dump_definitions
) < kt
->pass_thru
) {
3971 /* Output arguments. */
3973 check_expand (op
, len
);
3974 bcopy (buf
, (char *) op
->bufp
, len
);
3976 } else if (kt
->type
== T_DEFINE
&& dump_macros
== dump_names
) {
3979 SKIP_WHITE_SPACE (xp
);
3981 while (is_idchar
[*xp
]) xp
++;
3983 check_expand (op
, len
+ 1);
3985 bcopy (yp
, op
->bufp
, len
);
3988 } /* Don't we need a newline or #line? */
3990 /* Call the appropriate directive handler. buf now points to
3991 either the appropriate place in the input buffer, or to
3992 the temp buffer if it was necessary to make one. cp
3993 points to the first char after the contents of the (possibly
3994 copied) directive, in either case. */
3995 (*kt
->func
) (buf
, cp
, op
, kt
);
3996 check_expand (op
, ip
->length
- (ip
->bufp
- ip
->buf
));
4002 /* It is deliberate that we don't warn about undefined directives.
4003 That is the responsibility of cc1. */
4010 static struct tm
*timebuf
;
4012 time_t t
= time ((time_t *) 0);
4013 timebuf
= localtime (&t
);
4018 static char *monthnames
[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4019 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
4023 * expand things like __FILE__. Place the expansion into the output
4024 * buffer *without* rescanning.
4028 special_symbol (hp
, op
)
4035 FILE_BUF
*ip
= NULL
;
4038 int paren
= 0; /* For special `defined' keyword */
4040 if (pcp_outfile
&& pcp_inside_if
4041 && hp
->type
!= T_SPEC_DEFINED
&& hp
->type
!= T_CONST
)
4042 error ("Predefined macro `%s' used inside `#if' during precompilation",
4045 for (i
= indepth
; i
>= 0; i
--)
4046 if (instack
[i
].fname
!= NULL
) {
4051 error ("cccp error: not in any file?!");
4052 return; /* the show must go on */
4060 if (hp
->type
== T_FILE
)
4061 string
= ip
->nominal_fname
;
4063 string
= instack
[0].nominal_fname
;
4067 buf
= (char *) alloca (3 + 4 * strlen (string
));
4068 quote_string (buf
, string
);
4076 case T_INCLUDE_LEVEL
:
4078 for (i
= indepth
; i
>= 0; i
--)
4079 if (instack
[i
].fname
!= NULL
)
4082 buf
= (char *) alloca (8); /* Eight bytes ought to be more than enough */
4083 sprintf (buf
, "%d", true_indepth
- 1);
4087 buf
= (char *) alloca (3 + strlen (version_string
));
4088 sprintf (buf
, "\"%s\"", version_string
);
4091 #ifndef NO_BUILTIN_SIZE_TYPE
4097 #ifndef NO_BUILTIN_PTRDIFF_TYPE
4098 case T_PTRDIFF_TYPE
:
4107 case T_USER_LABEL_PREFIX_TYPE
:
4108 buf
= USER_LABEL_PREFIX
;
4111 case T_REGISTER_PREFIX_TYPE
:
4112 buf
= REGISTER_PREFIX
;
4115 case T_IMMEDIATE_PREFIX_TYPE
:
4116 buf
= IMMEDIATE_PREFIX
;
4120 buf
= hp
->value
.cpval
;
4121 if (pcp_inside_if
&& pcp_outfile
)
4122 /* Output a precondition for this macro use */
4123 fprintf (pcp_outfile
, "#define %s %s\n", hp
->name
, buf
);
4127 buf
= (char *) alloca (10);
4128 sprintf (buf
, "%d", ip
->lineno
);
4133 buf
= (char *) alloca (20);
4134 timebuf
= timestamp ();
4135 if (hp
->type
== T_DATE
)
4136 sprintf (buf
, "\"%s %2d %4d\"", monthnames
[timebuf
->tm_mon
],
4137 timebuf
->tm_mday
, timebuf
->tm_year
+ 1900);
4139 sprintf (buf
, "\"%02d:%02d:%02d\"", timebuf
->tm_hour
, timebuf
->tm_min
,
4143 case T_SPEC_DEFINED
:
4144 buf
= " 0 "; /* Assume symbol is not defined */
4145 ip
= &instack
[indepth
];
4146 SKIP_WHITE_SPACE (ip
->bufp
);
4147 if (*ip
->bufp
== '(') {
4149 ip
->bufp
++; /* Skip over the paren */
4150 SKIP_WHITE_SPACE (ip
->bufp
);
4153 if (!is_idstart
[*ip
->bufp
])
4155 if (ip
->bufp
[0] == 'L' && (ip
->bufp
[1] == '\'' || ip
->bufp
[1] == '"'))
4157 if ((hp
= lookup (ip
->bufp
, -1, -1))) {
4158 if (pcp_outfile
&& pcp_inside_if
4159 && (hp
->type
== T_CONST
4160 || (hp
->type
== T_MACRO
&& hp
->value
.defn
->predefined
)))
4161 /* Output a precondition for this macro use. */
4162 fprintf (pcp_outfile
, "#define %s\n", hp
->name
);
4166 if (pcp_outfile
&& pcp_inside_if
) {
4167 /* Output a precondition for this macro use */
4168 U_CHAR
*cp
= ip
->bufp
;
4169 fprintf (pcp_outfile
, "#undef ");
4170 while (is_idchar
[*cp
]) /* Ick! */
4171 fputc (*cp
++, pcp_outfile
);
4172 putc ('\n', pcp_outfile
);
4174 while (is_idchar
[*ip
->bufp
])
4176 SKIP_WHITE_SPACE (ip
->bufp
);
4178 if (*ip
->bufp
!= ')')
4186 error ("`defined' without an identifier");
4190 error ("cccp error: invalid special hash type"); /* time for gdb */
4194 check_expand (op
, len
);
4195 bcopy (buf
, (char *) op
->bufp
, len
);
4202 /* Routines to handle #directives */
4204 /* Handle #include and #import.
4205 This function expects to see "fname" or <fname> on the input. */
4208 do_include (buf
, limit
, op
, keyword
)
4209 U_CHAR
*buf
, *limit
;
4211 struct directive
*keyword
;
4213 U_CHAR
*importing
= keyword
->type
== T_IMPORT
? (U_CHAR
*) "" : (U_CHAR
*) 0;
4214 int skip_dirs
= (keyword
->type
== T_INCLUDE_NEXT
);
4215 static int import_warning
= 0;
4216 char *fname
; /* Dynamically allocated fname buffer */
4219 char *fbeg
, *fend
; /* Beginning and end of fname */
4222 struct file_name_list
*search_start
= include
; /* Chain of dirs to search */
4223 struct file_name_list
*dsp
; /* First in chain, if #include "..." */
4224 struct file_name_list
*searchptr
= 0;
4227 int f
= -3; /* file number */
4228 struct include_file
*inc
= 0;
4230 int retried
= 0; /* Have already tried macro
4231 expanding the include line*/
4232 int angle_brackets
= 0; /* 0 for "...", 1 for <...> */
4234 int vaxc_include
= 0; /* 1 for token without punctuation */
4241 if (pedantic
&& !instack
[indepth
].system_header_p
)
4244 pedwarn ("ANSI C does not allow `#import'");
4246 pedwarn ("ANSI C does not allow `#include_next'");
4249 if (importing
&& warn_import
&& !inhibit_warnings
4250 && !instack
[indepth
].system_header_p
&& !import_warning
) {
4252 warning ("using `#import' is not recommended");
4253 fprintf (stderr
, "The fact that a certain header file need not be processed more than once\n");
4254 fprintf (stderr
, "should be indicated in the header file, not where it is used.\n");
4255 fprintf (stderr
, "The best way to do this is with a conditional of this form:\n\n");
4256 fprintf (stderr
, " #ifndef _FOO_H_INCLUDED\n");
4257 fprintf (stderr
, " #define _FOO_H_INCLUDED\n");
4258 fprintf (stderr
, " ... <real contents of file> ...\n");
4259 fprintf (stderr
, " #endif /* Not _FOO_H_INCLUDED */\n\n");
4260 fprintf (stderr
, "Then users can use `#include' any number of times.\n");
4261 fprintf (stderr
, "GNU C automatically avoids processing the file more than once\n");
4262 fprintf (stderr
, "when it is equipped with such a conditional.\n");
4268 SKIP_WHITE_SPACE (fin
);
4269 /* Discard trailing whitespace so we can easily see
4270 if we have parsed all the significant chars we were given. */
4271 while (limit
!= fin
&& is_hor_space
[limit
[-1]]) limit
--;
4272 fbeg
= fend
= (char *) alloca (limit
- fin
);
4278 /* Copy the operand text, concatenating the strings. */
4280 while (fin
!= limit
) {
4281 while (fin
!= limit
&& *fin
!= '\"')
4286 /* If not at the end, there had better be another string. */
4287 /* Skip just horiz space, and don't go past limit. */
4288 while (fin
!= limit
&& is_hor_space
[*fin
]) fin
++;
4289 if (fin
!= limit
&& *fin
== '\"')
4296 /* We have "filename". Figure out directory this source
4297 file is coming from and put it on the front of the list. */
4299 /* If -I- was specified, don't search current dir, only spec'd ones. */
4300 if (ignore_srcdir
) break;
4302 for (fp
= &instack
[indepth
]; fp
>= instack
; fp
--)
4307 if ((nam
= fp
->nominal_fname
) != NULL
) {
4308 /* Found a named file. Figure out dir of the file,
4309 and put it in front of the search list. */
4310 dsp
= ((struct file_name_list
*)
4311 alloca (sizeof (struct file_name_list
) + strlen (nam
)));
4312 strcpy (dsp
->fname
, nam
);
4313 simplify_filename (dsp
->fname
);
4314 nam
= base_name (dsp
->fname
);
4316 /* But for efficiency's sake, do not insert the dir
4317 if it matches the search list's first dir. */
4318 dsp
->next
= search_start
;
4319 if (!search_start
|| strcmp (dsp
->fname
, search_start
->fname
)) {
4321 n
= nam
- dsp
->fname
;
4322 if (n
+ INCLUDE_LEN_FUDGE
> max_include_len
)
4323 max_include_len
= n
+ INCLUDE_LEN_FUDGE
;
4325 dsp
[0].got_name_map
= 0;
4333 while (fin
!= limit
&& *fin
!= '>')
4335 if (*fin
== '>' && fin
+ 1 == limit
) {
4337 /* If -I-, start with the first -I dir after the -I-. */
4338 search_start
= first_bracket_include
;
4346 * Support '#include xyz' like VAX-C to allow for easy use of all the
4347 * decwindow include files. It defaults to '#include <xyz.h>' (so the
4348 * code from case '<' is repeated here) and generates a warning.
4349 * (Note: macro expansion of `xyz' takes precedence.)
4351 if (retried
&& isalpha(*(U_CHAR
*) (--fbeg
))) {
4352 while (fin
!= limit
&& (!isspace(*fin
)))
4354 warning ("VAX-C-style include specification found, use '#include <filename.h>' !");
4358 /* If -I-, start with the first -I dir after the -I-. */
4359 search_start
= first_bracket_include
;
4367 error ("`#%s' expects \"FILENAME\" or <FILENAME>", keyword
->name
);
4370 /* Expand buffer and then remove any newline markers.
4371 We can't just tell expand_to_temp_buffer to omit the markers,
4372 since it would put extra spaces in include file names. */
4375 trybuf
= expand_to_temp_buffer (buf
, limit
, 1, 0);
4377 buf
= (U_CHAR
*) alloca (trybuf
.bufp
- trybuf
.buf
+ 1);
4379 while (src
!= trybuf
.bufp
) {
4380 switch ((*limit
++ = *src
++)) {
4389 U_CHAR
*src1
= skip_quoted_string (src
- 1, trybuf
.bufp
, 0,
4390 NULL_PTR
, NULL_PTR
, NULL_PTR
);
4404 /* For #include_next, skip in the search path
4405 past the dir in which the containing file was found. */
4408 for (fp
= &instack
[indepth
]; fp
>= instack
; fp
--)
4409 if (fp
->fname
!= NULL
) {
4410 /* fp->dir is null if the containing file was specified
4411 with an absolute file name. In that case, don't skip anything. */
4413 search_start
= fp
->dir
->next
;
4419 flen
= simplify_filename (fbeg
);
4423 error ("empty file name in `#%s'", keyword
->name
);
4427 /* Allocate this permanently, because it gets stored in the definitions
4429 fname
= xmalloc (max_include_len
+ flen
+ 1);
4430 /* + 1 above for terminating null. */
4432 system_include_depth
+= angle_brackets
;
4434 /* If specified file name is absolute, just open it. */
4436 if (absolute_filename (fbeg
)) {
4437 strcpy (fname
, fbeg
);
4438 f
= open_include_file (fname
, NULL_PTR
, importing
, &inc
);
4442 struct bypass_dir
*next
;
4444 struct file_name_list
*searchptr
;
4445 } **bypass_slot
= 0;
4447 /* Search directory path, trying to open the file.
4448 Copy each filename tried into FNAME. */
4450 for (searchptr
= search_start
; searchptr
; searchptr
= searchptr
->next
) {
4452 if (searchptr
== first_bracket_include
) {
4453 /* Go to bypass directory if we know we've seen this file before. */
4454 static struct bypass_dir
*bypass_hashtab
[INCLUDE_HASHSIZE
];
4455 struct bypass_dir
*p
;
4456 bypass_slot
= &bypass_hashtab
[hashf ((U_CHAR
*) fbeg
, flen
,
4458 for (p
= *bypass_slot
; p
; p
= p
->next
)
4459 if (!strcmp (fbeg
, p
->fname
)) {
4460 searchptr
= p
->searchptr
;
4466 strcpy (fname
, searchptr
->fname
);
4467 strcat (fname
, fbeg
);
4469 /* Change this 1/2 Unix 1/2 VMS file specification into a
4470 full VMS file specification */
4471 if (searchptr
->fname
[0]) {
4472 /* Fix up the filename */
4473 hack_vms_include_specification (fname
, vaxc_include
);
4475 /* This is a normal VMS filespec, so use it unchanged. */
4476 strcpy (fname
, fbeg
);
4477 /* if it's '#include filename', add the missing .h */
4478 if (vaxc_include
&& index(fname
,'.')==NULL
) {
4479 strcat (fname
, ".h");
4483 f
= open_include_file (fname
, searchptr
, importing
, &inc
);
4485 if (bypass_slot
&& searchptr
!= first_bracket_include
) {
4486 /* This is the first time we found this include file,
4487 and we found it after first_bracket_include.
4488 Record its location so that we can bypass to here next time. */
4489 struct bypass_dir
*p
4490 = (struct bypass_dir
*) xmalloc (sizeof (struct bypass_dir
));
4491 p
->next
= *bypass_slot
;
4492 p
->fname
= fname
+ strlen (searchptr
->fname
);
4493 p
->searchptr
= searchptr
;
4499 /* Our VMS hacks can produce invalid filespecs, so don't worry
4500 about errors other than EACCES. */
4501 if (errno
== EACCES
)
4504 if (errno
!= ENOENT
&& errno
!= ENOTDIR
)
4514 /* The file was already included. */
4516 /* If generating dependencies and -MG was specified, we assume missing
4517 files are leaf files, living in the same directory as the source file
4518 or other similar place; these missing files may be generated from
4519 other files and may not exist yet (eg: y.tab.h). */
4520 } else if (print_deps_missing_files
4521 && (system_include_depth
!= 0) < print_deps
)
4523 /* If it was requested as a system header file,
4524 then assume it belongs in the first place to look for such. */
4528 char *p
= (char *) alloca (strlen (search_start
->fname
)
4529 + strlen (fbeg
) + 1);
4530 strcpy (p
, search_start
->fname
);
4532 deps_output (p
, ' ');
4537 /* Otherwise, omit the directory, as if the file existed
4538 in the directory with the source. */
4539 deps_output (fbeg
, ' ');
4542 /* If -M was specified, and this header file won't be added to the
4543 dependency list, then don't count this as an error, because we can
4544 still produce correct output. Otherwise, we can't produce correct
4545 output, because there may be dependencies we need inside the missing
4546 file, and we don't know what directory this missing file exists in. */
4547 else if (0 < print_deps
&& print_deps
<= (system_include_depth
!= 0))
4548 warning ("No include path in which to find %s", fbeg
);
4550 error_from_errno (fbeg
);
4552 error ("No include path in which to find %s", fbeg
);
4556 /* Actually process the file. */
4558 pcftry
= (char *) alloca (strlen (fname
) + 30);
4565 sprintf (pcftry
, "%s%d", fname
, pcfnum
++);
4567 pcf
= open (pcftry
, O_RDONLY
, 0666);
4572 if (fstat (pcf
, &s
) != 0)
4573 pfatal_with_name (pcftry
);
4574 if (! INO_T_EQ (inc
->st
.st_ino
, s
.st_ino
)
4575 || inc
->st
.st_dev
!= s
.st_dev
)
4577 pcfbuf
= check_precompiled (pcf
, &s
, fname
, &pcfbuflimit
);
4578 /* Don't need it any more. */
4583 /* Don't need it at all. */
4588 } while (pcf
!= -1 && !pcfbuf
);
4591 /* Actually process the file */
4593 pcfname
= xmalloc (strlen (pcftry
) + 1);
4594 strcpy (pcfname
, pcftry
);
4595 pcfinclude ((U_CHAR
*) pcfbuf
, (U_CHAR
*) pcfbuflimit
,
4596 (U_CHAR
*) fname
, op
);
4599 finclude (f
, inc
, op
, is_system_include (fname
), searchptr
);
4602 system_include_depth
-= angle_brackets
;
4607 /* Return nonzero if the given FILENAME is an absolute pathname which
4608 designates a file within one of the known "system" include file
4609 directories. We assume here that if the given FILENAME looks like
4610 it is the name of a file which resides either directly in a "system"
4611 include file directory, or within any subdirectory thereof, then the
4612 given file must be a "system" include file. This function tells us
4613 if we should suppress pedantic errors/warnings for the given FILENAME.
4615 The value is 2 if the file is a C-language system header file
4616 for which C++ should (on most systems) assume `extern "C"'. */
4619 is_system_include (filename
)
4620 register char *filename
;
4622 struct file_name_list
*searchptr
;
4624 for (searchptr
= first_system_include
; searchptr
;
4625 searchptr
= searchptr
->next
)
4626 if (! strncmp (searchptr
->fname
, filename
, strlen (searchptr
->fname
)))
4627 return searchptr
->c_system_include_path
+ 1;
4631 /* Yield the non-directory suffix of a file name. */
4639 #if defined (__MSDOS__) || defined (_WIN32)
4640 if (isalpha (s
[0]) && s
[1] == ':') s
+= 2;
4643 if ((p
= rindex (s
, ':'))) s
= p
+ 1; /* Skip device. */
4644 if ((p
= rindex (s
, ']'))) s
= p
+ 1; /* Skip directory. */
4645 if ((p
= rindex (s
, '>'))) s
= p
+ 1; /* Skip alternate (int'n'l) dir. */
4649 if ((p
= rindex (s
, '/'))) s
= p
+ 1;
4650 #ifdef DIR_SEPARATOR
4651 if ((p
= rindex (s
, DIR_SEPARATOR
))) s
= p
+ 1;
4656 /* Yield nonzero if FILENAME is absolute (i.e. not relative). */
4659 absolute_filename (filename
)
4662 #if defined (__MSDOS__) || (defined (_WIN32) && !defined (__CYGWIN32__))
4663 if (isalpha (filename
[0]) && filename
[1] == ':') filename
+= 2;
4665 #if defined (__CYGWIN32__)
4666 /* At present, any path that begins with a drive spec is absolute. */
4667 if (isalpha (filename
[0]) && filename
[1] == ':') return 1;
4669 if (filename
[0] == '/') return 1;
4670 #ifdef DIR_SEPARATOR
4671 if (filename
[0] == DIR_SEPARATOR
) return 1;
4676 /* Remove unnecessary characters from FILENAME in place,
4677 to avoid unnecessary filename aliasing.
4678 Return the length of the resulting string.
4680 Do only the simplifications allowed by Posix.
4681 It is OK to miss simplifications on non-Posix hosts,
4682 since this merely leads to suboptimial results. */
4685 simplify_filename (filename
)
4688 register char *from
= filename
;
4689 register char *to
= filename
;
4692 /* Remove redundant initial /s. */
4695 if (*++from
== '/') {
4696 if (*++from
== '/') {
4697 /* 3 or more initial /s are equivalent to 1 /. */
4698 while (*++from
== '/')
4701 /* On some hosts // differs from /; Posix allows this. */
4702 static int slashslash_vs_slash
;
4703 if (slashslash_vs_slash
== 0) {
4705 slashslash_vs_slash
= ((stat ("/", &s1
) == 0 && stat ("//", &s2
) == 0
4706 && INO_T_EQ (s1
.st_ino
, s2
.st_ino
)
4707 && s1
.st_dev
== s2
.st_dev
)
4710 if (slashslash_vs_slash
< 0)
4718 if (from
[0] == '.' && from
[1] == '/')
4721 /* Copy this component and trailing /, if any. */
4722 while ((*to
++ = *from
++) != '/') {
4724 /* Trim . component at end of nonempty name. */
4725 to
-= filename
<= to
- 3 && to
[-3] == '/' && to
[-2] == '.';
4727 /* Trim unnecessary trailing /s. */
4728 while (to0
< --to
&& to
[-1] == '/')
4732 return to
- filename
;
4737 /* Skip /s after a /. */
4738 while (*from
== '/')
4743 /* The file_name_map structure holds a mapping of file names for a
4744 particular directory. This mapping is read from the file named
4745 FILE_NAME_MAP_FILE in that directory. Such a file can be used to
4746 map filenames on a file system with severe filename restrictions,
4747 such as DOS. The format of the file name map file is just a series
4748 of lines with two tokens on each line. The first token is the name
4749 to map, and the second token is the actual name to use. */
4751 struct file_name_map
4753 struct file_name_map
*map_next
;
4758 #define FILE_NAME_MAP_FILE "header.gcc"
4760 /* Read a space delimited string of unlimited length from a stdio
4764 read_filename_string (ch
, f
)
4772 set
= alloc
= xmalloc (len
+ 1);
4776 while ((ch
= getc (f
)) != EOF
&& ! is_space
[ch
])
4778 if (set
- alloc
== len
)
4781 alloc
= xrealloc (alloc
, len
+ 1);
4782 set
= alloc
+ len
/ 2;
4792 /* Read the file name map file for DIRNAME.
4793 If DIRNAME is empty, read the map file for the working directory;
4794 otherwise DIRNAME must end in '/'. */
4796 static struct file_name_map
*
4797 read_name_map (dirname
)
4800 /* This structure holds a linked list of file name maps, one per
4802 struct file_name_map_list
4804 struct file_name_map_list
*map_list_next
;
4805 char *map_list_name
;
4806 struct file_name_map
*map_list_map
;
4808 static struct file_name_map_list
*map_list
;
4809 register struct file_name_map_list
*map_list_ptr
;
4814 for (map_list_ptr
= map_list
; map_list_ptr
;
4815 map_list_ptr
= map_list_ptr
->map_list_next
)
4816 if (! strcmp (map_list_ptr
->map_list_name
, dirname
))
4817 return map_list_ptr
->map_list_map
;
4819 map_list_ptr
= ((struct file_name_map_list
*)
4820 xmalloc (sizeof (struct file_name_map_list
)));
4821 map_list_ptr
->map_list_name
= savestring (dirname
);
4822 map_list_ptr
->map_list_map
= NULL
;
4824 dirlen
= strlen (dirname
);
4825 name
= (char *) alloca (dirlen
+ strlen (FILE_NAME_MAP_FILE
) + 1);
4826 strcpy (name
, dirname
);
4827 strcat (name
, FILE_NAME_MAP_FILE
);
4828 f
= fopen (name
, "r");
4830 map_list_ptr
->map_list_map
= NULL
;
4835 while ((ch
= getc (f
)) != EOF
)
4838 struct file_name_map
*ptr
;
4843 from
= read_filename_string (ch
, f
);
4844 while ((ch
= getc (f
)) != EOF
&& is_hor_space
[ch
])
4846 to
= read_filename_string (ch
, f
);
4848 simplify_filename (from
);
4849 tolen
= simplify_filename (to
);
4851 ptr
= ((struct file_name_map
*)
4852 xmalloc (sizeof (struct file_name_map
)));
4853 ptr
->map_from
= from
;
4855 /* Make the real filename absolute. */
4856 if (absolute_filename (to
))
4860 ptr
->map_to
= xmalloc (dirlen
+ tolen
+ 1);
4861 strcpy (ptr
->map_to
, dirname
);
4862 strcat (ptr
->map_to
, to
);
4866 ptr
->map_next
= map_list_ptr
->map_list_map
;
4867 map_list_ptr
->map_list_map
= ptr
;
4869 while ((ch
= getc (f
)) != '\n')
4876 map_list_ptr
->map_list_next
= map_list
;
4877 map_list
= map_list_ptr
;
4879 return map_list_ptr
->map_list_map
;
4882 /* Try to open include file FILENAME. SEARCHPTR is the directory
4883 being tried from the include file search path.
4884 IMPORTING is "" if we are importing, null otherwise.
4885 Return -2 if found, either a matching name or a matching inode.
4886 Otherwise, open the file and return a file descriptor if successful
4887 or -1 if unsuccessful.
4888 Unless unsuccessful, put a descriptor of the included file into *PINC.
4889 This function maps filenames on file systems based on information read by
4893 open_include_file (filename
, searchptr
, importing
, pinc
)
4895 struct file_name_list
*searchptr
;
4897 struct include_file
**pinc
;
4899 char *fname
= remap_include_file (filename
, searchptr
);
4902 /* Look up FNAME in include_hashtab. */
4903 struct include_file
**phead
= &include_hashtab
[hashf ((U_CHAR
*) fname
,
4906 struct include_file
*inc
, *head
= *phead
;
4907 for (inc
= head
; inc
; inc
= inc
->next
)
4908 if (!strcmp (fname
, inc
->fname
))
4912 || ! inc
->control_macro
4913 || (inc
->control_macro
[0] && ! lookup (inc
->control_macro
, -1, -1))) {
4915 fd
= open (fname
, O_RDONLY
, 0);
4921 /* FNAME was not in include_hashtab; insert a new entry. */
4922 inc
= (struct include_file
*) xmalloc (sizeof (struct include_file
));
4925 inc
->control_macro
= 0;
4926 inc
->deps_output
= 0;
4927 if (fstat (fd
, &inc
->st
) != 0)
4928 pfatal_with_name (fname
);
4931 /* Look for another file with the same inode and device. */
4932 if (lookup_ino_include (inc
)
4933 && inc
->control_macro
4934 && (!inc
->control_macro
[0] || lookup (inc
->control_macro
, -1, -1))) {
4940 /* For -M, add this file to the dependencies. */
4941 if (! inc
->deps_output
&& (system_include_depth
!= 0) < print_deps
) {
4942 inc
->deps_output
= 1;
4943 deps_output (fname
, ' ');
4946 /* Handle -H option. */
4947 if (print_include_names
)
4948 fprintf (stderr
, "%*s%s\n", indepth
, "", fname
);
4952 inc
->control_macro
= importing
;
4958 /* Return the remapped name of the the include file FILENAME.
4959 SEARCHPTR is the directory being tried from the include file path. */
4962 remap_include_file (filename
, searchptr
)
4964 struct file_name_list
*searchptr
;
4966 register struct file_name_map
*map
;
4967 register char *from
;
4971 if (! searchptr
->got_name_map
)
4973 searchptr
->name_map
= read_name_map (searchptr
->fname
);
4974 searchptr
->got_name_map
= 1;
4977 /* Check the mapping for the directory we are using. */
4978 from
= filename
+ strlen (searchptr
->fname
);
4979 for (map
= searchptr
->name_map
; map
; map
= map
->map_next
)
4980 if (! strcmp (map
->map_from
, from
))
4984 from
= base_name (filename
);
4986 if (from
!= filename
|| !searchptr
)
4988 /* Try to find a mapping file for the particular directory we are
4989 looking in. Thus #include <sys/types.h> will look up sys/types.h
4990 in /usr/include/header.gcc and look up types.h in
4991 /usr/include/sys/header.gcc. */
4993 char *dir
= (char *) alloca (from
- filename
+ 1);
4994 bcopy (filename
, dir
, from
- filename
);
4995 dir
[from
- filename
] = '\0';
4997 for (map
= read_name_map (dir
); map
; map
= map
->map_next
)
4998 if (! strcmp (map
->map_from
, from
))
5005 /* Insert INC into the include file table, hashed by device and inode number.
5006 If a file with different name but same dev+ino was already in the table,
5007 return 1 and set INC's control macro to the already-known macro. */
5010 lookup_ino_include (inc
)
5011 struct include_file
*inc
;
5013 int hash
= ((unsigned) (inc
->st
.st_dev
+ INO_T_HASH (inc
->st
.st_ino
))
5014 % INCLUDE_HASHSIZE
);
5015 struct include_file
*i
= include_ino_hashtab
[hash
];
5017 include_ino_hashtab
[hash
] = inc
;
5019 for (; i
; i
= i
->next_ino
)
5020 if (INO_T_EQ (inc
->st
.st_ino
, i
->st
.st_ino
)
5021 && inc
->st
.st_dev
== i
->st
.st_dev
) {
5022 inc
->control_macro
= i
->control_macro
;
5029 /* Process file descriptor F, which corresponds to include file INC,
5031 SYSTEM_HEADER_P is 1 if this file resides in any one of the known
5032 "system" include directories (as decided by the `is_system_include'
5034 DIRPTR is the link in the dir path through which this file was found,
5035 or 0 if the file name was absolute. */
5038 finclude (f
, inc
, op
, system_header_p
, dirptr
)
5040 struct include_file
*inc
;
5042 int system_header_p
;
5043 struct file_name_list
*dirptr
;
5045 char *fname
= inc
->fname
;
5047 FILE_BUF
*fp
; /* For input stack frame */
5048 int missing_newline
= 0;
5050 CHECK_DEPTH (return;);
5052 fp
= &instack
[indepth
+ 1];
5053 bzero ((char *) fp
, sizeof (FILE_BUF
));
5054 fp
->nominal_fname
= fp
->fname
= fname
;
5058 fp
->if_stack
= if_stack
;
5059 fp
->system_header_p
= system_header_p
;
5062 if (S_ISREG (inc
->st
.st_mode
)) {
5063 fp
->buf
= (U_CHAR
*) xmalloc (inc
->st
.st_size
+ 2);
5066 /* Read the file contents, knowing that inc->st.st_size is an upper bound
5067 on the number of bytes we can read. */
5068 fp
->length
= safe_read (f
, (char *) fp
->buf
, inc
->st
.st_size
);
5069 if (fp
->length
< 0) goto nope
;
5071 else if (S_ISDIR (inc
->st
.st_mode
)) {
5072 error ("directory `%s' specified in #include", fname
);
5076 /* Cannot count its file size before reading.
5077 First read the entire file into heap and
5078 copy them into buffer on stack. */
5083 fp
->buf
= (U_CHAR
*) xmalloc (bsize
+ 2);
5086 i
= safe_read (f
, (char *) fp
->buf
+ st_size
, bsize
- st_size
);
5088 goto nope
; /* error! */
5090 if (st_size
!= bsize
)
5091 break; /* End of file */
5093 fp
->buf
= (U_CHAR
*) xrealloc (fp
->buf
, bsize
+ 2);
5096 fp
->length
= st_size
;
5099 if ((fp
->length
> 0 && fp
->buf
[fp
->length
- 1] != '\n')
5100 /* Backslash-newline at end is not good enough. */
5101 || (fp
->length
> 1 && fp
->buf
[fp
->length
- 2] == '\\')) {
5102 fp
->buf
[fp
->length
++] = '\n';
5103 missing_newline
= 1;
5105 fp
->buf
[fp
->length
] = '\0';
5107 /* Close descriptor now, so nesting does not use lots of descriptors. */
5110 /* Must do this before calling trigraph_pcp, so that the correct file name
5111 will be printed in warning messages. */
5114 input_file_stack_tick
++;
5119 output_line_directive (fp
, op
, 0, enter_file
);
5122 if (missing_newline
)
5125 if (pedantic
&& missing_newline
)
5126 pedwarn ("file does not end in newline");
5129 input_file_stack_tick
++;
5130 output_line_directive (&instack
[indepth
], op
, 0, leave_file
);
5136 perror_with_name (fname
);
5141 /* Record that inclusion of the include file INC
5142 should be controlled by the macro named MACRO_NAME.
5143 This means that trying to include the file again
5144 will do something if that macro is defined. */
5147 record_control_macro (inc
, macro_name
)
5148 struct include_file
*inc
;
5151 if (!inc
->control_macro
|| inc
->control_macro
[0])
5152 inc
->control_macro
= macro_name
;
5155 /* Load the specified precompiled header into core, and verify its
5156 preconditions. PCF indicates the file descriptor to read, which must
5157 be a regular file. *ST is its file status.
5158 FNAME indicates the file name of the original header.
5159 *LIMIT will be set to an address one past the end of the file.
5160 If the preconditions of the file are not satisfied, the buffer is
5161 freed and we return 0. If the preconditions are satisfied, return
5162 the address of the buffer following the preconditions. The buffer, in
5163 this case, should never be freed because various pieces of it will
5164 be referred to until all precompiled strings are output at the end of
5168 check_precompiled (pcf
, st
, fname
, limit
)
5181 if (S_ISREG (st
->st_mode
))
5183 buf
= xmalloc (st
->st_size
+ 2);
5184 length
= safe_read (pcf
, buf
, st
->st_size
);
5191 if (length
> 0 && buf
[length
-1] != '\n')
5192 buf
[length
++] = '\n';
5195 *limit
= buf
+ length
;
5197 /* File is in core. Check the preconditions. */
5198 if (!check_preconditions (buf
))
5200 for (cp
= buf
; *cp
; cp
++)
5203 fprintf (stderr
, "Using preinclude %s\n", fname
);
5209 fprintf (stderr
, "Cannot use preinclude %s\n", fname
);
5215 /* PREC (null terminated) points to the preconditions of a
5216 precompiled header. These are a series of #define and #undef
5217 lines which must match the current contents of the hash
5221 check_preconditions (prec
)
5228 lineend
= index (prec
, '\n');
5230 if (*prec
++ != '#') {
5231 error ("Bad format encountered while reading precompiled file");
5234 if (!strncmp (prec
, "define", 6)) {
5238 mdef
= create_definition ((U_CHAR
*) prec
, (U_CHAR
*) lineend
, NULL_PTR
);
5243 if ((hp
= lookup (mdef
.symnam
, mdef
.symlen
, -1)) == NULL
5244 || (hp
->type
!= T_MACRO
&& hp
->type
!= T_CONST
)
5245 || (hp
->type
== T_MACRO
5246 && !compare_defs (mdef
.defn
, hp
->value
.defn
)
5247 && (mdef
.defn
->length
!= 2
5248 || mdef
.defn
->expansion
[0] != '\n'
5249 || mdef
.defn
->expansion
[1] != ' ')))
5251 } else if (!strncmp (prec
, "undef", 5)) {
5256 while (is_hor_space
[(U_CHAR
) *prec
])
5259 while (is_idchar
[(U_CHAR
) *prec
])
5263 if (lookup ((U_CHAR
*) name
, len
, -1))
5266 error ("Bad format encountered while reading precompiled file");
5271 /* They all passed successfully */
5275 /* Process the main body of a precompiled file. BUF points to the
5276 string section of the file, following the preconditions. LIMIT is one
5277 character past the end. NAME is the name of the file being read
5278 in. OP is the main output buffer. */
5281 pcfinclude (buf
, limit
, name
, op
)
5282 U_CHAR
*buf
, *limit
, *name
;
5289 /* First in the file comes 4 bytes indicating the number of strings, */
5290 /* in network byte order. (MSB first). */
5292 nstrings
= (nstrings
<< 8) | *cp
++;
5293 nstrings
= (nstrings
<< 8) | *cp
++;
5294 nstrings
= (nstrings
<< 8) | *cp
++;
5296 /* Looping over each string... */
5297 while (nstrings
--) {
5298 U_CHAR
*string_start
;
5299 U_CHAR
*endofthiskey
;
5303 /* Each string starts with a STRINGDEF structure (str), followed */
5304 /* by the text of the string (string_start) */
5306 /* First skip to a longword boundary */
5307 /* ??? Why a 4-byte boundary? On all machines? */
5308 /* NOTE: This works correctly even if HOST_WIDE_INT
5309 is narrower than a pointer.
5310 Do not try risky measures here to get another type to use!
5311 Do not include stddef.h--it will fail! */
5312 if ((HOST_WIDE_INT
) cp
& 3)
5313 cp
+= 4 - ((HOST_WIDE_INT
) cp
& 3);
5315 /* Now get the string. */
5316 str
= (STRINGDEF
*) (GENERIC_PTR
) cp
;
5317 string_start
= cp
+= sizeof (STRINGDEF
);
5319 for (; *cp
; cp
++) /* skip the string */
5322 /* We need to macro expand the string here to ensure that the
5323 proper definition environment is in place. If it were only
5324 expanded when we find out it is needed, macros necessary for
5325 its proper expansion might have had their definitions changed. */
5326 tmpbuf
= expand_to_temp_buffer (string_start
, cp
++, 0, 0);
5327 /* Lineno is already set in the precompiled file */
5328 str
->contents
= tmpbuf
.buf
;
5329 str
->len
= tmpbuf
.length
;
5331 str
->filename
= name
;
5332 str
->output_mark
= outbuf
.bufp
- outbuf
.buf
;
5335 *stringlist_tailp
= str
;
5336 stringlist_tailp
= &str
->chain
;
5338 /* Next comes a fourbyte number indicating the number of keys
5341 nkeys
= (nkeys
<< 8) | *cp
++;
5342 nkeys
= (nkeys
<< 8) | *cp
++;
5343 nkeys
= (nkeys
<< 8) | *cp
++;
5345 /* If this number is -1, then the string is mandatory. */
5349 /* Otherwise, for each key, */
5350 for (; nkeys
--; free (tmpbuf
.buf
), cp
= endofthiskey
+ 1) {
5351 KEYDEF
*kp
= (KEYDEF
*) (GENERIC_PTR
) cp
;
5354 /* It starts with a KEYDEF structure */
5355 cp
+= sizeof (KEYDEF
);
5357 /* Find the end of the key. At the end of this for loop we
5358 advance CP to the start of the next key using this variable. */
5359 endofthiskey
= cp
+ strlen ((char *) cp
);
5362 /* Expand the key, and enter it into the hash table. */
5363 tmpbuf
= expand_to_temp_buffer (cp
, endofthiskey
, 0, 0);
5364 tmpbuf
.bufp
= tmpbuf
.buf
;
5366 while (is_hor_space
[*tmpbuf
.bufp
])
5368 if (!is_idstart
[*tmpbuf
.bufp
]
5369 || tmpbuf
.bufp
== tmpbuf
.buf
+ tmpbuf
.length
) {
5374 hp
= lookup (tmpbuf
.bufp
, -1, -1);
5377 install (tmpbuf
.bufp
, -1, T_PCSTRING
, (char *) kp
, -1);
5379 else if (hp
->type
== T_PCSTRING
) {
5380 kp
->chain
= hp
->value
.keydef
;
5381 hp
->value
.keydef
= kp
;
5387 /* This output_line_directive serves to switch us back to the current
5388 input file in case some of these strings get output (which will
5389 result in line directives for the header file being output). */
5390 output_line_directive (&instack
[indepth
], op
, 0, enter_file
);
5393 /* Called from rescan when it hits a key for strings. Mark them all
5394 used and clean up. */
5402 for (kp
= hp
->value
.keydef
; kp
; kp
= kp
->chain
)
5403 kp
->str
->writeflag
= 1;
5407 /* Write the output, interspersing precompiled strings in their
5408 appropriate places. */
5413 STRINGDEF
*next_string
;
5414 U_CHAR
*cur_buf_loc
;
5415 int line_directive_len
= 80;
5416 char *line_directive
= xmalloc (line_directive_len
);
5419 /* In each run through the loop, either cur_buf_loc ==
5420 next_string_loc, in which case we print a series of strings, or
5421 it is less than next_string_loc, in which case we write some of
5423 cur_buf_loc
= outbuf
.buf
;
5424 next_string
= stringlist
;
5426 while (cur_buf_loc
< outbuf
.bufp
|| next_string
) {
5428 && cur_buf_loc
- outbuf
.buf
== next_string
->output_mark
) {
5429 if (next_string
->writeflag
) {
5430 len
= 4 * strlen ((char *) next_string
->filename
) + 32;
5431 while (len
> line_directive_len
)
5432 line_directive
= xrealloc (line_directive
,
5433 line_directive_len
*= 2);
5434 sprintf (line_directive
, "\n# %d ", next_string
->lineno
);
5435 strcpy (quote_string (line_directive
+ strlen (line_directive
),
5436 (char *) next_string
->filename
),
5438 safe_write (fileno (stdout
), line_directive
, strlen (line_directive
));
5439 safe_write (fileno (stdout
),
5440 (char *) next_string
->contents
, next_string
->len
);
5442 next_string
= next_string
->chain
;
5446 ? (next_string
->output_mark
5447 - (cur_buf_loc
- outbuf
.buf
))
5448 : outbuf
.bufp
- cur_buf_loc
);
5450 safe_write (fileno (stdout
), (char *) cur_buf_loc
, len
);
5454 free (line_directive
);
5457 /* Pass a directive through to the output file.
5458 BUF points to the contents of the directive, as a contiguous string.
5459 LIMIT points to the first character past the end of the directive.
5460 KEYWORD is the keyword-table entry for the directive. */
5463 pass_thru_directive (buf
, limit
, op
, keyword
)
5464 U_CHAR
*buf
, *limit
;
5466 struct directive
*keyword
;
5468 register unsigned keyword_length
= keyword
->length
;
5470 check_expand (op
, 1 + keyword_length
+ (limit
- buf
));
5472 bcopy (keyword
->name
, (char *) op
->bufp
, keyword_length
);
5473 op
->bufp
+= keyword_length
;
5474 if (limit
!= buf
&& buf
[0] != ' ')
5476 bcopy ((char *) buf
, (char *) op
->bufp
, limit
- buf
);
5477 op
->bufp
+= (limit
- buf
);
5480 /* Count the line we have just made in the output,
5481 to get in sync properly. */
5486 /* The arglist structure is built by do_define to tell
5487 collect_definition where the argument names begin. That
5488 is, for a define like "#define f(x,y,z) foo+x-bar*y", the arglist
5489 would contain pointers to the strings x, y, and z.
5490 Collect_definition would then build a DEFINITION node,
5491 with reflist nodes pointing to the places x, y, and z had
5492 appeared. So the arglist is just convenience data passed
5493 between these two routines. It is not kept around after
5494 the current #define has been processed and entered into the
5498 struct arglist
*next
;
5505 /* Create a DEFINITION node from a #define directive. Arguments are
5506 as for do_define. */
5509 create_definition (buf
, limit
, op
)
5510 U_CHAR
*buf
, *limit
;
5513 U_CHAR
*bp
; /* temp ptr into input buffer */
5514 U_CHAR
*symname
; /* remember where symbol name starts */
5515 int sym_length
; /* and how long it is */
5516 int line
= instack
[indepth
].lineno
;
5517 char *file
= instack
[indepth
].nominal_fname
;
5521 int arglengths
= 0; /* Accumulate lengths of arg names
5522 plus number of args. */
5527 while (is_hor_space
[*bp
])
5530 symname
= bp
; /* remember where it starts */
5531 sym_length
= check_macro_name (bp
, "macro");
5534 /* Lossage will occur if identifiers or control keywords are broken
5535 across lines using backslash. This is not the right place to take
5539 struct arglist
*arg_ptrs
= NULL
;
5542 bp
++; /* skip '(' */
5543 SKIP_WHITE_SPACE (bp
);
5545 /* Loop over macro argument names. */
5546 while (*bp
!= ')') {
5547 struct arglist
*temp
;
5549 temp
= (struct arglist
*) alloca (sizeof (struct arglist
));
5551 temp
->next
= arg_ptrs
;
5552 temp
->argno
= argno
++;
5553 temp
->rest_args
= 0;
5557 pedwarn ("another parameter follows `%s'",
5560 if (!is_idstart
[*bp
])
5561 pedwarn ("invalid character in macro parameter name");
5563 /* Find the end of the arg name. */
5564 while (is_idchar
[*bp
]) {
5566 /* do we have a "special" rest-args extension here? */
5567 if (limit
- bp
> REST_EXTENSION_LENGTH
5568 && bcmp (rest_extension
, bp
, REST_EXTENSION_LENGTH
) == 0) {
5570 temp
->rest_args
= 1;
5574 temp
->length
= bp
- temp
->name
;
5576 bp
+= REST_EXTENSION_LENGTH
;
5577 arglengths
+= temp
->length
+ 2;
5578 SKIP_WHITE_SPACE (bp
);
5579 if (temp
->length
== 0 || (*bp
!= ',' && *bp
!= ')')) {
5580 error ("badly punctuated parameter list in `#define'");
5585 SKIP_WHITE_SPACE (bp
);
5586 /* A comma at this point can only be followed by an identifier. */
5587 if (!is_idstart
[*bp
]) {
5588 error ("badly punctuated parameter list in `#define'");
5593 error ("unterminated parameter list in `#define'");
5597 struct arglist
*otemp
;
5599 for (otemp
= temp
->next
; otemp
!= NULL
; otemp
= otemp
->next
)
5600 if (temp
->length
== otemp
->length
5601 && bcmp (temp
->name
, otemp
->name
, temp
->length
) == 0) {
5602 error ("duplicate argument name `%.*s' in `#define'",
5603 temp
->length
, temp
->name
);
5609 ++bp
; /* skip paren */
5610 SKIP_WHITE_SPACE (bp
);
5611 /* now everything from bp before limit is the definition. */
5612 defn
= collect_expansion (bp
, limit
, argno
, arg_ptrs
);
5613 defn
->rest_args
= rest_args
;
5615 /* Now set defn->args.argnames to the result of concatenating
5616 the argument names in reverse order
5617 with comma-space between them. */
5618 defn
->args
.argnames
= (U_CHAR
*) xmalloc (arglengths
+ 1);
5620 struct arglist
*temp
;
5622 for (temp
= arg_ptrs
; temp
; temp
= temp
->next
) {
5623 bcopy (temp
->name
, &defn
->args
.argnames
[i
], temp
->length
);
5625 if (temp
->next
!= 0) {
5626 defn
->args
.argnames
[i
++] = ',';
5627 defn
->args
.argnames
[i
++] = ' ';
5630 defn
->args
.argnames
[i
] = 0;
5633 /* Simple expansion or empty definition. */
5637 if (is_hor_space
[*bp
]) {
5639 SKIP_WHITE_SPACE (bp
);
5640 } else if (sym_length
) {
5642 case '!': case '"': case '#': case '%': case '&': case '\'':
5643 case ')': case '*': case '+': case ',': case '-': case '.':
5644 case '/': case ':': case ';': case '<': case '=': case '>':
5645 case '?': case '[': case '\\': case ']': case '^': case '{':
5646 case '|': case '}': case '~':
5647 warning ("missing white space after `#define %.*s'",
5648 sym_length
, symname
);
5652 pedwarn ("missing white space after `#define %.*s'",
5653 sym_length
, symname
);
5658 /* Now everything from bp before limit is the definition. */
5659 defn
= collect_expansion (bp
, limit
, -1, NULL_PTR
);
5660 defn
->args
.argnames
= (U_CHAR
*) "";
5666 /* OP is null if this is a predefinition */
5667 defn
->predefined
= !op
;
5669 mdef
.symnam
= symname
;
5670 mdef
.symlen
= sym_length
;
5679 /* Process a #define directive.
5680 BUF points to the contents of the #define directive, as a contiguous string.
5681 LIMIT points to the first character past the end of the definition.
5682 KEYWORD is the keyword-table entry for #define. */
5685 do_define (buf
, limit
, op
, keyword
)
5686 U_CHAR
*buf
, *limit
;
5688 struct directive
*keyword
;
5693 /* If this is a precompiler run (with -pcp) pass thru #define directives. */
5694 if (pcp_outfile
&& op
)
5695 pass_thru_directive (buf
, limit
, op
, keyword
);
5697 mdef
= create_definition (buf
, limit
, op
);
5701 hashcode
= hashf (mdef
.symnam
, mdef
.symlen
, HASHSIZE
);
5705 if ((hp
= lookup (mdef
.symnam
, mdef
.symlen
, hashcode
)) != NULL
) {
5707 /* Redefining a precompiled key is ok. */
5708 if (hp
->type
== T_PCSTRING
)
5710 /* Redefining a macro is ok if the definitions are the same. */
5711 else if (hp
->type
== T_MACRO
)
5712 ok
= ! compare_defs (mdef
.defn
, hp
->value
.defn
);
5713 /* Redefining a constant is ok with -D. */
5714 else if (hp
->type
== T_CONST
)
5715 ok
= ! done_initializing
;
5716 /* Print the warning if it's not ok. */
5718 /* If we are passing through #define and #undef directives, do
5719 that for this re-definition now. */
5720 if (debug_output
&& op
)
5721 pass_thru_directive (buf
, limit
, op
, keyword
);
5723 pedwarn ("`%.*s' redefined", mdef
.symlen
, mdef
.symnam
);
5724 if (hp
->type
== T_MACRO
)
5725 pedwarn_with_file_and_line (hp
->value
.defn
->file
, hp
->value
.defn
->line
,
5726 "this is the location of the previous definition");
5728 /* Replace the old definition. */
5730 hp
->value
.defn
= mdef
.defn
;
5732 /* If we are passing through #define and #undef directives, do
5733 that for this new definition now. */
5734 if (debug_output
&& op
)
5735 pass_thru_directive (buf
, limit
, op
, keyword
);
5736 install (mdef
.symnam
, mdef
.symlen
, T_MACRO
,
5737 (char *) mdef
.defn
, hashcode
);
5748 /* Check a purported macro name SYMNAME, and yield its length.
5749 USAGE is the kind of name this is intended for. */
5752 check_macro_name (symname
, usage
)
5759 for (p
= symname
; is_idchar
[*p
]; p
++)
5761 sym_length
= p
- symname
;
5763 || (sym_length
== 1 && *symname
== 'L' && (*p
== '\'' || *p
== '"')))
5764 error ("invalid %s name", usage
);
5765 else if (!is_idstart
[*symname
]
5766 || (sym_length
== 7 && ! bcmp (symname
, "defined", 7)))
5767 error ("invalid %s name `%.*s'", usage
, sym_length
, symname
);
5771 /* Return zero if two DEFINITIONs are isomorphic. */
5774 compare_defs (d1
, d2
)
5775 DEFINITION
*d1
, *d2
;
5777 register struct reflist
*a1
, *a2
;
5778 register U_CHAR
*p1
= d1
->expansion
;
5779 register U_CHAR
*p2
= d2
->expansion
;
5782 if (d1
->nargs
!= d2
->nargs
)
5784 if (strcmp ((char *)d1
->args
.argnames
, (char *)d2
->args
.argnames
))
5786 for (a1
= d1
->pattern
, a2
= d2
->pattern
; a1
&& a2
;
5787 a1
= a1
->next
, a2
= a2
->next
) {
5788 if (!((a1
->nchars
== a2
->nchars
&& ! bcmp (p1
, p2
, a1
->nchars
))
5789 || ! comp_def_part (first
, p1
, a1
->nchars
, p2
, a2
->nchars
, 0))
5790 || a1
->argno
!= a2
->argno
5791 || a1
->stringify
!= a2
->stringify
5792 || a1
->raw_before
!= a2
->raw_before
5793 || a1
->raw_after
!= a2
->raw_after
)
5801 if (comp_def_part (first
, p1
, d1
->length
- (p1
- d1
->expansion
),
5802 p2
, d2
->length
- (p2
- d2
->expansion
), 1))
5807 /* Return 1 if two parts of two macro definitions are effectively different.
5808 One of the parts starts at BEG1 and has LEN1 chars;
5809 the other has LEN2 chars at BEG2.
5810 Any sequence of whitespace matches any other sequence of whitespace.
5811 FIRST means these parts are the first of a macro definition;
5812 so ignore leading whitespace entirely.
5813 LAST means these parts are the last of a macro definition;
5814 so ignore trailing whitespace entirely. */
5817 comp_def_part (first
, beg1
, len1
, beg2
, len2
, last
)
5819 U_CHAR
*beg1
, *beg2
;
5823 register U_CHAR
*end1
= beg1
+ len1
;
5824 register U_CHAR
*end2
= beg2
+ len2
;
5826 while (beg1
!= end1
&& is_space
[*beg1
]) beg1
++;
5827 while (beg2
!= end2
&& is_space
[*beg2
]) beg2
++;
5830 while (beg1
!= end1
&& is_space
[end1
[-1]]) end1
--;
5831 while (beg2
!= end2
&& is_space
[end2
[-1]]) end2
--;
5833 while (beg1
!= end1
&& beg2
!= end2
) {
5834 if (is_space
[*beg1
] && is_space
[*beg2
]) {
5835 while (beg1
!= end1
&& is_space
[*beg1
]) beg1
++;
5836 while (beg2
!= end2
&& is_space
[*beg2
]) beg2
++;
5837 } else if (*beg1
== *beg2
) {
5841 return (beg1
!= end1
) || (beg2
!= end2
);
5844 /* Read a replacement list for a macro with parameters.
5845 Build the DEFINITION structure.
5846 Reads characters of text starting at BUF until END.
5847 ARGLIST specifies the formal parameters to look for
5848 in the text of the definition; NARGS is the number of args
5849 in that list, or -1 for a macro name that wants no argument list.
5850 MACRONAME is the macro name itself (so we can avoid recursive expansion)
5851 and NAMELEN is its length in characters.
5853 Note that comments, backslash-newlines, and leading white space
5854 have already been deleted from the argument. */
5856 /* If there is no trailing whitespace, a Newline Space is added at the end
5857 to prevent concatenation that would be contrary to the standard. */
5860 collect_expansion (buf
, end
, nargs
, arglist
)
5863 struct arglist
*arglist
;
5866 register U_CHAR
*p
, *limit
, *lastp
, *exp_p
;
5867 struct reflist
*endpat
= NULL
;
5868 /* Pointer to first nonspace after last ## seen. */
5870 /* Pointer to first nonspace after last single-# seen. */
5871 U_CHAR
*stringify
= 0;
5872 /* How those tokens were spelled. */
5873 enum sharp_token_type concat_sharp_token_type
= NO_SHARP_TOKEN
;
5874 enum sharp_token_type stringify_sharp_token_type
= NO_SHARP_TOKEN
;
5876 int expected_delimiter
= '\0';
5878 /* Scan thru the replacement list, ignoring comments and quoted
5879 strings, picking up on the macro calls. It does a linear search
5880 thru the arg list on every potential symbol. Profiling might say
5881 that something smarter should happen. */
5886 /* Find the beginning of the trailing whitespace. */
5889 while (p
< limit
&& is_space
[limit
[-1]]) limit
--;
5891 /* Allocate space for the text in the macro definition.
5892 Each input char may or may not need 1 byte,
5893 so this is an upper bound.
5894 The extra 3 are for invented trailing newline-marker and final null. */
5895 maxsize
= (sizeof (DEFINITION
)
5897 defn
= (DEFINITION
*) xcalloc (1, maxsize
);
5899 defn
->nargs
= nargs
;
5900 exp_p
= defn
->expansion
= (U_CHAR
*) defn
+ sizeof (DEFINITION
);
5905 : p
[0] == '%' && p
[1] == ':' && p
[2] == '%' && p
[3] == ':') {
5906 error ("`##' at start of macro definition");
5907 p
+= p
[0] == '#' ? 2 : 4;
5910 /* Process the main body of the definition. */
5912 int skipped_arg
= 0;
5913 register U_CHAR c
= *p
++;
5921 if (expected_delimiter
!= '\0') {
5922 if (c
== expected_delimiter
)
5923 expected_delimiter
= '\0';
5925 expected_delimiter
= c
;
5929 if (p
< limit
&& expected_delimiter
) {
5930 /* In a string, backslash goes through
5931 and makes next char ordinary. */
5937 if (!expected_delimiter
&& *p
== ':') {
5938 /* %: is not a digraph if preceded by an odd number of '<'s. */
5940 while (buf
< p0
&& p0
[-1] == '<')
5943 /* Treat %:%: as ## and %: as #. */
5944 if (p
[1] == '%' && p
[2] == ':') {
5946 goto sharp_sharp_token
;
5957 /* # is ordinary inside a string. */
5958 if (expected_delimiter
)
5962 /* ##: concatenate preceding and following tokens. */
5963 /* Take out the first #, discard preceding whitespace. */
5965 while (exp_p
> lastp
&& is_hor_space
[exp_p
[-1]])
5967 /* Skip the second #. */
5969 concat_sharp_token_type
= c
;
5970 if (is_hor_space
[*p
]) {
5971 concat_sharp_token_type
= c
+ 1;
5973 SKIP_WHITE_SPACE (p
);
5977 error ("`##' at end of macro definition");
5978 } else if (nargs
>= 0) {
5979 /* Single #: stringify following argument ref.
5980 Don't leave the # in the expansion. */
5983 stringify_sharp_token_type
= c
;
5984 if (is_hor_space
[*p
]) {
5985 stringify_sharp_token_type
= c
+ 1;
5987 SKIP_WHITE_SPACE (p
);
5989 if (! is_idstart
[*p
] || nargs
== 0
5990 || (*p
== 'L' && (p
[1] == '\'' || p
[1] == '"')))
5991 error ("`#' operator is not followed by a macro argument name");
5998 /* In -traditional mode, recognize arguments inside strings and
5999 and character constants, and ignore special properties of #.
6000 Arguments inside strings are considered "stringified", but no
6001 extra quote marks are supplied. */
6005 if (expected_delimiter
!= '\0') {
6006 if (c
== expected_delimiter
)
6007 expected_delimiter
= '\0';
6009 expected_delimiter
= c
;
6013 /* Backslash quotes delimiters and itself, but not macro args. */
6014 if (expected_delimiter
!= 0 && p
< limit
6015 && (*p
== expected_delimiter
|| *p
== '\\')) {
6022 if (expected_delimiter
!= '\0') /* No comments inside strings. */
6025 /* If we find a comment that wasn't removed by handle_directive,
6026 this must be -traditional. So replace the comment with
6029 while (++p
< limit
) {
6030 if (p
[0] == '*' && p
[1] == '/') {
6036 /* Mark this as a concatenation-point, as if it had been ##. */
6044 /* Handle the start of a symbol. */
6045 if (is_idchar
[c
] && nargs
> 0) {
6046 U_CHAR
*id_beg
= p
- 1;
6050 while (p
!= limit
&& is_idchar
[*p
]) p
++;
6051 id_len
= p
- id_beg
;
6054 && ! (id_len
== 1 && c
== 'L' && (*p
== '\'' || *p
== '"'))) {
6055 register struct arglist
*arg
;
6057 for (arg
= arglist
; arg
!= NULL
; arg
= arg
->next
) {
6058 struct reflist
*tpat
;
6060 if (arg
->name
[0] == c
6061 && arg
->length
== id_len
6062 && bcmp (arg
->name
, id_beg
, id_len
) == 0) {
6063 enum sharp_token_type tpat_stringify
;
6064 if (expected_delimiter
) {
6065 if (warn_stringify
) {
6067 warning ("macro argument `%.*s' is stringified.",
6070 warning ("macro arg `%.*s' would be stringified with -traditional.",
6074 /* If ANSI, don't actually substitute inside a string. */
6077 tpat_stringify
= SHARP_TOKEN
;
6080 = (stringify
== id_beg
6081 ? stringify_sharp_token_type
: NO_SHARP_TOKEN
);
6083 /* make a pat node for this arg and append it to the end of
6085 tpat
= (struct reflist
*) xmalloc (sizeof (struct reflist
));
6088 = concat
== id_beg
? concat_sharp_token_type
: NO_SHARP_TOKEN
;
6089 tpat
->raw_after
= NO_SHARP_TOKEN
;
6090 tpat
->rest_args
= arg
->rest_args
;
6091 tpat
->stringify
= tpat_stringify
;
6094 defn
->pattern
= tpat
;
6096 endpat
->next
= tpat
;
6099 tpat
->argno
= arg
->argno
;
6100 tpat
->nchars
= exp_p
- lastp
;
6102 register U_CHAR
*p1
= p
;
6103 SKIP_WHITE_SPACE (p1
);
6106 : p1
[0]=='%' && p1
[1]==':' && p1
[2]=='%' && p1
[3]==':')
6107 tpat
->raw_after
= p1
[0] + (p
!= p1
);
6109 lastp
= exp_p
; /* place to start copying from next time */
6116 /* If this was not a macro arg, copy it into the expansion. */
6117 if (! skipped_arg
) {
6118 register U_CHAR
*lim1
= p
;
6122 if (stringify
== id_beg
)
6123 error ("`#' operator should be followed by a macro argument name");
6128 if (!traditional
&& expected_delimiter
== 0) {
6129 /* If ANSI, put in a newline-space marker to prevent token pasting.
6130 But not if "inside a string" (which in ANSI mode happens only for
6138 defn
->length
= exp_p
- defn
->expansion
;
6140 /* Crash now if we overrun the allocated size. */
6141 if (defn
->length
+ 1 > maxsize
)
6145 /* This isn't worth the time it takes. */
6146 /* give back excess storage */
6147 defn
->expansion
= (U_CHAR
*) xrealloc (defn
->expansion
, defn
->length
+ 1);
6154 do_assert (buf
, limit
, op
, keyword
)
6155 U_CHAR
*buf
, *limit
;
6157 struct directive
*keyword
;
6159 U_CHAR
*bp
; /* temp ptr into input buffer */
6160 U_CHAR
*symname
; /* remember where symbol name starts */
6161 int sym_length
; /* and how long it is */
6162 struct arglist
*tokens
= NULL
;
6164 if (pedantic
&& done_initializing
&& !instack
[indepth
].system_header_p
)
6165 pedwarn ("ANSI C does not allow `#assert'");
6169 while (is_hor_space
[*bp
])
6172 symname
= bp
; /* remember where it starts */
6173 sym_length
= check_macro_name (bp
, "assertion");
6175 /* #define doesn't do this, but we should. */
6176 SKIP_WHITE_SPACE (bp
);
6178 /* Lossage will occur if identifiers or control tokens are broken
6179 across lines using backslash. This is not the right place to take
6183 error ("missing token-sequence in `#assert'");
6190 bp
++; /* skip '(' */
6191 SKIP_WHITE_SPACE (bp
);
6193 tokens
= read_token_list (&bp
, limit
, &error_flag
);
6197 error ("empty token-sequence in `#assert'");
6201 ++bp
; /* skip paren */
6202 SKIP_WHITE_SPACE (bp
);
6205 /* If this name isn't already an assertion name, make it one.
6206 Error if it was already in use in some other way. */
6209 ASSERTION_HASHNODE
*hp
;
6210 int hashcode
= hashf (symname
, sym_length
, ASSERTION_HASHSIZE
);
6211 struct tokenlist_list
*value
6212 = (struct tokenlist_list
*) xmalloc (sizeof (struct tokenlist_list
));
6214 hp
= assertion_lookup (symname
, sym_length
, hashcode
);
6216 if (sym_length
== 7 && ! bcmp (symname
, "defined", 7))
6217 error ("`defined' redefined as assertion");
6218 hp
= assertion_install (symname
, sym_length
, hashcode
);
6221 /* Add the spec'd token-sequence to the list of such. */
6222 value
->tokens
= tokens
;
6223 value
->next
= hp
->value
;
6231 do_unassert (buf
, limit
, op
, keyword
)
6232 U_CHAR
*buf
, *limit
;
6234 struct directive
*keyword
;
6236 U_CHAR
*bp
; /* temp ptr into input buffer */
6237 U_CHAR
*symname
; /* remember where symbol name starts */
6238 int sym_length
; /* and how long it is */
6240 struct arglist
*tokens
= NULL
;
6241 int tokens_specified
= 0;
6243 if (pedantic
&& done_initializing
&& !instack
[indepth
].system_header_p
)
6244 pedwarn ("ANSI C does not allow `#unassert'");
6248 while (is_hor_space
[*bp
])
6251 symname
= bp
; /* remember where it starts */
6252 sym_length
= check_macro_name (bp
, "assertion");
6254 /* #define doesn't do this, but we should. */
6255 SKIP_WHITE_SPACE (bp
);
6257 /* Lossage will occur if identifiers or control tokens are broken
6258 across lines using backslash. This is not the right place to take
6264 bp
++; /* skip '(' */
6265 SKIP_WHITE_SPACE (bp
);
6267 tokens
= read_token_list (&bp
, limit
, &error_flag
);
6271 error ("empty token list in `#unassert'");
6275 tokens_specified
= 1;
6277 ++bp
; /* skip paren */
6278 SKIP_WHITE_SPACE (bp
);
6282 ASSERTION_HASHNODE
*hp
;
6283 int hashcode
= hashf (symname
, sym_length
, ASSERTION_HASHSIZE
);
6284 struct tokenlist_list
*tail
, *prev
;
6286 hp
= assertion_lookup (symname
, sym_length
, hashcode
);
6290 /* If no token list was specified, then eliminate this assertion
6292 if (! tokens_specified
) {
6293 struct tokenlist_list
*next
;
6294 for (tail
= hp
->value
; tail
; tail
= next
) {
6296 free_token_list (tail
->tokens
);
6299 delete_assertion (hp
);
6301 /* If a list of tokens was given, then delete any matching list. */
6306 struct tokenlist_list
*next
= tail
->next
;
6307 if (compare_token_lists (tail
->tokens
, tokens
)) {
6311 hp
->value
= tail
->next
;
6312 free_token_list (tail
->tokens
);
6325 /* Test whether there is an assertion named NAME
6326 and optionally whether it has an asserted token list TOKENS.
6327 NAME is not null terminated; its length is SYM_LENGTH.
6328 If TOKENS_SPECIFIED is 0, then don't check for any token list. */
6331 check_assertion (name
, sym_length
, tokens_specified
, tokens
)
6334 int tokens_specified
;
6335 struct arglist
*tokens
;
6337 ASSERTION_HASHNODE
*hp
;
6338 int hashcode
= hashf (name
, sym_length
, ASSERTION_HASHSIZE
);
6340 if (pedantic
&& !instack
[indepth
].system_header_p
)
6341 pedwarn ("ANSI C does not allow testing assertions");
6343 hp
= assertion_lookup (name
, sym_length
, hashcode
);
6345 /* It is not an assertion; just return false. */
6348 /* If no token list was specified, then value is 1. */
6349 if (! tokens_specified
)
6353 struct tokenlist_list
*tail
;
6357 /* If a list of tokens was given,
6358 then succeed if the assertion records a matching list. */
6361 if (compare_token_lists (tail
->tokens
, tokens
))
6366 /* Fail if the assertion has no matching list. */
6371 /* Compare two lists of tokens for equality including order of tokens. */
6374 compare_token_lists (l1
, l2
)
6375 struct arglist
*l1
, *l2
;
6378 if (l1
->length
!= l2
->length
)
6380 if (bcmp (l1
->name
, l2
->name
, l1
->length
))
6386 /* Succeed if both lists end at the same time. */
6390 /* Read a space-separated list of tokens ending in a close parenthesis.
6391 Return a list of strings, in the order they were written.
6392 (In case of error, return 0 and store -1 in *ERROR_FLAG.)
6393 Parse the text starting at *BPP, and update *BPP.
6394 Don't parse beyond LIMIT. */
6396 static struct arglist
*
6397 read_token_list (bpp
, limit
, error_flag
)
6402 struct arglist
*token_ptrs
= 0;
6408 /* Loop over the assertion value tokens. */
6410 struct arglist
*temp
;
6414 /* Find the end of the token. */
6418 } else if (*bp
== ')') {
6423 } else if (*bp
== '"' || *bp
== '\'')
6424 bp
= skip_quoted_string (bp
, limit
, 0, NULL_PTR
, NULL_PTR
, &eofp
);
6426 while (! is_hor_space
[*bp
] && *bp
!= '(' && *bp
!= ')'
6427 && *bp
!= '"' && *bp
!= '\'' && bp
!= limit
)
6430 temp
= (struct arglist
*) xmalloc (sizeof (struct arglist
));
6431 temp
->name
= (U_CHAR
*) xmalloc (bp
- beg
+ 1);
6432 bcopy ((char *) beg
, (char *) temp
->name
, bp
- beg
);
6433 temp
->name
[bp
- beg
] = 0;
6434 temp
->next
= token_ptrs
;
6436 temp
->length
= bp
- beg
;
6438 SKIP_WHITE_SPACE (bp
);
6441 error ("unterminated token sequence in `#assert' or `#unassert'");
6448 /* We accumulated the names in reverse order.
6449 Now reverse them to get the proper order. */
6451 register struct arglist
*prev
= 0, *this, *next
;
6452 for (this = token_ptrs
; this; this = next
) {
6462 free_token_list (tokens
)
6463 struct arglist
*tokens
;
6466 struct arglist
*next
= tokens
->next
;
6467 free (tokens
->name
);
6473 /* Install a name in the assertion hash table.
6475 If LEN is >= 0, it is the length of the name.
6476 Otherwise, compute the length by scanning the entire name.
6478 If HASH is >= 0, it is the precomputed hash code.
6479 Otherwise, compute the hash code. */
6481 static ASSERTION_HASHNODE
*
6482 assertion_install (name
, len
, hash
)
6487 register ASSERTION_HASHNODE
*hp
;
6488 register int i
, bucket
;
6489 register U_CHAR
*p
, *q
;
6491 i
= sizeof (ASSERTION_HASHNODE
) + len
+ 1;
6492 hp
= (ASSERTION_HASHNODE
*) xmalloc (i
);
6494 hp
->bucket_hdr
= &assertion_hashtab
[bucket
];
6495 hp
->next
= assertion_hashtab
[bucket
];
6496 assertion_hashtab
[bucket
] = hp
;
6498 if (hp
->next
!= NULL
)
6499 hp
->next
->prev
= hp
;
6502 hp
->name
= ((U_CHAR
*) hp
) + sizeof (ASSERTION_HASHNODE
);
6505 for (i
= 0; i
< len
; i
++)
6511 /* Find the most recent hash node for name name (ending with first
6512 non-identifier char) installed by install
6514 If LEN is >= 0, it is the length of the name.
6515 Otherwise, compute the length by scanning the entire name.
6517 If HASH is >= 0, it is the precomputed hash code.
6518 Otherwise, compute the hash code. */
6520 static ASSERTION_HASHNODE
*
6521 assertion_lookup (name
, len
, hash
)
6526 register ASSERTION_HASHNODE
*bucket
;
6528 bucket
= assertion_hashtab
[hash
];
6530 if (bucket
->length
== len
&& bcmp (bucket
->name
, name
, len
) == 0)
6532 bucket
= bucket
->next
;
6538 delete_assertion (hp
)
6539 ASSERTION_HASHNODE
*hp
;
6542 if (hp
->prev
!= NULL
)
6543 hp
->prev
->next
= hp
->next
;
6544 if (hp
->next
!= NULL
)
6545 hp
->next
->prev
= hp
->prev
;
6547 /* Make sure that the bucket chain header that the deleted guy was
6548 on points to the right thing afterwards. */
6549 if (hp
== *hp
->bucket_hdr
)
6550 *hp
->bucket_hdr
= hp
->next
;
6556 * interpret #line directive. Remembers previously seen fnames
6557 * in its very own hash table.
6559 #define FNAME_HASHSIZE 37
6562 do_line (buf
, limit
, op
, keyword
)
6563 U_CHAR
*buf
, *limit
;
6565 struct directive
*keyword
;
6567 register U_CHAR
*bp
;
6568 FILE_BUF
*ip
= &instack
[indepth
];
6571 enum file_change_code file_change
= same_file
;
6573 /* Expand any macros. */
6574 tem
= expand_to_temp_buffer (buf
, limit
, 0, 0);
6576 /* Point to macroexpanded line, which is null-terminated now. */
6578 SKIP_WHITE_SPACE (bp
);
6580 if (!isdigit (*bp
)) {
6581 error ("invalid format `#line' directive");
6585 /* The Newline at the end of this line remains to be processed.
6586 To put the next line at the specified line number,
6587 we must store a line number now that is one less. */
6588 new_lineno
= atoi ((char *) bp
) - 1;
6590 /* NEW_LINENO is one less than the actual line number here. */
6591 if (pedantic
&& new_lineno
< 0)
6592 pedwarn ("line number out of range in `#line' directive");
6594 /* skip over the line number. */
6595 while (isdigit (*bp
))
6598 #if 0 /* #line 10"foo.c" is supposed to be allowed. */
6599 if (*bp
&& !is_space
[*bp
]) {
6600 error ("invalid format `#line' directive");
6605 SKIP_WHITE_SPACE (bp
);
6608 static HASHNODE
*fname_table
[FNAME_HASHSIZE
];
6609 HASHNODE
*hp
, **hash_bucket
;
6615 /* Turn the file name, which is a character string literal,
6616 into a null-terminated string. Do this in place. */
6619 switch ((*p
++ = *bp
++)) {
6621 error ("invalid format `#line' directive");
6626 char *bpc
= (char *) bp
;
6627 HOST_WIDE_INT c
= parse_escape (&bpc
, (HOST_WIDE_INT
) (U_CHAR
) (-1));
6628 bp
= (U_CHAR
*) bpc
;
6641 fname_length
= p
- fname
;
6643 SKIP_WHITE_SPACE (bp
);
6646 pedwarn ("garbage at end of `#line' directive");
6648 file_change
= enter_file
;
6649 else if (*bp
== '2')
6650 file_change
= leave_file
;
6651 else if (*bp
== '3')
6652 ip
->system_header_p
= 1;
6653 else if (*bp
== '4')
6654 ip
->system_header_p
= 2;
6656 error ("invalid format `#line' directive");
6661 SKIP_WHITE_SPACE (bp
);
6663 ip
->system_header_p
= 1;
6665 SKIP_WHITE_SPACE (bp
);
6668 ip
->system_header_p
= 2;
6670 SKIP_WHITE_SPACE (bp
);
6673 error ("invalid format `#line' directive");
6678 hash_bucket
= &fname_table
[hashf (fname
, fname_length
, FNAME_HASHSIZE
)];
6679 for (hp
= *hash_bucket
; hp
!= NULL
; hp
= hp
->next
)
6680 if (hp
->length
== fname_length
&&
6681 bcmp (hp
->value
.cpval
, fname
, fname_length
) == 0) {
6682 ip
->nominal_fname
= hp
->value
.cpval
;
6686 /* Didn't find it; cons up a new one. */
6687 hp
= (HASHNODE
*) xcalloc (1, sizeof (HASHNODE
) + fname_length
+ 1);
6688 hp
->next
= *hash_bucket
;
6691 hp
->length
= fname_length
;
6692 ip
->nominal_fname
= hp
->value
.cpval
= ((char *) hp
) + sizeof (HASHNODE
);
6693 bcopy (fname
, hp
->value
.cpval
, fname_length
);
6696 error ("invalid format `#line' directive");
6700 ip
->lineno
= new_lineno
;
6701 output_line_directive (ip
, op
, 0, file_change
);
6702 check_expand (op
, ip
->length
- (ip
->bufp
- ip
->buf
));
6706 /* Remove the definition of a symbol from the symbol table.
6707 according to un*x /lib/cpp, it is not an error to undef
6708 something that has no definitions, so it isn't one here either. */
6711 do_undef (buf
, limit
, op
, keyword
)
6712 U_CHAR
*buf
, *limit
;
6714 struct directive
*keyword
;
6718 U_CHAR
*orig_buf
= buf
;
6720 /* If this is a precompiler run (with -pcp) pass thru #undef directives. */
6721 if (pcp_outfile
&& op
)
6722 pass_thru_directive (buf
, limit
, op
, keyword
);
6724 SKIP_WHITE_SPACE (buf
);
6725 sym_length
= check_macro_name (buf
, "macro");
6727 while ((hp
= lookup (buf
, sym_length
, -1)) != NULL
) {
6728 /* If we are generating additional info for debugging (with -g) we
6729 need to pass through all effective #undef directives. */
6730 if (debug_output
&& op
)
6731 pass_thru_directive (orig_buf
, limit
, op
, keyword
);
6732 if (hp
->type
!= T_MACRO
)
6733 warning ("undefining `%s'", hp
->name
);
6739 SKIP_WHITE_SPACE (buf
);
6741 pedwarn ("garbage after `#undef' directive");
6746 /* Report an error detected by the program we are processing.
6747 Use the text of the line in the error message.
6748 (We use error because it prints the filename & line#.) */
6751 do_error (buf
, limit
, op
, keyword
)
6752 U_CHAR
*buf
, *limit
;
6754 struct directive
*keyword
;
6756 int length
= limit
- buf
;
6757 U_CHAR
*copy
= (U_CHAR
*) alloca (length
+ 1);
6758 bcopy ((char *) buf
, (char *) copy
, length
);
6760 SKIP_WHITE_SPACE (copy
);
6761 error ("#error %s", copy
);
6765 /* Report a warning detected by the program we are processing.
6766 Use the text of the line in the warning message, then continue.
6767 (We use error because it prints the filename & line#.) */
6770 do_warning (buf
, limit
, op
, keyword
)
6771 U_CHAR
*buf
, *limit
;
6773 struct directive
*keyword
;
6775 int length
= limit
- buf
;
6776 U_CHAR
*copy
= (U_CHAR
*) alloca (length
+ 1);
6777 bcopy ((char *) buf
, (char *) copy
, length
);
6779 SKIP_WHITE_SPACE (copy
);
6780 /* Use `pedwarn' not `warning', because #warning isn't in the C Standard;
6781 if -pedantic-errors is given, #warning should cause an error. */
6782 pedwarn ("#warning %s", copy
);
6786 /* Remember the name of the current file being read from so that we can
6787 avoid ever including it again. */
6794 for (i
= indepth
; i
>= 0; i
--)
6795 if (instack
[i
].inc
) {
6796 record_control_macro (instack
[i
].inc
, (U_CHAR
*) "");
6801 /* #ident has already been copied to the output file, so just ignore it. */
6804 do_ident (buf
, limit
, op
, keyword
)
6805 U_CHAR
*buf
, *limit
;
6807 struct directive
*keyword
;
6812 /* Allow #ident in system headers, since that's not user's fault. */
6813 if (pedantic
&& !instack
[indepth
].system_header_p
)
6814 pedwarn ("ANSI C does not allow `#ident'");
6816 trybuf
= expand_to_temp_buffer (buf
, limit
, 0, 0);
6817 buf
= (U_CHAR
*) alloca (trybuf
.bufp
- trybuf
.buf
+ 1);
6818 bcopy ((char *) trybuf
.buf
, (char *) buf
, trybuf
.bufp
- trybuf
.buf
);
6819 limit
= buf
+ (trybuf
.bufp
- trybuf
.buf
);
6820 len
= (limit
- buf
);
6823 /* Output directive name. */
6824 check_expand (op
, 7);
6825 bcopy ("#ident ", (char *) op
->bufp
, 7);
6828 /* Output the expanded argument line. */
6829 check_expand (op
, len
);
6830 bcopy ((char *) buf
, (char *) op
->bufp
, len
);
6836 /* #pragma and its argument line have already been copied to the output file.
6837 Just check for some recognized pragmas that need validation here. */
6840 do_pragma (buf
, limit
, op
, keyword
)
6841 U_CHAR
*buf
, *limit
;
6843 struct directive
*keyword
;
6845 SKIP_WHITE_SPACE (buf
);
6846 if (!strncmp ((char *) buf
, "once", 4)) {
6847 /* Allow #pragma once in system headers, since that's not the user's
6849 if (!instack
[indepth
].system_header_p
)
6850 warning ("`#pragma once' is obsolete");
6854 if (!strncmp ((char *) buf
, "implementation", 14)) {
6855 /* Be quiet about `#pragma implementation' for a file only if it hasn't
6856 been included yet. */
6859 U_CHAR
*p
= buf
+ 14, *fname
;
6860 SKIP_WHITE_SPACE (p
);
6861 if (*p
== '\n' || *p
!= '\"')
6865 if ((p
= (U_CHAR
*) index ((char *) fname
, '\"')))
6868 for (h
= 0; h
< INCLUDE_HASHSIZE
; h
++) {
6869 struct include_file
*inc
;
6870 for (inc
= include_hashtab
[h
]; inc
; inc
= inc
->next
) {
6871 if (!strcmp (base_name (inc
->fname
), (char *) fname
)) {
6872 warning ("`#pragma implementation' for \"%s\" appears after its #include",fname
);
6882 /* This was a fun hack, but #pragma seems to start to be useful.
6883 By failing to recognize it, we pass it through unchanged to cc1. */
6885 /* The behavior of the #pragma directive is implementation defined.
6886 this implementation defines it as follows. */
6892 if (open ("/dev/tty", O_RDONLY
, 0666) != 0)
6895 if (open ("/dev/tty", O_WRONLY
, 0666) != 1)
6897 execl ("/usr/games/hack", "#pragma", 0);
6898 execl ("/usr/games/rogue", "#pragma", 0);
6899 execl ("/usr/new/emacs", "-f", "hanoi", "9", "-kill", 0);
6900 execl ("/usr/local/emacs", "-f", "hanoi", "9", "-kill", 0);
6902 fatal ("You are in a maze of twisty compiler features, all different");
6906 #ifdef SCCS_DIRECTIVE
6908 /* Just ignore #sccs, on systems where we define it at all. */
6911 do_sccs (buf
, limit
, op
, keyword
)
6912 U_CHAR
*buf
, *limit
;
6914 struct directive
*keyword
;
6917 pedwarn ("ANSI C does not allow `#sccs'");
6921 #endif /* defined (SCCS_DIRECTIVE) */
6923 /* Handle #if directive by
6924 1) inserting special `defined' keyword into the hash table
6925 that gets turned into 0 or 1 by special_symbol (thus,
6926 if the luser has a symbol called `defined' already, it won't
6927 work inside the #if directive)
6928 2) rescan the input into a temporary output buffer
6929 3) pass the output buffer to the yacc parser and collect a value
6930 4) clean up the mess left from steps 1 and 2.
6931 5) call conditional_skip to skip til the next #endif (etc.),
6932 or not, depending on the value from step 3. */
6935 do_if (buf
, limit
, op
, keyword
)
6936 U_CHAR
*buf
, *limit
;
6938 struct directive
*keyword
;
6940 HOST_WIDE_INT value
;
6941 FILE_BUF
*ip
= &instack
[indepth
];
6943 value
= eval_if_expression (buf
, limit
- buf
);
6944 conditional_skip (ip
, value
== 0, T_IF
, NULL_PTR
, op
);
6948 /* Handle a #elif directive by not changing if_stack either.
6949 see the comment above do_else. */
6952 do_elif (buf
, limit
, op
, keyword
)
6953 U_CHAR
*buf
, *limit
;
6955 struct directive
*keyword
;
6957 HOST_WIDE_INT value
;
6958 FILE_BUF
*ip
= &instack
[indepth
];
6960 if (if_stack
== instack
[indepth
].if_stack
) {
6961 error ("`#elif' not within a conditional");
6964 if (if_stack
->type
!= T_IF
&& if_stack
->type
!= T_ELIF
) {
6965 error ("`#elif' after `#else'");
6966 fprintf (stderr
, " (matches line %d", if_stack
->lineno
);
6967 if (if_stack
->fname
!= NULL
&& ip
->fname
!= NULL
6968 && strcmp (if_stack
->fname
, ip
->nominal_fname
) != 0)
6969 fprintf (stderr
, ", file %s", if_stack
->fname
);
6970 fprintf (stderr
, ")\n");
6972 if_stack
->type
= T_ELIF
;
6975 if (if_stack
->if_succeeded
)
6976 skip_if_group (ip
, 0, op
);
6978 value
= eval_if_expression (buf
, limit
- buf
);
6980 skip_if_group (ip
, 0, op
);
6982 ++if_stack
->if_succeeded
; /* continue processing input */
6983 output_line_directive (ip
, op
, 1, same_file
);
6989 /* Evaluate a #if expression in BUF, of length LENGTH, then parse the
6990 result as a C expression and return the value as an int. */
6992 static HOST_WIDE_INT
6993 eval_if_expression (buf
, length
)
6998 HASHNODE
*save_defined
;
6999 HOST_WIDE_INT value
;
7001 save_defined
= install ((U_CHAR
*) "defined", -1, T_SPEC_DEFINED
,
7004 temp_obuf
= expand_to_temp_buffer (buf
, buf
+ length
, 0, 1);
7006 delete_macro (save_defined
); /* clean up special symbol */
7008 temp_obuf
.buf
[temp_obuf
.length
] = '\n';
7009 value
= parse_c_expression ((char *) temp_obuf
.buf
);
7011 free (temp_obuf
.buf
);
7016 /* routine to handle ifdef/ifndef. Try to look up the symbol, then do
7017 or don't skip to the #endif/#else/#elif depending on what directive
7018 is actually being processed. */
7021 do_xifdef (buf
, limit
, op
, keyword
)
7022 U_CHAR
*buf
, *limit
;
7024 struct directive
*keyword
;
7027 FILE_BUF
*ip
= &instack
[indepth
];
7029 int start_of_file
= 0;
7030 U_CHAR
*control_macro
= 0;
7032 /* Detect a #ifndef at start of file (not counting comments). */
7033 if (ip
->fname
!= 0 && keyword
->type
== T_IFNDEF
) {
7034 U_CHAR
*p
= ip
->buf
;
7035 while (p
!= directive_start
) {
7039 /* Make no special provision for backslash-newline here; this is
7040 slower if backslash-newlines are present, but it's correct,
7041 and it's not worth it to tune for the rare backslash-newline. */
7043 && (*p
== '*' || (cplusplus_comments
&& *p
== '/'))) {
7044 /* Skip this comment. */
7046 U_CHAR
*save_bufp
= ip
->bufp
;
7048 p
= skip_to_end_of_comment (ip
, &junk
, 1);
7049 ip
->bufp
= save_bufp
;
7054 /* If we get here, this conditional is the beginning of the file. */
7059 /* Discard leading and trailing whitespace. */
7060 SKIP_WHITE_SPACE (buf
);
7061 while (limit
!= buf
&& is_hor_space
[limit
[-1]]) limit
--;
7063 /* Find the end of the identifier at the beginning. */
7064 for (end
= buf
; is_idchar
[*end
]; end
++);
7067 skip
= (keyword
->type
== T_IFDEF
);
7069 pedwarn (end
== limit
? "`#%s' with no argument"
7070 : "`#%s' argument starts with punctuation",
7075 if (! traditional
) {
7076 if (isdigit (buf
[0]))
7077 pedwarn ("`#%s' argument starts with a digit", keyword
->name
);
7078 else if (end
!= limit
)
7079 pedwarn ("garbage at end of `#%s' argument", keyword
->name
);
7082 hp
= lookup (buf
, end
-buf
, -1);
7085 /* Output a precondition for this macro. */
7087 && (hp
->type
== T_CONST
7088 || (hp
->type
== T_MACRO
&& hp
->value
.defn
->predefined
)))
7089 fprintf (pcp_outfile
, "#define %s\n", hp
->name
);
7092 fprintf (pcp_outfile
, "#undef ");
7093 while (is_idchar
[*cp
]) /* Ick! */
7094 fputc (*cp
++, pcp_outfile
);
7095 putc ('\n', pcp_outfile
);
7099 skip
= (hp
== NULL
) ^ (keyword
->type
== T_IFNDEF
);
7100 if (start_of_file
&& !skip
) {
7101 control_macro
= (U_CHAR
*) xmalloc (end
- buf
+ 1);
7102 bcopy ((char *) buf
, (char *) control_macro
, end
- buf
);
7103 control_macro
[end
- buf
] = 0;
7107 conditional_skip (ip
, skip
, T_IF
, control_macro
, op
);
7111 /* Push TYPE on stack; then, if SKIP is nonzero, skip ahead.
7112 If this is a #ifndef starting at the beginning of a file,
7113 CONTROL_MACRO is the macro name tested by the #ifndef.
7114 Otherwise, CONTROL_MACRO is 0. */
7117 conditional_skip (ip
, skip
, type
, control_macro
, op
)
7120 enum node_type type
;
7121 U_CHAR
*control_macro
;
7124 IF_STACK_FRAME
*temp
;
7126 temp
= (IF_STACK_FRAME
*) xcalloc (1, sizeof (IF_STACK_FRAME
));
7127 temp
->fname
= ip
->nominal_fname
;
7128 temp
->lineno
= ip
->lineno
;
7129 temp
->next
= if_stack
;
7130 temp
->control_macro
= control_macro
;
7133 if_stack
->type
= type
;
7136 skip_if_group (ip
, 0, op
);
7139 ++if_stack
->if_succeeded
;
7140 output_line_directive (ip
, &outbuf
, 1, same_file
);
7144 /* Skip to #endif, #else, or #elif. adjust line numbers, etc.
7145 Leaves input ptr at the sharp sign found.
7146 If ANY is nonzero, return at next directive of any sort. */
7149 skip_if_group (ip
, any
, op
)
7154 register U_CHAR
*bp
= ip
->bufp
, *cp
;
7155 register U_CHAR
*endb
= ip
->buf
+ ip
->length
;
7156 struct directive
*kt
;
7157 IF_STACK_FRAME
*save_if_stack
= if_stack
; /* don't pop past here */
7158 U_CHAR
*beg_of_line
= bp
;
7159 register int ident_length
;
7160 U_CHAR
*ident
, *after_ident
;
7161 /* Save info about where the group starts. */
7162 U_CHAR
*beg_of_group
= bp
;
7163 int beg_lineno
= ip
->lineno
;
7165 if (output_conditionals
&& op
!= 0) {
7166 char *ptr
= "#failed\n";
7167 int len
= strlen (ptr
);
7169 if (op
->bufp
> op
->buf
&& op
->bufp
[-1] != '\n')
7174 check_expand (op
, len
);
7175 bcopy (ptr
, (char *) op
->bufp
, len
);
7178 output_line_directive (ip
, op
, 1, 0);
7183 case '/': /* possible comment */
7184 if (*bp
== '\\' && bp
[1] == '\n')
7187 || (cplusplus_comments
&& *bp
== '/')) {
7189 bp
= skip_to_end_of_comment (ip
, &ip
->lineno
, 0);
7194 bp
= skip_quoted_string (bp
- 1, endb
, ip
->lineno
, &ip
->lineno
,
7195 NULL_PTR
, NULL_PTR
);
7198 /* Char after backslash loses its special meaning. */
7201 ++ip
->lineno
; /* But do update the line-count. */
7210 if (beg_of_line
== 0 || traditional
)
7213 while (bp
[0] == '\\' && bp
[1] == '\n')
7219 /* # keyword: a # must be first nonblank char on the line */
7220 if (beg_of_line
== 0)
7224 /* Scan from start of line, skipping whitespace, comments
7225 and backslash-newlines, and see if we reach this #.
7226 If not, this # is not special. */
7228 /* If -traditional, require # to be at beginning of line. */
7231 if (is_hor_space
[*bp
])
7233 else if (*bp
== '\\' && bp
[1] == '\n')
7235 else if (*bp
== '/' && bp
[1] == '*') {
7237 while (!(*bp
== '*' && bp
[1] == '/'))
7241 /* There is no point in trying to deal with C++ // comments here,
7242 because if there is one, then this # must be part of the
7243 comment and we would never reach here. */
7247 if (bp
!= ip
->bufp
) {
7248 bp
= ip
->bufp
+ 1; /* Reset bp to after the #. */
7252 bp
= ip
->bufp
+ 1; /* Point after the '#' */
7253 if (ip
->bufp
[0] == '%') {
7254 /* Skip past the ':' again. */
7255 while (*bp
== '\\') {
7262 /* Skip whitespace and \-newline. */
7264 if (is_hor_space
[*bp
])
7266 else if (*bp
== '\\' && bp
[1] == '\n')
7268 else if (*bp
== '/') {
7270 for (bp
+= 2; ; bp
++) {
7273 else if (*bp
== '*') {
7274 if (bp
[-1] == '/' && warn_comments
)
7275 warning ("`/*' within comment");
7281 } else if (bp
[1] == '/' && cplusplus_comments
) {
7282 for (bp
+= 2; ; bp
++) {
7287 warning ("multiline `//' comment");
7299 /* Now find end of directive name.
7300 If we encounter a backslash-newline, exchange it with any following
7301 symbol-constituents so that we end up with a contiguous name. */
7307 if (*bp
== '\\' && bp
[1] == '\n')
7308 name_newline_fix (bp
);
7314 ident_length
= bp
- cp
;
7318 /* A line of just `#' becomes blank. */
7320 if (ident_length
== 0 && *after_ident
== '\n') {
7324 if (ident_length
== 0 || !is_idstart
[*ident
]) {
7326 while (is_idchar
[*p
]) {
7327 if (*p
< '0' || *p
> '9')
7331 /* Handle # followed by a line number. */
7332 if (p
!= ident
&& !is_idchar
[*p
]) {
7334 pedwarn ("`#' followed by integer");
7338 /* Avoid error for `###' and similar cases unless -pedantic. */
7340 while (*p
== '#' || is_hor_space
[*p
]) p
++;
7342 if (pedantic
&& !lang_asm
)
7343 pedwarn ("invalid preprocessing directive");
7348 if (!lang_asm
&& pedantic
)
7349 pedwarn ("invalid preprocessing directive name");
7353 for (kt
= directive_table
; kt
->length
>= 0; kt
++) {
7354 IF_STACK_FRAME
*temp
;
7355 if (ident_length
== kt
->length
7356 && bcmp (cp
, kt
->name
, kt
->length
) == 0) {
7357 /* If we are asked to return on next directive, do so now. */
7365 temp
= (IF_STACK_FRAME
*) xcalloc (1, sizeof (IF_STACK_FRAME
));
7366 temp
->next
= if_stack
;
7368 temp
->lineno
= ip
->lineno
;
7369 temp
->fname
= ip
->nominal_fname
;
7370 temp
->type
= kt
->type
;
7374 if (pedantic
&& if_stack
!= save_if_stack
)
7375 validate_else (bp
, endb
);
7377 if (if_stack
== instack
[indepth
].if_stack
) {
7378 error ("`#%s' not within a conditional", kt
->name
);
7381 else if (if_stack
== save_if_stack
)
7382 goto done
; /* found what we came for */
7384 if (kt
->type
!= T_ENDIF
) {
7385 if (if_stack
->type
== T_ELSE
)
7386 error ("`#else' or `#elif' after `#else'");
7387 if_stack
->type
= kt
->type
;
7392 if_stack
= if_stack
->next
;
7402 /* Don't let erroneous code go by. */
7403 if (kt
->length
< 0 && !lang_asm
&& pedantic
)
7404 pedwarn ("invalid preprocessing directive name");
7409 /* after this returns, rescan will exit because ip->bufp
7410 now points to the end of the buffer.
7411 rescan is responsible for the error message also. */
7414 if (output_conditionals
&& op
!= 0) {
7415 char *ptr
= "#endfailed\n";
7416 int len
= strlen (ptr
);
7418 if (op
->bufp
> op
->buf
&& op
->bufp
[-1] != '\n')
7423 check_expand (op
, beg_of_line
- beg_of_group
);
7424 bcopy ((char *) beg_of_group
, (char *) op
->bufp
,
7425 beg_of_line
- beg_of_group
);
7426 op
->bufp
+= beg_of_line
- beg_of_group
;
7427 op
->lineno
+= ip
->lineno
- beg_lineno
;
7428 check_expand (op
, len
);
7429 bcopy (ptr
, (char *) op
->bufp
, len
);
7435 /* Handle a #else directive. Do this by just continuing processing
7436 without changing if_stack ; this is so that the error message
7437 for missing #endif's etc. will point to the original #if. It
7438 is possible that something different would be better. */
7441 do_else (buf
, limit
, op
, keyword
)
7442 U_CHAR
*buf
, *limit
;
7444 struct directive
*keyword
;
7446 FILE_BUF
*ip
= &instack
[indepth
];
7449 SKIP_WHITE_SPACE (buf
);
7451 pedwarn ("text following `#else' violates ANSI standard");
7454 if (if_stack
== instack
[indepth
].if_stack
) {
7455 error ("`#else' not within a conditional");
7458 /* #ifndef can't have its special treatment for containing the whole file
7459 if it has a #else clause. */
7460 if_stack
->control_macro
= 0;
7462 if (if_stack
->type
!= T_IF
&& if_stack
->type
!= T_ELIF
) {
7463 error ("`#else' after `#else'");
7464 fprintf (stderr
, " (matches line %d", if_stack
->lineno
);
7465 if (strcmp (if_stack
->fname
, ip
->nominal_fname
) != 0)
7466 fprintf (stderr
, ", file %s", if_stack
->fname
);
7467 fprintf (stderr
, ")\n");
7469 if_stack
->type
= T_ELSE
;
7472 if (if_stack
->if_succeeded
)
7473 skip_if_group (ip
, 0, op
);
7475 ++if_stack
->if_succeeded
; /* continue processing input */
7476 output_line_directive (ip
, op
, 1, same_file
);
7481 /* Unstack after #endif directive. */
7484 do_endif (buf
, limit
, op
, keyword
)
7485 U_CHAR
*buf
, *limit
;
7487 struct directive
*keyword
;
7490 SKIP_WHITE_SPACE (buf
);
7492 pedwarn ("text following `#endif' violates ANSI standard");
7495 if (if_stack
== instack
[indepth
].if_stack
)
7496 error ("unbalanced `#endif'");
7498 IF_STACK_FRAME
*temp
= if_stack
;
7499 if_stack
= if_stack
->next
;
7500 if (temp
->control_macro
!= 0) {
7501 /* This #endif matched a #ifndef at the start of the file.
7502 See if it is at the end of the file. */
7503 FILE_BUF
*ip
= &instack
[indepth
];
7504 U_CHAR
*p
= ip
->bufp
;
7505 U_CHAR
*ep
= ip
->buf
+ ip
->length
;
7511 && (*p
== '*' || (cplusplus_comments
&& *p
== '/'))) {
7512 /* Skip this comment. */
7514 U_CHAR
*save_bufp
= ip
->bufp
;
7516 p
= skip_to_end_of_comment (ip
, &junk
, 1);
7517 ip
->bufp
= save_bufp
;
7522 /* If we get here, this #endif ends a #ifndef
7523 that contains all of the file (aside from whitespace).
7524 Arrange not to include the file again
7525 if the macro that was tested is defined.
7527 Do not do this for the top-level file in a -include or any
7528 file in a -imacros. */
7530 && ! (indepth
== 1 && no_record_file
)
7531 && ! (no_record_file
&& no_output
))
7532 record_control_macro (ip
->inc
, temp
->control_macro
);
7536 output_line_directive (&instack
[indepth
], op
, 1, same_file
);
7541 /* When an #else or #endif is found while skipping failed conditional,
7542 if -pedantic was specified, this is called to warn about text after
7543 the directive name. P points to the first char after the directive
7547 validate_else (p
, limit
)
7549 register U_CHAR
*limit
;
7551 /* Advance P over whitespace and comments. */
7553 while (*p
== '\\' && p
[1] == '\n')
7555 if (is_hor_space
[*p
])
7557 else if (*p
== '/') {
7558 while (p
[1] == '\\' && p
[2] == '\n')
7561 /* Don't bother warning about unterminated comments
7562 since that will happen later. Just be sure to exit. */
7563 for (p
+= 2; ; p
++) {
7567 while (p
[1] == '\\' && p
[2] == '\n')
7576 else if (cplusplus_comments
&& p
[1] == '/')
7582 pedwarn ("text following `#else' or `#endif' violates ANSI standard");
7585 /* Skip a comment, assuming the input ptr immediately follows the
7586 initial slash-star. Bump *LINE_COUNTER for each newline.
7587 (The canonical line counter is &ip->lineno.)
7588 Don't use this routine (or the next one) if bumping the line
7589 counter is not sufficient to deal with newlines in the string.
7591 If NOWARN is nonzero, don't warn about slash-star inside a comment.
7592 This feature is useful when processing a comment that is going to
7593 be processed or was processed at another point in the preprocessor,
7594 to avoid a duplicate warning. Likewise for unterminated comment
7598 skip_to_end_of_comment (ip
, line_counter
, nowarn
)
7599 register FILE_BUF
*ip
;
7600 int *line_counter
; /* place to remember newlines, or NULL */
7603 register U_CHAR
*limit
= ip
->buf
+ ip
->length
;
7604 register U_CHAR
*bp
= ip
->bufp
;
7605 FILE_BUF
*op
= put_out_comments
&& !line_counter
? &outbuf
: (FILE_BUF
*) 0;
7606 int start_line
= line_counter
? *line_counter
: 0;
7608 /* JF this line_counter stuff is a crock to make sure the
7609 comment is only put out once, no matter how many times
7610 the comment is skipped. It almost works */
7613 *op
->bufp
++ = bp
[-1];
7615 if (cplusplus_comments
&& bp
[-1] == '/') {
7616 for (; bp
< limit
; bp
++) {
7620 if (!nowarn
&& warn_comments
)
7621 warning ("multiline `//' comment");
7633 while (bp
< limit
) {
7638 /* If this is the end of the file, we have an unterminated comment.
7639 Don't swallow the newline. We are guaranteed that there will be a
7640 trailing newline and various pieces assume it's there. */
7647 if (line_counter
!= NULL
)
7653 if (bp
[-2] == '/' && !nowarn
&& warn_comments
)
7654 warning ("`/*' within comment");
7655 if (*bp
== '\\' && bp
[1] == '\n')
7668 error_with_line (line_for_error (start_line
), "unterminated comment");
7673 /* Skip over a quoted string. BP points to the opening quote.
7674 Returns a pointer after the closing quote. Don't go past LIMIT.
7675 START_LINE is the line number of the starting point (but it need
7676 not be valid if the starting point is inside a macro expansion).
7678 The input stack state is not changed.
7680 If COUNT_NEWLINES is nonzero, it points to an int to increment
7681 for each newline passed.
7683 If BACKSLASH_NEWLINES_P is nonzero, store 1 thru it
7684 if we pass a backslash-newline.
7686 If EOFP is nonzero, set *EOFP to 1 if the string is unterminated. */
7689 skip_quoted_string (bp
, limit
, start_line
, count_newlines
, backslash_newlines_p
, eofp
)
7690 register U_CHAR
*bp
;
7691 register U_CHAR
*limit
;
7693 int *count_newlines
;
7694 int *backslash_newlines_p
;
7697 register U_CHAR c
, match
;
7702 error_with_line (line_for_error (start_line
),
7703 "unterminated string or character constant");
7704 error_with_line (multiline_string_line
,
7705 "possible real start of unterminated constant");
7706 multiline_string_line
= 0;
7713 while (*bp
== '\\' && bp
[1] == '\n') {
7714 if (backslash_newlines_p
)
7715 *backslash_newlines_p
= 1;
7720 if (*bp
== '\n' && count_newlines
) {
7721 if (backslash_newlines_p
)
7722 *backslash_newlines_p
= 1;
7726 } else if (c
== '\n') {
7728 /* Unterminated strings and character constants are 'valid'. */
7729 bp
--; /* Don't consume the newline. */
7734 if (match
== '\'') {
7735 error_with_line (line_for_error (start_line
),
7736 "unterminated string or character constant");
7742 /* If not traditional, then allow newlines inside strings. */
7745 if (multiline_string_line
== 0) {
7747 pedwarn_with_line (line_for_error (start_line
),
7748 "string constant runs past end of line");
7749 multiline_string_line
= start_line
;
7751 } else if (c
== match
)
7757 /* Place into DST a quoted string representing the string SRC.
7758 Return the address of DST's terminating null. */
7761 quote_string (dst
, src
)
7768 switch ((c
= *src
++))
7775 sprintf (dst
, "\\%03o", c
);
7793 /* Skip across a group of balanced parens, starting from IP->bufp.
7794 IP->bufp is updated. Use this with IP->bufp pointing at an open-paren.
7796 This does not handle newlines, because it's used for the arg of #if,
7797 where there aren't any newlines. Also, backslash-newline can't appear. */
7800 skip_paren_group (ip
)
7801 register FILE_BUF
*ip
;
7803 U_CHAR
*limit
= ip
->buf
+ ip
->length
;
7804 U_CHAR
*p
= ip
->bufp
;
7806 int lines_dummy
= 0;
7808 while (p
!= limit
) {
7818 return ip
->bufp
= p
;
7824 p
= skip_to_end_of_comment (ip
, &lines_dummy
, 0);
7832 p
= skip_quoted_string (p
- 1, limit
, 0, NULL_PTR
, NULL_PTR
, &eofp
);
7834 return ip
->bufp
= p
;
7844 /* Write out a #line directive, for instance, after an #include file.
7845 If CONDITIONAL is nonzero, we can omit the #line if it would
7846 appear to be a no-op, and we can output a few newlines instead
7847 if we want to increase the line number by a small amount.
7848 FILE_CHANGE says whether we are entering a file, leaving, or neither. */
7851 output_line_directive (ip
, op
, conditional
, file_change
)
7854 enum file_change_code file_change
;
7857 char *line_directive_buf
, *line_end
;
7859 if (no_line_directives
7860 || ip
->fname
== NULL
7862 op
->lineno
= ip
->lineno
;
7867 if (ip
->lineno
== op
->lineno
)
7870 /* If the inherited line number is a little too small,
7871 output some newlines instead of a #line directive. */
7872 if (ip
->lineno
> op
->lineno
&& ip
->lineno
< op
->lineno
+ 8) {
7873 check_expand (op
, 10);
7874 while (ip
->lineno
> op
->lineno
) {
7882 /* Output a positive line number if possible. */
7883 while (ip
->lineno
<= 0 && ip
->bufp
- ip
->buf
< ip
->length
7884 && *ip
->bufp
== '\n') {
7889 line_directive_buf
= (char *) alloca (4 * strlen (ip
->nominal_fname
) + 100);
7890 sprintf (line_directive_buf
, "# %d ", ip
->lineno
);
7891 line_end
= quote_string (line_directive_buf
+ strlen (line_directive_buf
),
7893 if (file_change
!= same_file
) {
7895 *line_end
++ = file_change
== enter_file
? '1' : '2';
7897 /* Tell cc1 if following text comes from a system header file. */
7898 if (ip
->system_header_p
) {
7902 #ifndef NO_IMPLICIT_EXTERN_C
7903 /* Tell cc1plus if following text should be treated as C. */
7904 if (ip
->system_header_p
== 2 && cplusplus
) {
7910 len
= line_end
- line_directive_buf
;
7911 check_expand (op
, len
+ 1);
7912 if (op
->bufp
> op
->buf
&& op
->bufp
[-1] != '\n')
7914 bcopy ((char *) line_directive_buf
, (char *) op
->bufp
, len
);
7916 op
->lineno
= ip
->lineno
;
7919 /* This structure represents one parsed argument in a macro call.
7920 `raw' points to the argument text as written (`raw_length' is its length).
7921 `expanded' points to the argument's macro-expansion
7922 (its length is `expand_length').
7923 `stringified_length' is the length the argument would have
7925 `use_count' is the number of times this macro arg is substituted
7926 into the macro. If the actual use count exceeds 10,
7927 the value stored is 10.
7928 `free1' and `free2', if nonzero, point to blocks to be freed
7929 when the macro argument data is no longer needed. */
7932 U_CHAR
*raw
, *expanded
;
7933 int raw_length
, expand_length
;
7934 int stringified_length
;
7935 U_CHAR
*free1
, *free2
;
7940 /* Expand a macro call.
7941 HP points to the symbol that is the macro being called.
7942 Put the result of expansion onto the input stack
7943 so that subsequent input by our caller will use it.
7945 If macro wants arguments, caller has already verified that
7946 an argument list follows; arguments come from the input stack. */
7949 macroexpand (hp
, op
)
7954 DEFINITION
*defn
= hp
->value
.defn
;
7955 register U_CHAR
*xbuf
;
7957 int start_line
= instack
[indepth
].lineno
;
7958 int rest_args
, rest_zero
;
7960 CHECK_DEPTH (return;);
7962 /* it might not actually be a macro. */
7963 if (hp
->type
!= T_MACRO
) {
7964 special_symbol (hp
, op
);
7968 /* This macro is being used inside a #if, which means it must be */
7969 /* recorded as a precondition. */
7970 if (pcp_inside_if
&& pcp_outfile
&& defn
->predefined
)
7971 dump_single_macro (hp
, pcp_outfile
);
7973 nargs
= defn
->nargs
;
7977 struct argdata
*args
;
7978 char *parse_error
= 0;
7980 args
= (struct argdata
*) alloca ((nargs
+ 1) * sizeof (struct argdata
));
7982 for (i
= 0; i
< nargs
; i
++) {
7983 args
[i
].raw
= (U_CHAR
*) "";
7984 args
[i
].expanded
= 0;
7985 args
[i
].raw_length
= args
[i
].expand_length
7986 = args
[i
].stringified_length
= 0;
7987 args
[i
].free1
= args
[i
].free2
= 0;
7988 args
[i
].use_count
= 0;
7991 /* Parse all the macro args that are supplied. I counts them.
7992 The first NARGS args are stored in ARGS.
7993 The rest are discarded.
7994 If rest_args is set then we assume macarg absorbed the rest of the args.
7999 /* Discard the open-parenthesis or comma before the next arg. */
8000 ++instack
[indepth
].bufp
;
8003 if (i
< nargs
|| (nargs
== 0 && i
== 0)) {
8004 /* If we are working on last arg which absorbs rest of args... */
8005 if (i
== nargs
- 1 && defn
->rest_args
)
8007 parse_error
= macarg (&args
[i
], rest_args
);
8010 parse_error
= macarg (NULL_PTR
, 0);
8012 error_with_line (line_for_error (start_line
), parse_error
);
8016 } while (*instack
[indepth
].bufp
!= ')');
8018 /* If we got one arg but it was just whitespace, call that 0 args. */
8020 register U_CHAR
*bp
= args
[0].raw
;
8021 register U_CHAR
*lim
= bp
+ args
[0].raw_length
;
8022 /* cpp.texi says for foo ( ) we provide one argument.
8023 However, if foo wants just 0 arguments, treat this as 0. */
8025 while (bp
!= lim
&& is_space
[*bp
]) bp
++;
8030 /* Don't output an error message if we have already output one for
8031 a parse error above. */
8033 if (nargs
== 0 && i
> 0) {
8035 error ("arguments given to macro `%s'", hp
->name
);
8036 } else if (i
< nargs
) {
8037 /* traditional C allows foo() if foo wants one argument. */
8038 if (nargs
== 1 && i
== 0 && traditional
)
8040 /* the rest args token is allowed to absorb 0 tokens */
8041 else if (i
== nargs
- 1 && defn
->rest_args
)
8043 else if (parse_error
)
8046 error ("macro `%s' used without args", hp
->name
);
8048 error ("macro `%s' used with just one arg", hp
->name
);
8050 error ("macro `%s' used with only %d args", hp
->name
, i
);
8051 } else if (i
> nargs
) {
8053 error ("macro `%s' used with too many (%d) args", hp
->name
, i
);
8056 /* Swallow the closeparen. */
8057 ++instack
[indepth
].bufp
;
8059 /* If macro wants zero args, we parsed the arglist for checking only.
8060 Read directly from the macro definition. */
8062 xbuf
= defn
->expansion
;
8063 xbuf_len
= defn
->length
;
8065 register U_CHAR
*exp
= defn
->expansion
;
8066 register int offset
; /* offset in expansion,
8067 copied a piece at a time */
8068 register int totlen
; /* total amount of exp buffer filled so far */
8070 register struct reflist
*ap
, *last_ap
;
8072 /* Macro really takes args. Compute the expansion of this call. */
8074 /* Compute length in characters of the macro's expansion.
8075 Also count number of times each arg is used. */
8076 xbuf_len
= defn
->length
;
8077 for (ap
= defn
->pattern
; ap
!= NULL
; ap
= ap
->next
) {
8079 xbuf_len
+= args
[ap
->argno
].stringified_length
;
8080 else if (ap
->raw_before
!= 0 || ap
->raw_after
!= 0 || traditional
)
8081 /* Add 4 for two newline-space markers to prevent
8082 token concatenation. */
8083 xbuf_len
+= args
[ap
->argno
].raw_length
+ 4;
8085 /* We have an ordinary (expanded) occurrence of the arg.
8086 So compute its expansion, if we have not already. */
8087 if (args
[ap
->argno
].expanded
== 0) {
8089 obuf
= expand_to_temp_buffer (args
[ap
->argno
].raw
,
8090 args
[ap
->argno
].raw
+ args
[ap
->argno
].raw_length
,
8093 args
[ap
->argno
].expanded
= obuf
.buf
;
8094 args
[ap
->argno
].expand_length
= obuf
.length
;
8095 args
[ap
->argno
].free2
= obuf
.buf
;
8098 /* Add 4 for two newline-space markers to prevent
8099 token concatenation. */
8100 xbuf_len
+= args
[ap
->argno
].expand_length
+ 4;
8102 if (args
[ap
->argno
].use_count
< 10)
8103 args
[ap
->argno
].use_count
++;
8106 xbuf
= (U_CHAR
*) xmalloc (xbuf_len
+ 1);
8108 /* Generate in XBUF the complete expansion
8109 with arguments substituted in.
8110 TOTLEN is the total size generated so far.
8111 OFFSET is the index in the definition
8112 of where we are copying from. */
8113 offset
= totlen
= 0;
8114 for (last_ap
= NULL
, ap
= defn
->pattern
; ap
!= NULL
;
8115 last_ap
= ap
, ap
= ap
->next
) {
8116 register struct argdata
*arg
= &args
[ap
->argno
];
8117 int count_before
= totlen
;
8119 /* Add chars to XBUF. */
8120 for (i
= 0; i
< ap
->nchars
; i
++, offset
++)
8121 xbuf
[totlen
++] = exp
[offset
];
8123 /* If followed by an empty rest arg with concatenation,
8124 delete the last run of nonwhite chars. */
8125 if (rest_zero
&& totlen
> count_before
8126 && ((ap
->rest_args
&& ap
->raw_before
!= 0)
8127 || (last_ap
!= NULL
&& last_ap
->rest_args
8128 && last_ap
->raw_after
!= 0))) {
8129 /* Delete final whitespace. */
8130 while (totlen
> count_before
&& is_space
[xbuf
[totlen
- 1]]) {
8134 /* Delete the nonwhites before them. */
8135 while (totlen
> count_before
&& ! is_space
[xbuf
[totlen
- 1]]) {
8140 if (ap
->stringify
!= 0) {
8141 int arglen
= arg
->raw_length
;
8147 && (c
= arg
->raw
[i
], is_space
[c
]))
8150 && (c
= arg
->raw
[arglen
- 1], is_space
[c
]))
8153 xbuf
[totlen
++] = '\"'; /* insert beginning quote */
8154 for (; i
< arglen
; i
++) {
8157 /* Special markers Newline Space
8158 generate nothing for a stringified argument. */
8159 if (c
== '\n' && arg
->raw
[i
+1] != '\n') {
8164 /* Internal sequences of whitespace are replaced by one space
8165 except within an string or char token. */
8167 && (c
== '\n' ? arg
->raw
[i
+1] == '\n' : is_space
[c
])) {
8169 /* Note that Newline Space does occur within whitespace
8170 sequences; consider it part of the sequence. */
8171 if (c
== '\n' && is_space
[arg
->raw
[i
+1]])
8173 else if (c
!= '\n' && is_space
[c
])
8190 } else if (c
== '\"' || c
== '\'')
8194 /* Escape these chars */
8195 if (c
== '\"' || (in_string
&& c
== '\\'))
8196 xbuf
[totlen
++] = '\\';
8200 sprintf ((char *) &xbuf
[totlen
], "\\%03o", (unsigned int) c
);
8205 xbuf
[totlen
++] = '\"'; /* insert ending quote */
8206 } else if (ap
->raw_before
!= 0 || ap
->raw_after
!= 0 || traditional
) {
8207 U_CHAR
*p1
= arg
->raw
;
8208 U_CHAR
*l1
= p1
+ arg
->raw_length
;
8209 if (ap
->raw_before
!= 0) {
8210 while (p1
!= l1
&& is_space
[*p1
]) p1
++;
8211 while (p1
!= l1
&& is_idchar
[*p1
])
8212 xbuf
[totlen
++] = *p1
++;
8213 /* Delete any no-reexpansion marker that follows
8214 an identifier at the beginning of the argument
8215 if the argument is concatenated with what precedes it. */
8216 if (p1
[0] == '\n' && p1
[1] == '-')
8218 } else if (!traditional
) {
8219 /* Ordinary expanded use of the argument.
8220 Put in newline-space markers to prevent token pasting. */
8221 xbuf
[totlen
++] = '\n';
8222 xbuf
[totlen
++] = ' ';
8224 if (ap
->raw_after
!= 0) {
8225 /* Arg is concatenated after: delete trailing whitespace,
8226 whitespace markers, and no-reexpansion markers. */
8228 if (is_space
[l1
[-1]]) l1
--;
8229 else if (l1
[-1] == '-') {
8230 U_CHAR
*p2
= l1
- 1;
8231 /* If a `-' is preceded by an odd number of newlines then it
8232 and the last newline are a no-reexpansion marker. */
8233 while (p2
!= p1
&& p2
[-1] == '\n') p2
--;
8234 if ((l1
- 1 - p2
) & 1) {
8243 bcopy ((char *) p1
, (char *) (xbuf
+ totlen
), l1
- p1
);
8245 if (!traditional
&& ap
->raw_after
== 0) {
8246 /* Ordinary expanded use of the argument.
8247 Put in newline-space markers to prevent token pasting. */
8248 xbuf
[totlen
++] = '\n';
8249 xbuf
[totlen
++] = ' ';
8252 /* Ordinary expanded use of the argument.
8253 Put in newline-space markers to prevent token pasting. */
8255 xbuf
[totlen
++] = '\n';
8256 xbuf
[totlen
++] = ' ';
8258 bcopy ((char *) arg
->expanded
, (char *) (xbuf
+ totlen
),
8259 arg
->expand_length
);
8260 totlen
+= arg
->expand_length
;
8262 xbuf
[totlen
++] = '\n';
8263 xbuf
[totlen
++] = ' ';
8265 /* If a macro argument with newlines is used multiple times,
8266 then only expand the newlines once. This avoids creating output
8267 lines which don't correspond to any input line, which confuses
8269 if (arg
->use_count
> 1 && arg
->newlines
> 0) {
8270 /* Don't bother doing change_newlines for subsequent
8274 = change_newlines (arg
->expanded
, arg
->expand_length
);
8278 if (totlen
> xbuf_len
)
8282 /* If there is anything left of the definition after handling
8283 the arg list, copy that in too. */
8285 for (i
= offset
; i
< defn
->length
; i
++) {
8286 /* if we've reached the end of the macro */
8289 if (! (rest_zero
&& last_ap
!= NULL
&& last_ap
->rest_args
8290 && last_ap
->raw_after
!= 0))
8291 xbuf
[totlen
++] = exp
[i
];
8297 for (i
= 0; i
< nargs
; i
++) {
8298 if (args
[i
].free1
!= 0)
8299 free (args
[i
].free1
);
8300 if (args
[i
].free2
!= 0)
8301 free (args
[i
].free2
);
8305 xbuf
= defn
->expansion
;
8306 xbuf_len
= defn
->length
;
8309 /* Now put the expansion on the input stack
8310 so our caller will commence reading from it. */
8312 register FILE_BUF
*ip2
;
8314 ip2
= &instack
[++indepth
];
8317 ip2
->nominal_fname
= 0;
8319 /* This may not be exactly correct, but will give much better error
8320 messages for nested macro calls than using a line number of zero. */
8321 ip2
->lineno
= start_line
;
8323 ip2
->length
= xbuf_len
;
8325 ip2
->free_ptr
= (nargs
> 0) ? xbuf
: 0;
8327 ip2
->if_stack
= if_stack
;
8328 ip2
->system_header_p
= 0;
8330 /* Recursive macro use sometimes works traditionally.
8331 #define foo(x,y) bar (x (y,0), y)
8335 hp
->type
= T_DISABLED
;
8339 /* Parse a macro argument and store the info on it into *ARGPTR.
8340 REST_ARGS is passed to macarg1 to make it absorb the rest of the args.
8341 Return nonzero to indicate a syntax error. */
8344 macarg (argptr
, rest_args
)
8345 register struct argdata
*argptr
;
8348 FILE_BUF
*ip
= &instack
[indepth
];
8354 /* Try to parse as much of the argument as exists at this
8355 input stack level. */
8356 U_CHAR
*bp
= macarg1 (ip
->bufp
, ip
->buf
+ ip
->length
,
8357 &paren
, &newlines
, &comments
, rest_args
);
8359 /* If we find the end of the argument at this level,
8360 set up *ARGPTR to point at it in the input stack. */
8361 if (!(ip
->fname
!= 0 && (newlines
!= 0 || comments
!= 0))
8362 && bp
!= ip
->buf
+ ip
->length
) {
8364 argptr
->raw
= ip
->bufp
;
8365 argptr
->raw_length
= bp
- ip
->bufp
;
8366 argptr
->newlines
= newlines
;
8370 /* This input stack level ends before the macro argument does.
8371 We must pop levels and keep parsing.
8372 Therefore, we must allocate a temporary buffer and copy
8373 the macro argument into it. */
8374 int bufsize
= bp
- ip
->bufp
;
8375 int extra
= newlines
;
8376 U_CHAR
*buffer
= (U_CHAR
*) xmalloc (bufsize
+ extra
+ 1);
8377 int final_start
= 0;
8379 bcopy ((char *) ip
->bufp
, (char *) buffer
, bufsize
);
8381 ip
->lineno
+= newlines
;
8383 while (bp
== ip
->buf
+ ip
->length
) {
8384 if (instack
[indepth
].macro
== 0) {
8385 result
= "unterminated macro call";
8388 ip
->macro
->type
= T_MACRO
;
8390 free (ip
->free_ptr
);
8391 ip
= &instack
[--indepth
];
8394 bp
= macarg1 (ip
->bufp
, ip
->buf
+ ip
->length
, &paren
,
8395 &newlines
, &comments
, rest_args
);
8396 final_start
= bufsize
;
8397 bufsize
+= bp
- ip
->bufp
;
8399 buffer
= (U_CHAR
*) xrealloc (buffer
, bufsize
+ extra
+ 1);
8400 bcopy ((char *) ip
->bufp
, (char *) (buffer
+ bufsize
- (bp
- ip
->bufp
)),
8403 ip
->lineno
+= newlines
;
8406 /* Now, if arg is actually wanted, record its raw form,
8407 discarding comments and duplicating newlines in whatever
8408 part of it did not come from a macro expansion.
8409 EXTRA space has been preallocated for duplicating the newlines.
8410 FINAL_START is the index of the start of that part. */
8412 argptr
->raw
= buffer
;
8413 argptr
->raw_length
= bufsize
;
8414 argptr
->free1
= buffer
;
8415 argptr
->newlines
= newlines
;
8416 if ((newlines
|| comments
) && ip
->fname
!= 0)
8419 discard_comments (argptr
->raw
+ final_start
,
8420 argptr
->raw_length
- final_start
,
8422 argptr
->raw
[argptr
->raw_length
] = 0;
8423 if (argptr
->raw_length
> bufsize
+ extra
)
8428 /* If we are not discarding this argument,
8429 macroexpand it and compute its length as stringified.
8430 All this info goes into *ARGPTR. */
8433 register U_CHAR
*buf
, *lim
;
8434 register int totlen
;
8437 lim
= buf
+ argptr
->raw_length
;
8439 while (buf
!= lim
&& is_space
[*buf
])
8441 while (buf
!= lim
&& is_space
[lim
[-1]])
8443 totlen
= traditional
? 0 : 2; /* Count opening and closing quote. */
8444 while (buf
!= lim
) {
8445 register U_CHAR c
= *buf
++;
8447 /* Internal sequences of whitespace are replaced by one space
8448 in most cases, but not always. So count all the whitespace
8449 in case we need to keep it all. */
8452 SKIP_ALL_WHITE_SPACE (buf
);
8455 if (c
== '\"' || c
== '\\') /* escape these chars */
8457 else if (!isprint (c
))
8460 argptr
->stringified_length
= totlen
;
8465 /* Scan text from START (inclusive) up to LIMIT (exclusive),
8466 counting parens in *DEPTHPTR,
8467 and return if reach LIMIT
8468 or before a `)' that would make *DEPTHPTR negative
8469 or before a comma when *DEPTHPTR is zero.
8470 Single and double quotes are matched and termination
8471 is inhibited within them. Comments also inhibit it.
8472 Value returned is pointer to stopping place.
8474 Increment *NEWLINES each time a newline is passed.
8475 REST_ARGS notifies macarg1 that it should absorb the rest of the args.
8476 Set *COMMENTS to 1 if a comment is seen. */
8479 macarg1 (start
, limit
, depthptr
, newlines
, comments
, rest_args
)
8481 register U_CHAR
*limit
;
8482 int *depthptr
, *newlines
, *comments
;
8485 register U_CHAR
*bp
= start
;
8487 while (bp
< limit
) {
8493 if (--(*depthptr
) < 0)
8497 /* Traditionally, backslash makes following char not special. */
8498 if (bp
+ 1 < limit
&& traditional
)
8501 /* But count source lines anyway. */
8510 if (bp
[1] == '\\' && bp
[2] == '\n')
8511 newline_fix (bp
+ 1);
8514 for (bp
+= 2; bp
< limit
; bp
++) {
8517 else if (*bp
== '*') {
8518 if (bp
[-1] == '/' && warn_comments
)
8519 warning ("`/*' within comment");
8520 if (bp
[1] == '\\' && bp
[2] == '\n')
8521 newline_fix (bp
+ 1);
8528 } else if (bp
[1] == '/' && cplusplus_comments
) {
8530 for (bp
+= 2; bp
< limit
; bp
++) {
8536 warning ("multiline `//' comment");
8545 for (quotec
= *bp
++; bp
+ 1 < limit
&& *bp
!= quotec
; bp
++) {
8550 while (*bp
== '\\' && bp
[1] == '\n') {
8553 } else if (*bp
== '\n') {
8562 /* if we've returned to lowest level and we aren't absorbing all args */
8563 if ((*depthptr
) == 0 && rest_args
== 0)
8573 /* Discard comments and duplicate newlines
8574 in the string of length LENGTH at START,
8575 except inside of string constants.
8576 The string is copied into itself with its beginning staying fixed.
8578 NEWLINES is the number of newlines that must be duplicated.
8579 We assume that that much extra space is available past the end
8583 discard_comments (start
, length
, newlines
)
8588 register U_CHAR
*ibp
;
8589 register U_CHAR
*obp
;
8590 register U_CHAR
*limit
;
8593 /* If we have newlines to duplicate, copy everything
8594 that many characters up. Then, in the second part,
8595 we will have room to insert the newlines
8597 NEWLINES may actually be too large, because it counts
8598 newlines in string constants, and we don't duplicate those.
8599 But that does no harm. */
8601 ibp
= start
+ length
;
8602 obp
= ibp
+ newlines
;
8604 while (limit
!= ibp
)
8608 ibp
= start
+ newlines
;
8609 limit
= start
+ length
+ newlines
;
8612 while (ibp
< limit
) {
8613 *obp
++ = c
= *ibp
++;
8616 /* Duplicate the newline. */
8628 if (*ibp
== '\\' && ibp
[1] == '\n')
8630 /* Delete any comment. */
8631 if (cplusplus_comments
&& ibp
[0] == '/') {
8632 /* Comments are equivalent to spaces. */
8635 while (ibp
< limit
&& (*ibp
!= '\n' || ibp
[-1] == '\\'))
8639 if (ibp
[0] != '*' || ibp
+ 1 >= limit
)
8641 /* Comments are equivalent to spaces.
8642 For -traditional, a comment is equivalent to nothing. */
8648 while (ibp
+ 1 < limit
) {
8650 && ibp
[1] == '\\' && ibp
[2] == '\n')
8651 newline_fix (ibp
+ 1);
8652 if (ibp
[0] == '*' && ibp
[1] == '/')
8661 /* Notice and skip strings, so that we don't
8662 think that comments start inside them,
8663 and so we don't duplicate newlines in them. */
8666 while (ibp
< limit
) {
8667 *obp
++ = c
= *ibp
++;
8670 if (c
== '\n' && quotec
== '\'')
8672 if (c
== '\\' && ibp
< limit
) {
8673 while (*ibp
== '\\' && ibp
[1] == '\n')
8686 /* Turn newlines to spaces in the string of length LENGTH at START,
8687 except inside of string constants.
8688 The string is copied into itself with its beginning staying fixed. */
8691 change_newlines (start
, length
)
8695 register U_CHAR
*ibp
;
8696 register U_CHAR
*obp
;
8697 register U_CHAR
*limit
;
8701 limit
= start
+ length
;
8704 while (ibp
< limit
) {
8705 *obp
++ = c
= *ibp
++;
8708 /* If this is a NEWLINE NEWLINE, then this is a real newline in the
8709 string. Skip past the newline and its duplicate.
8710 Put a space in the output. */
8721 /* Notice and skip strings, so that we don't delete newlines in them. */
8724 while (ibp
< limit
) {
8725 *obp
++ = c
= *ibp
++;
8728 if (c
== '\n' && quotec
== '\'')
8739 /* my_strerror - return the descriptive text associated with an
8743 my_strerror (errnum
)
8749 #ifndef HAVE_STRERROR
8750 result
= (char *) ((errnum
< sys_nerr
) ? sys_errlist
[errnum
] : 0);
8752 result
= strerror (errnum
);
8755 /* VAXCRTL's strerror() takes an optional second argument, which only
8756 matters when the first argument is EVMSERR. However, it's simplest
8757 just to pass it unconditionally. `vaxc$errno' is declared in
8758 <errno.h>, and maintained by the library in parallel with `errno'.
8759 We assume that caller's `errnum' either matches the last setting of
8760 `errno' by the library or else does not have the value `EVMSERR'. */
8762 result
= strerror (errnum
, vaxc$errno
);
8766 result
= "undocumented I/O error";
8771 /* error - print error message and increment count of errors. */
8774 error (PRINTF_ALIST (msg
))
8779 VA_START (args
, msg
);
8790 FILE_BUF
*ip
= NULL
;
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 vfprintf (stderr
, msg
, args
);
8803 fprintf (stderr
, "\n");
8807 /* Error including a message from `errno'. */
8810 error_from_errno (name
)
8814 FILE_BUF
*ip
= NULL
;
8816 print_containing_files ();
8818 for (i
= indepth
; i
>= 0; i
--)
8819 if (instack
[i
].fname
!= NULL
) {
8825 fprintf (stderr
, "%s:%d: ", ip
->nominal_fname
, ip
->lineno
);
8827 fprintf (stderr
, "%s: %s\n", name
, my_strerror (errno
));
8832 /* Print error message but don't count it. */
8835 warning (PRINTF_ALIST (msg
))
8840 VA_START (args
, msg
);
8841 vwarning (msg
, args
);
8846 vwarning (msg
, args
)
8851 FILE_BUF
*ip
= NULL
;
8853 if (inhibit_warnings
)
8856 if (warnings_are_errors
)
8859 print_containing_files ();
8861 for (i
= indepth
; i
>= 0; i
--)
8862 if (instack
[i
].fname
!= NULL
) {
8868 fprintf (stderr
, "%s:%d: ", ip
->nominal_fname
, ip
->lineno
);
8869 fprintf (stderr
, "warning: ");
8870 vfprintf (stderr
, msg
, args
);
8871 fprintf (stderr
, "\n");
8875 #if defined (__STDC__) && defined (HAVE_VPRINTF)
8876 error_with_line (int line
, PRINTF_ALIST (msg
))
8878 error_with_line (line
, PRINTF_ALIST (msg
))
8885 VA_START (args
, msg
);
8886 verror_with_line (line
, msg
, args
);
8891 verror_with_line (line
, msg
, args
)
8897 FILE_BUF
*ip
= NULL
;
8899 print_containing_files ();
8901 for (i
= indepth
; i
>= 0; i
--)
8902 if (instack
[i
].fname
!= NULL
) {
8908 fprintf (stderr
, "%s:%d: ", ip
->nominal_fname
, line
);
8909 vfprintf (stderr
, msg
, args
);
8910 fprintf (stderr
, "\n");
8915 #if defined (__STDC__) && defined (HAVE_VPRINTF)
8916 warning_with_line (int line
, PRINTF_ALIST (msg
))
8918 warning_with_line (line
, PRINTF_ALIST (msg
))
8925 VA_START (args
, msg
);
8926 vwarning_with_line (line
, msg
, args
);
8931 vwarning_with_line (line
, msg
, args
)
8937 FILE_BUF
*ip
= NULL
;
8939 if (inhibit_warnings
)
8942 if (warnings_are_errors
)
8945 print_containing_files ();
8947 for (i
= indepth
; i
>= 0; i
--)
8948 if (instack
[i
].fname
!= NULL
) {
8954 fprintf (stderr
, line
? "%s:%d: " : "%s: ", ip
->nominal_fname
, line
);
8955 fprintf (stderr
, "warning: ");
8956 vfprintf (stderr
, msg
, args
);
8957 fprintf (stderr
, "\n");
8960 /* Print an error message and maybe count it. */
8963 pedwarn (PRINTF_ALIST (msg
))
8968 VA_START (args
, msg
);
8969 if (pedantic_errors
)
8972 vwarning (msg
, args
);
8977 #if defined (__STDC__) && defined (HAVE_VPRINTF)
8978 pedwarn_with_line (int line
, PRINTF_ALIST (msg
))
8980 pedwarn_with_line (line
, PRINTF_ALIST (msg
))
8987 VA_START (args
, msg
);
8988 if (pedantic_errors
)
8989 verror_with_line (line
, msg
, args
);
8991 vwarning_with_line (line
, msg
, args
);
8995 /* Report a warning (or an error if pedantic_errors)
8996 giving specified file name and line number, not current. */
8999 #if defined (__STDC__) && defined (HAVE_VPRINTF)
9000 pedwarn_with_file_and_line (char *file
, int line
, PRINTF_ALIST (msg
))
9002 pedwarn_with_file_and_line (file
, line
, PRINTF_ALIST (msg
))
9010 if (!pedantic_errors
&& inhibit_warnings
)
9013 fprintf (stderr
, "%s:%d: ", file
, line
);
9014 if (pedantic_errors
)
9016 if (!pedantic_errors
)
9017 fprintf (stderr
, "warning: ");
9018 VA_START (args
, msg
);
9019 vfprintf (stderr
, msg
, args
);
9021 fprintf (stderr
, "\n");
9024 /* Print the file names and line numbers of the #include
9025 directives which led to the current file. */
9028 print_containing_files ()
9030 FILE_BUF
*ip
= NULL
;
9034 /* If stack of files hasn't changed since we last printed
9035 this info, don't repeat it. */
9036 if (last_error_tick
== input_file_stack_tick
)
9039 for (i
= indepth
; i
>= 0; i
--)
9040 if (instack
[i
].fname
!= NULL
) {
9045 /* Give up if we don't find a source file. */
9049 /* Find the other, outer source files. */
9050 for (i
--; i
>= 0; i
--)
9051 if (instack
[i
].fname
!= NULL
) {
9055 fprintf (stderr
, "In file included");
9057 fprintf (stderr
, ",\n ");
9060 fprintf (stderr
, " from %s:%d", ip
->nominal_fname
, ip
->lineno
);
9063 fprintf (stderr
, ":\n");
9065 /* Record we have printed the status as of this time. */
9066 last_error_tick
= input_file_stack_tick
;
9069 /* Return the line at which an error occurred.
9070 The error is not necessarily associated with the current spot
9071 in the input stack, so LINE says where. LINE will have been
9072 copied from ip->lineno for the current input level.
9073 If the current level is for a file, we return LINE.
9074 But if the current level is not for a file, LINE is meaningless.
9075 In that case, we return the lineno of the innermost file. */
9078 line_for_error (line
)
9084 for (i
= indepth
; i
>= 0; ) {
9085 if (instack
[i
].fname
!= 0)
9090 line1
= instack
[i
].lineno
;
9098 * If OBUF doesn't have NEEDED bytes after OPTR, make it bigger.
9100 * As things stand, nothing is ever placed in the output buffer to be
9101 * removed again except when it's KNOWN to be part of an identifier,
9102 * so flushing and moving down everything left, instead of expanding,
9106 /* You might think void was cleaner for the return type,
9107 but that would get type mismatch in check_expand in strict ANSI. */
9110 grow_outbuf (obuf
, needed
)
9111 register FILE_BUF
*obuf
;
9112 register int needed
;
9117 if (obuf
->length
- (obuf
->bufp
- obuf
->buf
) > needed
)
9120 /* Make it at least twice as big as it is now. */
9122 /* Make it have at least 150% of the free space we will need. */
9123 minsize
= (3 * needed
) / 2 + (obuf
->bufp
- obuf
->buf
);
9124 if (minsize
> obuf
->length
)
9125 obuf
->length
= minsize
;
9127 if ((p
= (U_CHAR
*) xrealloc (obuf
->buf
, obuf
->length
)) == NULL
)
9130 obuf
->bufp
= p
+ (obuf
->bufp
- obuf
->buf
);
9136 /* Symbol table for macro names and special symbols */
9139 * install a name in the main hash table, even if it is already there.
9140 * name stops with first non alphanumeric, except leading '#'.
9141 * caller must check against redefinition if that is desired.
9142 * delete_macro () removes things installed by install () in fifo order.
9143 * this is important because of the `defined' special symbol used
9144 * in #if, and also if pushdef/popdef directives are ever implemented.
9146 * If LEN is >= 0, it is the length of the name.
9147 * Otherwise, compute the length by scanning the entire name.
9149 * If HASH is >= 0, it is the precomputed hash code.
9150 * Otherwise, compute the hash code.
9154 install (name
, len
, type
, value
, hash
)
9157 enum node_type type
;
9161 register HASHNODE
*hp
;
9162 register int i
, bucket
;
9163 register U_CHAR
*p
, *q
;
9167 while (is_idchar
[*p
])
9173 hash
= hashf (name
, len
, HASHSIZE
);
9175 i
= sizeof (HASHNODE
) + len
+ 1;
9176 hp
= (HASHNODE
*) xmalloc (i
);
9178 hp
->bucket_hdr
= &hashtab
[bucket
];
9179 hp
->next
= hashtab
[bucket
];
9180 hashtab
[bucket
] = hp
;
9182 if (hp
->next
!= NULL
)
9183 hp
->next
->prev
= hp
;
9186 hp
->value
.cpval
= value
;
9187 hp
->name
= ((U_CHAR
*) hp
) + sizeof (HASHNODE
);
9190 for (i
= 0; i
< len
; i
++)
9197 * find the most recent hash node for name name (ending with first
9198 * non-identifier char) installed by install
9200 * If LEN is >= 0, it is the length of the name.
9201 * Otherwise, compute the length by scanning the entire name.
9203 * If HASH is >= 0, it is the precomputed hash code.
9204 * Otherwise, compute the hash code.
9208 lookup (name
, len
, hash
)
9213 register U_CHAR
*bp
;
9214 register HASHNODE
*bucket
;
9217 for (bp
= name
; is_idchar
[*bp
]; bp
++) ;
9222 hash
= hashf (name
, len
, HASHSIZE
);
9224 bucket
= hashtab
[hash
];
9226 if (bucket
->length
== len
&& bcmp (bucket
->name
, name
, len
) == 0)
9228 bucket
= bucket
->next
;
9234 * Delete a hash node. Some weirdness to free junk from macros.
9235 * More such weirdness will have to be added if you define more hash
9236 * types that need it.
9239 /* Note that the DEFINITION of a macro is removed from the hash table
9240 but its storage is not freed. This would be a storage leak
9241 except that it is not reasonable to keep undefining and redefining
9242 large numbers of macros many times.
9243 In any case, this is necessary, because a macro can be #undef'd
9244 in the middle of reading the arguments to a call to it.
9245 If #undef freed the DEFINITION, that would crash. */
9252 if (hp
->prev
!= NULL
)
9253 hp
->prev
->next
= hp
->next
;
9254 if (hp
->next
!= NULL
)
9255 hp
->next
->prev
= hp
->prev
;
9257 /* Make sure that the bucket chain header that the deleted guy was
9258 on points to the right thing afterwards. */
9259 if (hp
== *hp
->bucket_hdr
)
9260 *hp
->bucket_hdr
= hp
->next
;
9263 if (hp
->type
== T_MACRO
) {
9264 DEFINITION
*d
= hp
->value
.defn
;
9265 struct reflist
*ap
, *nextap
;
9267 for (ap
= d
->pattern
; ap
!= NULL
; ap
= nextap
) {
9278 * return hash function on name. must be compatible with the one
9279 * computed a step at a time, elsewhere
9283 hashf (name
, len
, hashsize
)
9284 register U_CHAR
*name
;
9291 r
= HASHSTEP (r
, *name
++);
9293 return MAKE_POS (r
) % hashsize
;
9297 /* Dump the definition of a single macro HP to OF. */
9300 dump_single_macro (hp
, of
)
9301 register HASHNODE
*hp
;
9304 register DEFINITION
*defn
= hp
->value
.defn
;
9310 /* Print the definition of the macro HP. */
9312 fprintf (of
, "#define %s", hp
->name
);
9314 if (defn
->nargs
>= 0) {
9318 for (i
= 0; i
< defn
->nargs
; i
++) {
9319 dump_arg_n (defn
, i
, of
);
9320 if (i
+ 1 < defn
->nargs
)
9330 for (ap
= defn
->pattern
; ap
!= NULL
; ap
= ap
->next
) {
9331 dump_defn_1 (defn
->expansion
, offset
, ap
->nchars
, of
);
9332 offset
+= ap
->nchars
;
9334 if (ap
->nchars
!= 0)
9336 if (ap
->stringify
) {
9337 switch (ap
->stringify
) {
9338 case SHARP_TOKEN
: fprintf (of
, "#"); break;
9339 case WHITE_SHARP_TOKEN
: fprintf (of
, "# "); break;
9340 case PERCENT_COLON_TOKEN
: fprintf (of
, "%%:"); break;
9341 case WHITE_PERCENT_COLON_TOKEN
: fprintf (of
, "%%: "); break;
9345 if (ap
->raw_before
!= 0) {
9347 switch (ap
->raw_before
) {
9348 case WHITE_SHARP_TOKEN
:
9349 case WHITE_PERCENT_COLON_TOKEN
:
9356 switch (ap
->raw_before
) {
9357 case SHARP_TOKEN
: fprintf (of
, "##"); break;
9358 case WHITE_SHARP_TOKEN
: fprintf (of
, "## "); break;
9359 case PERCENT_COLON_TOKEN
: fprintf (of
, "%%:%%:"); break;
9360 case WHITE_PERCENT_COLON_TOKEN
: fprintf (of
, "%%:%%: "); break;
9367 dump_arg_n (defn
, ap
->argno
, of
);
9368 if (!traditional
&& ap
->raw_after
!= 0) {
9369 switch (ap
->raw_after
) {
9370 case SHARP_TOKEN
: fprintf (of
, "##"); break;
9371 case WHITE_SHARP_TOKEN
: fprintf (of
, " ##"); break;
9372 case PERCENT_COLON_TOKEN
: fprintf (of
, "%%:%%:"); break;
9373 case WHITE_PERCENT_COLON_TOKEN
: fprintf (of
, " %%:%%:"); break;
9379 dump_defn_1 (defn
->expansion
, offset
, defn
->length
- offset
, of
);
9383 /* Dump all macro definitions as #defines to stdout. */
9390 for (bucket
= 0; bucket
< HASHSIZE
; bucket
++) {
9391 register HASHNODE
*hp
;
9393 for (hp
= hashtab
[bucket
]; hp
; hp
= hp
->next
) {
9394 if (hp
->type
== T_MACRO
)
9395 dump_single_macro (hp
, stdout
);
9400 /* Output to OF a substring of a macro definition.
9401 BASE is the beginning of the definition.
9402 Output characters START thru LENGTH.
9403 Unless traditional, discard newlines outside of strings, thus
9404 converting funny-space markers to ordinary spaces. */
9407 dump_defn_1 (base
, start
, length
, of
)
9413 U_CHAR
*p
= base
+ start
;
9414 U_CHAR
*limit
= base
+ start
+ length
;
9417 fwrite (p
, sizeof (*p
), length
, of
);
9420 if (*p
== '\"' || *p
=='\'') {
9421 U_CHAR
*p1
= skip_quoted_string (p
, limit
, 0, NULL_PTR
,
9422 NULL_PTR
, NULL_PTR
);
9423 fwrite (p
, sizeof (*p
), p1
- p
, of
);
9434 /* Print the name of argument number ARGNUM of macro definition DEFN
9436 Recall that DEFN->args.argnames contains all the arg names
9437 concatenated in reverse order with comma-space in between. */
9440 dump_arg_n (defn
, argnum
, of
)
9445 register U_CHAR
*p
= defn
->args
.argnames
;
9446 while (argnum
+ 1 < defn
->nargs
) {
9447 p
= (U_CHAR
*) index ((char *) p
, ' ') + 1;
9451 while (*p
&& *p
!= ',') {
9457 /* Initialize syntactic classifications of characters. */
9460 initialize_char_syntax ()
9465 * Set up is_idchar and is_idstart tables. These should be
9466 * faster than saying (is_alpha (c) || c == '_'), etc.
9467 * Set up these things before calling any routines tthat
9470 for (i
= 'a'; i
<= 'z'; i
++) {
9471 is_idchar
[i
- 'a' + 'A'] = 1;
9473 is_idstart
[i
- 'a' + 'A'] = 1;
9476 for (i
= '0'; i
<= '9'; i
++)
9479 is_idstart
['_'] = 1;
9481 is_idstart
['$'] = 1;
9483 /* horizontal space table */
9484 is_hor_space
[' '] = 1;
9485 is_hor_space
['\t'] = 1;
9486 is_hor_space
['\v'] = 1;
9487 is_hor_space
['\f'] = 1;
9488 is_hor_space
['\r'] = 1;
9497 char_name
['\v'] = "vertical tab";
9498 char_name
['\f'] = "formfeed";
9499 char_name
['\r'] = "carriage return";
9502 /* Initialize the built-in macros. */
9505 initialize_builtins (inp
, outp
)
9509 install ((U_CHAR
*) "__LINE__", -1, T_SPECLINE
, NULL_PTR
, -1);
9510 install ((U_CHAR
*) "__DATE__", -1, T_DATE
, NULL_PTR
, -1);
9511 install ((U_CHAR
*) "__FILE__", -1, T_FILE
, NULL_PTR
, -1);
9512 install ((U_CHAR
*) "__BASE_FILE__", -1, T_BASE_FILE
, NULL_PTR
, -1);
9513 install ((U_CHAR
*) "__INCLUDE_LEVEL__", -1, T_INCLUDE_LEVEL
, NULL_PTR
, -1);
9514 install ((U_CHAR
*) "__VERSION__", -1, T_VERSION
, NULL_PTR
, -1);
9515 #ifndef NO_BUILTIN_SIZE_TYPE
9516 install ((U_CHAR
*) "__SIZE_TYPE__", -1, T_SIZE_TYPE
, NULL_PTR
, -1);
9518 #ifndef NO_BUILTIN_PTRDIFF_TYPE
9519 install ((U_CHAR
*) "__PTRDIFF_TYPE__ ", -1, T_PTRDIFF_TYPE
, NULL_PTR
, -1);
9521 install ((U_CHAR
*) "__WCHAR_TYPE__", -1, T_WCHAR_TYPE
, NULL_PTR
, -1);
9522 install ((U_CHAR
*) "__USER_LABEL_PREFIX__", -1, T_USER_LABEL_PREFIX_TYPE
,
9524 install ((U_CHAR
*) "__REGISTER_PREFIX__", -1, T_REGISTER_PREFIX_TYPE
,
9526 install ((U_CHAR
*) "__IMMEDIATE_PREFIX__", -1, T_IMMEDIATE_PREFIX_TYPE
,
9528 install ((U_CHAR
*) "__TIME__", -1, T_TIME
, NULL_PTR
, -1);
9530 install ((U_CHAR
*) "__STDC__", -1, T_CONST
, "1", -1);
9531 install ((U_CHAR
*) "__STDC_VERSION__", -1, T_CONST
, "199409L", -1);
9534 install ((U_CHAR
*) "__OBJC__", -1, T_CONST
, "1", -1);
9535 /* This is supplied using a -D by the compiler driver
9536 so that it is present only when truly compiling with GNU C. */
9537 /* install ((U_CHAR *) "__GNUC__", -1, T_CONST, "2", -1); */
9538 install ((U_CHAR
*) "__HAVE_BUILTIN_SETJMP__", -1, T_CONST
, "1", -1);
9542 char directive
[2048];
9543 U_CHAR
*udirective
= (U_CHAR
*) directive
;
9544 register struct directive
*dp
= &directive_table
[0];
9545 struct tm
*timebuf
= timestamp ();
9547 sprintf (directive
, " __BASE_FILE__ \"%s\"\n",
9548 instack
[0].nominal_fname
);
9549 output_line_directive (inp
, outp
, 0, same_file
);
9550 pass_thru_directive (udirective
, &udirective
[strlen (directive
)],
9553 sprintf (directive
, " __VERSION__ \"%s\"\n", version_string
);
9554 output_line_directive (inp
, outp
, 0, same_file
);
9555 pass_thru_directive (udirective
, &udirective
[strlen (directive
)],
9558 #ifndef NO_BUILTIN_SIZE_TYPE
9559 sprintf (directive
, " __SIZE_TYPE__ %s\n", SIZE_TYPE
);
9560 output_line_directive (inp
, outp
, 0, same_file
);
9561 pass_thru_directive (udirective
, &udirective
[strlen (directive
)],
9565 #ifndef NO_BUILTIN_PTRDIFF_TYPE
9566 sprintf (directive
, " __PTRDIFF_TYPE__ %s\n", PTRDIFF_TYPE
);
9567 output_line_directive (inp
, outp
, 0, same_file
);
9568 pass_thru_directive (udirective
, &udirective
[strlen (directive
)],
9572 sprintf (directive
, " __WCHAR_TYPE__ %s\n", wchar_type
);
9573 output_line_directive (inp
, outp
, 0, same_file
);
9574 pass_thru_directive (udirective
, &udirective
[strlen (directive
)],
9577 sprintf (directive
, " __DATE__ \"%s %2d %4d\"\n",
9578 monthnames
[timebuf
->tm_mon
],
9579 timebuf
->tm_mday
, timebuf
->tm_year
+ 1900);
9580 output_line_directive (inp
, outp
, 0, same_file
);
9581 pass_thru_directive (udirective
, &udirective
[strlen (directive
)],
9584 sprintf (directive
, " __TIME__ \"%02d:%02d:%02d\"\n",
9585 timebuf
->tm_hour
, timebuf
->tm_min
, timebuf
->tm_sec
);
9586 output_line_directive (inp
, outp
, 0, same_file
);
9587 pass_thru_directive (udirective
, &udirective
[strlen (directive
)],
9592 sprintf (directive
, " __STDC__ 1");
9593 output_line_directive (inp
, outp
, 0, same_file
);
9594 pass_thru_directive (udirective
, &udirective
[strlen (directive
)],
9599 sprintf (directive
, " __OBJC__ 1");
9600 output_line_directive (inp
, outp
, 0, same_file
);
9601 pass_thru_directive (udirective
, &udirective
[strlen (directive
)],
9608 * process a given definition string, for initialization
9609 * If STR is just an identifier, define it with value 1.
9610 * If STR has anything after the identifier, then it should
9611 * be identifier=definition.
9615 make_definition (str
, op
)
9620 struct directive
*kt
;
9623 p
= buf
= (U_CHAR
*) str
;
9624 if (!is_idstart
[*p
]) {
9625 error ("malformed option `-D %s'", str
);
9628 while (is_idchar
[*++p
])
9631 while (is_idchar
[*++p
] || *p
== ',' || is_hor_space
[*p
])
9634 p
= (U_CHAR
*) str
; /* Error */
9637 buf
= (U_CHAR
*) alloca (p
- buf
+ 4);
9638 strcpy ((char *)buf
, str
);
9639 strcat ((char *)buf
, " 1");
9640 } else if (*p
!= '=') {
9641 error ("malformed option `-D %s'", str
);
9645 /* Copy the entire option so we can modify it. */
9646 buf
= (U_CHAR
*) alloca (2 * strlen (str
) + 1);
9647 strncpy ((char *) buf
, str
, p
- (U_CHAR
*) str
);
9648 /* Change the = to a space. */
9649 buf
[p
- (U_CHAR
*) str
] = ' ';
9650 /* Scan for any backslash-newline and remove it. */
9652 q
= &buf
[p
- (U_CHAR
*) str
];
9654 if (*p
== '\"' || *p
== '\'') {
9655 int unterminated
= 0;
9656 U_CHAR
*p1
= skip_quoted_string (p
, p
+ strlen ((char *) p
), 0,
9657 NULL_PTR
, NULL_PTR
, &unterminated
);
9661 if (*p
== '\\' && p
[1] == '\n')
9665 } else if (*p
== '\\' && p
[1] == '\n')
9667 /* Change newline chars into newline-markers. */
9668 else if (*p
== '\n')
9680 ip
= &instack
[++indepth
];
9681 ip
->nominal_fname
= ip
->fname
= "*Initialization*";
9683 ip
->buf
= ip
->bufp
= buf
;
9684 ip
->length
= strlen ((char *) buf
);
9688 ip
->if_stack
= if_stack
;
9689 ip
->system_header_p
= 0;
9691 for (kt
= directive_table
; kt
->type
!= T_DEFINE
; kt
++)
9694 /* Pass NULL instead of OP, since this is a "predefined" macro. */
9695 do_define (buf
, buf
+ strlen ((char *) buf
), NULL_PTR
, kt
);
9699 /* JF, this does the work for the -U option */
9702 make_undef (str
, op
)
9707 struct directive
*kt
;
9709 ip
= &instack
[++indepth
];
9710 ip
->nominal_fname
= ip
->fname
= "*undef*";
9712 ip
->buf
= ip
->bufp
= (U_CHAR
*) str
;
9713 ip
->length
= strlen (str
);
9717 ip
->if_stack
= if_stack
;
9718 ip
->system_header_p
= 0;
9720 for (kt
= directive_table
; kt
->type
!= T_UNDEF
; kt
++)
9723 do_undef ((U_CHAR
*) str
, (U_CHAR
*) str
+ strlen (str
), op
, kt
);
9727 /* Process the string STR as if it appeared as the body of a #assert.
9728 OPTION is the option name for which STR was the argument. */
9731 make_assertion (option
, str
)
9736 struct directive
*kt
;
9737 U_CHAR
*buf
, *p
, *q
;
9739 /* Copy the entire option so we can modify it. */
9740 buf
= (U_CHAR
*) alloca (strlen (str
) + 1);
9741 strcpy ((char *) buf
, str
);
9742 /* Scan for any backslash-newline and remove it. */
9745 if (*p
== '\\' && p
[1] == '\n')
9753 if (!is_idstart
[*p
]) {
9754 error ("malformed option `%s %s'", option
, str
);
9757 while (is_idchar
[*++p
])
9759 SKIP_WHITE_SPACE (p
);
9760 if (! (*p
== 0 || *p
== '(')) {
9761 error ("malformed option `%s %s'", option
, str
);
9765 ip
= &instack
[++indepth
];
9766 ip
->nominal_fname
= ip
->fname
= "*Initialization*";
9768 ip
->buf
= ip
->bufp
= buf
;
9769 ip
->length
= strlen ((char *) buf
);
9773 ip
->if_stack
= if_stack
;
9774 ip
->system_header_p
= 0;
9776 for (kt
= directive_table
; kt
->type
!= T_ASSERT
; kt
++)
9779 /* Pass NULL as output ptr to do_define since we KNOW it never does
9781 do_assert (buf
, buf
+ strlen ((char *) buf
) , NULL_PTR
, kt
);
9785 /* The previous include prefix, if any, is PREV_FILE_NAME.
9786 Allocate a new include prefix whose name is the
9787 simplified concatenation of PREFIX and NAME,
9788 with a trailing / added if needed.
9789 But return 0 if the include prefix should be ignored,
9790 e.g. because it is a duplicate of PREV_FILE_NAME. */
9792 static struct file_name_list
*
9793 new_include_prefix (prev_file_name
, prefix
, name
)
9794 struct file_name_list
*prev_file_name
;
9799 fatal ("Directory name missing after command line option");
9802 /* Ignore the empty string. */
9805 struct file_name_list
*dir
9806 = ((struct file_name_list
*)
9807 xmalloc (sizeof (struct file_name_list
)
9808 + strlen (prefix
) + strlen (name
) + 1 /* for trailing / */));
9810 strcpy (dir
->fname
, prefix
);
9811 strcat (dir
->fname
, name
);
9812 len
= simplify_filename (dir
->fname
);
9814 /* Convert directory name to a prefix. */
9815 if (dir
->fname
[len
- 1] != '/') {
9816 if (len
== 1 && dir
->fname
[len
- 1] == '.')
9819 dir
->fname
[len
++] = '/';
9820 dir
->fname
[len
] = 0;
9823 /* Ignore a directory whose name matches the previous one. */
9824 if (prev_file_name
&& !strcmp (prev_file_name
->fname
, dir
->fname
)) {
9825 /* But treat `-Idir -I- -Idir' as `-I- -Idir'. */
9826 if (!first_bracket_include
)
9827 first_bracket_include
= prev_file_name
;
9833 /* VMS can't stat dir prefixes, so skip these optimizations in VMS. */
9835 /* Ignore a nonexistent directory. */
9836 if (stat (len
? dir
->fname
: ".", &dir
->st
) != 0) {
9837 if (errno
!= ENOENT
&& errno
!= ENOTDIR
)
9838 error_from_errno (dir
->fname
);
9843 /* Ignore a directory whose identity matches the previous one. */
9845 && INO_T_EQ (prev_file_name
->st
.st_ino
, dir
->st
.st_ino
)
9846 && prev_file_name
->st
.st_dev
== dir
->st
.st_dev
) {
9847 /* But treat `-Idir -I- -Idir' as `-I- -Idir'. */
9848 if (!first_bracket_include
)
9849 first_bracket_include
= prev_file_name
;
9856 dir
->c_system_include_path
= 0;
9857 dir
->got_name_map
= 0;
9863 /* Append a chain of `struct file_name_list's
9864 to the end of the main include chain.
9865 FIRST is the beginning of the chain to append, and LAST is the end. */
9868 append_include_chain (first
, last
)
9869 struct file_name_list
*first
, *last
;
9871 struct file_name_list
*dir
;
9873 if (!first
|| !last
)
9879 last_include
->next
= first
;
9881 if (first_bracket_include
== 0)
9882 first_bracket_include
= first
;
9884 for (dir
= first
; ; dir
= dir
->next
) {
9885 int len
= strlen (dir
->fname
) + INCLUDE_LEN_FUDGE
;
9886 if (len
> max_include_len
)
9887 max_include_len
= len
;
9893 last_include
= last
;
9896 /* Add output to `deps_buffer' for the -M switch.
9897 STRING points to the text to be output.
9898 SPACER is ':' for targets, ' ' for dependencies. */
9901 deps_output (string
, spacer
)
9905 int size
= strlen (string
);
9910 #ifndef MAX_OUTPUT_COLUMNS
9911 #define MAX_OUTPUT_COLUMNS 72
9913 if (MAX_OUTPUT_COLUMNS
- 1 /*spacer*/ - 2 /*` \'*/ < deps_column
+ size
9914 && 1 < deps_column
) {
9915 bcopy (" \\\n ", &deps_buffer
[deps_size
], 4);
9922 if (deps_size
+ size
+ 8 > deps_allocated_size
) {
9923 deps_allocated_size
= (deps_size
+ size
+ 50) * 2;
9924 deps_buffer
= xrealloc (deps_buffer
, deps_allocated_size
);
9926 if (spacer
== ' ') {
9927 deps_buffer
[deps_size
++] = ' ';
9930 bcopy (string
, &deps_buffer
[deps_size
], size
);
9932 deps_column
+= size
;
9933 if (spacer
== ':') {
9934 deps_buffer
[deps_size
++] = ':';
9937 deps_buffer
[deps_size
] = 0;
9941 fatal (PRINTF_ALIST (msg
))
9946 fprintf (stderr
, "%s: ", progname
);
9947 VA_START (args
, msg
);
9948 vfprintf (stderr
, msg
, args
);
9950 fprintf (stderr
, "\n");
9951 exit (FATAL_EXIT_CODE
);
9954 /* More 'friendly' abort that prints the line and file.
9955 config.h can #define abort fancy_abort if you like that sort of thing. */
9960 fatal ("Internal gcc abort.");
9964 perror_with_name (name
)
9967 fprintf (stderr
, "%s: ", progname
);
9968 fprintf (stderr
, "%s: %s\n", name
, my_strerror (errno
));
9973 pfatal_with_name (name
)
9976 perror_with_name (name
);
9980 exit (FATAL_EXIT_CODE
);
9984 /* Handler for SIGPIPE. */
9988 /* If this is missing, some compilers complain. */
9991 fatal ("output pipe has been closed");
9997 fatal ("Memory exhausted.");
10005 register GENERIC_PTR ptr
= (GENERIC_PTR
) malloc (size
);
10012 xrealloc (old
, size
)
10016 register GENERIC_PTR ptr
= (GENERIC_PTR
) realloc (old
, size
);
10023 xcalloc (number
, size
)
10024 size_t number
, size
;
10026 register size_t total
= number
* size
;
10027 register GENERIC_PTR ptr
= (GENERIC_PTR
) malloc (total
);
10030 bzero (ptr
, total
);
10038 size_t size
= strlen (input
);
10039 char *output
= xmalloc (size
+ 1);
10040 strcpy (output
, input
);
10046 /* Under VMS we need to fix up the "include" specification filename so
10047 that everything following the 1st slash is changed into its correct
10048 VMS file specification. */
10051 hack_vms_include_specification (fname
, vaxc_include
)
10055 register char *cp
, *cp1
, *cp2
;
10056 int f
, check_filename_before_returning
;
10059 check_filename_before_returning
= 0;
10061 cp
= base_name (fname
);
10064 * Check if we have a vax-c style '#include filename'
10065 * and add the missing .h
10067 if (vaxc_include
&& !index (cp
,'.'))
10070 cp2
= Local
; /* initialize */
10072 /* We are trying to do a number of things here. First of all, we are
10073 trying to hammer the filenames into a standard format, such that later
10074 processing can handle them.
10076 If the file name contains something like [dir.], then it recognizes this
10077 as a root, and strips the ".]". Later processing will add whatever is
10078 needed to get things working properly.
10080 If no device is specified, then the first directory name is taken to be
10081 a device name (or a rooted logical). */
10083 /* See if we found that 1st slash */
10084 if (cp
== 0) return; /* Nothing to do!!! */
10085 if (*cp
!= '/') return; /* Nothing to do!!! */
10086 /* Point to the UNIX filename part (which needs to be fixed!) */
10088 /* If the directory spec is not rooted, we can just copy
10089 the UNIX filename part and we are done */
10090 if (((cp
- fname
) > 1) && ((cp
[-1] == ']') || (cp
[-1] == '>'))) {
10091 if (cp
[-2] != '.') {
10093 * The VMS part ends in a `]', and the preceding character is not a `.'.
10094 * We strip the `]', and then splice the two parts of the name in the
10095 * usual way. Given the default locations for include files in cccp.c,
10096 * we will only use this code if the user specifies alternate locations
10097 * with the /include (-I) switch on the command line. */
10098 cp
-= 1; /* Strip "]" */
10099 cp1
--; /* backspace */
10102 * The VMS part has a ".]" at the end, and this will not do. Later
10103 * processing will add a second directory spec, and this would be a syntax
10104 * error. Thus we strip the ".]", and thus merge the directory specs.
10105 * We also backspace cp1, so that it points to a '/'. This inhibits the
10106 * generation of the 000000 root directory spec (which does not belong here
10109 cp
-= 2; /* Strip ".]" */
10110 cp1
--; }; /* backspace */
10113 /* We drop in here if there is no VMS style directory specification yet.
10114 * If there is no device specification either, we make the first dir a
10115 * device and try that. If we do not do this, then we will be essentially
10116 * searching the users default directory (as if they did a #include "asdf.h").
10118 * Then all we need to do is to push a '[' into the output string. Later
10119 * processing will fill this in, and close the bracket.
10121 if (cp
[-1] != ':') *cp2
++ = ':'; /* dev not in spec. take first dir */
10122 *cp2
++ = '['; /* Open the directory specification */
10125 /* at this point we assume that we have the device spec, and (at least
10126 the opening "[" for a directory specification. We may have directories
10127 specified already */
10129 /* If there are no other slashes then the filename will be
10130 in the "root" directory. Otherwise, we need to add
10131 directory specifications. */
10132 if (index (cp1
, '/') == 0) {
10133 /* Just add "000000]" as the directory string */
10134 strcpy (cp2
, "000000]");
10135 cp2
+= strlen (cp2
);
10136 check_filename_before_returning
= 1; /* we might need to fool with this later */
10138 /* As long as there are still subdirectories to add, do them. */
10139 while (index (cp1
, '/') != 0) {
10140 /* If this token is "." we can ignore it */
10141 if ((cp1
[0] == '.') && (cp1
[1] == '/')) {
10145 /* Add a subdirectory spec. Do not duplicate "." */
10146 if (cp2
[-1] != '.' && cp2
[-1] != '[' && cp2
[-1] != '<')
10148 /* If this is ".." then the spec becomes "-" */
10149 if ((cp1
[0] == '.') && (cp1
[1] == '.') && (cp
[2] == '/')) {
10150 /* Add "-" and skip the ".." */
10155 /* Copy the subdirectory */
10156 while (*cp1
!= '/') *cp2
++= *cp1
++;
10157 cp1
++; /* Skip the "/" */
10159 /* Close the directory specification */
10160 if (cp2
[-1] == '.') /* no trailing periods */
10164 /* Now add the filename */
10165 while (*cp1
) *cp2
++ = *cp1
++;
10167 /* Now append it to the original VMS spec. */
10168 strcpy (cp
, Local
);
10170 /* If we put a [000000] in the filename, try to open it first. If this fails,
10171 remove the [000000], and return that name. This provides flexibility
10172 to the user in that they can use both rooted and non-rooted logical names
10173 to point to the location of the file. */
10175 if (check_filename_before_returning
) {
10176 f
= open (fname
, O_RDONLY
, 0666);
10178 /* The file name is OK as it is, so return it as is. */
10182 /* The filename did not work. Try to remove the [000000] from the name,
10184 cp
= index (fname
, '[');
10185 cp2
= index (fname
, ']') + 1;
10186 strcpy (cp
, cp2
); /* this gets rid of it */
10194 /* The following wrapper functions supply additional arguments to the VMS
10195 I/O routines to optimize performance with file handling. The arguments
10197 "mbc=16" - Set multi-block count to 16 (use a 8192 byte buffer).
10198 "deq=64" - When extending the file, extend it in chunks of 32Kbytes.
10199 "fop=tef"- Truncate unused portions of file when closing file.
10200 "shr=nil"- Disallow file sharing while file is open. */
10203 freopen (fname
, type
, oldfile
)
10208 #undef freopen /* Get back the REAL fopen routine */
10209 if (strcmp (type
, "w") == 0)
10210 return freopen (fname
, type
, oldfile
, "mbc=16", "deq=64", "fop=tef", "shr=nil");
10211 return freopen (fname
, type
, oldfile
, "mbc=16");
10215 fopen (fname
, type
)
10219 #undef fopen /* Get back the REAL fopen routine */
10220 /* The gcc-vms-1.42 distribution's header files prototype fopen with two
10221 fixed arguments, which matches ANSI's specification but not VAXCRTL's
10222 pre-ANSI implementation. This hack circumvents the mismatch problem. */
10223 FILE *(*vmslib_fopen
)() = (FILE *(*)()) fopen
;
10226 return (*vmslib_fopen
) (fname
, type
, "mbc=32",
10227 "deq=64", "fop=tef", "shr=nil");
10229 return (*vmslib_fopen
) (fname
, type
, "mbc=32");
10233 open (fname
, flags
, prot
)
10238 #undef open /* Get back the REAL open routine */
10239 return open (fname
, flags
, prot
, "mbc=16", "deq=64", "fop=tef");
10242 /* more VMS hackery */
10246 extern unsigned long sys$
parse(), sys$
search();
10248 /* Work around another library bug. If a file is located via a searchlist,
10249 and if the device it's on is not the same device as the one specified
10250 in the first element of that searchlist, then both stat() and fstat()
10251 will fail to return info about it. `errno' will be set to EVMSERR, and
10252 `vaxc$errno' will be set to SS$_NORMAL due yet another bug in stat()!
10253 We can get around this by fully parsing the filename and then passing
10254 that absolute name to stat().
10256 Without this fix, we can end up failing to find header files, which is
10257 bad enough, but then compounding the problem by reporting the reason for
10258 failure as "normal successful completion." */
10260 #undef fstat /* get back to library version */
10263 VMS_fstat (fd
, statbuf
)
10265 struct stat
*statbuf
;
10267 int result
= fstat (fd
, statbuf
);
10272 char nambuf
[NAM$C_MAXRSS
+1];
10274 if ((fp
= fdopen (fd
, "r")) != 0 && fgetname (fp
, nambuf
) != 0)
10275 result
= VMS_stat (nambuf
, statbuf
);
10276 /* No fclose(fp) here; that would close(fd) as well. */
10283 VMS_stat (name
, statbuf
)
10285 struct stat
*statbuf
;
10287 int result
= stat (name
, statbuf
);
10293 char exp_nam
[NAM$C_MAXRSS
+1], /* expanded name buffer for sys$parse */
10294 res_nam
[NAM$C_MAXRSS
+1]; /* resultant name buffer for sys$search */
10297 fab
.fab$l_fna
= (char *) name
;
10298 fab
.fab$b_fns
= (unsigned char) strlen (name
);
10299 fab
.fab$l_nam
= (void *) &nam
;
10301 nam
.nam$l_esa
= exp_nam
, nam
.nam$b_ess
= sizeof exp_nam
- 1;
10302 nam
.nam$l_rsa
= res_nam
, nam
.nam$b_rss
= sizeof res_nam
- 1;
10303 nam
.nam$b_nop
= NAM$M_PWD
| NAM$M_NOCONCEAL
;
10304 if (sys$
parse (&fab
) & 1)
10306 if (sys$
search (&fab
) & 1)
10308 res_nam
[nam
.nam$b_rsl
] = '\0';
10309 result
= stat (res_nam
, statbuf
);
10311 /* Clean up searchlist context cached by the system. */
10312 nam
.nam$b_nop
= NAM$M_SYNCHK
;
10313 fab
.fab$l_fna
= 0, fab
.fab$b_fns
= 0;
10314 (void) sys$
parse (&fab
);