cpphash.h (FIRST, [...]): New.

* cpphash.h (FIRST, LAST, CUR, RLIMIT): New.
	(struct cpp_context): Add traditional fields.
	* cppmacro.c (paste_all_tokens, push_ptoken_context,
	push_token_context, cpp_get_token, _cpp_backup_tokens): Update.
	* cpptrad.c (skip_comment, lex_identifier,
	_cpp_read_logical_line_trad, scan_out_logical_line): Update.

From-SVN: r54242
This commit is contained in:
Neil Booth 2002-06-04 13:07:06 +00:00 committed by Neil Booth
parent 589005ff21
commit 82eda77ed5
4 changed files with 64 additions and 31 deletions

View File

@ -1,3 +1,12 @@
2002-06-04 Neil Booth <neil@daikokuya.demon.co.uk>
* cpphash.h (FIRST, LAST, CUR, RLIMIT): New.
(struct cpp_context): Add traditional fields.
* cppmacro.c (paste_all_tokens, push_ptoken_context,
push_token_context, cpp_get_token, _cpp_backup_tokens): Update.
* cpptrad.c (skip_comment, lex_identifier,
_cpp_read_logical_line_trad, scan_out_logical_line): Update.
2002-06-04 Kazu Hirata <kazu@cs.umass.edu> 2002-06-04 Kazu Hirata <kazu@cs.umass.edu>
* gbl-ctors.h: Fix formatting. * gbl-ctors.h: Fix formatting.

View File

@ -126,16 +126,36 @@ struct tokenrun
cpp_token *base, *limit; cpp_token *base, *limit;
}; };
/* Accessor macros for struct cpp_context. */
#define FIRST(c) (c->u.iso.first)
#define LAST(c) (c->u.iso.last)
#define CUR(c) (c->u.trad.cur)
#define RLIMIT(c) (c->u.trad.rlimit)
typedef struct cpp_context cpp_context; typedef struct cpp_context cpp_context;
struct cpp_context struct cpp_context
{ {
/* Doubly-linked list. */ /* Doubly-linked list. */
cpp_context *next, *prev; cpp_context *next, *prev;
/* Contexts other than the base context are contiguous tokens. union
e.g. macro expansions, expanded argument tokens. */ {
union utoken first; /* For ISO macro expansion. Contexts other than the base context
union utoken last; are contiguous tokens. e.g. macro expansions, expanded
argument tokens. */
struct
{
union utoken first;
union utoken last;
} iso;
/* For traditional macro expansion. */
struct
{
const uchar *cur;
const uchar *rlimit;
} trad;
} u;
/* If non-NULL, a buffer used for storage related to this context. /* If non-NULL, a buffer used for storage related to this context.
When the context is popped, the buffer is released. */ When the context is popped, the buffer is released. */

View File

@ -425,9 +425,9 @@ paste_all_tokens (pfile, lhs)
inserted. In either case, the constraints to #define inserted. In either case, the constraints to #define
guarantee we have at least one more token. */ guarantee we have at least one more token. */
if (context->direct_p) if (context->direct_p)
rhs = context->first.token++; rhs = FIRST (context).token++;
else else
rhs = *context->first.ptoken++; rhs = *FIRST (context).ptoken++;
if (rhs->type == CPP_PADDING) if (rhs->type == CPP_PADDING)
abort (); abort ();
@ -896,8 +896,8 @@ push_ptoken_context (pfile, macro, buff, first, count)
context->direct_p = false; context->direct_p = false;
context->macro = macro; context->macro = macro;
context->buff = buff; context->buff = buff;
context->first.ptoken = first; FIRST (context).ptoken = first;
context->last.ptoken = first + count; LAST (context).ptoken = first + count;
} }
/* Push a list of tokens. */ /* Push a list of tokens. */
@ -913,8 +913,8 @@ push_token_context (pfile, macro, first, count)
context->direct_p = true; context->direct_p = true;
context->macro = macro; context->macro = macro;
context->buff = NULL; context->buff = NULL;
context->first.token = first; FIRST (context).token = first;
context->last.token = first + count; LAST (context).token = first + count;
} }
/* Expand an argument ARG before replacing parameters in a /* Expand an argument ARG before replacing parameters in a
@ -1004,12 +1004,12 @@ cpp_get_token (pfile)
/* Context->prev == 0 <=> base context. */ /* Context->prev == 0 <=> base context. */
if (!context->prev) if (!context->prev)
result = _cpp_lex_token (pfile); result = _cpp_lex_token (pfile);
else if (context->first.token != context->last.token) else if (FIRST (context).token != LAST (context).token)
{ {
if (context->direct_p) if (context->direct_p)
result = context->first.token++; result = FIRST (context).token++;
else else
result = *context->first.ptoken++; result = *FIRST (context).ptoken++;
if (result->flags & PASTE_LEFT) if (result->flags & PASTE_LEFT)
{ {
@ -1118,9 +1118,9 @@ _cpp_backup_tokens (pfile, count)
if (count != 1) if (count != 1)
abort (); abort ();
if (pfile->context->direct_p) if (pfile->context->direct_p)
pfile->context->first.token--; FIRST (pfile->context).token--;
else else
pfile->context->first.ptoken--; FIRST (pfile->context).ptoken--;
} }
} }

