This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Infrastructure patch for cpplib: token lists


This is infrastructure only.  Nothing uses this code.  Yet.

zw

	* cpplib.h (enum cpp_ttype): Add token types for all
	punctuators.  Distinguish pp-numbers from valid C numbers.
	Give some tokens better names.  Initialize from macro.
	(struct cpp_name, cpp_token, cpp_toklist): New data
	structures.
	Update prototypes.
	* cpplex.c (bump_column, expand_name_space,
	expand_token_space, init_token_list, cpp_output_list,
	_cpp_scan_line):  New functions.
	(output_line_command): Add third argument, new line number.
	* cpphash.h: Update prototypes.
	* cppexp.c, cpphash.c, cpplib.c, scan-decls.c: Update for new
	token names.

===================================================================
Index: cppexp.c
--- cppexp.c	2000/04/18 20:41:59	1.51
+++ cppexp.c	2000/04/20 19:22:58
@@ -348,7 +348,7 @@ parse_defined (pfile)
 
   pfile->no_macro_expand++;
   token = _cpp_get_directive_token (pfile);
-  if (token == CPP_LPAREN)
+  if (token == CPP_OPEN_PAREN)
     {
       paren++;
       CPP_SET_WRITTEN (pfile, old_written);
@@ -364,7 +364,7 @@ parse_defined (pfile)
 
   if (paren)
     {
-      if (_cpp_get_directive_token (pfile) != CPP_RPAREN)
+      if (_cpp_get_directive_token (pfile) != CPP_CLOSE_PAREN)
 	goto oops;
     }
   CPP_SET_WRITTEN (pfile, old_written);
===================================================================
Index: cpphash.c
--- cpphash.c	2000/04/19 20:53:05	1.69
+++ cpphash.c	2000/04/20 19:22:58
@@ -335,7 +335,7 @@ collect_expansion (pfile, arglist)
 	    CPP_SET_WRITTEN (pfile, here);
 	  break;
 
-	case CPP_STRINGIZE:
+	case CPP_HASH:
 	  /* # is not special in object-like macros.  It is special in
 	     function-like macros with no args.  (6.10.3.2 para 1.) */
 	  if (arglist == NULL)
@@ -348,7 +348,7 @@ collect_expansion (pfile, arglist)
 	  CPP_SET_WRITTEN (pfile, here);  /* delete from replacement text */
 	  break;
 
-	case CPP_TOKPASTE:
+	case CPP_PASTE:
 	  /* If the last token was an argument, discard this token and
 	     any hspace between it and the argument's position.  Then
 	     mark the arg raw_after.  */
@@ -577,10 +577,10 @@ collect_formal_parameters (pfile)
 
   old_written = CPP_WRITTEN (pfile);
   token = _cpp_get_directive_token (pfile);
-  if (token != CPP_LPAREN)
+  if (token != CPP_OPEN_PAREN)
     {
       cpp_ice (pfile, "first token = %d not %d in collect_formal_parameters",
-	       token, CPP_LPAREN);
+	       token, CPP_OPEN_PAREN);
       goto invalid;
     }
 
@@ -626,10 +626,10 @@ collect_formal_parameters (pfile)
 	  argv[argc].len = 0;
 	  break;
 
-	case CPP_RPAREN:
+	case CPP_CLOSE_PAREN:
 	  goto done;
 
-	case CPP_3DOTS:
+	case CPP_ELLIPSIS:
 	  goto rest_arg;
 
 	case CPP_VSPACE:
@@ -668,7 +668,7 @@ collect_formal_parameters (pfile)
   argv[argc].rest_arg = 1;
   
   token = _cpp_get_directive_token (pfile);
