blob: 25fc0368f29a2b4a8a7677a7965e5c2bf79b5ee1 [file] [log] [blame]
Benny Prijono9033e312005-11-21 02:08:39 +00001/* $Id$ */
2/*
3 * Copyright (C)2003-2006 Benny Prijono <benny@prijono.org>
4 *
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 Prijono5a9091c2006-02-14 20:59:53 +0000144 return pj_ansi_strncmp(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 Prijono5a9091c2006-02-14 20:59:53 +0000154 return pj_ansi_strncmp(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 Prijono5a9091c2006-02-14 20:59:53 +0000169 return pj_ansi_strncmp(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 Prijonocec5f4a2005-11-22 23:51:50 +0000198PJ_IDEF(int) strnicmp_alnum( const char *str1, const char *str2,
199 int len)
200{
201 if (len==0)
202 return 0;
203 else {
204 register const pj_uint32_t *p1 = (pj_uint32_t*)str1,
205 *p2 = (pj_uint32_t*)str2;
206 while (len > 3 && (*p1 & 0x5F5F5F5F)==(*p2 & 0x5F5F5F5F))
207 ++p1, ++p2, len-=4;
208
209 if (len > 3)
210 return -1;
211#if defined(PJ_IS_LITTLE_ENDIAN) && PJ_IS_LITTLE_ENDIAN!=0
212 else if (len==3)
213 return ((*p1 & 0x005F5F5F)==(*p2 & 0x005F5F5F)) ? 0 : -1;
214 else if (len==2)
215 return ((*p1 & 0x00005F5F)==(*p2 & 0x00005F5F)) ? 0 : -1;
216 else if (len==1)
217 return ((*p1 & 0x0000005F)==(*p2 & 0x0000005F)) ? 0 : -1;
218#else
219 else if (len==3)
220 return ((*p1 & 0x5F5F5F00)==(*p2 & 0x5F5F5F00)) ? 0 : -1;
221 else if (len==2)
222 return ((*p1 & 0x5F5F0000)==(*p2 & 0x5F5F0000)) ? 0 : -1;
223 else if (len==1)
224 return ((*p1 & 0x5F000000)==(*p2 & 0x5F000000)) ? 0 : -1;
225#endif
226 else
227 return 0;
228 }
229}
230
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000231PJ_IDEF(int) pj_stricmp_alnum(const pj_str_t *str1, const pj_str_t *str2)
232{
233 register int len = str1->slen;
234
235 if (len != str2->slen) {
Benny Prijono8220f902006-01-09 17:20:59 +0000236 return (len < str2->slen) ? -1 : 1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000237 } else if (len == 0) {
238 return 0;
239 } else {
240 register const pj_uint32_t *p1 = (pj_uint32_t*)str1->ptr,
241 *p2 = (pj_uint32_t*)str2->ptr;
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000242 while (len > 3 && (*p1 & 0x5F5F5F5F)==(*p2 & 0x5F5F5F5F))
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000243 ++p1, ++p2, len-=4;
244
245 if (len > 3)
246 return -1;
247#if defined(PJ_IS_LITTLE_ENDIAN) && PJ_IS_LITTLE_ENDIAN!=0
248 else if (len==3)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000249 return ((*p1 & 0x005F5F5F)==(*p2 & 0x005F5F5F)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000250 else if (len==2)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000251 return ((*p1 & 0x00005F5F)==(*p2 & 0x00005F5F)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000252 else if (len==1)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000253 return ((*p1 & 0x0000005F)==(*p2 & 0x0000005F)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000254#else
255 else if (len==3)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000256 return ((*p1 & 0x5F5F5F00)==(*p2 & 0x5F5F5F00)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000257 else if (len==2)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000258 return ((*p1 & 0x5F5F0000)==(*p2 & 0x5F5F0000)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000259 else if (len==1)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000260 return ((*p1 & 0x5F000000)==(*p2 & 0x5F000000)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000261#endif
262 else
263 return 0;
Benny Prijono9033e312005-11-21 02:08:39 +0000264 }
265}
266
267PJ_IDEF(int) pj_stricmp2( const pj_str_t *str1, const char *str2)
268{
Benny Prijono8220f902006-01-09 17:20:59 +0000269 if (str1->ptr && str2)
Benny Prijono5a9091c2006-02-14 20:59:53 +0000270 return pj_ansi_strnicmp(str1->ptr, str2, str1->slen);
Benny Prijono8220f902006-01-09 17:20:59 +0000271 else if (str2)
272 return (*str2=='\0') ? 0 : -1;
273 else if (str1->ptr)
274 return (str1->slen==0) ? 0 : 1;
275 else
276 return 0;
Benny Prijono9033e312005-11-21 02:08:39 +0000277}
278
279PJ_IDEF(int) pj_strnicmp( const pj_str_t *str1, const pj_str_t *str2,
280 pj_size_t len)
281{
Benny Prijono8220f902006-01-09 17:20:59 +0000282 if (str1->ptr && str2->ptr)
Benny Prijono5a9091c2006-02-14 20:59:53 +0000283 return pj_ansi_strnicmp(str1->ptr, str2->ptr, len);
Benny Prijono8220f902006-01-09 17:20:59 +0000284 else if (str2->ptr)
285 return str2->slen==0 ? 0 : -1;
286 else if (str1->ptr)
287 return str1->slen==0 ? 0 : 1;
288 else
289 return 0;
Benny Prijono9033e312005-11-21 02:08:39 +0000290}
291
292PJ_IDEF(int) pj_strnicmp2( const pj_str_t *str1, const char *str2,
293 pj_size_t len)
294{
Benny Prijono8220f902006-01-09 17:20:59 +0000295 if (len == 0)
296 return 0;
297 else if (str1->ptr && str2)
Benny Prijono5a9091c2006-02-14 20:59:53 +0000298 return pj_ansi_strnicmp(str1->ptr, str2, len);
Benny Prijono8220f902006-01-09 17:20:59 +0000299 else if (str1->ptr)
300 return str1->slen==0 ? 0 : 1;
301 else if (str2)
302 return *str2=='\0' ? 0 : -1;
303 else
304 return 0;
305
Benny Prijono9033e312005-11-21 02:08:39 +0000306}
307
308PJ_IDEF(void) pj_strcat(pj_str_t *dst, const pj_str_t *src)
309{
310 if (src->slen) {
311 pj_memcpy(dst->ptr + dst->slen, src->ptr, src->slen);
312 dst->slen += src->slen;
313 }
314}
315
Benny Prijono5a9091c2006-02-14 20:59:53 +0000316PJ_IDEF(void) pj_strcat2(pj_str_t *dst, const char *str)
317{
318 unsigned len = pj_ansi_strlen(str);
319 if (len) {
320 pj_memcpy(dst->ptr + dst->slen, str, len);
321 dst->slen += len;
322 }
323}
324
Benny Prijono9033e312005-11-21 02:08:39 +0000325PJ_IDEF(pj_str_t*) pj_strtrim( pj_str_t *str )
326{
327 pj_strltrim(str);
328 pj_strrtrim(str);
329 return str;
330}
331