2 * We don't read from the terminal.
4 %option never-interactive
7 * Prefix scanner routines with "ascend" rather than "yy", so this scanner
8 * can coexist with other scanners.
10 %option prefix="ascend"
16 * Copyright (c) 1998 by Gilbert Ramirez <gram@alumni.rice.edu>
18 * This program is free software; you can redistribute it and/or
19 * modify it under the terms of the GNU General Public License
20 * as published by the Free Software Foundation; either version 2
21 * of the License, or (at your option) any later version.
23 * This program is distributed in the hope that it will be useful,
24 * but WITHOUT ANY WARRANTY; without even the implied warranty of
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26 * GNU General Public License for more details.
28 * You should have received a copy of the GNU General Public License
29 * along with this program; if not, write to the Free Software
30 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
40 #include <io.h> /* for isatty() on win32 */
44 #include "ascendtext.h"
46 #include "ascend-int.h"
47 #include "file_wrappers.h"
48 #include "ascend_scanner_lex.h"
51 extern char *ascend_ra_ptr;
52 extern char *ascend_ra_last;
53 #define YY_INPUT(buf,result,max_size) { int c = file_getc(yy_fh); \
54 result = (c==EOF) ? YY_NULL : (buf[0] = c, 1); }
59 #define NO_USER "<none>"
62 #define YY_NO_UNISTD_H
81 WDD_CAUSE "Cause an attempt to place call to "
82 WDD_CALLNUM [^\n\r\t ]+
83 WDD_CHUNK "WD_DIALOUT_DISP: chunk"
84 WDD_TYPE "type "[^\n\r\t ]+
112 %s sc_ether_direction
116 <INITIAL,sc_gen_byte>{ETHER_PFX} {
117 BEGIN(sc_ether_direction);
118 ascendlval.d = ASCEND_PFX_ETHER;
122 <INITIAL,sc_gen_byte>{ISDN_XPFX} {
124 ascendlval.d = ASCEND_PFX_ISDN_X;
128 <INITIAL,sc_gen_byte>{ISDN_RPFX} {
130 ascendlval.d = ASCEND_PFX_ISDN_R;
134 <INITIAL,sc_gen_byte>{WAN_XPFX} {
136 ascendlval.d = ASCEND_PFX_WDS_X;
140 <INITIAL,sc_gen_byte>{WAN_RPFX} {
142 ascendlval.d = ASCEND_PFX_WDS_R;
146 <INITIAL,sc_gen_byte>{PPP_XPFX} {
148 ascendlval.d = ASCEND_PFX_WDS_X;
152 <INITIAL,sc_gen_byte>{PPP_RPFX} {
154 ascendlval.d = ASCEND_PFX_WDS_R;
158 <sc_ether_direction>[^\(]{2,20} {
163 <sc_isdn_call>[^\/\(:]{2,20} {
168 <sc_wds_user>[^:]{2,20} {
169 char *atcopy = g_strdup(ascendtext);
170 char colon = input();
171 char after = input();
174 unput(after); unput(colon);
176 if (after != '(' && after != ' ') {
178 if (pseudo_header != NULL) {
179 g_strlcpy(pseudo_header->user, atcopy, ASCEND_MAX_STR_LEN);
181 } else { /* We have a version 7 file */
183 if (pseudo_header != NULL) {
184 g_strlcpy(pseudo_header->user, NO_USER, ASCEND_MAX_STR_LEN);
186 /* Are valid values ever > 2^32? If so we need to adjust YYSTYPE and a lot of */
187 /* upstream code accordingly. */
188 ascendlval.d = (guint32) strtoul(ascendtext, NULL, 10);
197 ascendlval.d = (guint32) strtoul(ascendtext, NULL, 10);
201 <sc_gen_task>(0x|0X)?{H}{2,8} {
202 BEGIN(sc_gen_time_s);
203 ascendlval.d = (guint32) strtoul(ascendtext, NULL, 16);
207 <sc_gen_task>\"[A-Za-z0-9_ ]+\" {
211 <sc_gen_time_s>{D}{1,10} {
212 BEGIN(sc_gen_time_u);
213 ascendlval.d = (guint32) strtoul(ascendtext, NULL, 10);
217 <sc_gen_time_u>{D}{1,6} {
218 char *atcopy = g_strdup(ascendtext);
219 BEGIN(sc_gen_octets);
220 /* only want the most significant 2 digits. convert to usecs */
221 if (strlen(atcopy) > 2)
223 ascendlval.d = (guint32) strtoul(atcopy, NULL, 10) * 10000;
228 <sc_gen_octets>{D}{1,10} {
229 BEGIN(sc_gen_counter);
230 ascendlval.d = (guint32) strtoul(ascendtext, NULL, 10);
234 <sc_gen_counter,sc_gen_byte>"["{H}{4}"]:" {
239 <sc_gen_byte>{H}{2} {
240 ascendlval.b = (guint8)(guint32) strtoul(ascendtext, NULL, 16);
244 <sc_gen_byte>" "{4} {
252 <INITIAL,sc_gen_byte>{WDD_DATE} {
253 BEGIN(sc_wdd_date_d);
257 <sc_wdd_date_d>{D}{2} {
258 BEGIN(sc_wdd_date_m);
259 ascendlval.d = (guint32) strtoul(ascendtext, NULL, 10);
263 <sc_wdd_date_m>{D}{2} {
264 BEGIN(sc_wdd_date_y);
265 ascendlval.d = (guint32) strtoul(ascendtext, NULL, 10);
269 <sc_wdd_date_y>{D}{4} {
271 ascendlval.d = (guint32) strtoul(ascendtext, NULL, 10);
275 <sc_wdd_time>{WDD_TIME} {
276 BEGIN(sc_wdd_time_h);
280 <sc_wdd_time_h>{D}{2} {
281 BEGIN(sc_wdd_time_m);
282 ascendlval.d = (guint32) strtoul(ascendtext, NULL, 10);
286 <sc_wdd_time_m>{D}{2} {
287 BEGIN(sc_wdd_time_s);
288 ascendlval.d = (guint32) strtoul(ascendtext, NULL, 10);
292 <sc_wdd_time_s>{D}{2} {
294 ascendlval.d = (guint32) strtoul(ascendtext, NULL, 10);
298 <sc_wdd_cause>{WDD_CAUSE} {
299 BEGIN(sc_wdd_callnum);
303 <sc_wdd_callnum>{WDD_CALLNUM} {
305 if (pseudo_header != NULL) {
306 g_strlcpy(pseudo_header->call_num, ascendtext, ASCEND_MAX_STR_LEN);
311 <INITIAL,sc_wdd_chunk,sc_gen_byte>{WDD_CHUNK} {
312 BEGIN(sc_wdd_chunknum);
316 <sc_wdd_chunknum>{H}{1,8} {
318 ascendlval.d = (guint32) strtoul(ascendtext, NULL, 16);
322 <sc_wdd_type>{WDD_TYPE} {
327 <sc_gen_task>\/{D}+ {
331 (0x|0X)?{H}+ { return HEXNUM; }
333 task:|task|at|time:|octets { return KEYWORD; }
335 <<EOF>> { at_eof++; yyterminate(); }
341 void ascend_init_lexer(FILE_T fh)
349 * We want to stop processing when we get to the end of the input.
350 * (%option noyywrap is not used because if used then
351 * some flex versions (eg: 2.5.35) generate code which causes
352 * warnings by the Windows VC compiler).