blob: 807962b002551ec368fe333011613102d5a40b5d [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{
72 register char *p = str->ptr;
73 while (pj_isspace(*p))
74 ++p;
75 str->slen -= (p - str->ptr);
76 str->ptr = p;
77 return str;
78}
79
80PJ_DEF(pj_str_t*) pj_strrtrim( pj_str_t *str )
81{
82 char *end = str->ptr + str->slen;
83 register char *p = end - 1;
84 while (p >= str->ptr && pj_isspace(*p))
85 --p;
86 str->slen -= ((end - p) - 1);
87 return str;
88}
89
90PJ_DEF(char*) pj_create_random_string(char *str, pj_size_t len)
91{
92 unsigned i;
93 char *p = str;
94
95 PJ_CHECK_STACK();
96
97 for (i=0; i<len/8; ++i) {
Benny Prijono4a035e92007-04-02 11:29:46 +000098 pj_uint32_t val = pj_rand();
Benny Prijono9033e312005-11-21 02:08:39 +000099 pj_val_to_hex_digit( (val & 0xFF000000) >> 24, p+0 );
100 pj_val_to_hex_digit( (val & 0x00FF0000) >> 16, p+2 );
101 pj_val_to_hex_digit( (val & 0x0000FF00) >> 8, p+4 );
102 pj_val_to_hex_digit( (val & 0x000000FF) >> 0, p+6 );
103 p += 8;
104 }
105 for (i=i * 8; i<len; ++i) {
106 *p++ = pj_hex_digits[ pj_rand() & 0x0F ];
107 }
108 return str;
109}
110
111
112PJ_DEF(unsigned long) pj_strtoul(const pj_str_t *str)
113{
114 unsigned long value;
115 unsigned i;
116
117 PJ_CHECK_STACK();
118
119 value = 0;
120 for (i=0; i<(unsigned)str->slen; ++i) {
Benny Prijono6ee5fb12008-07-23 13:26:33 +0000121 if (!pj_isdigit(str->ptr[i]))
122 break;
Benny Prijono9033e312005-11-21 02:08:39 +0000123 value = value * 10 + (str->ptr[i] - '0');
124 }
125 return value;
126}
127
Benny Prijonoc7434f62007-04-15 09:58:48 +0000128PJ_DEF(unsigned long) pj_strtoul2(const pj_str_t *str, pj_str_t *endptr,
129 unsigned base)
130{
131 unsigned long value;
132 unsigned i;
133
134 PJ_CHECK_STACK();
135
136 value = 0;
137 if (base <= 10) {
138 for (i=0; i<(unsigned)str->slen; ++i) {
139 unsigned c = (str->ptr[i] - '0');
140 if (c >= base)
141 break;
142 value = value * base + c;
143 }
144 } else if (base == 16) {
145 for (i=0; i<(unsigned)str->slen; ++i) {
146 if (!pj_isxdigit(str->ptr[i]))
147 break;
148 value = value * 16 + pj_hex_digit_to_val(str->ptr[i]);
149 }
150 } else {
151 pj_assert(!"Unsupported base");
152 i = 0;
153 value = 0xFFFFFFFFUL;
154 }
155
156 if (endptr) {
157 endptr->ptr = str->ptr + i;
158 endptr->slen = str->slen - i;
159 }
160
161 return value;
162}
163
Benny Prijono9033e312005-11-21 02:08:39 +0000164PJ_DEF(int) pj_utoa(unsigned long val, char *buf)
165{
166 return pj_utoa_pad(val, buf, 0, 0);
167}
168
169PJ_DEF(int) pj_utoa_pad( unsigned long val, char *buf, int min_dig, int pad)
170{
171 char *p;
172 int len;
173
174 PJ_CHECK_STACK();
175
176 p = buf;
177 do {
178 unsigned long digval = (unsigned long) (val % 10);
179 val /= 10;
180 *p++ = (char) (digval + '0');
181 } while (val > 0);
182
183 len = p-buf;
184 while (len < min_dig) {
185 *p++ = (char)pad;
186 ++len;
187 }
188 *p-- = '\0';
189
190 do {
191 char temp = *p;
192 *p = *buf;
193 *buf = temp;
194 --p;
195 ++buf;
196 } while (buf < p);
197
198 return len;
199}
200
201