Hello all,
find attached a patch which adds a new assignment operator (:=) to the config
script. Instead of the regular assignment (=), this operator will not add an
entry to an existing avp, but it deletes the existing avp and creates a new
avp with only one value.
I think this is usefull because I was using a lot of avp_delete()/assignment
sequences to keep just 1 value in an avp instead of a list.
Please review and comment on it. Although the patch seems to work ok, I don't
have any insight in the pointer dances OpenSER does, so I might have done
something completely insane.
If the patch is acceptable as is, please commit.
Patch is against OpenSER 1.2 svn revision 2606
Config example and result:
route {
xlog("Part 1");
$avp(s:test1) = "test1_1";
$avp(s:test1) = "test1_2";
$avp(s:test2) := "test2_1";
$avp(s:test2) := "test2_2";
avp_print();
xlog("Part 2");
$avp(s:test1) := "test1_3";
$avp(s:test2) = "test2_3";
avp_print();
}
Log snippet:
[19924]: Part 1
[19924]: INFO:avpops:print_avp: p=0xb5c4fbc0, flags=0x0003
[19924]: INFO: name=<test2>
[19924]: INFO: val_str=<test2_2 / 7>
[19924]: INFO:avpops:print_avp: p=0xb5c4fb90, flags=0x0003
[19924]: INFO: name=<test1>
[19924]: INFO: val_str=<test1_2 / 7>
[19924]: INFO:avpops:print_avp: p=0xb5c4fb60, flags=0x0003
[19924]: INFO: name=<test1>
[19924]: INFO: val_str=<test1_1 / 7>
[19924]: Part 2
[19924]: INFO:avpops:print_avp: p=0xb5c4fb90, flags=0x0003
[19924]: INFO: name=<test2>
[19924]: INFO: val_str=<test2_3 / 7>
[19924]: INFO:avpops:print_avp: p=0xb5c4fb60, flags=0x0003
[19924]: INFO: name=<test1>
[19924]: INFO: val_str=<test1_3 / 7>
[19924]: INFO:avpops:print_avp: p=0xb5c4fbc0, flags=0x0003
[19924]: INFO: name=<test2>
[19924]: INFO: val_str=<test2_2 / 7>
--
Greetings,
Alex Hermann
Index: cfg.lex
===================================================================
--- cfg.lex (revision 2606)
+++ cfg.lex (working copy)
@@ -209,6 +209,7 @@
MINUS "-"
MULT "*"
MODULO "%"
+COLONEQ ":="
PLUSEQ "+="
MINUSEQ "-="
SLASHEQ "/="
@@ -218,7 +219,7 @@
BOREQ "|="
BXOREQ "^="
-ASSIGNOP {EQUAL}|{PLUSEQ}|{MINUSEQ}|{SLASHEQ}|{MULTEQ}|{MODULOEQ}|{BANDEQ}|{BOREQ}|{BXOREQ}
+ASSIGNOP {EQUAL}|{COLONEQ}|{PLUSEQ}|{MINUSEQ}|{SLASHEQ}|{MULTEQ}|{MODULOEQ}|{BANDEQ}|{BOREQ}|{BXOREQ}
BITOP {BAND}|{BOR}|{BXOR}|{BNOT}
ARITHOP {PLUS}|{MINUS}|{SLASH}|{MULT}|{MODULO}
LOGOP {EQUAL_T}|{GT}|{LT}|{GTE}|{LTE}|{DIFF}|{MATCH}|{NOTMATCH}|{NOT}|{AND}|{OR}
@@ -566,6 +567,7 @@
<INITIAL>{BNOT} { count(); return BNOT; }
<INITIAL>{MULT} { count(); return MULT; }
<INITIAL>{MODULO} { count(); return MODULO; }
+<INITIAL>{COLONEQ} { count(); return COLONEQ; }
<INITIAL>{PLUSEQ} { count(); return PLUSEQ; }
<INITIAL>{MINUSEQ} { count(); return MINUSEQ; }
<INITIAL>{SLASHEQ} { count(); return SLASHEQ; }
Index: action.c
===================================================================
--- action.c (revision 2606)
+++ action.c (working copy)
@@ -205,6 +205,7 @@
dspec = (xl_spec_p)a->elem[0].u.data;
switch ((unsigned char)a->type){
case EQ_T:
+ case COLONEQ_T:
case PLUSEQ_T:
case MINUSEQ_T:
case DIVEQ_T:
@@ -226,6 +227,10 @@
destroy_avps(name_type, avp_name, 0);
return 1;
}
+ if((unsigned char)a->type == COLONEQ_T)
+ {
+ destroy_avps(name_type, avp_name, 1);
+ }
flags = name_type;
if(val.flags&XL_TYPE_INT)
@@ -975,6 +980,7 @@
ret=1; /* continue processing */
break;
case EQ_T:
+ case COLONEQ_T:
case PLUSEQ_T:
case MINUSEQ_T:
case DIVEQ_T:
Index: cfg.y
===================================================================
--- cfg.y (revision 2606)
+++ cfg.y (working copy)
@@ -354,6 +354,7 @@
%nonassoc DIFF
%nonassoc MATCH
%nonassoc NOTMATCH
+%nonassoc COLONEQ
%nonassoc PLUSEQ
%nonassoc MINUSEQ
%nonassoc SLASHEQ
@@ -1605,6 +1606,7 @@
assignop:
EQUAL { $$ = EQ_T; }
+ | COLONEQ { $$ = COLONEQ_T; }
| PLUSEQ { $$ = PLUSEQ_T; }
| MINUSEQ { $$ = MINUSEQ_T;}
| SLASHEQ { $$ = DIVEQ_T; }
Index: route_struct.h
===================================================================
--- route_struct.h (revision 2606)
+++ route_struct.h (working copy)
@@ -77,7 +77,7 @@
EXIT_T,
SWITCH_T, CASE_T, DEFAULT_T, SBREAK_T,
SET_DSTURI_T, RESET_DSTURI_T, ISDSTURISET_T,
- EQ_T, PLUSEQ_T, MINUSEQ_T, DIVEQ_T, MULTEQ_T, MODULOEQ_T, BANDEQ_T,
+ EQ_T, COLONEQ_T, PLUSEQ_T, MINUSEQ_T, DIVEQ_T, MULTEQ_T, MODULOEQ_T, BANDEQ_T,
BOREQ_T, BXOREQ_T, USE_BLACKLIST_T, SET_TIME_STAMP_T,
RESET_TIME_STAMP_T, DIFF_TIME_STAMP_T
};
Index: route.c
===================================================================
--- route.c (revision 2606)
+++ route.c (working copy)
@@ -368,6 +368,7 @@
}
break;
case EQ_T:
+ case COLONEQ_T:
case PLUSEQ_T:
case MINUSEQ_T:
case DIVEQ_T:
_______________________________________________
Devel mailing list
[email protected]
http://openser.org/cgi-bin/mailman/listinfo/devel