3 * $OpenBSD: scan.l,v 1.14 2003/12/02 09:00:07 otto Exp $
4 * $DragonFly: src/usr.bin/bc/scan.l,v 1.1 2004/09/20 04:20:34 dillon Exp $
8 * Copyright (c) 2003, Otto Moerbeek <otto@drijf.net>
10 * Permission to use, copy, modify, and distribute this software for any
11 * purpose with or without fee is hereby granted, provided that the above
12 * copyright notice and this permission notice appear in all copies.
14 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
15 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
16 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
17 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
18 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
19 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
20 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
32 static char *strbuf = NULL;
33 static size_t strbuf_sz = 1;
36 static void init_strbuf(void);
37 static void add_str(const char *);
45 %x comment string number
55 <<EOF>> fatal("end of file in comment");
58 \" BEGIN(string); init_strbuf();
60 [^"\n\\\[\]]+ add_str(yytext);
64 \n add_str("\n"); lineno++;
65 \" BEGIN(INITIAL); yylval.str = strbuf; return STRING;
66 <<EOF>> fatal("end of file in string");
82 {DIGIT}+ add_str(yytext);
98 if (strcmp(strbuf, ".") == 0)
108 "break" return BREAK;
109 "continue" return CONTINUE;
110 "define" return DEFINE;
112 "ibase" return IBASE;
116 "length" return LENGTH;
117 "obase" return OBASE;
118 "print" return PRINT;
120 "return" return RETURN;
121 "scale" return SCALE;
123 "while" return WHILE;
128 "%" return REMAINDER;
131 "&&" return BOOL_AND;
140 "=" yylval.str = ""; return ASSIGN_OP;
141 "+=" yylval.str = "+"; return ASSIGN_OP;
142 "-=" yylval.str = "-"; return ASSIGN_OP;
143 "*=" yylval.str = "*"; return ASSIGN_OP;
144 "/=" yylval.str = "/"; return ASSIGN_OP;
145 "%=" yylval.str = "%"; return ASSIGN_OP;
146 "^=" yylval.str = "^"; return ASSIGN_OP;
150 ">=" return GREATER_EQ;
151 "!=" return UNEQUALS;
156 ";" return SEMICOLON;
168 /* alloc an extra byte for the type marker */
169 char *p = malloc(yyleng + 2);
172 strlcpy(p, yytext, yyleng + 1);
178 \n lineno++; return NEWLINE;
183 . yyerror("illegal character");
190 if (strbuf == NULL) {
191 strbuf = malloc(strbuf_sz);
199 add_str(const char *str)
203 arglen = strlen(str);
205 if (strlen(strbuf) + arglen + 1 > strbuf_sz) {
209 newsize = strbuf_sz + arglen + 1;
210 p = realloc(strbuf, newsize);
218 strlcat(strbuf, str, strbuf_sz);
224 if (isatty(fileno(yyin))) {