aboutsummaryrefslogtreecommitdiff
path: root/gcc/c-common.c
diff options
context:
space:
mode:
authorDave Brolley <brolley@cygnus.com>1998-05-21 08:54:04 +0000
committerDave Brolley <brolley@gcc.gnu.org>1998-05-21 04:54:04 -0400
commitc87248620c69e3cc5234e16889c7051b372cb61a (patch)
tree90fed89e61e9fd2bf61cf04959aef270cf529fdb /gcc/c-common.c
parent39d6585022489902100df3dc47f799183c6aeac1 (diff)
downloadgcc-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.c107
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. */