source: libpacketdump/parser.y @ 120540d

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 120540d was 4f666aa, checked in by Perry Lorier <perry@…>, 15 years ago

Try a new build system for libpacket dump (move everything in
libpacketdump/parser/ into libpacketdump/)

  • Property mode set to 100644
File size: 3.4 KB
Line 
1%{
2    #include <stdio.h>
3    #include <stdlib.h>
4    #include <string.h>
5    #include <netinet/in.h>
6    #include <sys/socket.h>
7    #include <arpa/inet.h>
8    #include <assert.h>
9    #include "grammar.h"
10    #include "libpacketdump.h"
11    #include "bitbuffer.h"
12
13    #define YYERROR_VERBOSE 1
14
15   
16    int yylex(void);
17
18    char *file;
19    element_t *el_list = NULL;
20
21    /* i didnt want these to be global, but i think they have to be? :/ */
22    static bitbuffer_t buffer = 0;
23    static int bits = 0;
24%}
25
26
27%union {
28    int intval;
29    char *textval;
30    element_t *ptr;
31}
32
33%token TOK_BIGENDIAN TOK_LITTLEENDIAN TOK_NEXT TOK_OUTPUT_INT TOK_OUTPUT_HEX TOK_OUTPUT_IPV4 TOK_OUTPUT_FLAG TOK_CONSTANT TOK_IDENTIFIER TOK_OUTPUT_MAC TOK_OUTPUT_NONE
34
35%type <intval> TOK_BIGENDIAN TOK_LITTLEENDIAN TOK_NEXT TOK_OUTPUT_INT TOK_OUTPUT_HEX TOK_OUTPUT_IPV4 TOK_OUTPUT_FLAG TOK_OUTPUT_NONE TOK_CONSTANT output byteorder size '"'
36%type <textval> TOK_IDENTIFIER identifier
37%type <ptr> element nextfile elements
38
39%%
40
41config:     elements nextfile { /*print_list(el_list);*/ }
42           ;
43       
44elements:   element
45          | elements element { }
46          ;
47
48element:    byteorder size output identifier {
49                node_t *n;
50                element_t *el;
51                /* create a new field node... */
52                field_t *new_field = (field_t *)malloc(sizeof(field_t));
53                new_field->order = $1;
54                new_field->size = $2;
55                new_field->display = $3;
56                new_field->identifier = $4;
57
58                /* to go inside a new node... */
59                n = (node_t *)malloc(sizeof(node_t));
60                n->field = new_field;
61
62                /* to go inside a new element */
63                el = (element_t *)malloc(sizeof(element_t));           
64                el->type = FIELD;
65                el->next = NULL;
66                el->data = n;
67               
68                /* and stick the new element on the end of our list */
69                el_list = append(el_list, el);
70            }
71          ;
72
73byteorder: TOK_BIGENDIAN { $$ = BIGENDIAN; }
74            | TOK_LITTLEENDIAN { $$ = LITTLEENDIAN; }
75          ;
76
77size:   TOK_CONSTANT { $$ = yylval.intval; }
78        ;
79
80output:   TOK_OUTPUT_HEX    { $$ = DISPLAY_HEX; }
81        | TOK_OUTPUT_INT    { $$ = DISPLAY_INT; }
82        | TOK_OUTPUT_IPV4   { $$ = DISPLAY_IPV4; }
83        | TOK_OUTPUT_FLAG   { $$ = DISPLAY_FLAG; }
84        | TOK_OUTPUT_MAC    { $$ = DISPLAY_MAC; }
85        | TOK_OUTPUT_NONE   { $$ = DISPLAY_NONE; }
86        ;
87
88
89identifier: TOK_IDENTIFIER { $$ = strdup($1); }
90            ;
91
92
93nextfile:   TOK_NEXT identifier identifier {
94
95                element_t *tmp;
96                node_t *n;
97                element_t *el;
98                next_t *nextheader = (next_t *)malloc(sizeof(next_t));
99                nextheader->prefix = $2;
100                nextheader->fieldname = $3;
101                nextheader->target = NULL;
102               
103                for(tmp = el_list ;; tmp=tmp->next)
104                {
105                    /*
106                     * if we hit the end of the list or a nextheader then
107                     * the field name we are looking for doesn't exist
108                     * - this is an error but we can carry on and just
109                     * not bother parsing anything after this header
110                     */
111                    if(tmp == NULL || tmp->type == NEXTHEADER)
112                    {
113                        fprintf(stderr, "XXX No field match found for "
114                                        "nextfield '%s'...ignoring\n", $3);
115                        $$ = NULL;
116                        break;
117                    }
118                   
119                    /*
120                     * if the field name matches the one we are looking at,
121                     * store a pointer to it so we can steal its value later
122                     */
123                    if(strcmp($3, tmp->data->field->identifier) == 0)
124                    {
125                        nextheader->target = tmp->data->field;
126                        break;
127                    }
128                }
129               
130                n = (node_t *)malloc(sizeof(node_t));
131                n->nextheader = nextheader;
132
133                el = (element_t *)malloc(sizeof(element_t));           
134                el->type = NEXTHEADER;
135                el->next = NULL;
136                el->data = n;
137               
138                el_list = append(el_list, el);
139            }
140        |   { /*printf("no next file...\n");*/ $$ = NULL; }
141        ;
142
143
144%%
145
Note: See TracBrowser for help on using the repository browser.