modules/ims_qos: added patch for flow-description bug when request originates from...
[sip-router] / lib / cds / sstr.h
1 /* 
2  * Copyright (C) 2005 iptelorg GmbH
3  *
4  * This file is part of ser, a free SIP server.
5  *
6  * ser is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version
10  *
11  * For a license to use the ser software under conditions
12  * other than those described here, or to purchase support for this
13  * software, please contact iptel.org by e-mail at the following addresses:
14  *    info@iptel.org
15  *
16  * ser is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
24  */
25
26 #ifndef __SIMPLE_STR_H
27 #define __SIMPLE_STR_H
28
29 #include <cds/memory.h>
30
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34
35 /* If compiled for SER, use ser internal strings ! */
36 #ifdef SER
37
38 #include "str.h"        
39 typedef str str_t;
40
41 #else
42
43 typedef struct {
44         char *s;
45         int len;
46 } str_t;
47
48 #define STR_STATIC_INIT(v) {(v), sizeof(v) - 1}
49
50 #endif
51
52 #define FMT_STR(str)    (str).len,((str).s ? (str).s : "")      
53
54 #define str_len(ptr)    ((ptr)?(ptr)->len:0)
55
56 /** transalate zero-terminated string to str_t (both uses the input buffer!)*/
57 str_t zt2str(char *str);
58
59 /** returns 1 if the string is empty */
60 int is_str_empty(const str_t *s);
61
62 /** duplicate string into given destination (data region is newly allocated) */
63 int str_dup_impl(str_t* dst, const str_t* src);
64 int str_dup_dbg(str_t* dst, const str_t* src, const char *file, int line);
65 /*#define str_dup(dst,src)      str_dup_dbg(dst,src,__FILE__,__LINE__)*/
66 #define str_dup(dst,src)        str_dup_impl(dst,src)
67
68
69 /** duplicate string into newly allocated destination (data and str structure are newly allocated) */
70 str_t *str_dup_new(const str_t* src);
71
72 /** duplicate zero-terminated string */
73 int str_dup_zt(str_t* dst, const char* src);
74
75 /** duplicate zero-terminated string to zero-terminated string */
76 char *zt_strdup(const char*src);
77
78 /** frees string content if allocated */
79 /* void str_free_content(str_t *s); */
80 #define str_free_content(str)   do { if (str != NULL) { \
81                 if (((str)->len > 0) && ((str)->s)) cds_free((str)->s);\
82                 (str)->len = 0; \
83                 (str)->s = 0; \
84         } } while (0)
85
86 /** frees string content if allocated and then the string itself */
87 /* void str_free(str_t *s); */
88 #define str_free(str)   do { if (str != NULL) { \
89                 if (((str)->len > 0) && ((str)->s)) cds_free((str)->s);\
90                 cds_free(str); \
91         } } while (0)
92
93 /* clears string content */
94 #define str_clear(str)  do { if (str != NULL) { \
95                 (str)->len = 0; \
96                 (str)->s = 0; \
97         } } while (0)
98
99
100 /** case sensitive comparation - returns 0 if equal, nonzero otherwise */
101 int str_case_equals(const str_t *a, const str_t *b);
102 /** case insensitive comparation - returns 0 if equal, nonzero otherwise */
103 int str_nocase_equals(const str_t *a, const str_t *b);
104
105 /** compare str_t and zero terminated string */
106 int str_cmp_zt(const str_t *a, const char *b); /* renamed sz_cmp */
107
108 /** is b prefix of a */
109 int str_prefix(const str_t *a, const str_t *b); /* ss_start */
110
111 /* #define ss_cmp(const str_t *a, const str_t *b) ((a->len == b->len)?sz_cmp(a, b->s):(-1)) */
112
113 /* void str_clear(str_t *s); */
114
115 /** locate character in string */
116 char *str_strchr(const str_t *s, char c);
117
118 /** locate string in string */
119 char *str_str(const str_t *s, const str_t *search_for);
120
121 /* creates new string as concatenation of a and b */
122 int str_concat(str_t *dst, str_t *a, str_t *b);
123
124 int replace_str(const str_t *src, str_t *dst, const str_t *sample, const str_t *value);
125
126 /** Copies string into another one. The destination string buffer 
127  * MUST be allocated in needed size! */
128 #define str_cpy(dst, src) do { \
129         memcpy((dst)->s, (src)->s, (src)->len); \
130         (dst)->len = (src)->len; \
131         } while (0)
132
133 /* pointer after given string - often used when strings
134  * allocated together with data structure holding them */
135 #define after_str_ptr(ss)       ((ss)->s + (ss)->len)
136
137 /*
138  * Append a string app with length app_len
139  * to the end of string str which is a str* pointer
140  * the buffer must be large enough
141  */
142 #define str_append(str, app, app_len)                    \
143     do {                                                 \
144         memcpy((str)->s + (str)->len, (app), (app_len)); \
145         (str)->len += (app_len);                         \
146     } while(0)
147
148 #ifdef __cplusplus
149 }
150 #endif
151
152 #endif