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:
parent
589005ff21
commit
82eda77ed5
@ -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.
|
||||||
|
@ -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. */
|
||||||
|
@ -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--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user