blob: 7430b6265871d8b0f4b9886b856fa305164e353f [file] [log] [blame]
Benny Prijono9033e312005-11-21 02:08:39 +00001/* $Id$ */
2/*
Benny Prijonoa771a512007-02-19 01:13:53 +00003 * Copyright (C)2003-2007 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{
138 pj_ssize_t diff;
139
140 diff = str1->slen - str2->slen;
141 if (diff) {
Benny Prijono8220f902006-01-09 17:20:59 +0000142 return diff > 0 ? 1 : -1;
Benny Prijono9033e312005-11-21 02:08:39 +0000143 } else if (str1->ptr && str1->slen) {
Benny Prijonoea4296c2006-09-13 22:48:37 +0000144 return memcmp(str1->ptr, str2->ptr, str1->slen);
Benny Prijono9033e312005-11-21 02:08:39 +0000145 } else {
146 return 0;
147 }
148}
149
150PJ_IDEF(int) pj_strncmp( const pj_str_t *str1, const pj_str_t *str2,
151 pj_size_t len)
152{
Benny Prijono8220f902006-01-09 17:20:59 +0000153 if (str1->ptr && str2->ptr)
Benny Prijonoea4296c2006-09-13 22:48:37 +0000154 return memcmp(str1->ptr, str2->ptr, len);
Benny Prijono8220f902006-01-09 17:20:59 +0000155 else if (str2->ptr)
156 return str2->slen==0 ? 0 : -1;
157 else if (str1->ptr)
158 return str1->slen==0 ? 0 : 1;
159 else
160 return 0;
Benny Prijono9033e312005-11-21 02:08:39 +0000161}
162
163PJ_IDEF(int) pj_strncmp2( const pj_str_t *str1, const char *str2,
164 pj_size_t len)
165{
Benny Prijono8220f902006-01-09 17:20:59 +0000166 if (len == 0)
167 return 0;
168 else if (str1->ptr && str2)
Benny Prijonoea4296c2006-09-13 22:48:37 +0000169 return memcmp(str1->ptr, str2, len);
Benny Prijono8220f902006-01-09 17:20:59 +0000170 else if (str1->ptr)
171 return str1->slen==0 ? 0 : 1;
172 else if (str2)
173 return *str2=='\0' ? 0 : -1;
174 else
175 return 0;
Benny Prijono9033e312005-11-21 02:08:39 +0000176}
177
178PJ_IDEF(int) pj_strcmp2( const pj_str_t *str1, const char *str2 )
179{
Benny Prijono8220f902006-01-09 17:20:59 +0000180 if (str1->slen == 0) {
181 return (!str2 || *str2=='\0') ? 0 : -1;
182 } else
183 return pj_strncmp2( str1, str2, str1->slen);
Benny Prijono9033e312005-11-21 02:08:39 +0000184}
185
186PJ_IDEF(int) pj_stricmp( const pj_str_t *str1, const pj_str_t *str2)
187{
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000188 register int len = str1->slen;
189 if (len != str2->slen) {
190 return (int)(len - str2->slen);
191 } else if (len == 0) {
192 return 0;
Benny Prijono9033e312005-11-21 02:08:39 +0000193 } else {
Benny Prijono5a9091c2006-02-14 20:59:53 +0000194 return pj_ansi_strnicmp(str1->ptr, str2->ptr, len);
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000195 }
196}
197
Benny Prijonodcf29962006-03-23 18:03:40 +0000198#if defined(PJ_HAS_STRICMP_ALNUM) && PJ_HAS_STRICMP_ALNUM!=0
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000199PJ_IDEF(int) strnicmp_alnum( const char *str1, const char *str2,
200 int len)
201{
202 if (len==0)
203 return 0;
204 else {
205 register const pj_uint32_t *p1 = (pj_uint32_t*)str1,
206 *p2 = (pj_uint32_t*)str2;
207 while (len > 3 && (*p1 & 0x5F5F5F5F)==(*p2 & 0x5F5F5F5F))
208 ++p1, ++p2, len-=4;
209
210 if (len > 3)
211 return -1;
212#if defined(PJ_IS_LITTLE_ENDIAN) && PJ_IS_LITTLE_ENDIAN!=0
213 else if (len==3)
214 return ((*p1 & 0x005F5F5F)==(*p2 & 0x005F5F5F)) ? 0 : -1;
215 else if (len==2)
216 return ((*p1 & 0x00005F5F)==(*p2 & 0x00005F5F)) ? 0 : -1;
217 else if (len==1)
218 return ((*p1 & 0x0000005F)==(*p2 & 0x0000005F)) ? 0 : -1;
219#else
220 else if (len==3)
221 return ((*p1 & 0x5F5F5F00)==(*p2 & 0x5F5F5F00)) ? 0 : -1;
222 else if (len==2)
223 return ((*p1 & 0x5F5F0000)==(*p2 & 0x5F5F0000)) ? 0 : -1;
224 else if (len==1)
225 return ((*p1 & 0x5F000000)==(*p2 & 0x5F000000)) ? 0 : -1;
226#endif
227 else
228 return 0;
229 }
230}
231
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000232PJ_IDEF(int) pj_stricmp_alnum(const pj_str_t *str1, const pj_str_t *str2)
233{
234 register int len = str1->slen;
235
236 if (len != str2->slen) {
Benny Prijono8220f902006-01-09 17:20:59 +0000237 return (len < str2->slen) ? -1 : 1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000238 } else if (len == 0) {
239 return 0;
240 } else {
241 register const pj_uint32_t *p1 = (pj_uint32_t*)str1->ptr,
242 *p2 = (pj_uint32_t*)str2->ptr;
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000243 while (len > 3 && (*p1 & 0x5F5F5F5F)==(*p2 & 0x5F5F5F5F))
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000244 ++p1, ++p2, len-=4;
245
246 if (len > 3)
247 return -1;
248#if defined(PJ_IS_LITTLE_ENDIAN) && PJ_IS_LITTLE_ENDIAN!=0
249 else if (len==3)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000250 return ((*p1 & 0x005F5F5F)==(*p2 & 0x005F5F5F)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000251 else if (len==2)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000252 return ((*p1 & 0x00005F5F)==(*p2 & 0x00005F5F)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000253 else if (len==1)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000254 return ((*p1 & 0x0000005F)==(*p2 & 0x0000005F)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000255#else
256 else if (len==3)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000257 return ((*p1 & 0x5F5F5F00)==(*p2 & 0x5F5F5F00)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000258 else if (len==2)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000259 return ((*p1 & 0x5F5F0000)==(*p2 & 0x5F5F0000)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000260 else if (len==1)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000261 return ((*p1 & 0x5F000000)==(*p2 & 0x5F000000)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000262#endif
263 else
264 return 0;
Benny Prijono9033e312005-11-21 02:08:39 +0000265 }
266}
Benny Prijonodcf29962006-03-23 18:03:40 +0000267#endif /* PJ_HAS_STRICMP_ALNUM */
Benny Prijono9033e312005-11-21 02:08:39 +0000268
269PJ_IDEF(int) pj_stricmp2( const pj_str_t *str1, const char *str2)
270{
Benny Prijono8220f902006-01-09 17:20:59 +0000271 if (str1->ptr && str2)
Benny Prijono5a9091c2006-02-14 20:59:53 +0000272 return pj_ansi_strnicmp(str1->ptr, str2, str1->slen);
Benny Prijono8220f902006-01-09 17:20:59 +0000273 else if (str2)
274 return (*str2=='\0') ? 0 : -1;
275 else if (str1->ptr)
276 return (str1->slen==0) ? 0 : 1;
277 else
278 return 0;
Benny Prijono9033e312005-11-21 02:08:39 +0000279}
280
281PJ_IDEF(int) pj_strnicmp( const pj_str_t *str1, const pj_str_t *str2,
282 pj_size_t len)
283{
Benny Prijono8220f902006-01-09 17:20:59 +0000284 if (str1->ptr && str2->ptr)
Benny Prijono5a9091c2006-02-14 20:59:53 +0000285 return pj_ansi_strnicmp(str1->ptr, str2->ptr, len);
Benny Prijono8220f902006-01-09 17:20:59 +0000286 else if (str2->ptr)
287 return str2->slen==0 ? 0 : -1;
288 else if (str1->ptr)
289 return str1->slen==0 ? 0 : 1;
290 else
291 return 0;
Benny Prijono9033e312005-11-21 02:08:39 +0000292}
293
294PJ_IDEF(int) pj_strnicmp2( const pj_str_t *str1, const char *str2,
295 pj_size_t len)
296{
Benny Prijono8220f902006-01-09 17:20:59 +0000297 if (len == 0)
298 return 0;
299 else if (str1->ptr && str2)
Benny Prijono5a9091c2006-02-14 20:59:53 +0000300 return pj_ansi_strnicmp(str1->ptr, str2, len);
Benny Prijono8220f902006-01-09 17:20:59 +0000301 else if (str1->ptr)
302 return str1->slen==0 ? 0 : 1;
303 else if (str2)
304 return *str2=='\0' ? 0 : -1;
305 else
306 return 0;
307
Benny Prijono9033e312005-11-21 02:08:39 +0000308}
309
310PJ_IDEF(void) pj_strcat(pj_str_t *dst, const pj_str_t *src)
311{
312 if (src->slen) {
313 pj_memcpy(dst->ptr + dst->slen, src->ptr, src->slen);
314 dst->slen += src->slen;
315 }
316}
317
Benny Prijono5a9091c2006-02-14 20:59:53 +0000318PJ_IDEF(void) pj_strcat2(pj_str_t *dst, const char *str)
319{
320 unsigned len = pj_ansi_strlen(str);
321 if (len) {
322 pj_memcpy(dst->ptr + dst->slen, str, len);
323 dst->slen += len;
324 }
325}
326
Benny Prijono9033e312005-11-21 02:08:39 +0000327PJ_IDEF(pj_str_t*) pj_strtrim( pj_str_t *str )
328{
329 pj_strltrim(str);
330 pj_strrtrim(str);
331 return str;
332}
333