View File

@ -23,7 +23,7 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* Lexing TODO: Handle -C, maybe -CC, and space in escaped newlines. /* Lexing TODO: Handle -C, maybe -CC, and space in escaped newlines.
Stop cpplex.c from recognizing comments and directives during its Stop cpplex.c from recognizing comments and directives during its
lexing pass. */ lexing pass. Get rid of line_base usage - seems pointless? */
static const uchar *handle_newline PARAMS ((cpp_reader *, const uchar *)); static const uchar *handle_newline PARAMS ((cpp_reader *, const uchar *));
static const uchar *skip_escaped_newlines PARAMS ((cpp_reader *, static const uchar *skip_escaped_newlines PARAMS ((cpp_reader *,
@ -90,8 +90,8 @@ skip_comment (pfile, cur)
const uchar *cur; const uchar *cur;
{ {
unsigned int from_line = pfile->line; unsigned int from_line = pfile->line;
unsigned int c = 0, prevc; unsigned int c = 0, prevc = 0;
const uchar *limit = pfile->buffer->rlimit; const uchar *limit = RLIMIT (pfile->context);
while (cur < limit) while (cur < limit)
{ {
@ -138,7 +138,7 @@ lex_identifier (pfile, cur)
} }
while (ISIDNUM (*cur)); while (ISIDNUM (*cur));
pfile->buffer->cur = cur; CUR (pfile->context) = cur;
len = out - pfile->trad_out_cur; len = out - pfile->trad_out_cur;
pfile->trad_out_cur = out; pfile->trad_out_cur = out;
return (cpp_hashnode *) ht_lookup (pfile->hash_table, pfile->trad_out_cur, return (cpp_hashnode *) ht_lookup (pfile->hash_table, pfile->trad_out_cur,
@ -206,8 +206,12 @@ _cpp_read_logical_line_trad (pfile)
return false; return false;
} }
CUR (pfile->context) = buffer->cur;
RLIMIT (pfile->context) = buffer->rlimit;
pfile->trad_out_cur = pfile->trad_out_base; pfile->trad_out_cur = pfile->trad_out_base;
scan_out_logical_line (pfile); scan_out_logical_line (pfile);
buffer->cur = CUR (pfile->context);
pfile->trad_line = pfile->line; pfile->trad_line = pfile->line;
pfile->line = first_line; pfile->line = first_line;
_cpp_overlay_buffer (pfile, pfile->trad_out_base, _cpp_overlay_buffer (pfile, pfile->trad_out_base,
@ -222,12 +226,12 @@ static void
scan_out_logical_line (pfile) scan_out_logical_line (pfile)
cpp_reader *pfile; cpp_reader *pfile;
{ {
cpp_buffer *buffer = pfile->buffer; cpp_context *context = pfile->context;
const uchar *cur = buffer->cur; const uchar *cur = CUR (context);
unsigned int c, quote = 0; unsigned int c, quote = 0;
uchar *out; uchar *out;
check_output_buffer (pfile, buffer->rlimit - cur); check_output_buffer (pfile, RLIMIT (context) - cur);
out = pfile->trad_out_cur; out = pfile->trad_out_cur;
for (;;) for (;;)
@ -240,20 +244,20 @@ scan_out_logical_line (pfile)
switch (c) switch (c)
{ {
case '\0': case '\0':
if (cur - 1 != buffer->rlimit) if (cur - 1 != RLIMIT (context))
break; break;
cur--; cur--;
if (!buffer->from_stage3) if (!pfile->buffer->from_stage3)
cpp_error (pfile, DL_PEDWARN, "no newline at end of file"); cpp_error (pfile, DL_PEDWARN, "no newline at end of file");
pfile->line++; pfile->line++;
if (0) goto finish_output;
{
case '\r': case '\n': case '\r': case '\n':
cur = handle_newline (pfile, cur - 1); cur = handle_newline (pfile, cur - 1);
} finish_output:
out[-1] = '\n'; out[-1] = '\n';
out[0] = '\0'; out[0] = '\0';
buffer->cur = cur; CUR (context) = cur;
pfile->trad_out_cur = out; pfile->trad_out_cur = out;
return; return;
@ -306,7 +310,7 @@ scan_out_logical_line (pfile)
pfile->trad_out_cur = --out; pfile->trad_out_cur = --out;
node = lex_identifier (pfile, cur - 1); node = lex_identifier (pfile, cur - 1);
out = pfile->trad_out_cur; out = pfile->trad_out_cur;
cur = buffer->cur; cur = CUR (context);
} }
break; break;