source: libpacketdump/parser/parser.y @ 6a18893

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

Completely change the build system of the protocol file parser to try and
avoid issues on freebsd

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