-  if (token != CPP_RPAREN)
+  if (token != CPP_CLOSE_PAREN)
     {
       cpp_error (pfile, "another parameter follows `...'");
       goto invalid;
@@ -776,10 +776,10 @@ macarg (pfile, rest_args)
 	  if (!CPP_IS_MACRO_BUFFER (CPP_BUFFER (pfile)))
 	    return token;
 	  break;
-	case CPP_LPAREN:
+	case CPP_OPEN_PAREN:
 	  paren++;
 	  break;
-	case CPP_RPAREN:
+	case CPP_CLOSE_PAREN:
 	  if (--paren < 0)
 	    goto found;
 	  break;
@@ -1042,7 +1042,7 @@ _cpp_macroexpand (pfile, hp)
       pfile->no_directives++;
 
       token = cpp_get_non_space_token (pfile);
-      if (token != CPP_LPAREN)
+      if (token != CPP_OPEN_PAREN)
 	cpp_ice (pfile, "macroexpand: unexpected token %d (wanted LPAREN)",
 		 token);
       CPP_ADJUST_WRITTEN (pfile, -1);
@@ -1072,7 +1072,7 @@ _cpp_macroexpand (pfile, hp)
       CPP_OPTION (pfile, discard_comments)--;
       pfile->no_macro_expand--;
       pfile->no_directives--;
-      if (token != CPP_RPAREN)
+      if (token != CPP_CLOSE_PAREN)
 	return;
 
       /* foo ( ) is equivalent to foo () unless foo takes exactly one
===================================================================
Index: cpphash.h
--- cpphash.h	2000/04/18 20:41:59	1.34
+++ cpphash.h	2000/04/20 19:22:59
@@ -120,12 +120,6 @@ struct hashnode
   enum node_type type;		/* type of special token */
 };
 
