-/* Subroutine of _cpp_lex_direct to handle '%'. A little tricky, since we
- want to avoid stepping back when lexing %:%X. */
-static void
-lex_percent (pfile, result)
- cpp_reader *pfile;
- cpp_token *result;
-{
- cpp_buffer *buffer= pfile->buffer;
- cppchar_t c;
-
- result->type = CPP_MOD;
- /* Parsing %:%X could leave an extra character. */
- if (buffer->extra_char == EOF)
- c = get_effective_char (pfile);
- else
- {
- c = buffer->read_ahead = buffer->extra_char;
- buffer->extra_char = EOF;
- }
-
- if (c == '=')
- ACCEPT_CHAR (CPP_MOD_EQ);
- else if (CPP_OPTION (pfile, digraphs))
- {
- if (c == ':')
- {
- result->flags |= DIGRAPH;
- ACCEPT_CHAR (CPP_HASH);
- if (get_effective_char (pfile) == '%')
- {
- buffer->extra_char = get_effective_char (pfile);
- if (buffer->extra_char == ':')
- {
- buffer->extra_char = EOF;
- ACCEPT_CHAR (CPP_PASTE);
- }
- else
- /* We'll catch the extra_char when we're called back. */
- buffer->read_ahead = '%';
- }
- }
- else if (c == '>')
- {
- result->flags |= DIGRAPH;
- ACCEPT_CHAR (CPP_CLOSE_BRACE);
- }
- }
-}
-
-/* Subroutine of _cpp_lex_direct to handle '.'. This is tricky, since we
- want to avoid stepping back when lexing '...' or '.123'. In the
- latter case we should also set a flag for parse_number. */
-static void
-lex_dot (pfile, result)
- cpp_reader *pfile;
- cpp_token *result;
-{
- cpp_buffer *buffer = pfile->buffer;
- cppchar_t c;
-
- /* Parsing ..X could leave an extra character. */
- if (buffer->extra_char == EOF)
- c = get_effective_char (pfile);
- else
- {
- c = buffer->read_ahead = buffer->extra_char;
- buffer->extra_char = EOF;
- }
-
- /* All known character sets have 0...9 contiguous. */
- if (c >= '0' && c <= '9')
- {
- result->type = CPP_NUMBER;
- parse_number (pfile, &result->val.str, c, 1);
- }
- else
- {
- result->type = CPP_DOT;
- if (c == '.')
- {
- buffer->extra_char = get_effective_char (pfile);
- if (buffer->extra_char == '.')
- {
- buffer->extra_char = EOF;
- ACCEPT_CHAR (CPP_ELLIPSIS);
- }
- else
- /* We'll catch the extra_char when we're called back. */
- buffer->read_ahead = '.';
- }
- else if (c == '*' && CPP_OPTION (pfile, cplusplus))
- ACCEPT_CHAR (CPP_DOT_STAR);
- }
-}
-