blob: fb520c7b7175c6c872aaf6b64ba43b18ebe9b830 [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#include <pj/string.h>
Benny Prijonoc7434f62007-04-15 09:58:48 +000020#include <pj/assert.h>
Benny Prijono9033e312005-11-21 02:08:39 +000021#include <pj/pool.h>
22#include <pj/ctype.h>
23#include <pj/rand.h>
24#include <pj/os.h>
25
26#if PJ_FUNCTIONS_ARE_INLINED==0
27# include <pj/string_i.h>
28#endif
29
30
Benny Prijonobc2219b2008-01-26 10:45:52 +000031PJ_DEF(char*) pj_strstr(const pj_str_t *str, const pj_str_t *substr)
32{
33 const char *s, *ends;
34
35 /* Special case when substr is zero */
36 if (substr->slen == 0) {
37 return (char*)str->ptr;
38 }
39
40 s = str->ptr;
41 ends = str->ptr + str->slen - substr->slen;
42 for (; s<=ends; ++s) {
43 if (pj_ansi_strncmp(s, substr->ptr, substr->slen)==0)
44 return (char*)s;
45 }
46 return NULL;
47}
48
49
50PJ_DEF(char*) pj_stristr(const pj_str_t *str, const pj_str_t *substr)
51{
52 const char *s, *ends;
53
54 /* Special case when substr is zero */
55 if (substr->slen == 0) {
56 return (char*)str->ptr;
57 }
58
59 s = str->ptr;
60 ends = str->ptr + str->slen - substr->slen;
61 for (; s<=ends; ++s) {
62 if (pj_ansi_strnicmp(s, substr->ptr, substr->slen)==0)
63 return (char*)s;
64 }
65 return NULL;
66}
67
68
Benny Prijono9033e312005-11-21 02:08:39 +000069PJ_DEF(pj_str_t*) pj_strltrim( pj_str_t *str )
70{
71 register char *p = str->ptr;
72 while (pj_isspace(*p))
73 ++p;
74 str->slen -= (p - str->ptr);
75 str->ptr = p;
76 return str;
77}
78
79PJ_DEF(pj_str_t*) pj_strrtrim( pj_str_t *str )
80{
81 char *end = str->ptr + str->slen;
82 register char *p = end - 1;
83 while (p >= str->ptr && pj_isspace(*p))
84 --p;
85 str->slen -= ((end - p) - 1);
86 return str;
87}
88
89PJ_DEF(char*) pj_create_random_string(char *str, pj_size_t len)
90{
91 unsigned i;
92 char *p = str;
93
94 PJ_CHECK_STACK();
95
96 for (i=0; i<len/8; ++i) {
Benny Prijono4a035e92007-04-02 11:29:46 +000097 pj_uint32_t val = pj_rand();
Benny Prijono9033e312005-11-21 02:08:39 +000098 pj_val_to_hex_digit( (val & 0xFF000000) >> 24, p+0 );
99 pj_val_to_hex_digit( (val & 0x00FF0000) >> 16, p+2 );
100 pj_val_to_hex_digit( (val & 0x0000FF00) >> 8, p+4 );
101 pj_val_to_hex_digit( (val & 0x000000FF) >> 0, p+6 );
102 p += 8;
103 }
104 for (i=i * 8; i<len; ++i) {
105 *p++ = pj_hex_digits[ pj_rand() & 0x0F ];
106 }
107 return str;
108}
109
110
111PJ_DEF(unsigned long) pj_strtoul(const pj_str_t *str)
112{
113 unsigned long value;
114 unsigned i;
115
116 PJ_CHECK_STACK();
117
118 value = 0;
119 for (i=0; i<(unsigned)str->slen; ++i) {
120 value = value * 10 + (str->ptr[i] - '0');
121 }
122 return value;
123}
124
Benny Prijonoc7434f62007-04-15 09:58:48 +0000125PJ_DEF(unsigned long) pj_strtoul2(const pj_str_t *str, pj_str_t *endptr,
126 unsigned base)
127{
128 unsigned long value;
129 unsigned i;
130
131 PJ_CHECK_STACK();
132
133 value = 0;
134 if (base <= 10) {
135 for (i=0; i<(unsigned)str->slen; ++i) {
136 unsigned c = (str->ptr[i] - '0');
137 if (c >= base)
138 break;
139 value = value * base + c;
140 }
141 } else if (base == 16) {
142 for (i=0; i<(unsigned)str->slen; ++i) {
143 if (!pj_isxdigit(str->ptr[i]))
144 break;
145 value = value * 16 + pj_hex_digit_to_val(str->ptr[i]);
146 }
147 } else {
148 pj_assert(!"Unsupported base");
149 i = 0;
150 value = 0xFFFFFFFFUL;
151 }
152
153 if (endptr) {
154 endptr->ptr = str->ptr + i;
155 endptr->slen = str->slen - i;
156 }
157
158 return value;
159}
160
Benny Prijono9033e312005-11-21 02:08:39 +0000161PJ_DEF(int) pj_utoa(unsigned long val, char *buf)
162{
163 return pj_utoa_pad(val, buf, 0, 0);
164}
165
166PJ_DEF(int) pj_utoa_pad( unsigned long val, char *buf, int min_dig, int pad)
167{
168 char *p;
169 int len;
170
171 PJ_CHECK_STACK();
172
173 p = buf;
174 do {
175 unsigned long digval = (unsigned long) (val % 10);
176 val /= 10;
177 *p++ = (char) (digval + '0');
178 } while (val > 0);
179
180 len = p-buf;
181 while (len < min_dig) {
182 *p++ = (char)pad;
183 ++len;
184 }
185 *p-- = '\0';
186
187 do {
188 char temp = *p;
189 *p = *buf;
190 *buf = temp;
191 --p;
192 ++buf;
193 } while (buf < p);
194
195 return len;
196}
197
198