--- textops.c.old	2005-10-19 22:12:12.000000000 +0300
+++ textops.c	2006-06-05 08:29:21.000000000 +0300
@@ -63,6 +63,8 @@
 #include "../../parser/parse_uri.h"
 #include "../../parser/parse_hname2.h"
 #include "../../parser/parse_methods.h"
+#include "../../trim.h"
+#include "../../ut.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -98,6 +100,7 @@
 static int append_urihf(struct sip_msg* msg, char* str1, char* str2);
 static int append_time_f(struct sip_msg* msg, char* , char *);
 static int is_method_f(struct sip_msg* msg, char* , char *);
+static int inc_cseq_val_f(struct sip_msg* msg, char* , char *);
 
 static int fixup_regex(void**, int);
 static int fixup_substre(void**, int);
@@ -137,6 +140,8 @@
 		REQUEST_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE },
 	{"is_method",        is_method_f,       1, fixup_method,
 			REQUEST_ROUTE|ONREPLY_ROUTE|FAILURE_ROUTE},
+	{"inc_cseq_val",        inc_cseq_val_f,   0, 0,
+			REQUEST_ROUTE|ONREPLY_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE},
 	{0,0,0,0,0}
 };
 
@@ -165,8 +170,6 @@
 	return msg->buf+msg->first_line.len;
 }
 
-
-
 static int search_f(struct sip_msg* msg, char* key, char* str2)
 {
 	/*we registered only 1 param, so we ignore str2*/
@@ -176,8 +179,6 @@
 	return 1;
 }
 
-
-
 static int search_append_f(struct sip_msg* msg, char* key, char* str)
 {
 	struct lump* l;
@@ -214,8 +215,6 @@
 
 static int replace_all_f(struct sip_msg* msg, char* key, char* str)
 {
-
-
 	struct lump* l;
 	regmatch_t pmatch;
 	char* s;
@@ -429,6 +428,7 @@
 	act.p1_type = STRING_ST;
 	act.p1.string = result->s;
 	rval = do_action(&act, msg);
+	
 	pkg_free(result);
 	return rval;
 }
@@ -536,7 +536,6 @@
 static int append_time_f(struct sip_msg* msg, char* p1, char *p2)
 {
 
-
 	size_t len;
 	char time_str[MAX_TIME];
 	time_t now;
@@ -662,6 +661,106 @@
 				m->len)==0))?1:-1;
 }
 
+/* inc_cseq_val function obtains CSeq value and CSeq method name 
+with SER parsing methods; increments the CSeq value by 1; 
+searches for string of CSeq value + whitespace + CSeq method name in header text
+and replaces this string with a string of incremented CSeq value + whitespace + Cseq method name */
+static int inc_cseq_val_f(struct sip_msg* msg, char* p1, char *p2)
+{
+	unsigned int cseq_val;
+	char* insert_str;
+	char* search_str;
+	int searchlen;
+	int insertlen;
+	str cseq_old_val_str;
+	str cseq_new_val_str;
+	int off;
+	str cseq_meth;	
+	char* begin;
+	char* header;
+	struct lump* l;
+	
+	if(parse_headers(msg, HDR_CSEQ_F, 0)!=0)
+	{
+		LOG(L_ERR, "textops:inc_cseq_val: ERROR - cannot parse cseq header\n");
+		return -1; /* should it be 0 ?!?! */
+	}
+
+	/* get cseq value as unsigned int */
+	cseq_old_val_str.s = get_cseq(msg)->number.s;
+	cseq_old_val_str.len = get_cseq(msg)->number.len;
+	trim_leading(&cseq_old_val_str);
+	if (str2int(&cseq_old_val_str, &cseq_val) < 0) {
+	    LOG(L_ERR, "textops:inc_cseq_val(): Error while converting cseq number\n");
+	    return -1;
+	}
+
+	/* increment cseq value */
+	cseq_val++;
+	/* convert incremented cseq integer value back to string null terminated*/
+	cseq_new_val_str.s = int2str((unsigned long)cseq_val, &cseq_new_val_str.len);
+	/* get cseq method */
+	cseq_meth.s=get_cseq(msg)->method.s;
+	cseq_meth.len=get_cseq(msg)->method.len;
+
+	/* allocate memory for insert string - not null terminated*/
+	insertlen = cseq_new_val_str.len + cseq_meth.len + 1;
+	insert_str = (char *)pkg_malloc(insertlen);
+	if (insert_str==0){
+		LOG(L_ERR, "ERROR: inc_cseq_val: mem. allocation failure insert string\n");
+		return -1;
+	}
+
+	/* Construct the insert string - not null terminated*/
+	memcpy(insert_str, cseq_new_val_str.s, cseq_new_val_str.len);
+	memcpy(insert_str+cseq_new_val_str.len, " ", 1);
+	memcpy(insert_str+cseq_new_val_str.len+1 ,cseq_meth.s, cseq_meth.len);
+
+	/* allocate memory for search string null terminated*/
+	searchlen = cseq_old_val_str.len + cseq_meth.len + 2;
+	search_str= (char *)pkg_malloc(searchlen);
+	if (search_str==0){
+		pkg_free(insert_str);	
+		LOG(L_ERR, "ERROR: inc_cseq_val: mem. allocation failure search string\n");
+		return -1;
+	}
+
+	/* Construct the search string null terminated*/
+	memcpy(search_str, cseq_old_val_str.s, cseq_old_val_str.len);
+	memcpy(search_str+cseq_old_val_str.len, " ", 1);
+	memcpy(search_str+cseq_old_val_str.len+1 ,cseq_meth.s, cseq_meth.len);
+	search_str[searchlen-1]=0;
+	
+	header=get_header(msg);
+	off= header - msg->buf;
+
+	/* find the search string */
+	begin = strstr(header, search_str);
+	pkg_free(search_str);
+
+	if (!(begin==NULL))
+	{
+		/* string found */
+		if ((l=del_lump(msg, begin - header + off, searchlen-1, 0))==0){
+			LOG(L_ERR, "ERROR: could not del_lump\n");
+			pkg_free(insert_str);
+			return -1;
+		}
+		if (insert_new_lump_after(l, insert_str,insertlen, 0)==0){
+			LOG(L_ERR, "ERROR: could not insert new lump\n");
+			pkg_free(insert_str);	
+			return -1;
+		}
+		return 1;		
+	} else {
+		/*string not found */
+		LOG(L_ERR, "textops:inc_cseq_val: search string NOT found\n");
+		pkg_free(insert_str);
+		return -1;
+	}
+}
+
+
 /*
  * Convert char* parameter to str* parameter
  */
