blob: 91aebfb09415f98f36c5dad5301853b491fe17fc [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;
26 dst.slen = str ? pj_native_strlen(str) : 0;
27 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{
46 if (src->slen) {
47 dst->ptr = (char*)pj_pool_alloc(pool, src->slen+1);
48 pj_memcpy(dst->ptr, src->ptr, src->slen);
49 } else {
50 dst->ptr = (char*)pj_pool_alloc(pool, 1);
51 }
52 dst->slen = src->slen;
53 dst->ptr[dst->slen] = '\0';
54 return dst;
55}
56
57PJ_IDEF(pj_str_t*) pj_strdup2(pj_pool_t *pool,
58 pj_str_t *dst,
59 const char *src)
60{
61 dst->slen = src ? pj_native_strlen(src) : 0;
62 if (dst->slen) {
63 dst->ptr = (char*)pj_pool_alloc(pool, dst->slen);
64 pj_memcpy(dst->ptr, src, dst->slen);
65 } else {
66 dst->ptr = NULL;
67 }
68 return dst;
69}
70
71
72PJ_IDEF(pj_str_t) pj_strdup3(pj_pool_t *pool, const char *src)
73{
74 pj_str_t temp;
75 pj_strdup2(pool, &temp, src);
76 return temp;
77}
78
79PJ_IDEF(pj_str_t*) pj_strassign( pj_str_t *dst, pj_str_t *src )
80{
81 dst->ptr = src->ptr;
82 dst->slen = src->slen;
83 return dst;
84}
85
86PJ_IDEF(pj_str_t*) pj_strcpy(pj_str_t *dst, const pj_str_t *src)
87{
88 dst->slen = src->slen;
89 if (src->slen > 0)
90 pj_memcpy(dst->ptr, src->ptr, src->slen);
91 return dst;
92}
93
94PJ_IDEF(pj_str_t*) pj_strcpy2(pj_str_t *dst, const char *src)
95{
96 dst->slen = src ? pj_native_strlen(src) : 0;
97 if (dst->slen > 0)
98 pj_memcpy(dst->ptr, src, dst->slen);
99 return dst;
100}
101
102PJ_IDEF(pj_str_t*) pj_strncpy( pj_str_t *dst, const pj_str_t *src,
103 pj_ssize_t max)
104{
105 if (max > src->slen) max = src->slen;
106 pj_memcpy(dst->ptr, src->ptr, max);
107 dst->slen = max;
108 return dst;
109}
110
111PJ_IDEF(pj_str_t*) pj_strncpy_with_null( pj_str_t *dst, const pj_str_t *src,
112 pj_ssize_t max)
113{
114 if (max <= src->slen)
115 max = max-1;
116 else
117 max = src->slen;
118
119 pj_memcpy(dst->ptr, src->ptr, max);
120 dst->ptr[max] = '\0';
121 dst->slen = max;
122 return dst;
123}
124
125
126PJ_IDEF(int) pj_strcmp( const pj_str_t *str1, const pj_str_t *str2)
127{
128 pj_ssize_t diff;
129
130 diff = str1->slen - str2->slen;
131 if (diff) {
132 return (int)diff;
133 } else if (str1->ptr && str1->slen) {
134 return pj_native_strncmp(str1->ptr, str2->ptr, str1->slen);
135 } else {
136 return 0;
137 }
138}
139
140PJ_IDEF(int) pj_strncmp( const pj_str_t *str1, const pj_str_t *str2,
141 pj_size_t len)
142{
143 return (str1->ptr && str2->ptr) ?
144 pj_native_strncmp(str1->ptr, str2->ptr, len) :
145 (str1->ptr == str2->ptr ? 0 : 1);
146}
147
148PJ_IDEF(int) pj_strncmp2( const pj_str_t *str1, const char *str2,
149 pj_size_t len)
150{
151 return (str1->ptr && str2) ? pj_native_strncmp(str1->ptr, str2, len) :
152 (str1->ptr==str2 ? 0 : 1);
153}
154
155PJ_IDEF(int) pj_strcmp2( const pj_str_t *str1, const char *str2 )
156{
157 return pj_strncmp2( str1, str2, str1->slen);
158}
159
160PJ_IDEF(int) pj_stricmp( const pj_str_t *str1, const pj_str_t *str2)
161{
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000162 register int len = str1->slen;
163 if (len != str2->slen) {
164 return (int)(len - str2->slen);
165 } else if (len == 0) {
166 return 0;
Benny Prijono9033e312005-11-21 02:08:39 +0000167 } else {
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000168 return pj_native_strnicmp(str1->ptr, str2->ptr, len);
169 }
170}
171
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000172PJ_IDEF(int) strnicmp_alnum( const char *str1, const char *str2,
173 int len)
174{
175 if (len==0)
176 return 0;
177 else {
178 register const pj_uint32_t *p1 = (pj_uint32_t*)str1,
179 *p2 = (pj_uint32_t*)str2;
180 while (len > 3 && (*p1 & 0x5F5F5F5F)==(*p2 & 0x5F5F5F5F))
181 ++p1, ++p2, len-=4;
182
183 if (len > 3)
184 return -1;
185#if defined(PJ_IS_LITTLE_ENDIAN) && PJ_IS_LITTLE_ENDIAN!=0
186 else if (len==3)
187 return ((*p1 & 0x005F5F5F)==(*p2 & 0x005F5F5F)) ? 0 : -1;
188 else if (len==2)
189 return ((*p1 & 0x00005F5F)==(*p2 & 0x00005F5F)) ? 0 : -1;
190 else if (len==1)
191 return ((*p1 & 0x0000005F)==(*p2 & 0x0000005F)) ? 0 : -1;
192#else
193 else if (len==3)
194 return ((*p1 & 0x5F5F5F00)==(*p2 & 0x5F5F5F00)) ? 0 : -1;
195 else if (len==2)
196 return ((*p1 & 0x5F5F0000)==(*p2 & 0x5F5F0000)) ? 0 : -1;
197 else if (len==1)
198 return ((*p1 & 0x5F000000)==(*p2 & 0x5F000000)) ? 0 : -1;
199#endif
200 else
201 return 0;
202 }
203}
204
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000205PJ_IDEF(int) pj_stricmp_alnum(const pj_str_t *str1, const pj_str_t *str2)
206{
207 register int len = str1->slen;
208
209 if (len != str2->slen) {
210 return -1;
211 } else if (len == 0) {
212 return 0;
213 } else {
214 register const pj_uint32_t *p1 = (pj_uint32_t*)str1->ptr,
215 *p2 = (pj_uint32_t*)str2->ptr;
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000216 while (len > 3 && (*p1 & 0x5F5F5F5F)==(*p2 & 0x5F5F5F5F))
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000217 ++p1, ++p2, len-=4;
218
219 if (len > 3)
220 return -1;
221#if defined(PJ_IS_LITTLE_ENDIAN) && PJ_IS_LITTLE_ENDIAN!=0
222 else if (len==3)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000223 return ((*p1 & 0x005F5F5F)==(*p2 & 0x005F5F5F)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000224 else if (len==2)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000225 return ((*p1 & 0x00005F5F)==(*p2 & 0x00005F5F)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000226 else if (len==1)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000227 return ((*p1 & 0x0000005F)==(*p2 & 0x0000005F)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000228#else
229 else if (len==3)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000230 return ((*p1 & 0x5F5F5F00)==(*p2 & 0x5F5F5F00)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000231 else if (len==2)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000232 return ((*p1 & 0x5F5F0000)==(*p2 & 0x5F5F0000)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000233 else if (len==1)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000234 return ((*p1 & 0x5F000000)==(*p2 & 0x5F000000)) ? 0 : -1;
Benny Prijonoa7944bb2005-11-21 17:01:50 +0000235#endif
236 else
237 return 0;
Benny Prijono9033e312005-11-21 02:08:39 +0000238 }
239}
240
241PJ_IDEF(int) pj_stricmp2( const pj_str_t *str1, const char *str2)
242{
243 return (str1->ptr && str2) ?
244 pj_native_strnicmp(str1->ptr, str2, str1->slen) :
245 (str1->ptr==str2 ? 0 : 1);
246}
247
248PJ_IDEF(int) pj_strnicmp( const pj_str_t *str1, const pj_str_t *str2,
249 pj_size_t len)
250{
251 return (str1->ptr && str2->ptr) ?
252 pj_native_strnicmp(str1->ptr, str2->ptr, len) :
253 (str1->ptr == str2->ptr ? 0 : 1);
254}
255
256PJ_IDEF(int) pj_strnicmp2( const pj_str_t *str1, const char *str2,
257 pj_size_t len)
258{
259 return (str1->ptr && str2) ?
260 pj_native_strnicmp(str1->ptr, str2, len) :
261 (str1->ptr == str2 ? 0 : 1);
262}
263
264PJ_IDEF(void) pj_strcat(pj_str_t *dst, const pj_str_t *src)
265{
266 if (src->slen) {
267 pj_memcpy(dst->ptr + dst->slen, src->ptr, src->slen);
268 dst->slen += src->slen;
269 }
270}
271
272PJ_IDEF(pj_str_t*) pj_strtrim( pj_str_t *str )
273{
274 pj_strltrim(str);
275 pj_strrtrim(str);
276 return str;
277}
278