1
/* $Id: string_i.h 3553 2011-05-05 06:14:19Z nanang $ */
3
* Copyright (C) 2008-2011 Teluu Inc. (http://www.teluu.com)
4
* Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
6
* This program 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.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23
PJ_IDEF(pj_str_t) pj_str(char *str)
27
dst.slen = str ? pj_ansi_strlen(str) : 0;
31
PJ_IDEF(pj_str_t*) pj_strdup(pj_pool_t *pool,
35
/* Without this, destination will be corrupted */
40
dst->ptr = (char*)pj_pool_alloc(pool, src->slen);
41
pj_memcpy(dst->ptr, src->ptr, src->slen);
43
dst->slen = src->slen;
47
PJ_IDEF(pj_str_t*) pj_strdup_with_null( pj_pool_t *pool,
51
dst->ptr = (char*)pj_pool_alloc(pool, src->slen+1);
53
pj_memcpy(dst->ptr, src->ptr, src->slen);
55
dst->slen = src->slen;
56
dst->ptr[dst->slen] = '\0';
60
PJ_IDEF(pj_str_t*) pj_strdup2(pj_pool_t *pool,
64
dst->slen = src ? pj_ansi_strlen(src) : 0;
66
dst->ptr = (char*)pj_pool_alloc(pool, dst->slen);
67
pj_memcpy(dst->ptr, src, dst->slen);
74
PJ_IDEF(pj_str_t*) pj_strdup2_with_null( pj_pool_t *pool,
78
dst->slen = src ? pj_ansi_strlen(src) : 0;
79
dst->ptr = (char*)pj_pool_alloc(pool, dst->slen+1);
81
pj_memcpy(dst->ptr, src, dst->slen);
83
dst->ptr[dst->slen] = '\0';
87
PJ_IDEF(pj_str_t) pj_strdup3(pj_pool_t *pool, const char *src)
90
pj_strdup2(pool, &temp, src);
94
PJ_IDEF(pj_str_t*) pj_strassign( pj_str_t *dst, pj_str_t *src )
97
dst->slen = src->slen;
101
PJ_IDEF(pj_str_t*) pj_strcpy(pj_str_t *dst, const pj_str_t *src)
103
dst->slen = src->slen;
105
pj_memcpy(dst->ptr, src->ptr, src->slen);
109
PJ_IDEF(pj_str_t*) pj_strcpy2(pj_str_t *dst, const char *src)
111
dst->slen = src ? pj_ansi_strlen(src) : 0;
113
pj_memcpy(dst->ptr, src, dst->slen);
117
PJ_IDEF(pj_str_t*) pj_strncpy( pj_str_t *dst, const pj_str_t *src,
120
if (max > src->slen) max = src->slen;
121
pj_memcpy(dst->ptr, src->ptr, max);
126
PJ_IDEF(pj_str_t*) pj_strncpy_with_null( pj_str_t *dst, const pj_str_t *src,
129
if (max <= src->slen)
134
pj_memcpy(dst->ptr, src->ptr, max);
135
dst->ptr[max] = '\0';
141
PJ_IDEF(int) pj_strcmp( const pj_str_t *str1, const pj_str_t *str2)
143
if (str1->slen == 0) {
144
return str2->slen==0 ? 0 : -1;
145
} else if (str2->slen == 0) {
148
int min = (str1->slen < str2->slen)? str1->slen : str2->slen;
149
int res = pj_memcmp(str1->ptr, str2->ptr, min);
151
return (str1->slen < str2->slen) ? -1 :
152
(str1->slen == str2->slen ? 0 : 1);
159
PJ_IDEF(int) pj_strncmp( const pj_str_t *str1, const pj_str_t *str2,
162
pj_str_t copy1, copy2;
164
if (len < (unsigned)str1->slen) {
165
copy1.ptr = str1->ptr;
170
if (len < (unsigned)str2->slen) {
171
copy2.ptr = str2->ptr;
176
return pj_strcmp(str1, str2);
179
PJ_IDEF(int) pj_strncmp2( const pj_str_t *str1, const char *str2,
185
copy2.ptr = (char*)str2;
186
copy2.slen = pj_ansi_strlen(str2);
191
return pj_strncmp(str1, ©2, len);
194
PJ_IDEF(int) pj_strcmp2( const pj_str_t *str1, const char *str2 )
199
copy2.ptr = (char*)str2;
200
copy2.slen = pj_ansi_strlen(str2);
206
return pj_strcmp(str1, ©2);
209
PJ_IDEF(int) pj_stricmp( const pj_str_t *str1, const pj_str_t *str2)
211
if (str1->slen == 0) {
212
return str2->slen==0 ? 0 : -1;
213
} else if (str2->slen == 0) {
216
int min = (str1->slen < str2->slen)? str1->slen : str2->slen;
217
int res = pj_ansi_strnicmp(str1->ptr, str2->ptr, min);
219
return (str1->slen < str2->slen) ? -1 :
220
(str1->slen == str2->slen ? 0 : 1);
227
#if defined(PJ_HAS_STRICMP_ALNUM) && PJ_HAS_STRICMP_ALNUM!=0
228
PJ_IDEF(int) strnicmp_alnum( const char *str1, const char *str2,
234
register const pj_uint32_t *p1 = (pj_uint32_t*)str1,
235
*p2 = (pj_uint32_t*)str2;
236
while (len > 3 && (*p1 & 0x5F5F5F5F)==(*p2 & 0x5F5F5F5F))
241
#if defined(PJ_IS_LITTLE_ENDIAN) && PJ_IS_LITTLE_ENDIAN!=0
243
return ((*p1 & 0x005F5F5F)==(*p2 & 0x005F5F5F)) ? 0 : -1;
245
return ((*p1 & 0x00005F5F)==(*p2 & 0x00005F5F)) ? 0 : -1;
247
return ((*p1 & 0x0000005F)==(*p2 & 0x0000005F)) ? 0 : -1;
250
return ((*p1 & 0x5F5F5F00)==(*p2 & 0x5F5F5F00)) ? 0 : -1;
252
return ((*p1 & 0x5F5F0000)==(*p2 & 0x5F5F0000)) ? 0 : -1;
254
return ((*p1 & 0x5F000000)==(*p2 & 0x5F000000)) ? 0 : -1;
261
PJ_IDEF(int) pj_stricmp_alnum(const pj_str_t *str1, const pj_str_t *str2)
263
register int len = str1->slen;
265
if (len != str2->slen) {
266
return (len < str2->slen) ? -1 : 1;
267
} else if (len == 0) {
270
register const pj_uint32_t *p1 = (pj_uint32_t*)str1->ptr,
271
*p2 = (pj_uint32_t*)str2->ptr;
272
while (len > 3 && (*p1 & 0x5F5F5F5F)==(*p2 & 0x5F5F5F5F))
277
#if defined(PJ_IS_LITTLE_ENDIAN) && PJ_IS_LITTLE_ENDIAN!=0
279
return ((*p1 & 0x005F5F5F)==(*p2 & 0x005F5F5F)) ? 0 : -1;
281
return ((*p1 & 0x00005F5F)==(*p2 & 0x00005F5F)) ? 0 : -1;
283
return ((*p1 & 0x0000005F)==(*p2 & 0x0000005F)) ? 0 : -1;
286
return ((*p1 & 0x5F5F5F00)==(*p2 & 0x5F5F5F00)) ? 0 : -1;
288
return ((*p1 & 0x5F5F0000)==(*p2 & 0x5F5F0000)) ? 0 : -1;
290
return ((*p1 & 0x5F000000)==(*p2 & 0x5F000000)) ? 0 : -1;
296
#endif /* PJ_HAS_STRICMP_ALNUM */
298
PJ_IDEF(int) pj_stricmp2( const pj_str_t *str1, const char *str2)
303
copy2.ptr = (char*)str2;
304
copy2.slen = pj_ansi_strlen(str2);
310
return pj_stricmp(str1, ©2);
313
PJ_IDEF(int) pj_strnicmp( const pj_str_t *str1, const pj_str_t *str2,
316
pj_str_t copy1, copy2;
318
if (len < (unsigned)str1->slen) {
319
copy1.ptr = str1->ptr;
324
if (len < (unsigned)str2->slen) {
325
copy2.ptr = str2->ptr;
330
return pj_stricmp(str1, str2);
333
PJ_IDEF(int) pj_strnicmp2( const pj_str_t *str1, const char *str2,
339
copy2.ptr = (char*)str2;
340
copy2.slen = pj_ansi_strlen(str2);
345
return pj_strnicmp(str1, ©2, len);
348
PJ_IDEF(void) pj_strcat(pj_str_t *dst, const pj_str_t *src)
351
pj_memcpy(dst->ptr + dst->slen, src->ptr, src->slen);
352
dst->slen += src->slen;
356
PJ_IDEF(void) pj_strcat2(pj_str_t *dst, const char *str)
358
unsigned len = str? pj_ansi_strlen(str) : 0;
360
pj_memcpy(dst->ptr + dst->slen, str, len);
365
PJ_IDEF(pj_str_t*) pj_strtrim( pj_str_t *str )