blob: ef38d928a061934d4b3265cb6b5b012f59bcd533 [file] [log] [blame]
Benny Prijono9033e312005-11-21 02:08:39 +00001/* $Id$ */
2/*
Benny Prijono32177c02008-06-20 22:44:47 +00003 * Copyright (C)2003-2008 Benny Prijono <benny@prijono.org>
Benny Prijono9033e312005-11-21 02:08:39 +00004 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19
Benny Prijonoa7944bb2005-11-21 17:01:50 +000020#include <pj/pool.h>
21
Benny Prijono9033e312005-11-21 02:08:39 +000022PJ_IDEF(pj_str_t) pj_str(char *str)
23{
24 pj_str_t dst;
25 dst.ptr = str;
Benny Prijono5a9091c2006-02-14 20:59:53 +000026 dst.slen = str ? pj_ansi_strlen(str) : 0;
Benny Prijono9033e312005-11-21 02:08:39 +000027 return dst;
28}
29
30PJ_IDEF(pj_str_t*) pj_strdup(pj_pool_t *pool,
31 pj_str_t *dst,
32 const pj_str_t *src)
33{
34 if (src->slen) {
35 dst->ptr = (char*)pj_pool_alloc(pool, src->slen);
36 pj_memcpy(dst->ptr, src->ptr, src->slen);
37 }
38 dst->slen = src->slen;
39 return dst;
40}
41
42PJ_IDEF(pj_str_t*) pj_strdup_with_null( pj_pool_t *pool,
43 pj_str_t *dst,
44 const pj_str_t *src)
45{
Benny Prijono942452b2006-03-02 21:12:28 +000046 dst->ptr = (char*)pj_pool_alloc(pool, src->slen+1);
Benny Prijono9033e312005-11-21 02:08:39 +000047 if (src->slen) {
Benny Prijono9033e312005-11-21 02:08:39 +000048 pj_memcpy(dst->ptr, src->ptr, src->slen);
Benny Prijono9033e312005-11-21 02:08:39 +000049 }
50 dst->slen = src->slen;
51 dst->ptr[dst->slen] = '\0';
52 return dst;
53}
54
55PJ_IDEF(pj_str_t*) pj_strdup2(pj_pool_t *pool,
56 pj_str_t *dst,
57 const char *src)
58{
Benny Prijono5a9091c2006-02-14 20:59:53 +000059 dst->slen = src ? pj_ansi_strlen(src) : 0;
Benny Prijono9033e312005-11-21 02:08:39 +000060 if (dst->slen) {
61 dst->ptr = (char*)pj_pool_alloc(pool, dst->slen);
62 pj_memcpy(dst->ptr, src, dst->slen);
63 } else {
64 dst->ptr = NULL;
65 }
66 return dst;
67}
68
Benny Prijono942452b2006-03-02 21:12:28 +000069PJ_IDEF(pj_str_t*) pj_strdup2_with_null( pj_pool_t *pool,
70 pj_str_t *dst,
71 const char *src)
72{
73 dst->slen = src ? pj_ansi_strlen(src) : 0;
74 dst->ptr = (char*)pj_pool_alloc(pool, dst->slen+1);
75 if (dst->slen) {
76 pj_memcpy(dst->ptr, src, dst->slen);
77 }
78 dst->ptr[dst->slen] = '\0';
79 return dst;
80}
Benny Prijono9033e312005-11-21 02:08:39 +000081
82PJ_IDEF(pj_str_t) pj_strdup3(pj_pool_t *pool, const char *src)
83{
84 pj_str_t temp;
85 pj_strdup2(pool, &temp, src);
86 return temp;
87}
88
89PJ_IDEF(pj_str_t*) pj_strassign( pj_str_t *dst, pj_str_t *src )
90{
91 dst->ptr = src->ptr;
92 dst->slen = src->slen;
93 return dst;
94}
95
96PJ_IDEF(pj_str_t*) pj_strcpy(pj_str_t *dst, const pj_str_t *src)
97{
98 dst->slen = src->slen;
99 if (src->slen > 0)
100 pj_memcpy(dst->ptr, src->ptr, src->slen);
101 return dst;
102}
103
104PJ_IDEF(pj_str_t*) pj_strcpy2(pj_str_t *dst, const char *src)
105{
Benny Prijono5a9091c2006-02-14 20:59:53 +0000106 dst->slen = src ? pj_ansi_strlen(src) : 0;
Benny Prijono9033e312005-11-21 02:08:39 +0000107 if (dst->slen > 0)
108 pj_memcpy(dst->ptr, src, dst->slen);
109 return dst;
110}
111
112PJ_IDEF(pj_str_t*) pj_strncpy( pj_str_t *dst, const pj_str_t *src,
113 pj_ssize_t max)
114{
115 if (max > src->slen) max = src->slen;
116 pj_memcpy(dst->ptr, src->ptr, max);
117 dst->slen = max;
118 return dst;
119}
120
121PJ_IDEF(pj_str_t*) pj_strncpy_with_null( pj_str_t *dst, const pj_str_t *src,
122 pj_ssize_t max)
123{
124 if (max <= src->slen)
125 max = max-1;
126 else
127 max = src->slen;
128
129 pj_memcpy(dst->ptr, src->ptr, max);
130 dst->ptr[max] = '\0';
131 dst->slen = max;
132 return dst;
133}
134
135
136PJ_IDEF(int) pj_strcmp( const pj_str_t *str1, const pj_str_t *str2)
137{
Benny Prijono18a051b2007-06-28 00:50:10 +0000138 if (str1->slen == 0) {
139 return str2->slen==0 ? 0 : -1;
140 } else if (str2->slen == 0) {
141 return 1;
Benny Prijono9033e312005-11-21 02:08:39 +0000142 } else {
Benny Prijono18a051b2007-06-28 00:50:10 +0000143 int min = (str1->slen < str2->slen)? str1->slen : str2->slen;
144 int res = pj_memcmp(str1->ptr, str2->ptr, min);
145 if (res == 0) {
146 return (str1->slen < str2->slen) ? -1 :
147 (str1->slen == str2->slen ? 0 : 1);
148 } else {
149 return res;
150 }
Benny Prijono9033e312005-11-21 02:08:39 +0000151 }
152}
153
154PJ_IDEF(int) pj_strncmp( const pj_str_t *str1, const pj_str_t *str2,
155 pj_size_t len)
156{
Benny Prijono18a051b2007-06-28 00:50:10 +0000157 pj_str_t copy1, copy2;
158
159 if (len < (unsigned)str1->slen) {
160 copy1.ptr = str1->ptr;
161 copy1.slen = len;
162 str1 = &copy1;
163 }
164
165 if (len < (unsigned)str2->slen) {
166 copy2.ptr = str2->ptr;
167 copy2.slen = len;
168 str2 = &copy2;
169 }
170
171 return pj_strcmp(str1, str2);
Benny Prijono9033e312005-11-21 02:08:39 +0000172}
173
174PJ_IDEF(int) pj_strncmp2( const pj_str_t *str1, const char *str2,
175 pj_size_t len)
176{
Benny Prijono18a051b2007-06-28 00:50:10 +0000177 pj_str_t copy2;
178
179 if (str2) {
180 copy2.ptr = (char*)str2;
181 copy2.slen = pj_ansi_strlen(str2);
182 } else {
183 copy2.slen = 0;
184 }
185
186 return pj_strncmp(str1, &copy2, len);
Benny Prijono9033e312005-11-21 02:08:39 +0000187}
188
189PJ_IDEF(int) pj_strcmp2( const pj_str_t *str1, const char *str2 )
190{
Benny Prijono18a051b2007-06-28 00:50:10 +0000191 pj_str_t copy2;
192
193 if (str2) {
194 copy2.ptr = (char*)str2;
195 copy2.slen = pj_ansi_strlen(str2);
196 } else {
Benny Prijono337fb5e2007-10-26 09:02:28 +0000197 copy2.ptr = NULL;
Benny Prijono18a051b2007-06-28 00:50:10 +0000198 copy2.slen = 0;
199 }
200
201 return pj_strcmp(str1, &copy2);
Benny Prijono9033e312005-11-21 02:08:39 +0000202}
203
204PJ_IDEF(int) pj_stricmp( const pj_str_t *str1, const pj_str_t *str2)
205{
Benny Prijono18a051b2007-06-28 00:50:10 +0000206 if (str1->slen == 0) {
207 return str2->slen==0 ? 0 : -1;
208 } else if (str2->slen == 0) {
209 return 1;
Benny Prijono9033e312005-11-21 02:08:39 +0000210 } else {
Benny Prijono18a051b2007-06-28 00:50:10 +0000211 int min = (str1->slen < str2->slen)? str1->slen : str2->slen;
212 int res = pj_ansi_strnicmp(str1->ptr, str2->ptr, min);
213 if (res == 0) {
214 return (str1->slen < str2->slen) ? -1 :
215 (str1->slen == str2->slen ? 0 : 1);
216 } else {
217 return res;
218 }
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000219 }
220}
221
Benny Prijonodcf29962006-03-23 18:03:40 +0000222#if defined(PJ_HAS_STRICMP_ALNUM) && PJ_HAS_STRICMP_ALNUM!=0
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000223PJ_IDEF(int) strnicmp_alnum( const char *str1, const char *str2,
224 int len)
225{
226 if (len==0)
227 return 0;
228 else {
229 register const pj_uint32_t *p1 = (pj_uint32_t*)str1,
230 *p2 = (pj_uint32_t*)str2;
231 while (len > 3 && (*p1 & 0x5F5F5F5F)==(*p2 & 0x5F5F5F5F))
232 ++p1, ++p2, len-=4;
233
234 if (len > 3)
235 return -1;
236#if defined(PJ_IS_LITTLE_ENDIAN) && PJ_IS_LITTLE_ENDIAN!=0
237 else if (len==3)
238 return ((*p1 & 0x005F5F5F)==(*p2 & 0x005F5F5F)) ? 0 : -1;
239 else if (len==2)
240 return ((*p1 & 0x00005F5F)==(*p2 & 0x00005F5F)) ? 0 : -1;
241 else if (len==1)
242 return ((*p1 & 0x0000005F)==(*p2 & 0x0000005F)) ? 0 : -1;
243#else
244 else if (len==3)
245 return ((*p1 & 0x5F5F5F00)==(*p2 & 0x5F5F5F00)) ? 0 : -1;
246 else if (len==2)
247 return ((*p1 & 0x5F5F0000)==(*p2 & 0x5F5F0000)) ? 0 : -1;
248 else if (len==1)
249 return ((*p1 & 0x5F000000)==(*p2 & 0x5F000000)) ? 0 : -1;
250#endif
251 else
252 return 0;
253 }
254}
255
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000256PJ_IDEF(int) pj_stricmp_alnum(const pj_str_t *str1, const pj_str_t *str2)
257{
258 register int len = str1->slen;
259
260 if (len != str2->slen) {
Benny Prijono8220f902006-01-09 17:20:59 +0000261 return (len < str2->slen) ? -1 : 1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000262 } else if (len == 0) {
263 return 0;
264 } else {
265 register const pj_uint32_t *p1 = (pj_uint32_t*)str1->ptr,
266 *p2 = (pj_uint32_t*)str2->ptr;
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000267 while (len > 3 && (*p1 & 0x5F5F5F5F)==(*p2 & 0x5F5F5F5F))
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000268 ++p1, ++p2, len-=4;
269
270 if (len > 3)
271 return -1;
272#if defined(PJ_IS_LITTLE_ENDIAN) && PJ_IS_LITTLE_ENDIAN!=0
273 else if (len==3)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000274 return ((*p1 & 0x005F5F5F)==(*p2 & 0x005F5F5F)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000275 else if (len==2)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000276 return ((*p1 & 0x00005F5F)==(*p2 & 0x00005F5F)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000277 else if (len==1)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000278 return ((*p1 & 0x0000005F)==(*p2 & 0x0000005F)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000279#else
280 else if (len==3)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000281 return ((*p1 & 0x5F5F5F00)==(*p2 & 0x5F5F5F00)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000282 else if (len==2)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000283 return ((*p1 & 0x5F5F0000)==(*p2 & 0x5F5F0000)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000284 else if (len==1)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000285 return ((*p1 & 0x5F000000)==(*p2 & 0x5F000000)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000286#endif
287 else
288 return 0;
Benny Prijono9033e312005-11-21 02:08:39 +0000289 }
290}
Benny Prijonodcf29962006-03-23 18:03:40 +0000291#endif /* PJ_HAS_STRICMP_ALNUM */
Benny Prijono9033e312005-11-21 02:08:39 +0000292
293PJ_IDEF(int) pj_stricmp2( const pj_str_t *str1, const char *str2)
294{
Benny Prijono18a051b2007-06-28 00:50:10 +0000295 pj_str_t copy2;
296
297 if (str2) {
298 copy2.ptr = (char*)str2;
299 copy2.slen = pj_ansi_strlen(str2);
300 } else {
Benny Prijono337fb5e2007-10-26 09:02:28 +0000301 copy2.ptr = NULL;
Benny Prijono18a051b2007-06-28 00:50:10 +0000302 copy2.slen = 0;
303 }
304
305 return pj_stricmp(str1, &copy2);
Benny Prijono9033e312005-11-21 02:08:39 +0000306}
307
308PJ_IDEF(int) pj_strnicmp( const pj_str_t *str1, const pj_str_t *str2,
309 pj_size_t len)
310{
Benny Prijono18a051b2007-06-28 00:50:10 +0000311 pj_str_t copy1, copy2;
312
313 if (len < (unsigned)str1->slen) {
314 copy1.ptr = str1->ptr;
315 copy1.slen = len;
316 str1 = &copy1;
317 }
318
319 if (len < (unsigned)str2->slen) {
320 copy2.ptr = str2->ptr;
321 copy2.slen = len;
322 str2 = &copy2;
323 }
324
325 return pj_stricmp(str1, str2);
Benny Prijono9033e312005-11-21 02:08:39 +0000326}
327
328PJ_IDEF(int) pj_strnicmp2( const pj_str_t *str1, const char *str2,
329 pj_size_t len)
330{
Benny Prijono18a051b2007-06-28 00:50:10 +0000331 pj_str_t copy2;
Benny Prijono8220f902006-01-09 17:20:59 +0000332
Benny Prijono18a051b2007-06-28 00:50:10 +0000333 if (str2) {
334 copy2.ptr = (char*)str2;
335 copy2.slen = pj_ansi_strlen(str2);
336 } else {
337 copy2.slen = 0;
338 }
339
340 return pj_strnicmp(str1, &copy2, len);
Benny Prijono9033e312005-11-21 02:08:39 +0000341}
342
343PJ_IDEF(void) pj_strcat(pj_str_t *dst, const pj_str_t *src)
344{
345 if (src->slen) {
346 pj_memcpy(dst->ptr + dst->slen, src->ptr, src->slen);
347 dst->slen += src->slen;
348 }
349}
350
Benny Prijono5a9091c2006-02-14 20:59:53 +0000351PJ_IDEF(void) pj_strcat2(pj_str_t *dst, const char *str)
352{
Benny Prijono18a051b2007-06-28 00:50:10 +0000353 unsigned len = str? pj_ansi_strlen(str) : 0;
Benny Prijono5a9091c2006-02-14 20:59:53 +0000354 if (len) {
355 pj_memcpy(dst->ptr + dst->slen, str, len);
356 dst->slen += len;
357 }
358}
359
Benny Prijono9033e312005-11-21 02:08:39 +0000360PJ_IDEF(pj_str_t*) pj_strtrim( pj_str_t *str )
361{
362 pj_strltrim(str);
363 pj_strrtrim(str);
364 return str;
365}
366