-/* Directive flags.  */
-
-#define SYNTAX_INCLUDE (1 << 8)
-#define SYNTAX_ASSERT  (1 << 9)
-typedef int (* directive_handler) PARAMS ((cpp_reader *));
-
 /* List of directories to look for include files in. */
 struct file_name_list
 {
@@ -315,6 +309,7 @@ extern enum cpp_ttype _cpp_get_directive
 					PARAMS ((cpp_reader *));
 extern enum cpp_ttype _cpp_get_define_token
 					PARAMS ((cpp_reader *));
+extern void _cpp_scan_line		PARAMS ((cpp_reader *, cpp_toklist *));
 
 /* In cpplib.c */
 extern int _cpp_handle_directive	PARAMS ((cpp_reader *));
Index: cpplex.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cpplex.c,v
retrieving revision 1.18
diff -u -p -r1.18 cpplex.c
--- cpplex.c	2000/04/18 20:41:59	1.18
+++ cpplex.c	2000/04/20 19:23:00
@@ -50,7 +50,13 @@ static void null_warning        PARAMS (
 
 static void safe_fwrite		PARAMS ((cpp_reader *, const U_CHAR *,
 					 size_t, FILE *));
-static void output_line_command	PARAMS ((cpp_reader *, cpp_printer *));
+static void output_line_command	PARAMS ((cpp_reader *, cpp_printer *,
+					 unsigned int));
+static void bump_column		PARAMS ((cpp_printer *, unsigned int,
+					 unsigned int));
+static void expand_name_space	PARAMS ((cpp_toklist *));
+static void expand_token_space	PARAMS ((cpp_toklist *));
+static void init_token_list	PARAMS ((cpp_reader *, cpp_toklist *, int));
 
 /* Re-allocates PFILE->token_buffer so it will hold at least N more chars.  */
 
@@ -149,23 +155,18 @@ safe_fwrite (pfile, buf, len, fp)
    or the current file name has changed.  */
 
 static void
-output_line_command (pfile, print)
+output_line_command (pfile, print, line)
      cpp_reader *pfile;
      cpp_printer *print;
+     unsigned int line;
 {
-  unsigned int line;
-  cpp_buffer *ip;
+  cpp_buffer *ip = cpp_file_buffer (pfile);
   enum { same = 0, enter, leave, rname } change;
   static const char * const codes[] = { "", " 1", " 2", "" };
 
   if (CPP_OPTION (pfile, no_line_commands))
     return;
 
-  ip = cpp_file_buffer (pfile);
-  if (ip == NULL)
-    return;
-  line = CPP_BUF_LINE (ip);
-
   /* Determine whether the current filename has changed, and if so,
      how.  'nominal_fname' values are unique, so they can be compared
      by comparing pointers.  */
@@ -224,6 +225,8 @@ cpp_output_tokens (pfile, print)
      cpp_reader *pfile;
      cpp_printer *print;
 {
+  cpp_buffer *ip;
+
   if (CPP_WRITTEN (pfile) - print->written)
     {
       if (CPP_PWRITTEN (pfile)[-1] == '\n' && print->lineno)
@@ -231,10 +234,79 @@ cpp_output_tokens (pfile, print)
       safe_fwrite (pfile, pfile->token_buffer,
 		   CPP_WRITTEN (pfile) - print->written, print->outf);
     }
-  output_line_command (pfile, print);
+
+  ip = cpp_file_buffer (pfile);
+  if (ip)
+    output_line_command (pfile, print, CPP_BUF_LINE (ip));
+
   CPP_SET_WRITTEN (pfile, print->written);
 }
 
+/* Helper for cpp_output_list - increases the column number to match
+   what we expect it to be.  */
+
+static void
+bump_column (print, from, to)
+     cpp_printer *print;
+     unsigned int from, to;
+{
+  unsigned int tabs, spcs;
+  unsigned int delta = to - from;
+
+  /* Only if FROM is 0, advance by tabs.  */
+  if (from == 0)
+    tabs = delta / 8, spcs = delta % 8;
+  else
+    tabs = 0, spcs = delta;
+
+  while (tabs--) putc ('\t', print->outf);
+  while (spcs--) putc (' ', print->outf);
+}
+
+/* Write out the list L onto pfile->token_buffer.  This function is
+   incomplete:
+
+   1) pfile->token_buffer is not going to continue to exist.
+   2) At the moment, tokens don't carry the information described
+   in cpplib.h; they are all strings.
+   3) The list has to be a complete line, and has to be written starting
+   at the beginning of a line.  */
+
+void
+cpp_output_list (pfile, print, list)
+     cpp_reader *pfile;
+     cpp_printer *print;
+     const cpp_toklist *list;
+{
+  unsigned int i;
+  unsigned int curcol = 1;
+
+  /* XXX Probably does not do what is intended.  */
+  if (print->lineno != list->line)
+    output_line_command (pfile, print, list->line);
+  
+  for (i = 0; i < list->tokens_used; i++)
+    {
+      if (list->tokens[i].type == CPP_VSPACE)
+	{
+	  output_line_command (pfile, print, list->tokens[i].aux);
+	  continue;
+	}
+	  
+      if (curcol < list->tokens[i].col)
+	{
+	  /* Insert space to bring the column to what it should be.  */
+	  bump_column (print, curcol - 1, list->tokens[i].col);
+	  curcol = list->tokens[i].col;
+	}
+      /* XXX We may have to insert space to prevent an accidental
+	 token paste.  */
+      safe_fwrite (pfile, list->namebuf + list->tokens[i].val.name.offset,
+		   list->tokens[i].val.name.len, print->outf);
+      curcol += list->tokens[i].val.name.len;
+    }
+}
+
 /* Scan a string (which may have escape marks), perform macro expansion,
    and write the result to the token_buffer.  */
 
@@ -353,6 +425,107 @@ cpp_file_buffer (pfile)
   return NULL;
 }
 
+/* Token-buffer helper functions.  */
+
+/* Expand a token list's string space.  */
+static void
+expand_name_space (list)
+     cpp_toklist *list;
+{  
+  list->name_cap *= 2;
+  list->namebuf = (unsigned char *) xrealloc (list->namebuf,
+					      list->name_cap);
+}
+
+/* Expand the number of tokens in a list.  */
+static void
+expand_token_space (list)
+     cpp_toklist *list;
+{
+  list->tokens_cap *= 2;
+  list->tokens = (cpp_token *)
+    xrealloc (list->tokens, list->tokens_cap * sizeof (cpp_token));
+}
+
+/* Initialise a token list.  */
+static void
+init_token_list (pfile, list, recycle)
+     cpp_reader *pfile;
+     cpp_toklist *list;
+     int recycle;
+{
+  /* Recycling a used list saves 2 free-malloc pairs.  */
+  if (recycle)
+    {
+      list->tokens_used = 0;
+      list->name_used = 0;
+    }
+  else
+    {
+      /* Initialise token space.  */
+      list->tokens_cap = 256;	/* 4K on Intel.	 */
+      list->tokens_used = 0;
+      list->tokens = (cpp_token *)
+	xmalloc (list->tokens_cap * sizeof (cpp_token));
+
+      /* Initialise name space.	 */
+      list->name_cap = 1024;
+      list->name_used = 0;
+      list->namebuf = (unsigned char *) xmalloc (list->name_cap);
+    }
+
+  list->line = pfile->buffer->lineno;
+  list->dir_handler = 0;
+  list->dir_flags = 0;
+}
+
+/* Scan an entire line and create a token list for it.  Does not
+   macro-expand or execute directives.  */
+
+void
+_cpp_scan_line (pfile, list)
+     cpp_reader *pfile;
+     cpp_toklist *list;
+{
+  int i, col;
+  long written, len;
+  enum cpp_ttype type;
+
+  init_token_list (pfile, list, 1);
+
+  written = CPP_WRITTEN (pfile);
+  i = 0;
+  for (;;)
+    {
+      col = CPP_BUFFER (pfile)->cur - CPP_BUFFER (pfile)->line_base;
+      type = _cpp_lex_token (pfile);
+      len = CPP_WRITTEN (pfile) - written;
+      CPP_SET_WRITTEN (pfile, written);
+      if (type == CPP_HSPACE)
+	continue;
+
+      if (list->tokens_used >= list->tokens_cap)
+	expand_token_space (list);
+      if (list->name_used + len >= list->name_cap)
+	expand_name_space (list);
+
+      list->tokens_used++;
+      list->tokens[i].type = type;
+      list->tokens[i].col = col;
+
+      if (type == CPP_VSPACE)
+	break;
+
+      list->tokens[i].val.name.len = len;
+      list->tokens[i].val.name.offset = list->name_used;
+      memcpy (list->namebuf + list->name_used, CPP_PWRITTEN (pfile), len);
+      list->name_used += len;
+      i++;
+    }
+  list->tokens[i].aux =  CPP_BUFFER (pfile)->lineno + 1;
+}
+
+
 /* Skip a C-style block comment.  We know it's a comment, and point is
    at the second character of the starter.  */
 static void
@@ -904,9 +1077,9 @@ _cpp_lex_token (pfile)
 	      CPP_PUTC_Q (pfile, GETC ());
 	    }
 	  else
-	    return CPP_STRINGIZE;
+	    return CPP_HASH;
 
-	  return CPP_TOKPASTE;
+	  return CPP_PASTE;
 	}
 
       if (!pfile->only_seen_white)
