blob: 073cf26f631286d9829873481171ce22ccb6df51 [file] [log] [blame]
Benny Prijono9033e312005-11-21 02:08:39 +00001/* $Id$ */
2/*
Benny Prijono844653c2008-12-23 17:27:53 +00003 * Copyright (C) 2008-2009 Teluu Inc. (http://www.teluu.com)
4 * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
Benny Prijono9033e312005-11-21 02:08:39 +00005 *
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.
10 *
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.
15 *
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
19 */
20#include <pj/string.h>
Benny Prijonoc7434f62007-04-15 09:58:48 +000021#include <pj/assert.h>
Benny Prijono9033e312005-11-21 02:08:39 +000022#include <pj/pool.h>
23#include <pj/ctype.h>
24#include <pj/rand.h>
25#include <pj/os.h>
26
27#if PJ_FUNCTIONS_ARE_INLINED==0
28# include <pj/string_i.h>
29#endif
30
31
Benny Prijonobc2219b2008-01-26 10:45:52 +000032PJ_DEF(char*) pj_strstr(const pj_str_t *str, const pj_str_t *substr)
33{
34 const char *s, *ends;
35
36 /* Special case when substr is zero */
37 if (substr->slen == 0) {
38 return (char*)str->ptr;
39 }
40
41 s = str->ptr;
42 ends = str->ptr + str->slen - substr->slen;
43 for (; s<=ends; ++s) {
44 if (pj_ansi_strncmp(s, substr->ptr, substr->slen)==0)
45 return (char*)s;
46 }
47 return NULL;
48}
49
50
51PJ_DEF(char*) pj_stristr(const pj_str_t *str, const pj_str_t *substr)
52{
53 const char *s, *ends;
54
55 /* Special case when substr is zero */
56 if (substr->slen == 0) {
57 return (char*)str->ptr;
58 }
59
60 s = str->ptr;
61 ends = str->ptr + str->slen - substr->slen;
62 for (; s<=ends; ++s) {
63 if (pj_ansi_strnicmp(s, substr->ptr, substr->slen)==0)
64 return (char*)s;
65 }
66 return NULL;
67}
68
69
Benny Prijono9033e312005-11-21 02:08:39 +000070PJ_DEF(pj_str_t*) pj_strltrim( pj_str_t *str )
71{
Benny Prijono6d748702010-06-16 14:49:37 +000072 char *end = str->ptr + str->slen;
Benny Prijono9033e312005-11-21 02:08:39 +000073 register char *p = str->ptr;
Benny Prijono6d748702010-06-16 14:49:37 +000074 while (p < end && pj_isspace(*p))
Benny Prijono9033e312005-11-21 02:08:39 +000075 ++p;
76 str->slen -= (p - str->ptr);
77 str->ptr = p;
78 return str;
79}
80
81PJ_DEF(pj_str_t*) pj_strrtrim( pj_str_t *str )
82{
83 char *end = str->ptr + str->slen;
84 register char *p = end - 1;
85 while (p >= str->ptr && pj_isspace(*p))
86 --p;
87 str->slen -= ((end - p) - 1);
88 return str;
89}
90
91PJ_DEF(char*) pj_create_random_string(char *str, pj_size_t len)
92{
93 unsigned i;
94 char *p = str;
95
96 PJ_CHECK_STACK();
97
98 for (i=0; i<len/8; ++i) {
Benny Prijono4a035e92007-04-02 11:29:46 +000099 pj_uint32_t val = pj_rand();
Benny Prijono9033e312005-11-21 02:08:39 +0000100 pj_val_to_hex_digit( (val & 0xFF000000) >> 24, p+0 );
101 pj_val_to_hex_digit( (val & 0x00FF0000) >> 16, p+2 );
102 pj_val_to_hex_digit( (val & 0x0000FF00) >> 8, p+4 );
103 pj_val_to_hex_digit( (val & 0x000000FF) >> 0, p+6 );
104 p += 8;
105 }
106 for (i=i * 8; i<len; ++i) {
107 *p++ = pj_hex_digits[ pj_rand() & 0x0F ];
108 }
109 return str;
110}
111
112
113PJ_DEF(unsigned long) pj_strtoul(const pj_str_t *str)
114{
115 unsigned long value;
116 unsigned i;
117
118 PJ_CHECK_STACK();
119
120 value = 0;
121 for (i=0; i<(unsigned)str->slen; ++i) {
Benny Prijono6ee5fb12008-07-23 13:26:33 +0000122 if (!pj_isdigit(str->ptr[i]))
123 break;
Benny Prijono9033e312005-11-21 02:08:39 +0000124 value = value * 10 + (str->ptr[i] - '0');
125 }
126 return value;
127}
128
Benny Prijonoc7434f62007-04-15 09:58:48 +0000129PJ_DEF(unsigned long) pj_strtoul2(const pj_str_t *str, pj_str_t *endptr,
130 unsigned base)
131{
132 unsigned long value;
133 unsigned i;
134
135 PJ_CHECK_STACK();
136
137 value = 0;
138 if (base <= 10) {
139 for (i=0; i<(unsigned)str->slen; ++i) {
140 unsigned c = (str->ptr[i] - '0');
141 if (c >= base)
142 break;
143 value = value * base + c;
144 }
145 } else if (base == 16) {
146 for (i=0; i<(unsigned)str->slen; ++i) {
147 if (!pj_isxdigit(str->ptr[i]))
148 break;
149 value = value * 16 + pj_hex_digit_to_val(str->ptr[i]);
150 }
151 } else {
152 pj_assert(!"Unsupported base");
153 i = 0;
154 value = 0xFFFFFFFFUL;
155 }
156
157 if (endptr) {
158 endptr->ptr = str->ptr + i;
159 endptr->slen = str->slen - i;
160 }
161
162 return value;
163}
164
Benny Prijono9033e312005-11-21 02:08:39 +0000165PJ_DEF(int) pj_utoa(unsigned long val, char *buf)
166{
167 return pj_utoa_pad(val, buf, 0, 0);
168}
169
170PJ_DEF(int) pj_utoa_pad( unsigned long val, char *buf, int min_dig, int pad)
171{
172 char *p;
173 int len;
174
175 PJ_CHECK_STACK();
176
177 p = buf;
178 do {
179 unsigned long digval = (unsigned long) (val % 10);
180 val /= 10;
181 *p++ = (char) (digval + '0');
182 } while (val > 0);
183
184 len = p-buf;
185 while (len < min_dig) {
186 *p++ = (char)pad;
187 ++len;
188 }
189 *p-- = '\0';
190
191 do {
192 char temp = *p;
193 *p = *buf;
194 *buf = temp;
195 --p;
196 ++buf;
197 } while (buf < p);
198
199 return len;
200}
201
202