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

Reply via email to