(*zeroextract[qs]i_compare0_scratch): Use const_int_operand
[official-gcc.git] / gcc / bi-lexer.c
blob6601c52c05b679c0f8cc0491b225de3e917c42cf
1 /* Lexer for scanner of bytecode definition file.
2 Copyright (C) 1993, 1995 Free Software Foundation, Inc.
4 This file is part of GNU CC.
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
21 #include <stdio.h>
22 #include "hconfig.h"
23 #include "bi-parser.h"
26 /* Safely allocate NBYTES bytes of memory. Returns pointer to block of
27 memory. */
29 static char *
30 xmalloc (nbytes)
31 int nbytes;
33 char *tmp = (char *) malloc (nbytes);
35 if (!tmp)
37 fprintf (stderr, "can't allocate %d bytes (out of virtual memory)\n", nbytes);
38 exit (FATAL_EXIT_CODE);
41 return tmp;
45 /* Safely reallocate BLOCK so its size becomes NBYTES.
46 The block returned may be different from the one supplied. */
48 static char *
49 xrealloc (block, nbytes)
50 char *block;
51 int nbytes;
53 char *tmp = (block
54 ? (char *) realloc (block, nbytes)
55 : (char *) malloc (nbytes));
57 if (!tmp)
59 fprintf (stderr, "can't reallocate %d bytes (out of virtual memory)\n", nbytes);
60 exit (FATAL_EXIT_CODE);
63 return tmp;
67 /* Scan for string token on standard input. A string is, for our
68 purposes here, a sequence of characters that starts with the regexp
69 ``[^ #\t\n(),]'' and is then followed by the regexp ``[^#(),]*''. Any
70 character is accepted if preceded by a backslash, "\\". It is assumed
71 that the first character has already been checked by the main loop. */
73 static char *
74 scan_string ()
76 char *buffer = NULL;
77 char *point = NULL;
78 int buffer_size = 0;
79 int c;
81 while ((c = getc (stdin)) != EOF
82 && c != '#' && c != '(' && c != ')' && c != ',')
84 /* Extend buffer, if necessary (minus two so there's room for the NUL
85 trailer as well as another character if this one is a backslash). */
86 if (!buffer_size || (point - buffer >= buffer_size-2))
88 int previous_point_index = point - buffer;
90 buffer_size = (!buffer_size ? 32 : buffer_size * 2);
91 if (!buffer)
92 buffer = xmalloc (buffer_size);
93 else
94 buffer = xrealloc (buffer, buffer_size);
96 point = buffer + previous_point_index;
98 *point++ = c & 0xff;
100 if (c == '\\')
102 c = getc (stdin);
104 /* Catch special case: backslash at end of file */
105 if (c == EOF)
106 break;
108 *point++ = c;
111 *point = 0;
113 if (c != EOF)
114 ungetc (c, stdin);
116 return buffer;
121 yylex ()
123 int c;
124 char *token;
127 /* First char determines what token we're looking at */
128 for (;;)
130 c = getc (stdin);
132 switch (c)
134 case EOF:
135 return 0;
137 case ' ':
138 case '\t':
139 case '\n':
140 /* Ignore whitespace */
141 continue;
143 case '#':
144 /* Comments advance to next line */
145 while ((c = getc (stdin)) != '\n' && c != EOF);
146 continue;
148 default:
149 if (c != '(' && c != ')' && c != '\\' && c != ',')
151 ungetc (c, stdin);
152 yylval.string = scan_string ();
154 /* Check if string is "define_operator"; if so, return
155 a DEFOP token instead. */
156 if (!strcmp (yylval.string, "define_operator"))
158 free (yylval.string);
159 yylval.string = 0;
160 return DEFOP;
162 return STRING;
164 return c & 0xff;