@@ -959,7 +1132,7 @@ _cpp_lex_token (pfile)
 	  CPP_RESERVE (pfile, 2);
 	  CPP_PUTC_Q (pfile, c);
 	  CPP_PUTC_Q (pfile, c2);
-	  return CPP_RBRACE;
+	  return CPP_OPEN_BRACE;
 	}
       /* else fall through */
 
@@ -1042,7 +1215,7 @@ _cpp_lex_token (pfile)
 	  CPP_RESERVE (pfile, 2);
 	  CPP_PUTC_Q (pfile, c);
 	  CPP_PUTC_Q (pfile, c2);
-	  return CPP_LBRACE;
+	  return CPP_CLOSE_BRACE;
 	}
       else if (c2 == ':')
 	goto op2;
@@ -1082,7 +1255,7 @@ _cpp_lex_token (pfile)
 	  CPP_PUTC_Q (pfile, '.');
 	  CPP_PUTC_Q (pfile, '.');
 	  FORWARD (2);
-	  return CPP_3DOTS;
+	  return CPP_ELLIPSIS;
 	}
       goto randomchar;
 
@@ -1228,12 +1401,12 @@ _cpp_lex_token (pfile)
       CPP_PUTC (pfile, c);
       return CPP_VSPACE;
 
-    case '(': token = CPP_LPAREN;    goto char1;
-    case ')': token = CPP_RPAREN;    goto char1;
-    case '{': token = CPP_LBRACE;    goto char1;
-    case '}': token = CPP_RBRACE;    goto char1;
-    case ',': token = CPP_COMMA;     goto char1;
-    case ';': token = CPP_SEMICOLON; goto char1;
+    case '(': token = CPP_OPEN_PAREN;  goto char1;
+    case ')': token = CPP_CLOSE_PAREN; goto char1;
+    case '{': token = CPP_OPEN_BRACE;  goto char1;
+    case '}': token = CPP_CLOSE_BRACE; goto char1;
+    case ',': token = CPP_COMMA;       goto char1;
+    case ';': token = CPP_SEMICOLON;   goto char1;
 
     randomchar:
     default:
