diff options
author | Dave Brolley <brolley@cygnus.com> | 1998-05-21 08:54:04 +0000 |
---|---|---|
committer | Dave Brolley <brolley@gcc.gnu.org> | 1998-05-21 04:54:04 -0400 |
commit | c87248620c69e3cc5234e16889c7051b372cb61a (patch) | |
tree | 90fed89e61e9fd2bf61cf04959aef270cf529fdb /gcc/c-common.c | |
parent | 39d6585022489902100df3dc47f799183c6aeac1 (diff) | |
download | gcc-c87248620c69e3cc5234e16889c7051b372cb61a.zip gcc-c87248620c69e3cc5234e16889c7051b372cb61a.tar.gz gcc-c87248620c69e3cc5234e16889c7051b372cb61a.tar.bz2 |
configure.in (extra_c_objs): add prefix.o.
Thu May 21 11:51:15 1998 Dave Brolley <brolley@cygnus.com>
* configure.in (extra_c_objs): add prefix.o.
(extra_cxx_objs): extra objects for C++ with cpplib.
* configure: Regenerate.
* c-tree.h: (get_directive_line): Different prototype for cpplib.
(GET_DIRECTIVE_LINE): Macro wrapper for get_directive_line.
* c-lex.h: (get_directive_line): Not needed here for cpplib.
* c-lex.c: (yy_cur,yy_lim,yy_get_token): Move to c-common.c.
(GET_DIRECTIVE_LINE): Move to c-common.c and rename to get_directive_line.
* c-common.c (parse_in,parse_options,cpp_token): Declare for cpplib.
(yy_cur,yy_lim,yy_get_token,get_directive,line): Moved here from c-lex.c
From-SVN: r19926
Diffstat (limited to 'gcc/c-common.c')
-rw-r--r-- | gcc/c-common.c | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/gcc/c-common.c b/gcc/c-common.c index bc93ea2..120e3e8 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -28,6 +28,13 @@ Boston, MA 02111-1307, USA. */ #include "toplev.h" #include "output.h" +#if USE_CPPLIB +#include "cpplib.h" +cpp_reader parse_in; +cpp_options parse_options; +static enum cpp_token cpp_token; +#endif + #ifndef WCHAR_TYPE_SIZE #ifdef INT_TYPE_SIZE #define WCHAR_TYPE_SIZE INT_TYPE_SIZE @@ -2673,6 +2680,105 @@ truthvalue_conversion (expr) return build_binary_op (NE_EXPR, expr, integer_zero_node, 1); } +#if USE_CPPLIB +/* Read the rest of a #-directive from input stream FINPUT. + In normal use, the directive name and the white space after it + have already been read, so they won't be included in the result. + We allow for the fact that the directive line may contain + a newline embedded within a character or string literal which forms + a part of the directive. + + The value is a string in a reusable buffer. It remains valid + only until the next time this function is called. */ +unsigned char *yy_cur, *yy_lim; + +#define GETC() (yy_cur < yy_lim ? *yy_cur++ : yy_get_token ()) +#define UNGETC(c) ((c), yy_cur--) + +int +yy_get_token () +{ + for (;;) + { + parse_in.limit = parse_in.token_buffer; + cpp_token = cpp_get_token (&parse_in); + if (cpp_token == CPP_EOF) + return -1; + yy_lim = CPP_PWRITTEN (&parse_in); + yy_cur = parse_in.token_buffer; + if (yy_cur < yy_lim) + return *yy_cur++; + } +} + +char * +get_directive_line () +{ + static char *directive_buffer = NULL; + static unsigned buffer_length = 0; + register char *p; + register char *buffer_limit; + register int looking_for = 0; + register int char_escaped = 0; + + if (buffer_length == 0) + { + directive_buffer = (char *)xmalloc (128); + buffer_length = 128; + } + + buffer_limit = &directive_buffer[buffer_length]; + + for (p = directive_buffer; ; ) + { + int c; + + /* Make buffer bigger if it is full. */ + if (p >= buffer_limit) + { + register unsigned bytes_used = (p - directive_buffer); + + buffer_length *= 2; + directive_buffer + = (char *)xrealloc (directive_buffer, buffer_length); + p = &directive_buffer[bytes_used]; + buffer_limit = &directive_buffer[buffer_length]; + } + + c = GETC (); + + /* Discard initial whitespace. */ + if ((c == ' ' || c == '\t') && p == directive_buffer) + continue; + + /* Detect the end of the directive. */ + if (c == '\n' && looking_for == 0) + { + UNGETC (c); + c = '\0'; + } + + *p++ = c; + + if (c == 0) + return directive_buffer; + + /* Handle string and character constant syntax. */ + if (looking_for) + { + if (looking_for == c && !char_escaped) + looking_for = 0; /* Found terminator... stop looking. */ + } + else + if (c == '\'' || c == '"') + looking_for = c; /* Don't stop buffering until we see another + another one of these (or an EOF). */ + + /* Handle backslash. */ + char_escaped = (c == '\\' && ! char_escaped); + } +} +#else /* Read the rest of a #-directive from input stream FINPUT. In normal use, the directive name and the white space after it have already been read, so they won't be included in the result. @@ -2755,6 +2861,7 @@ get_directive_line (finput) char_escaped = (c == '\\' && ! char_escaped); } } +#endif /* !USE_CPPLIB */ /* Make a variant type in the proper way for C/C++, propagating qualifiers down to the element type of an array. */ |