NEEDED??? epan/dissectors/packet-dcerpc.c dissect_ndr_c_and_or_v_array_core dissect_n...
[wireshark-sm.git] / wiretap / candump_scanner.l
blobc43c5349c2f7166302e49c7ccb6ea1997f0d544e
1 /* candump_scanner.l
2  *
3  * Wiretap Library
4  * Copyright (c) 1998 by Gilbert Ramirez <gram@alumni.rice.edu>
5  *
6  * Support for candump log file format
7  * Copyright (c) 2019 by Maksim Salau <maksim.salau@gmail.com>
8  *
9  * SPDX-License-Identifier: GPL-2.0-or-later
10  */
12 %top {
13 /* Include this before everything else, for various large-file definitions */
14 #include "config.h"
15 #include <wireshark.h>
18 %option reentrant
19 %option noyywrap
20 %option noinput
21 %option nounput
22 %option batch
23 %option never-interactive
24 %option prefix="candump_"
25 %option extra-type="candump_state_t *"
26 %option yylineno
27 %option nodefault
29 %option noyy_scan_buffer
30 %option noyy_scan_bytes
31 %option noyy_scan_string
34  * We have to override the memory allocators so that we don't get
35  * "unused argument" warnings from the yyscanner argument (which
36  * we don't use, as we have a global memory allocator).
37  *
38  * We provide, as macros, our own versions of the routines generated by Flex,
39  * which just call malloc()/realloc()/free() (as the Flex versions do),
40  * discarding the extra argument.
41  */
42 %option noyyalloc
43 %option noyyrealloc
44 %option noyyfree
48 #include <ws_diag_control.h>
49 #include <wiretap/file_wrappers.h>
50 #include "candump_parser.h"
51 #include "candump_priv.h"
53 #ifndef HAVE_UNISTD_H
54 #define YY_NO_UNISTD_H
55 #endif
57 static int candump_yyinput(void *buf, candump_state_t *state)
59     int c = file_getc(state->fh);
61     if (c == EOF)
62     {
63         state->err = file_error(state->fh, &state->err_info);
64         return YY_NULL;
65     }
67     *(char *)buf = c;
69     return 1;
72 #define YY_INPUT(buf, result, max_size) \
73     do { (result) = candump_yyinput((buf), yyextra); } while (0)
75 /* Count bytes read. This is required in order to rewind the file
76  * to the beginning of the next packet, since flex reads more bytes
77  * before executing the action that does yyterminate(). */
78 #define YY_USER_ACTION do { yyextra->file_bytes_read += yyleng; } while (0);
81  * Sleazy hack to suppress compiler warnings in yy_fatal_error().
82  */
83 #define YY_EXIT_FAILURE ((void)yyscanner, 2)
86  * Macros for the allocators, to discard the extra argument.
87  */
88 #define candump_alloc(size, yyscanner)          (void *)malloc(size)
89 #define candump_realloc(ptr, size, yyscanner)   (void *)realloc((char *)(ptr), (size))
90 #define candump_free(ptr, yyscanner)            free((char *)(ptr))
92 DIAG_OFF_FLEX()
96 INT [0-9]
97 HEX [0-9A-Fa-f]
101 [ \t]                   { return TOKEN_SPACE; };
102 [\r\n][ \t\r\n]*        { yyterminate(); }
104 \({INT}+\.{INT}+\)      {
105                             yyextra->token.v0 = strtoul(yytext + 1, NULL, 10);
106                             yyextra->token.v1 = strtoul(strchr(yytext, '.') + 1, NULL, 10);
107                             return TOKEN_TIMESTAMP;
108                         }
110 R{INT}                  {
111                             yyextra->token.v0 = strtoul(yytext + 1, NULL, 10);
112                             return TOKEN_RTR;
113                         }
115 R                       {
116                             yyextra->token.v0 = 0;
117                             return TOKEN_RTR;
118                         }
120 {HEX}{8}#               {
121                             yyextra->token.v0 = strtoul(yytext, NULL, 16);
122                             return TOKEN_EXT_ID;
123                         }
125 {HEX}{3}#               {
126                             yyextra->token.v0 = strtoul(yytext, NULL, 16);
127                             return TOKEN_STD_ID;
128                         }
130 {HEX}{HEX}              {
131                             yyextra->token.v0 = strtoul(yytext, NULL, 16);
132                             return TOKEN_BYTE;
133                         }
135 #{HEX}                  {
136                             yyextra->token.v0 = strtoul(yytext + 1, NULL, 16);
137                             return TOKEN_FLAGS;
138                         }
140 .                       { return TOKEN_UNKNOWN; }
144 DIAG_ON_FLEX()