core: Changed WS from being a flag on a TCP/TLS connection to a protocol in its own...
[sip-router] / re.h
1 /*
2  * $Id$
3  *
4  * regexp and regexp substitutions implementations
5  * 
6  * Copyright (C) 2001-2003 FhG Fokus
7  *
8  * This file is part of ser, a free SIP server.
9  *
10  * ser is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version
14  *
15  * For a license to use the ser software under conditions
16  * other than those described here, or to purchase support for this
17  * software, please contact iptel.org by e-mail at the following addresses:
18  *    info@iptel.org
19  *
20  * ser is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License 
26  * along with this program; if not, write to the Free Software 
27  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
28  *
29  *
30  * History:
31  * --------
32  *   2003-08-04  created by andrei
33  *   2004-11-12  minor api extension, added *count (andrei)
34  */
35
36 #ifndef _re_h
37 #define _re_h
38
39 #include "str.h"
40 #include "pvar.h"
41 #include "parser/msg_parser.h"
42 #include <sys/types.h> /* for regex */
43 #include <regex.h>
44
45 #define WITH_SEP        1
46 #define WITHOUT_SEP     0
47
48 enum replace_special { REPLACE_NMATCH, REPLACE_CHAR, REPLACE_URI, 
49                                            REPLACE_SPEC };
50
51 struct replace_with{
52         int offset; /* offset in string */
53         int size;   /* size of replace "anchor" in string */
54         enum replace_special type;
55         union{
56                 int nmatch;
57                 char c;
58                 pv_spec_t spec;
59         }u;
60 };
61
62 struct subst_expr{
63         regex_t* re;
64         str replacement;
65         int replace_all; 
66         int n_escapes; /* escapes number (replace[] size) */
67         int max_pmatch ; /* highest () referenced */
68         struct replace_with replace[1]; /* 0 does not work on all compilers */
69 };
70
71 struct replace_lst{
72         int offset;
73         int size;   /* at offset, delete size bytes and replace them with rpl */
74         str rpl;
75         struct replace_lst *next;
76 };
77
78
79
80 void subst_expr_free(struct subst_expr* se);
81 void replace_lst_free(struct replace_lst* l);
82 int parse_repl(struct replace_with * rw, char ** begin, 
83                                 char * end, int *max_token_nb, int flag);
84 struct subst_expr*  subst_parser(str* subst);
85 struct replace_lst* subst_run( struct subst_expr* se, const char* input, 
86                                        struct sip_msg* msg, int *count);
87 str* subst_str(const char* input, struct sip_msg* msg,
88                                 struct subst_expr* se, int* count);
89
90
91
92 #endif
93