===================================================================
Index: cpplib.c
--- cpplib.c	2000/04/19 05:37:03	1.149
+++ cpplib.c	2000/04/20 19:23:00
@@ -377,7 +377,7 @@ do_define (pfile)
   token = _cpp_get_directive_token (pfile);
   if (token == CPP_VSPACE)
     empty = 0;  /* Empty definition of object like macro.  */
-  else if (token == CPP_LPAREN && ADJACENT_TO_MARK (pfile))
+  else if (token == CPP_OPEN_PAREN && ADJACENT_TO_MARK (pfile))
     funlike = 1;
   else if (ADJACENT_TO_MARK (pfile))
     /* If this is an object-like macro, C99 requires white space after
@@ -688,11 +688,13 @@ do_line (pfile)
 	  if (action_number == 1)
 	    {
 	      pfile->buffer_stack_depth++;
+	      ip->system_header_p = 0;
 	      read_line_number (pfile, &action_number);
 	    }
 	  else if (action_number == 2)
 	    {
 	      pfile->buffer_stack_depth--;
+	      ip->system_header_p = 0;
 	      read_line_number (pfile, &action_number);
 	    }
 	  if (action_number == 3)
@@ -1108,7 +1110,7 @@ detect_if_not_defined (pfile)
   /* ...then an optional '(' and the name, */
   token_offset = CPP_WRITTEN (pfile);
   token = _cpp_get_directive_token (pfile);
