4 * MATE's configuration language grammar
6 * Copyright 2005, Luis E. Garcia Ontanon <luis.ontanon@gmail.com>
10 * Ethereal - Network traffic analyzer
11 * By Gerald Combs <gerald@ethereal.com>
12 * Copyright 1998 Gerald Combs
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, write to the Free Software
26 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
30 #include "mate_grammar.h"
34 typedef struct _extraction {
36 header_field_info* hfi;
37 struct _extraction* next;
38 struct _extraction* last;
41 typedef struct _pdu_flags {
42 gboolean drop_unassigned;
44 gboolean last_extracted;
47 typedef struct _pdu_criteria_t {
49 avpl_match_mode criterium_match_mode;
50 accept_mode_t criterium_accept_mode;
53 typedef struct _pdu_statement {
56 extraction_t* extraction;
57 pdu_criteria_t* criteria;
58 GPtrArray* transforms;
61 typedef struct _gop_tree_statement {
62 gop_tree_mode_t pdu_tree_mode;
63 gboolean drop_unassigned;
67 typedef struct _gop_timer_statement {
71 } gop_timer_statement;
73 typedef struct _gop_option_statement {
74 gop_timer_statement* timer_sts;
75 gop_tree_statement* tree_sts;
76 } gop_option_statement;
78 typedef struct _gop_control_statement {
82 } gop_control_statement;
84 typedef struct _gop_statement {
85 gop_control_statement* control;
86 gop_option_statement* options;
87 GPtrArray* transforms;
90 typedef struct _gog_statements {
92 gop_tree_mode_t gop_tree_mode;
93 GPtrArray* transform_list;
95 LoAL* current_gogkeys;
98 static void configuration_error(mate_config* mc, const gchar* fmt, ...) {
99 static gchar error_buffer[256];
102 mate_config_frame* current_frame;
105 va_start( list, fmt );
106 g_vsnprintf(error_buffer,sizeof(error_buffer),fmt,list);
109 i = (gint) mc->config_stack->len;
114 incl = "\n included from: ";
119 current_frame = g_ptr_array_index(mc->config_stack,(guint)i);
121 g_string_sprintfa(mc->config_error,"%s%s at line %u",incl, current_frame->filename, current_frame->linenum);
124 g_string_sprintfa(mc->config_error,": %s\n",error_buffer);
126 THROW(MateConfigError);
130 static AVPL_Transf* new_transform_elem(AVPL* match, AVPL* replace, avpl_match_mode match_mode, avpl_replace_mode replace_mode) {
131 AVPL_Transf* t = g_malloc(sizeof(AVPL_Transf));
135 t->replace = replace;
136 t->match_mode = match_mode;
137 t->replace_mode = replace_mode;
145 static pdu_statement_t* do_pdu_statements(GPtrArray* payload, pdu_flags_t* flags, extraction_t* extraction, pdu_criteria_t* criteria, GPtrArray* transforms) {
146 pdu_statement_t* s = g_malloc(sizeof(pdu_statement_t));
148 s->payload = payload;
150 s->extraction = extraction;
151 s->criteria = criteria;
152 s->transforms = transforms;
157 static gchar* recolonize(mate_config* mc, gchar* s) {
158 GString* str = g_string_new("");
164 vec = g_strsplit(s,":",0);
166 for (i = 0; vec[i]; i++) {
170 switch ( strlen(vec[i]) ) {
173 vec[i][1] = vec[i][0];
175 if (vec[i][0] >= '0' && vec[i][0] <= '9') {
176 v += (vec[i][1] - '0' )*16;
178 v += (vec[i][1] - 'a' + 10)*16;
181 if (vec[i][0] >= '0' && vec[i][0] <= '9') {
182 v += (vec[i][0] - '0' );
184 v += (vec[i][0] - 'a' + 10);
189 configuration_error(mc,"bad token %s",s);
192 g_string_sprintfa(str,":%.2X",v);
197 g_string_erase(str,0,1);
201 g_string_free(str,FALSE);
212 %token_type { gchar* }
213 %token_destructor { if ($$) g_free($$); }
215 %extra_argument { mate_config* mc }
218 configuration_error(mc,"Syntax Error before %s",yyminor);
222 configuration_error(mc,"Parse Error");
225 %type transform_decl { AVPL_Transf* }
226 %type transform_body { AVPL_Transf* }
227 %type transform_statements { AVPL_Transf* }
228 %type transform_statement { AVPL_Transf* }
229 %type transform_blks { AVPL_Transf* }
230 %type transform_blk { AVPL_Transf* }
231 %type match_mode { avpl_match_mode }
232 %type action_mode { avpl_replace_mode }
234 %type gop_name { gchar* }
235 %type time_value { float }
236 %type pdu_name { gchar* }
237 %type gop_tree_mode { gop_tree_mode_t }
238 %type true_false { gboolean }
240 %type pdu_setup { pdu_statement_t* }
241 %type pdu_statements { pdu_statement_t* }
243 %type pdu_criteria_statement { pdu_criteria_t* }
244 %type pdu_flag_statements { pdu_flags_t* }
245 %type accept_mode { accept_mode_t }
246 %type drop_unassigned_statement { gboolean }
247 %type discard_pdu_data_statement { gboolean }
248 %type last_extracted_statement { gboolean }
250 %type extraction_statement {extraction_t*}
251 %type extraction_statements {extraction_t*}
253 %type gop_setup { gop_statement* }
254 %type gop_statements { gop_statement* }
255 %type gop_control_statements { gop_control_statement* }
256 %type gop_option_statements { gop_option_statement* }
257 %type gop_timer_statements { gop_timer_statement* }
258 %type gop_tree_statements { gop_tree_statement* }
260 %type gop_start_statement { AVPL* }
261 %type gop_stop_statement { AVPL* }
262 %type extra_statement { AVPL* }
263 %type show_goptree_statement { gop_tree_mode_t }
264 %type show_times_statement { gboolean }
265 %type expiration_statement { float }
266 %type idle_timeout_statement { float }
267 %type lifetime_statement { float }
269 %type gog_statements { gog_statement_t* }
270 %type gog_goptree_statement { gop_tree_mode_t }
271 %type gog_key_statements { LoAL* }
272 %type gog_key_statement { AVPL* }
273 %type transform_list_statement { GPtrArray* }
274 %type transform { AVPL_Transf* }
275 %type gop_tree_type { gop_tree_mode_t }
277 %type payload_statement { GPtrArray* }
278 %type proto_stack { GPtrArray* }
279 %type field { header_field_info* }
280 %type transform_list { GPtrArray* }
284 %type value { gchar* }
285 %type avp_oneoff { gchar* }
288 mate_config ::= decls DONE_KW SEMICOLON.
290 decls ::= decls decl.
296 decl ::= transform_decl.
298 /******************************************* TRANSFORM
301 transform_decl(A) ::= TRANSFORM_KW NAME(B) transform_body(C) SEMICOLON. {
304 if ( g_hash_table_lookup(mc->transfs,B) ) {
305 configuration_error(mc,"A transformation called '%s' exists already",B);
308 for ( c = C; c; c = c->next )
309 c->name = g_strdup(B);
311 g_hash_table_insert(mc->transfs,C->name,C);
316 transform_body(A) ::= OPEN_BRACE transform_blks(B) CLOSE_BRACE. { A = B; }
318 transform_blks(A) ::= transform_blks(C) transform_blk(B). {
321 for ( c = C; c->next; c = c->next ) ;
326 transform_blks(A) ::= transform_blk(B). { A = B; }
328 transform_blk(A) ::= MATCH_KW match_mode(B) avpl(C) action_mode(D) avpl(E) SEMICOLON. {
329 A = new_transform_elem(C,E,B,D);
332 transform_blk(A) ::= MATCH_KW match_mode(B) avpl(C) SEMICOLON. {
333 A = new_transform_elem(C,new_avpl(""),B,AVPL_INSERT);
336 transform_blk(A) ::= MATCH_KW avpl(B) action_mode(C) avpl(D) SEMICOLON. {
337 A = new_transform_elem(B,D,AVPL_STRICT,C);
340 transform_blk(A) ::= action_mode(B) avpl(C) SEMICOLON. {
341 A = new_transform_elem(new_avpl(""),C,AVPL_NO_MATCH,B);
344 transform_blk(A) ::= MATCH_KW avpl(B) SEMICOLON. {
345 A = new_transform_elem(B,new_avpl(""),AVPL_STRICT,AVPL_INSERT);
348 match_mode(A) ::= STRICT_KW. { A = AVPL_STRICT; }
349 match_mode(A) ::= EVERY_KW. { A = AVPL_EVERY; }
350 match_mode(A) ::= LOOSE_KW. { A = AVPL_LOOSE; }
352 action_mode(A) ::= REPLACE_KW. { A = AVPL_REPLACE; }
353 action_mode(A) ::= INSERT_KW. { A = AVPL_INSERT; }
355 /******************************************* PDU
358 pdu_decl ::= PDU_KW NAME(NAME) PROTO_KW field(FIELD) TRANSPORT_KW proto_stack(STACK) pdu_setup(SETUP) SEMICOLON. {
359 mate_cfg_pdu* cfg = new_pducfg(NAME);
360 extraction_t *extraction, *next_extraction;
361 GPtrArray* transport_stack = g_ptr_array_new();
364 if (! cfg ) configuration_error(mc,"could not create Pdu %s.",NAME);
366 cfg->hfid_proto = FIELD->id;
368 cfg->last_extracted = (SETUP->flags) ? SETUP->flags->last_extracted : mc->defaults.pdu.last_extracted;
369 cfg->discard = (SETUP->flags) ? SETUP->flags->discard : mc->defaults.pdu.discard;
370 cfg->drop_unassigned = (SETUP->flags) ? SETUP->flags->drop_unassigned : mc->defaults.pdu.drop_unassigned;
372 g_string_sprintfa(mc->protos_filter,"||%s",FIELD->abbrev);
374 /* flip the transport_stack */
375 for (i = STACK->len - 1; STACK->len; i--) {
376 g_ptr_array_add(transport_stack,g_ptr_array_remove_index(STACK,i));
379 g_ptr_array_free(STACK,FALSE);
381 cfg->transport_ranges = transport_stack;
382 cfg->payload_ranges = SETUP->payload;
384 if (SETUP->criteria) {
385 cfg->criterium = SETUP->criteria->criterium_avpl;
386 cfg->criterium_match_mode = SETUP->criteria->criterium_match_mode;
387 cfg->criterium_accept_mode = SETUP->criteria->criterium_accept_mode;
390 cfg->transforms = SETUP->transforms ? SETUP->transforms : g_ptr_array_new();
392 for (extraction = SETUP->extraction; extraction; extraction = next_extraction) {
393 next_extraction = extraction->next;
395 if ( ! add_hfid(extraction->hfi, extraction->as, cfg->hfids_attr) ) {
396 configuration_error(mc,"MATE: failed to create extraction rule '%s'",extraction->as);
403 pdu_setup(A) ::= OPEN_BRACE pdu_statements(B) CLOSE_BRACE. { A = B; }
406 pdu_statements(A) ::= payload_statement(B) pdu_flag_statements(C) extraction_statements(D) pdu_criteria_statement(E) transform_list_statement(F). { A = do_pdu_statements(B,C,D,E,F); }
407 pdu_statements(A) ::= payload_statement(B) pdu_flag_statements(C) extraction_statements(D) pdu_criteria_statement(E). { A = do_pdu_statements(B,C,D,E,NULL); }
408 pdu_statements(A) ::= payload_statement(B) pdu_flag_statements(C) extraction_statements(D) transform_list_statement(F). { A = do_pdu_statements(B,C,D,NULL,F); }
409 pdu_statements(A) ::= payload_statement(B) pdu_flag_statements(C) extraction_statements(D). { A = do_pdu_statements(B,C,D,NULL,NULL); }
410 pdu_statements(A) ::= payload_statement(B) extraction_statements(D) pdu_criteria_statement(E) transform_list_statement(F). { A = do_pdu_statements(B,NULL,D,E,F); }
411 pdu_statements(A) ::= payload_statement(B) extraction_statements(D) pdu_criteria_statement(E). { A = do_pdu_statements(B,NULL,D,E,NULL); }
412 pdu_statements(A) ::= payload_statement(B) extraction_statements(D) transform_list_statement(F). { A = do_pdu_statements(B,NULL,D,NULL,F); }
413 pdu_statements(A) ::= payload_statement(B) extraction_statements(D). { A = do_pdu_statements(B,NULL,D,NULL,NULL); }
414 pdu_statements(A) ::= pdu_flag_statements(C) extraction_statements(D) pdu_criteria_statement(E) transform_list_statement(F). { A = do_pdu_statements(NULL,C,D,E,F); }
415 pdu_statements(A) ::= pdu_flag_statements(C) extraction_statements(D) pdu_criteria_statement(E). { A = do_pdu_statements(NULL,C,D,E,NULL); }
416 pdu_statements(A) ::= pdu_flag_statements(C) extraction_statements(D) transform_list_statement(F). { A = do_pdu_statements(NULL,C,D,NULL,F); }
417 pdu_statements(A) ::= pdu_flag_statements(C) extraction_statements(D). { A = do_pdu_statements(NULL,C,D,NULL,NULL); }
418 pdu_statements(A) ::= extraction_statements(D) pdu_criteria_statement(E) transform_list_statement(F). { A = do_pdu_statements(NULL,NULL,D,E,F); }
419 pdu_statements(A) ::= extraction_statements(D) pdu_criteria_statement(E). { A = do_pdu_statements(NULL,NULL,D,E,NULL); }
420 pdu_statements(A) ::= extraction_statements(D) transform_list_statement(F). { A = do_pdu_statements(NULL,NULL,D,NULL,F); }
421 pdu_statements(A) ::= extraction_statements(D). { A = do_pdu_statements(NULL,NULL,D,NULL,NULL); }
423 pdu_flag_statements(A) ::= drop_unassigned_statement(B) discard_pdu_data_statement(C) last_extracted_statement(D). {
424 A = g_malloc(sizeof(pdu_flags_t));
426 A->drop_unassigned = B;
428 A->last_extracted = D;
431 pdu_flag_statements(A) ::= drop_unassigned_statement(B) discard_pdu_data_statement(C). {
432 A = g_malloc(sizeof(pdu_flags_t));
434 A->drop_unassigned = B;
436 A->last_extracted = mc->defaults.pdu.last_extracted;
439 pdu_flag_statements(A) ::= drop_unassigned_statement(B) last_extracted_statement(D). {
440 A = g_malloc(sizeof(pdu_flags_t));
442 A->drop_unassigned = B;
443 A->discard = mc->defaults.pdu.discard;
444 A->last_extracted = D;
447 pdu_flag_statements(A) ::= discard_pdu_data_statement(C) last_extracted_statement(D). {
448 A = g_malloc(sizeof(pdu_flags_t));
450 A->drop_unassigned = mc->defaults.pdu.drop_unassigned;
452 A->last_extracted = D;
455 pdu_flag_statements(A) ::= last_extracted_statement(D). {
456 A = g_malloc(sizeof(pdu_flags_t));
458 A->drop_unassigned = mc->defaults.pdu.drop_unassigned;
459 A->discard = mc->defaults.pdu.discard;
460 A->last_extracted = D;
463 pdu_flag_statements(A) ::= discard_pdu_data_statement(C). {
464 A = g_malloc(sizeof(pdu_flags_t));
466 A->drop_unassigned = mc->defaults.pdu.drop_unassigned;
468 A->last_extracted = mc->defaults.pdu.last_extracted;
471 pdu_flag_statements(A) ::= drop_unassigned_statement(B). {
472 A = g_malloc(sizeof(pdu_flags_t));
474 A->drop_unassigned = B;
475 A->discard = mc->defaults.pdu.discard;
476 A->last_extracted = mc->defaults.pdu.last_extracted;
480 payload_statement(A) ::= PAYLOAD_KW proto_stack(B) SEMICOLON. { A = B; }
482 pdu_criteria_statement(A) ::= CRITERIA_KW accept_mode(B) match_mode(C) avpl(D) SEMICOLON. {
483 A = g_malloc(sizeof(pdu_criteria_t));
484 A->criterium_avpl = D;
485 A->criterium_match_mode = C;
486 A->criterium_accept_mode = B;
489 accept_mode(A) ::= ACCEPT_KW. { A = ACCEPT_MODE; }
490 accept_mode(A) ::= REJECT_KW. { A = REJECT_MODE; }
492 extraction_statements(A) ::= extraction_statements(B) extraction_statement(C). {
498 extraction_statements(A) ::= extraction_statement(B). {
503 extraction_statement(A) ::= EXTRACT_KW NAME(NAME) FROM_KW field(FIELD) SEMICOLON. {
504 A = g_malloc(sizeof(extraction_t));
507 A->next = A->last = NULL;
511 drop_unassigned_statement(A) ::= DROP_UNASSIGNED_KW true_false(B) SEMICOLON. { A = B; }
513 discard_pdu_data_statement(A) ::= DISCARD_PDU_DATA_KW true_false(B) SEMICOLON. { A = B; }
515 last_extracted_statement(A) ::= LAST_PDU_KW true_false(B) SEMICOLON. { A = B; }
517 proto_stack(A) ::= proto_stack(B) SLASH field(C). {
518 int* hfidp = g_malloc(sizeof(int));
520 g_string_sprintfa(mc->fields_filter,"||%s",C->abbrev);
523 g_ptr_array_add(B,hfidp);
527 proto_stack(A) ::= field(B). {
528 int* hfidp = g_malloc(sizeof(int));
531 g_string_sprintfa(mc->fields_filter,"||%s",B->abbrev);
533 A = g_ptr_array_new();
534 g_ptr_array_add(A,hfidp);
537 field(A) ::= NAME(B). {
538 A = proto_registrar_get_byname(B);
543 /******************************************* GOP
546 gop_decl(A) ::= GOP_KW NAME(B) ON_KW pdu_name(C) MATCH_KW avpl(D) gop_setup(E) SEMICOLON. {
549 if (g_hash_table_lookup(mc->gopcfgs,B)) configuration_error(mc,"A Gop Named '%s' exists already.",B);
550 if (g_hash_table_lookup(mc->gops_by_pduname,C) ) configuration_error(mc,"Gop for Pdu '%s' exists already",C);
553 g_hash_table_insert(mc->gops_by_pduname,C,cfg);
554 g_hash_table_insert(mc->gopcfgs,cfg->name,cfg);
557 cfg->drop_unassigned = (E->options && E->options->tree_sts) ? E->options->tree_sts->drop_unassigned : mc->defaults.gop.drop_unassigned;
558 cfg->show_times = (E->options && E->options->tree_sts) ? E->options->tree_sts->show_times : mc->defaults.gop.show_times;
559 cfg->pdu_tree_mode = (E->options && E->options->tree_sts) ? E->options->tree_sts->pdu_tree_mode : mc->defaults.gop.pdu_tree_mode;
561 cfg->expiration = (E->options && E->options->timer_sts) ? E->options->timer_sts->expiration : mc->defaults.gop.expiration;
562 cfg->idle_timeout = (E->options && E->options->timer_sts) ? E->options->timer_sts->idle_timeout : mc->defaults.gop.idle_timeout;
563 cfg->lifetime = (E->options && E->options->timer_sts) ? E->options->timer_sts->lifetime : mc->defaults.gop.lifetime;
565 cfg->start = E->control ? E->control->start : NULL;
566 cfg->stop = E->control ? E->control->stop : NULL;
569 cfg->transforms = (E->transforms) ? E->transforms : g_ptr_array_new();
571 if (E->control && E->control->extras) {
572 merge_avpl(cfg->extra,E->control->extras,TRUE);
573 delete_avpl(E->control->extras,TRUE);
576 if (E->control) g_free(E->control);
579 if (E->options->tree_sts) g_free(E->options->tree_sts);
580 if (E->options->timer_sts) g_free(E->options->timer_sts);
581 if (E->options) g_free(E->options);
588 gop_decl(A) ::= GOP_KW NAME(B) ON_KW pdu_name(C) MATCH_KW avpl(D) SEMICOLON. {
591 if (g_hash_table_lookup(mc->gopcfgs,B)) configuration_error(mc,"A Gop Named '%s' exists already.",B);
592 if (g_hash_table_lookup(mc->gops_by_pduname,C) ) configuration_error(mc,"Gop for Pdu '%s' exists already",C);
595 g_hash_table_insert(mc->gops_by_pduname,C,cfg);
596 g_hash_table_insert(mc->gopcfgs,cfg->name,cfg);
598 cfg->drop_unassigned = mc->defaults.gop.drop_unassigned;
599 cfg->show_times = mc->defaults.gop.show_times;
600 cfg->pdu_tree_mode = mc->defaults.gop.pdu_tree_mode;
602 cfg->expiration = mc->defaults.gop.expiration;
603 cfg->idle_timeout = mc->defaults.gop.idle_timeout;
604 cfg->lifetime = mc->defaults.gop.lifetime;
610 cfg->transforms = g_ptr_array_new();
613 gop_setup(A) ::= OPEN_BRACE gop_statements(B) CLOSE_BRACE. {
617 gop_statements(A) ::= gop_control_statements(B) gop_option_statements(C) transform_list_statement(E). {
618 A = g_malloc(sizeof(gop_statement));
625 gop_statements(A) ::= gop_option_statements(C) transform_list_statement(E). {
626 A = g_malloc(sizeof(gop_statement));
633 gop_statements(A) ::= gop_control_statements(B) transform_list_statement(E). {
634 A = g_malloc(sizeof(gop_statement));
641 gop_statements(A) ::= gop_control_statements(B) gop_option_statements(C). {
642 A = g_malloc(sizeof(gop_statement));
646 A->transforms = NULL;
650 gop_statements(A) ::= gop_option_statements(C). {
651 A = g_malloc(sizeof(gop_statement));
655 A->transforms = NULL;
658 gop_statements(A) ::= gop_control_statements(B). {
659 A = g_malloc(sizeof(gop_statement));
663 A->transforms = NULL;
666 gop_statements(A) ::= transform_list_statement(E). {
667 A = g_malloc(sizeof(gop_statement));
677 gop_control_statements(A) ::= gop_start_statement(B) gop_stop_statement(C) extra_statement(D).{
678 A = g_malloc(sizeof(gop_control_statement));
686 gop_control_statements(A) ::= gop_stop_statement(C) extra_statement(D).{
687 A = g_malloc(sizeof(gop_control_statement));
694 gop_control_statements(A) ::= gop_start_statement(B) extra_statement(D).{
695 A = g_malloc(sizeof(gop_control_statement));
702 gop_control_statements(A) ::= gop_start_statement(B) gop_stop_statement(C).{
703 A = g_malloc(sizeof(gop_control_statement));
711 gop_control_statements(A) ::= gop_start_statement(B).{
712 A = g_malloc(sizeof(gop_control_statement));
719 gop_control_statements(A) ::= gop_stop_statement(C).{
720 A = g_malloc(sizeof(gop_control_statement));
727 gop_control_statements(A) ::= extra_statement(D). {
728 A = g_malloc(sizeof(gop_control_statement));
738 gop_option_statements(A) ::= gop_timer_statements(B) gop_tree_statements(C). {
739 A = g_malloc(sizeof(gop_control_statement));
745 gop_option_statements(A) ::= gop_timer_statements(B). {
746 A = g_malloc(sizeof(gop_timer_statement));
753 gop_option_statements(A) ::= gop_tree_statements(C). {
754 A = g_malloc(sizeof(gop_timer_statement));
763 gop_timer_statements(A) ::= expiration_statement(B) idle_timeout_statement(C) lifetime_statement(D). {
764 A = g_malloc(sizeof(gop_timer_statement));
772 gop_timer_statements(A) ::= expiration_statement(B) idle_timeout_statement(C). {
773 A = g_malloc(sizeof(gop_timer_statement));
777 A->lifetime = mc->defaults.gop.lifetime;
780 gop_timer_statements(A) ::= expiration_statement(B) lifetime_statement(D). {
781 A = g_malloc(sizeof(gop_timer_statement));
784 A->idle_timeout = mc->defaults.gop.lifetime;
788 gop_timer_statements(A) ::= idle_timeout_statement(C) lifetime_statement(D). {
789 A = g_malloc(sizeof(gop_timer_statement));
791 A->expiration = mc->defaults.gop.lifetime;
796 gop_timer_statements(A) ::= expiration_statement(B). {
797 A = g_malloc(sizeof(gop_timer_statement));
800 A->idle_timeout = mc->defaults.gop.lifetime;
801 A->lifetime = mc->defaults.gop.lifetime;
804 gop_timer_statements(A) ::= idle_timeout_statement(C). {
805 A = g_malloc(sizeof(gop_timer_statement));
807 A->expiration = mc->defaults.gop.lifetime;
809 A->lifetime = mc->defaults.gop.lifetime;
812 gop_timer_statements(A) ::= lifetime_statement(D). {
813 A = g_malloc(sizeof(gop_timer_statement));
815 A->expiration = mc->defaults.gop.lifetime;
816 A->idle_timeout = mc->defaults.gop.lifetime;
823 gop_tree_statements(A) ::= drop_unassigned_statement(B) show_goptree_statement(C) show_times_statement(D). {
824 A = g_malloc(sizeof(gop_tree_statement));
826 A->drop_unassigned = B;
827 A->pdu_tree_mode = C;
831 gop_tree_statements(A) ::= drop_unassigned_statement(B) show_goptree_statement(C). {
832 A = g_malloc(sizeof(gop_tree_statement));
834 A->drop_unassigned = B;
835 A->pdu_tree_mode = C;
836 A->show_times = mc->defaults.gop.show_times;
839 gop_tree_statements(A) ::= drop_unassigned_statement(B) show_times_statement(D). {
840 A = g_malloc(sizeof(gop_tree_statement));
842 A->drop_unassigned = B;
843 A->pdu_tree_mode = mc->defaults.gop.pdu_tree_mode;
847 gop_tree_statements(A) ::= show_goptree_statement(C) show_times_statement(D). {
848 A = g_malloc(sizeof(gop_tree_statement));
850 A->drop_unassigned = mc->defaults.gop.drop_unassigned;
851 A->pdu_tree_mode = C;
855 gop_tree_statements(A) ::= drop_unassigned_statement(B). {
856 A = g_malloc(sizeof(gop_tree_statement));
858 A->drop_unassigned = B;
859 A->pdu_tree_mode = mc->defaults.gop.pdu_tree_mode;
860 A->show_times = mc->defaults.gop.show_times;
863 gop_tree_statements(A) ::= show_goptree_statement(C). {
864 A = g_malloc(sizeof(gop_tree_statement));
866 A->drop_unassigned = mc->defaults.gop.drop_unassigned;
867 A->pdu_tree_mode = C;
868 A->show_times = mc->defaults.gop.show_times;
871 gop_tree_statements(A) ::= show_times_statement(D). {
872 A = g_malloc(sizeof(gop_tree_statement));
874 A->drop_unassigned = mc->defaults.gop.drop_unassigned;
875 A->pdu_tree_mode = mc->defaults.gop.pdu_tree_mode;
880 gop_start_statement(A) ::= START_KW avpl(B) SEMICOLON. { A = B; }
882 gop_stop_statement(A) ::= STOP_KW avpl(B) SEMICOLON. { A = B; }
884 show_goptree_statement(A) ::= SHOW_TREE_KW gop_tree_mode(B) SEMICOLON. { A = B; }
886 show_times_statement(A) ::= SHOW_TIMES_KW true_false(B) SEMICOLON. { A = B; }
888 expiration_statement(A) ::= EXPIRATION_KW time_value(B) SEMICOLON. { A = B; }
890 idle_timeout_statement(A) ::= IDLE_TIMEOUT_KW time_value(B) SEMICOLON. { A = B; }
892 lifetime_statement(A) ::= LIFETIME_KW time_value(B) SEMICOLON. { A = B; }
894 gop_tree_mode(A) ::= NO_TREE_KW. { A = GOP_NO_TREE; }
895 gop_tree_mode(A) ::= PDU_TREE_KW. { A = GOP_PDU_TREE; }
896 gop_tree_mode(A) ::= FRAME_TREE_KW. { A = GOP_FRAME_TREE; }
897 gop_tree_mode(A) ::= BASIC_TREE_KW. { A = GOP_BASIC_PDU_TREE; }
899 true_false(A) ::= TRUE_KW. { A = TRUE; }
900 true_false(A) ::= FALSE_KW. { A = FALSE; }
902 pdu_name(A) ::= NAME(B). {
904 if (( c = g_hash_table_lookup(mc->pducfgs,B) )) {
907 configuration_error(mc,"No such Pdu: '%s'",B);
912 time_value(A) ::= FLOATING(B). {
913 A = (float) strtod(B,NULL);
916 time_value(A) ::= INTEGER(B). {
917 A = (float) strtod(B,NULL);
923 gog_decl ::= GOG_KW NAME(A) OPEN_BRACE gog_statements(B) CLOSE_BRACE SEMICOLON. {
924 mate_cfg_gog* cfg = NULL;
926 if ( g_hash_table_lookup(mc->gogcfgs,A) ) {
927 configuration_error(mc,"Gog '%s' exists already ",A);
932 cfg->expiration = B->expiration;
933 cfg->gop_tree_mode = B->gop_tree_mode;
934 cfg->transforms = B->transform_list ? B->transform_list : g_ptr_array_new();
935 cfg->keys = B->current_gogkeys;
938 merge_avpl(cfg->extra,B->extras,TRUE);
939 delete_avpl(B->extras,TRUE);
945 gog_statements(A) ::= expiration_statement(B) gog_goptree_statement(C) gog_key_statements(D) extra_statement(E) transform_list_statement(F). {
946 A = g_malloc(sizeof(gog_statement_t));
949 A->gop_tree_mode = C;
950 A->current_gogkeys = D;
952 A->transform_list = F;
955 gog_statements(A) ::= expiration_statement(B) gog_goptree_statement(C) gog_key_statements(D) transform_list_statement(F). {
956 A = g_malloc(sizeof(gog_statement_t));
959 A->gop_tree_mode = C;
960 A->current_gogkeys = D;
961 A->extras = new_avpl("");
962 A->transform_list = F;
965 gog_statements(A) ::= expiration_statement(B) gog_key_statements(D) extra_statement(E) transform_list_statement(F). {
966 A = g_malloc(sizeof(gog_statement_t));
969 A->gop_tree_mode = mc->defaults.gog.gop_tree_mode;
970 A->current_gogkeys = D;
972 A->transform_list = F;
975 gog_statements(A) ::= expiration_statement(B) gog_key_statements(D) transform_list_statement(F). {
976 A = g_malloc(sizeof(gog_statement_t));
979 A->gop_tree_mode = mc->defaults.gog.gop_tree_mode;
980 A->current_gogkeys = D;
981 A->extras = new_avpl("");
982 A->transform_list = F;
985 gog_statements(A) ::= gog_goptree_statement(C) gog_key_statements(D) extra_statement(E) transform_list_statement(F). {
986 A = g_malloc(sizeof(gog_statement_t));
988 A->expiration = mc->defaults.gog.expiration;
989 A->gop_tree_mode = C;
990 A->current_gogkeys = D;
992 A->transform_list = F;
995 gog_statements(A) ::= gog_goptree_statement(C) gog_key_statements(D) transform_list_statement(F). {
996 A = g_malloc(sizeof(gog_statement_t));
998 A->expiration = mc->defaults.gog.expiration;
999 A->gop_tree_mode = C;
1000 A->current_gogkeys = D;
1001 A->extras = new_avpl("");
1002 A->transform_list = F;
1005 gog_statements(A) ::= gog_key_statements(D) extra_statement(E) transform_list_statement(F). {
1006 A = g_malloc(sizeof(gog_statement_t));
1008 A->expiration = mc->defaults.gog.expiration;
1009 A->gop_tree_mode = mc->defaults.gog.gop_tree_mode;
1010 A->current_gogkeys = D;
1012 A->transform_list = F;
1015 gog_statements(A) ::= gog_key_statements(D) transform_list_statement(F). {
1016 A = g_malloc(sizeof(gog_statement_t));
1018 A->expiration = mc->defaults.gog.expiration;
1019 A->gop_tree_mode = mc->defaults.gog.gop_tree_mode;
1020 A->current_gogkeys = D;
1021 A->extras = new_avpl("");
1022 A->transform_list = F;
1026 gog_statements(A) ::= expiration_statement(B) gog_goptree_statement(C) gog_key_statements(D) extra_statement(E). {
1027 A = g_malloc(sizeof(gog_statement_t));
1030 A->gop_tree_mode = C;
1031 A->current_gogkeys = D;
1033 A->transform_list = NULL;
1036 gog_statements(A) ::= expiration_statement(B) gog_goptree_statement(C) gog_key_statements(D). {
1037 A = g_malloc(sizeof(gog_statement_t));
1040 A->gop_tree_mode = C;
1041 A->current_gogkeys = D;
1042 A->extras = new_avpl("");
1043 A->transform_list = NULL;
1046 gog_statements(A) ::= expiration_statement(B) gog_key_statements(D) extra_statement(E). {
1047 A = g_malloc(sizeof(gog_statement_t));
1050 A->gop_tree_mode = mc->defaults.gog.gop_tree_mode;
1051 A->current_gogkeys = D;
1053 A->transform_list = NULL;
1056 gog_statements(A) ::= expiration_statement(B) gog_key_statements(D). {
1057 A = g_malloc(sizeof(gog_statement_t));
1060 A->gop_tree_mode = mc->defaults.gog.gop_tree_mode;
1061 A->current_gogkeys = D;
1062 A->extras = new_avpl("");
1063 A->transform_list = NULL;
1067 gog_statements(A) ::= gog_goptree_statement(C) gog_key_statements(D) extra_statement(E). {
1068 A = g_malloc(sizeof(gog_statement_t));
1070 A->expiration = mc->defaults.gog.expiration;
1071 A->gop_tree_mode = C;
1072 A->current_gogkeys = D;
1074 A->transform_list = NULL;
1077 gog_statements(A) ::= gog_goptree_statement(C) gog_key_statements(D). {
1078 A = g_malloc(sizeof(gog_statement_t));
1080 A->expiration = mc->defaults.gog.expiration;
1081 A->gop_tree_mode = C;
1082 A->current_gogkeys = D;
1083 A->extras = new_avpl("");
1084 A->transform_list = NULL;
1087 gog_statements(A) ::= gog_key_statements(D) extra_statement(E). {
1088 A = g_malloc(sizeof(gog_statement_t));
1090 A->expiration = mc->defaults.gog.expiration;
1091 A->gop_tree_mode = mc->defaults.gog.gop_tree_mode;
1092 A->current_gogkeys = D;
1094 A->transform_list = NULL;
1097 gog_statements(A) ::= gog_key_statements(D). {
1098 A = g_malloc(sizeof(gog_statement_t));
1100 A->expiration = mc->defaults.gog.expiration;
1101 A->gop_tree_mode = mc->defaults.gog.gop_tree_mode;
1102 A->current_gogkeys = D;
1103 A->extras = new_avpl("");
1104 A->transform_list = NULL;
1107 gog_goptree_statement(A) ::= GOP_TREE_KW gop_tree_type(B) SEMICOLON. { A = B; }
1109 gop_tree_type(A) ::= NULL_TREE. { A = GOP_NULL_TREE; }
1110 gop_tree_type(A) ::= FULL_TREE. { A = GOP_FULL_TREE; }
1111 gop_tree_type(A) ::= BASIC_TREE. { A = GOP_BASIC_TREE; }
1114 gog_key_statements(A) ::= gog_key_statements(B) gog_key_statement(C). {
1119 gog_key_statements(A) ::= gog_key_statement(B). {
1125 gog_key_statement(A) ::= MEMBER_KW gop_name(B) avpl(C) SEMICOLON. {
1130 gop_name(A) ::= NAME(B). {
1132 if (( c = g_hash_table_lookup(mc->gopcfgs,B) )) {
1135 configuration_error(mc,"No Gop called '%s' has been already declared",B);
1138 /******************************************** GENERAL
1142 extra_statement(A) ::= EXTRA_KW avpl(B) SEMICOLON. { A = B; }
1144 transform_list_statement(A) ::= TRANSFORM_KW transform_list(B) SEMICOLON. { A = B; }
1146 transform_list(A) ::= transform_list(B) COMMA transform(C). {
1148 g_ptr_array_add(B,C);
1151 transform_list(A) ::= transform(B). {
1152 A = g_ptr_array_new();
1153 g_ptr_array_add(A,B);
1156 transform(A) ::= NAME(B). {
1159 if (( t = g_hash_table_lookup(mc->transfs,B) )) {
1162 configuration_error(mc,"There's no such Transformation: %s",B);
1166 avpl(A) ::= OPEN_PARENS avps(B) CLOSE_PARENS. { A = B; }
1167 avpl(A) ::= OPEN_PARENS CLOSE_PARENS. { A = new_avpl(""); }
1169 avps(A) ::= avps(B) COMMA avp(C). { A = B; if ( ! insert_avp(B,C) ) delete_avp(C); }
1170 avps(A) ::= avp(B). { A = new_avpl(""); if ( ! insert_avp(A,B) ) delete_avp(B); }
1172 avp(A) ::= NAME(B) AVP_OPERATOR(C) value(D). { A = new_avp(B,D,*C); }
1173 avp(A) ::= NAME(B). { A = new_avp(B,"",'?'); }
1174 avp(A) ::= NAME(B) OPEN_BRACE avp_oneoff(C) CLOSE_BRACE. { A = new_avp(B,C,'|'); }
1176 avp_oneoff(A) ::= avp_oneoff(B) PIPE value(C). { A = g_strdup_printf("%s|%s",B,C); }
1177 avp_oneoff(A) ::= value(B). { A = g_strdup(B); }
1179 value(A) ::= QUOTED(B). { A = g_strdup(B); }
1180 value(A) ::= NAME(B). { A = g_strdup(B); }
1181 value(A) ::= FLOATING(B). { A = g_strdup(B); }
1182 value(A) ::= INTEGER(B). { A = g_strdup(B); }
1183 value(A) ::= DOTED_IP(B). { A = g_strdup(B); }
1184 value(A) ::= COLONIZED(B). { A = recolonize(mc,B); }