]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Create syntax sugar for add/delete/prepend, so xyzzy.prepend(123) is
authorPavel Machek <pavel@ucw.cz>
Thu, 20 Apr 2000 10:25:51 +0000 (10:25 +0000)
committerPavel Machek <pavel@ucw.cz>
Thu, 20 Apr 2000 10:25:51 +0000 (10:25 +0000)
possible. That means that milestone 3 was reached.

filter/config.Y
filter/f-util.c

index 3396669f4b4c79bd0d7a4889d7a75662cf3b7486..f33405f972e1d8d8a4a7d670ffdcf77d226fda84 100644 (file)
@@ -550,6 +550,13 @@ cmd:
       $$->a1.p = $2;
       $$->a2.p = build_tree( $4 );
    }
+
+
+ | rtadot dynamic_attr '.' EMPTY ';' 
+  { struct f_inst *i = f_new_inst(); i->code = 'E'; i->aux = T_CLIST; $$ = $2; $$->code = P('e','S'); $$->a1.p = i; }
+ | rtadot dynamic_attr '.' PREPEND '(' term ')' ';'   { $$ = f_generate_complex( P('A','p'), 'x', $2, $6 ); }
+ | rtadot dynamic_attr '.' ADD '(' term ')' ';'       { $$ = f_generate_complex( P('C','a'), 'a', $2, $6 ); } 
+ | rtadot dynamic_attr '.' DELETE '(' term ')' ';'    { $$ = f_generate_complex( P('C','a'), 'd', $2, $6 ); } 
  ;
 
 CF_END
index cf174e737490679618e7790242d0bdc6df89dddd..ba6e777274c94e9b1cd0a601bdaa845891caefe8 100644 (file)
@@ -10,6 +10,8 @@
 #include "conf/conf.h"
 #include "filter/filter.h"
 
+#define P(a,b) ((a<<8) | b)
+
 struct f_inst *
 f_new_inst(void)
 {
@@ -29,6 +31,27 @@ f_new_dynamic_attr(int type, int f_type, int code)
   return f;
 }
 
+/*
+ * Generate set_dynamic( operation( get_dynamic(), argument ) )
+ */
+struct f_inst *
+f_generate_complex(int operation, int operation_aux, struct f_inst *dyn, struct f_inst *argument)
+{
+  struct f_inst *set_dyn = f_new_inst(),
+                *oper = f_new_inst(),
+                *get_dyn = dyn;
+
+  *set_dyn = *get_dyn;
+  get_dyn->code = P('e','a');
+  oper->code = operation;
+  oper->aux = operation_aux;
+  oper->a1.p = get_dyn;
+  oper->a2.p = argument;
+  set_dyn->code = P('e','S');
+  set_dyn->a1.p = oper;
+  return set_dyn;
+}
+
 char *
 filter_name(struct filter *filter)
 {