-  if (token == CPP_LPAREN)
+  if (token == CPP_OPEN_PAREN)
     {
       token_offset = CPP_WRITTEN (pfile);
       need_rparen = 1;
@@ -1120,7 +1122,7 @@ detect_if_not_defined (pfile)
   token_len = CPP_WRITTEN (pfile) - token_offset;
 
   /* ...then the ')', if necessary, */
-  if (need_rparen && _cpp_get_directive_token (pfile) != CPP_RPAREN)
+  if (need_rparen && _cpp_get_directive_token (pfile) != CPP_CLOSE_PAREN)
     goto restore;
 
   /* ...and make sure there's nothing else on the line.  */
===================================================================
Index: cpplib.h
--- cpplib.h	2000/04/18 22:34:09	1.79
+++ cpplib.h	2000/04/20 19:23:02
@@ -32,37 +32,157 @@ typedef struct cpp_reader cpp_reader;
 typedef struct cpp_buffer cpp_buffer;
 typedef struct cpp_options cpp_options;
 typedef struct cpp_printer cpp_printer;
+typedef struct cpp_token cpp_token;
+typedef struct cpp_toklist cpp_toklist;
 
+  /* Put operators that can appear in a preprocessor expression first.
+     This allows a lookup table to be implemented in _cpp_parse_expr.
+     Ordering within this group is currently not significant, apart
+     from those ending in '=' being at the end.  */
+#define TTYPE_TABLE				\
+  T(CPP_PLUS = 0,	"+")	/* math */	\
+  T(CPP_MINUS,		"-")			\
+  T(CPP_MULT,		"*")			\
+  T(CPP_DIV,		"/")			\
+  T(CPP_MOD,		"%")			\
+  T(CPP_AND,		"&")	/* bit ops */	\
+  T(CPP_OR,		"|")			\
+  T(CPP_XOR,		"^")			\
+  T(CPP_COMPL,		"~")			\
+  T(CPP_RSHIFT,		">>")			\
+  T(CPP_LSHIFT,		"<<")			\
+  T(CPP_NOT,		"!")	/* logicals */	\
+  T(CPP_AND_AND,	"&&")			\
+  T(CPP_OR_OR,		"||")			\
+  T(CPP_QUERY,		"?")			\
+  T(CPP_COLON,		":")			\
+  T(CPP_COMMA,		",")	/* grouping */	\
+  T(CPP_OPEN_PAREN,	"(")			\
+  T(CPP_CLOSE_PAREN,	")")			\
+  T(CPP_GREATER,	">")	/* compare */	\
+  T(CPP_LESS,		"<")			\
+  T(CPP_EQ_EQ,		"==")			\
+  T(CPP_NOT_EQ,		"!=")			\
+  T(CPP_GREATER_EQ,	">=")			\
+  T(CPP_LESS_EQ,	"<=")			\
+\
+  /* The remainder of the punctuation.  Order is not significant. */	\
+  T(CPP_PLUS_EQ,	"+=")	/* math */	\
+  T(CPP_MINUS_EQ,	"-=")			\
+  T(CPP_MULT_EQ,	"*=")			\
+  T(CPP_DIV_EQ,		"/=")			\
+  T(CPP_MOD_EQ,		"%=")			\
+  T(CPP_AND_EQ,		"&=")	/* bit ops */	\
+  T(CPP_OR_EQ,		"|=")			\
+  T(CPP_XOR_EQ,		"^=")			\
+  T(CPP_COMPL_EQ,	"~=")			\
+  T(CPP_RSHIFT_EQ,	">>=")			\
+  T(CPP_LSHIFT_EQ,	"<<=")			\
+  T(CPP_EQ,		"=")	/* assign */	\
+  T(CPP_PLUS_PLUS,	"++")	/* increment */	\
+  T(CPP_MINUS_MINUS,	"--")			\
+  T(CPP_DEREF,		"->")	/* accessors */	\
+  T(CPP_DOT,		".")			\
+  T(CPP_OPEN_SQUARE,	"[")			\
+  T(CPP_CLOSE_SQUARE,	"]")			\
+  T(CPP_SCOPE,		"::")			\
+  T(CPP_DEREF_STAR,	"->*")			\
+  T(CPP_DOT_STAR,	".*")			\
+  T(CPP_OPEN_BRACE,	"{")	/* structure */	\
+  T(CPP_CLOSE_BRACE,	"}")			\
+  T(CPP_SEMICOLON,	";")			\
+  T(CPP_ELLIPSIS,	"...")			\
+  T(CPP_HASH,		"#")			\
+  T(CPP_PASTE,		"##")			\
+  T(CPP_BACKSLASH,	"\\")			\
+  T(CPP_MIN,		"<?")	/* extension */	\
+  T(CPP_MAX,		">?")			\
+  T(CPP_OTHER,		spell_other) /* stray punctuation */ \
+\
+  T(CPP_NAME,		spell_name)	/* word */	\
+  T(CPP_INT,		0)		/* 23 */	\
+  T(CPP_FLOAT,		0)		/* 3.14159 */	\
+  T(CPP_NUMBER,		spell_name)	/* 34_be+ta  */	\
+  T(CPP_CHAR,		spell_char)	/* 'char' */	\
+  T(CPP_WCHAR,		spell_char)	/* L'char' */	\
+  T(CPP_STRING,		spell_string)	/* "string" */	\
+  T(CPP_WSTRING,	spell_string)	/* L"string" */	\
+\
+  T(CPP_COMMENT,	spell_comment)	/* Only if output comments.  */ \
+  T(CPP_VSPACE,		"\n")		/* End of line.  */		\
+  T(CPP_EOF,		0)		/* End of file.  */		\
+  T(CPP_HEADER_NAME,	0)		/* <stdio.h> in #include */	\
+  T(CPP_ASSERTION,	0)		/* (...) in #assert */		\
+\
+  /* Obsolete - will be removed when no code uses them still.  */	\
+  T(CPP_HSPACE,		0)		/* Horizontal white space.  */	\
+  T(CPP_POP,		0)		/* End of buffer.  */		\
+  T(CPP_DIRECTIVE,	0)		/* #define and the like */	\
+  T(CPP_MACRO,		0)		/* Like a NAME, but expanded.  */
+
+#define T(e, s) e,
 enum cpp_ttype
+{
+  TTYPE_TABLE
+  N_TTYPES
+};
+#undef T
+
+/* Payload of a NAME, NUMBER, FLOAT, STRING, or COMMENT token.  */
+struct cpp_name
+{
+  unsigned int len;
+  unsigned int offset;		/* from list->namebuf */
+};
+
+/* A preprocessing token.
+   This has been carefully packed and should occupy 16 bytes on
+   both 32- and 64-bit hosts.  */
+struct cpp_token
 {
-  CPP_EOF = -1,
-  CPP_OTHER = 0,
-  CPP_COMMENT = 1,
-  CPP_HSPACE,
-  CPP_VSPACE, /* newlines and #line directives */
-  CPP_NAME,
-  CPP_MACRO,
-  CPP_NUMBER,
-  CPP_CHAR,
-  CPP_WCHAR,
-  CPP_STRING,
-  CPP_WSTRING,
-  CPP_DIRECTIVE,
-  CPP_ASSERTION,	/* #machine(a29k) */
-  CPP_STRINGIZE,	/* stringize macro argument */
-  CPP_TOKPASTE,		/* paste macro arg with next/prev token */
-  CPP_LPAREN,		/* "(" */
-  CPP_RPAREN,		/* ")" */
-  CPP_LBRACE,		/* "{" */
-  CPP_RBRACE,		/* "}" */
-  CPP_COMMA,		/* "," */
-  CPP_SEMICOLON,	/* ";" */
-  CPP_3DOTS,		/* "..." */
-  CPP_POP		/* We're about to pop the buffer stack.  */
+  unsigned short col;			/* starting column of this token */
+#ifdef ENUM_BITFIELDS_ARE_UNSIGNED
+  enum cpp_ttype type : CHAR_BIT;	/* node type */
+#else
+  unsigned char type;
+#endif
+  unsigned char flags;			/* flags - not presently used */
+  unsigned int aux;			/* hash of a NAME, or something -
+					   see uses in the code */
+  union
+  {
+    struct cpp_name name;		/* a string */
+    HOST_WIDEST_INT integer;		/* an integer */
+  } val;
 };
 
-typedef int (*parse_cleanup_t) PARAMS((cpp_buffer *, cpp_reader *));
+/* Directive flags.  */
+#define SYNTAX_INCLUDE (1 << 8)
+#define SYNTAX_ASSERT  (1 << 9)
 
+typedef int (*directive_handler) PARAMS ((cpp_reader *));
+typedef int (*parse_cleanup_t) PARAMS ((cpp_buffer *, cpp_reader *));
+
+struct cpp_toklist
+{
+  struct cpp_token *tokens;	/* actual tokens as an array */
+  unsigned int tokens_used;	/* tokens used */
+  unsigned int tokens_cap;	/* tokens allocated */
+
+  unsigned char *namebuf;	/* names buffer */
+  unsigned int name_used;	/* _bytes_ used */
+  unsigned int name_cap;	/* _bytes_ allocated */
+
+  unsigned int line;		/* starting line number */
+
+  /* Only used if tokens[0].type == CPP_DIRECTIVE.  This is the
+     handler to call after lexing the rest of this line.  The flags
+     indicate whether the rest of the line gets special treatment
+     during lexing (#include, #if, #assert, #unassert).  */
+  directive_handler dir_handler;
+  unsigned short dir_flags;
+};
+
 struct cpp_buffer
 {
   const unsigned char *cur;	 /* current position */
@@ -442,6 +562,8 @@ extern void cpp_reader_init PARAMS ((cpp
 extern cpp_printer *cpp_printer_init PARAMS ((cpp_reader *, cpp_printer *));
 extern int cpp_start_read PARAMS ((cpp_reader *, cpp_printer *, const char *));
 extern void cpp_output_tokens PARAMS ((cpp_reader *, cpp_printer *));
+extern void cpp_output_list PARAMS ((cpp_reader *, cpp_printer *,
+				     const cpp_toklist *));
 extern void cpp_finish PARAMS ((cpp_reader *, cpp_printer *));
 extern void cpp_cleanup PARAMS ((cpp_reader *));
 
@@ -486,6 +608,8 @@ extern cpp_buffer *cpp_push_buffer	PARAM
 extern cpp_buffer *cpp_pop_buffer	PARAMS ((cpp_reader *));
 extern void cpp_scan_buffer		PARAMS ((cpp_reader *, cpp_printer *));
 extern void cpp_scan_buffer_nooutput	PARAMS ((cpp_reader *));
+
+
 
 /* In cpphash.c */
 extern int cpp_defined			PARAMS ((cpp_reader *,
===================================================================
Index: scan-decls.c
--- scan-decls.c	2000/04/11 08:29:34	1.15
+++ scan-decls.c	2000/04/20 19:23:02
@@ -48,9 +48,9 @@ skip_to_closing_brace (pfile)
       enum cpp_ttype token = cpp_get_token (pfile);
       if (token == CPP_EOF)
 	break;
-      if (token == CPP_LBRACE)
+      if (token == CPP_OPEN_BRACE)
 	nesting++;
-      if (token == CPP_RBRACE && --nesting == 0)
+      if (token == CPP_CLOSE_BRACE && --nesting == 0)
 	break;
     }
 }
@@ -101,7 +101,7 @@ scan_decls (pfile, argc, argv)
   current_extern_C = 0;
   saw_extern = 0;
   saw_inline = 0;
-  if (token == CPP_RBRACE)
+  if (token == CPP_OPEN_BRACE)
     {
       /* Pop an 'extern "C"' nesting level, if appropriate.  */
       if (extern_C_braces_length
@@ -110,7 +110,7 @@ scan_decls (pfile, argc, argv)
       brace_nesting--;
       goto new_statement;
     }
-  if (token == CPP_LBRACE)
+  if (token == CPP_OPEN_BRACE)
     {
       brace_nesting++;
       goto new_statement;
@@ -128,7 +128,7 @@ scan_decls (pfile, argc, argv)
     {
       switch (token)
 	{
-	case CPP_LPAREN:
+	case CPP_OPEN_PAREN:
 	  /* Looks like this is the start of a formal parameter list.  */
 	  if (prev_id_start)
 	    {
@@ -139,9 +139,9 @@ scan_decls (pfile, argc, argv)
 	      for (;;)
 		{
 		  token = cpp_get_token (pfile);
-		  if (token == CPP_LPAREN)
+		  if (token == CPP_OPEN_PAREN)
 		    nesting++;
-		  else if (token == CPP_RPAREN)
+		  else if (token == CPP_CLOSE_PAREN)
 		    {
 		      nesting--;
 		      if (nesting == 0)
@@ -149,7 +149,7 @@ scan_decls (pfile, argc, argv)
 		    }
 		  else if (token == CPP_EOF)
 		    break;
-		  else if (token == CPP_NAME || token == CPP_3DOTS)
+		  else if (token == CPP_NAME || token == CPP_ELLIPSIS)
 		    have_arg_list = 1;
 		}
 	      recognized_function (pfile->token_buffer + prev_id_start,
@@ -161,7 +161,7 @@ scan_decls (pfile, argc, argv)
 				   have_arg_list,
 				   fbuf->nominal_fname, func_lineno);
 	      token = cpp_get_non_space_token (pfile);
-	      if (token == CPP_LBRACE)
+	      if (token == CPP_OPEN_BRACE)
 		{
 		  /* skip body of (normally) inline function */
 		  skip_to_closing_brace (pfile);
@@ -218,7 +218,7 @@ scan_decls (pfile, argc, argv)
 		  CPP_SET_WRITTEN (pfile, start_written);
 		  current_extern_C = 1;
 		  token = cpp_get_non_space_token (pfile);
-		  if (token == CPP_LBRACE)
+		  if (token == CPP_OPEN_BRACE)
 		    {
 		      brace_nesting++;
 		      extern_C_braces[extern_C_braces_length++]
@@ -238,7 +238,7 @@ scan_decls (pfile, argc, argv)
 	case CPP_EOF:
 	  return 0;
 
-	case CPP_LBRACE:  case CPP_RBRACE:  case CPP_DIRECTIVE:
+	case CPP_OPEN_BRACE:  case CPP_CLOSE_BRACE:  case CPP_DIRECTIVE:
 	  goto new_statement;  /* handle_statement? */
 	  
 	case CPP_HSPACE:  case CPP_VSPACE:  case CPP_COMMENT:  case CPP_POP:

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]