source: libpacketdump/parser.y @ eade363

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

Tidy up thousands of little warnings

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