1 /* ------------------------------------------------------------------
2 * Copyright (C) 1998-2009 PacketVideo
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13 * express or implied.
14 * See the License for the specific language governing permissions
15 * and limitations under the License.
16 * -------------------------------------------------------------------
17 */
18 #include "oscl_stdstring.h"
19
20 #define OSCL_ASCII_CASE_MAGIC_BIT 0x20
21
oscl_strlen(const char * str)22 OSCL_EXPORT_REF uint32 oscl_strlen(const char* str)
23 {
24 return (uint32)strlen(str);
25 }
26
oscl_strlen(const oscl_wchar * str)27 OSCL_EXPORT_REF uint32 oscl_strlen(const oscl_wchar* str)
28 {
29 uint32 len = 0;
30 while (*str != '\0')
31 {
32 str++;
33 len++;
34 }
35 return len;
36 }
37
oscl_strncpy(char * dest,const char * src,uint32 count)38 OSCL_EXPORT_REF char* oscl_strncpy(char* dest, const char* src, uint32 count)
39 {
40 return strncpy(dest, src, count);
41 }
42
oscl_strncpy(oscl_wchar * dest,const oscl_wchar * src,uint32 count)43 OSCL_EXPORT_REF oscl_wchar* oscl_strncpy(oscl_wchar *dest, const oscl_wchar *src, uint32 count)
44 {
45 oscl_wchar* tmp = dest;
46 uint32 ii;
47 for (ii = 0; ii < count && *src != '\0'; ii++)
48 {
49 *tmp++ = *src++;
50 }
51 // pad with null chars upto length count
52 for (; ii < count; ii++)
53 {
54 *tmp++ = '\0';
55 }
56 return dest;
57 }
58
oscl_strcmp(const char * str1,const char * str2)59 OSCL_EXPORT_REF int32 oscl_strcmp(const char* str1, const char* str2)
60 {
61 return (int32)strcmp(str1, str2);
62 }
63
oscl_strncmp(const char * str1,const char * str2,uint32 count)64 OSCL_EXPORT_REF int32 oscl_strncmp(const char* str1, const char* str2, uint32 count)
65 {
66 return (int32)strncmp(str1, str2, count);
67 }
68
69
oscl_strcmp(const oscl_wchar * str1,const oscl_wchar * str2)70 OSCL_EXPORT_REF int32 oscl_strcmp(const oscl_wchar *str1, const oscl_wchar *str2)
71 {
72 while ((*str1 == *str2) && (*str1 != '\0'))
73 {
74 str1++;
75 str2++;
76 }
77 return (*str1 - *str2);
78 }
79
80
oscl_strncmp(const oscl_wchar * str1,const oscl_wchar * str2,uint32 count)81 OSCL_EXPORT_REF int32 oscl_strncmp(const oscl_wchar *str1, const oscl_wchar *str2, uint32 count)
82 {
83 for (uint32 ii = 0; ii < count; ii++)
84 {
85 if (*str1 != *str2 || *str1 == '\0')
86 {
87 return (*str1 - *str2);
88 }
89 str1++;
90 str2++;
91 }
92 return 0;
93 }
94
95
oscl_strncat(char * dest,const char * src,uint32 count)96 OSCL_EXPORT_REF char* oscl_strncat(char* dest, const char* src, uint32 count)
97 {
98 return strncat(dest, src, count);
99 }
100
oscl_strncat(oscl_wchar * dest,const oscl_wchar * src,uint32 count)101 OSCL_EXPORT_REF oscl_wchar* oscl_strncat(oscl_wchar* dest, const oscl_wchar* src, uint32 count)
102 {
103 oscl_wchar* tmp = dest + oscl_strlen(dest);
104 for (uint32 ii = 0; ii < count && *src != '\0'; ii++)
105 {
106 *tmp++ = *src++;
107 }
108 *tmp = '\0';
109 return dest;
110 }
111
oscl_strchr(const char * str,int32 c)112 OSCL_EXPORT_REF const char* oscl_strchr(const char *str, int32 c)
113 {
114 if (str)
115 {
116 while (*str != '\0')
117 {
118 if (*str == (char)c)
119 return str;
120 str++;
121 }
122 if (*str == (char)c)
123 return str;
124 }
125 return NULL;
126 }
127
oscl_strchr(char * str,int32 c)128 OSCL_EXPORT_REF char* oscl_strchr(char *str, int32 c)
129 {
130 return (char*)oscl_strchr((const char*)str, c);
131 }
132
oscl_strchr(const oscl_wchar * str,int32 c)133 OSCL_EXPORT_REF const oscl_wchar* oscl_strchr(const oscl_wchar *str, int32 c)
134 {
135 if (str)
136 {
137 while (*str != '\0')
138 {
139 if (*str == (oscl_wchar)c)
140 return str;
141 str++;
142 }
143 if (*str == (oscl_wchar)c)
144 return str;
145 }
146 return NULL;
147 }
148
oscl_strchr(oscl_wchar * str,int32 c)149 OSCL_EXPORT_REF oscl_wchar* oscl_strchr(oscl_wchar *str, int32 c)
150 {
151 return (oscl_wchar*)oscl_strchr((const oscl_wchar*)str, c);
152 }
153
oscl_strrchr(const char * str,int32 c)154 OSCL_EXPORT_REF const char* oscl_strrchr(const char *str, int32 c)
155 {
156 if (!str)
157 return NULL;
158
159 const char*start = str;
160
161 while (*str != '\0')
162 str++;
163
164 while (str >= start)
165 {
166 if (*str == (char)c)
167 return str;
168 if (str == start)
169 return NULL;
170 str--;
171 }
172 return NULL;
173 }
174
oscl_strrchr(char * str,int32 c)175 OSCL_EXPORT_REF char* oscl_strrchr(char *str, int32 c)
176 {
177 return (char*)oscl_strrchr((const char*)str, c);
178 }
179
oscl_strrchr(const oscl_wchar * str,int32 c)180 OSCL_EXPORT_REF const oscl_wchar* oscl_strrchr(const oscl_wchar *str, int32 c)
181 {
182 if (!str)
183 return NULL;
184
185 const oscl_wchar*start = str;
186
187 while (*str != '\0')
188 str++;
189
190 while (str >= start)
191 {
192 if (*str == (oscl_wchar)c)
193 return str;
194 if (str == start)
195 return NULL;
196 str--;
197 }
198 return NULL;
199 }
200
oscl_strrchr(oscl_wchar * str,int32 c)201 OSCL_EXPORT_REF oscl_wchar* oscl_strrchr(oscl_wchar *str, int32 c)
202 {
203 return (oscl_wchar*)oscl_strrchr((const oscl_wchar*)str, c);
204 }
205
oscl_strset(char * dest,char val,uint32 count)206 OSCL_EXPORT_REF char* oscl_strset(char* dest, char val, uint32 count)
207 {
208 for (uint32 ii = 0; ii < count; ii++)
209 {
210 *dest++ = val;
211 }
212 return dest;
213 }
214
oscl_strset(oscl_wchar * dest,oscl_wchar val,uint32 count)215 OSCL_EXPORT_REF oscl_wchar* oscl_strset(oscl_wchar* dest, oscl_wchar val, uint32 count)
216 {
217 for (uint32 ii = 0; ii < count; ii++)
218 {
219 *dest++ = val;
220 }
221 return dest;
222 }
223
oscl_isLetter(const char c)224 OSCL_EXPORT_REF bool oscl_isLetter(const char c)
225 {
226 return ((c >= 65 && c <= 90) || (c >= 97 && c <= 122));
227 }
228
oscl_CIstrcmp(const char * str1,const char * str2)229 OSCL_EXPORT_REF int32 oscl_CIstrcmp(const char *str1, const char *str2)
230 {
231
232 while ((*str1 != '\0') && (oscl_tolower(*str1) == oscl_tolower(*str2)))
233 {
234 str1++;
235 str2++;
236 }
237 return (oscl_tolower(*str1) - oscl_tolower(*str2));
238 }
239
oscl_CIstrcmp(const oscl_wchar * str1,const oscl_wchar * str2)240 OSCL_EXPORT_REF int32 oscl_CIstrcmp(const oscl_wchar *str1, const oscl_wchar *str2)
241 {
242 while ((*str1 != '\0') && (oscl_tolower(*str1) == oscl_tolower(*str2)))
243 {
244 str1++;
245 str2++;
246 }
247 return (oscl_tolower(*str1) - oscl_tolower(*str2));
248
249 }
250
oscl_CIstrncmp(const char * str1,const char * str2,uint32 count)251 OSCL_EXPORT_REF int32 oscl_CIstrncmp(const char *str1, const char *str2, uint32 count)
252 {
253 for (uint32 i = 0; i < count; i++)
254 {
255 if ((*str1 == '\0') || (oscl_tolower(*str1) != oscl_tolower(*str2)))
256 return (oscl_tolower(*str1) - oscl_tolower(*str2));
257 str1++;
258 str2++;
259 }
260 return 0;
261 }
262
oscl_CIstrncmp(const oscl_wchar * str1,const oscl_wchar * str2,uint32 count)263 OSCL_EXPORT_REF int32 oscl_CIstrncmp(const oscl_wchar *str1, const oscl_wchar *str2, uint32 count)
264 {
265 for (uint32 i = 0; i < count; i++)
266 {
267 if ((*str1 == '\0') || (oscl_tolower(*str1) != oscl_tolower(*str2)))
268 return (oscl_tolower(*str1) - oscl_tolower(*str2));
269 str1++;
270 str2++;
271 }
272 return 0;
273 }
274
oscl_tolower(const char car)275 OSCL_EXPORT_REF char oscl_tolower(const char car)
276 {
277 return tolower(car);
278 }
279
oscl_tolower(const oscl_wchar car)280 OSCL_EXPORT_REF oscl_wchar oscl_tolower(const oscl_wchar car)
281 {
282 if (car >= 65 && car <= 90)
283 return (OSCL_STATIC_CAST(oscl_wchar, (car + OSCL_ASCII_CASE_MAGIC_BIT)));
284 else
285 return car;
286 }
287
oscl_strstr(const char * str1,const char * str2)288 OSCL_EXPORT_REF const char* oscl_strstr(const char* str1, const char* str2)
289 {
290 return (const char*)strstr(str1, str2);
291 }
292
oscl_strstr(char * str1,const char * str2)293 OSCL_EXPORT_REF char* oscl_strstr(char* str1, const char* str2)
294 {
295 return (char*)strstr(str1, str2);
296 }
297
oscl_strstr(const oscl_wchar * str1,const oscl_wchar * str2)298 OSCL_EXPORT_REF const oscl_wchar* oscl_strstr(const oscl_wchar* str1, const oscl_wchar* str2)
299 {
300 uint32 size = oscl_strlen(str1);
301 uint32 size2 = oscl_strlen(str2);
302 const oscl_wchar* p = (oscl_wchar*) str1;
303 while ((*p != '\0') && (size >= size2))
304 {
305 if (!oscl_strncmp(p, str2, size2))
306 return p;
307 else
308 {
309 p += 1;
310 size -= 1;
311 }
312 }
313 return 0;
314 }
315
oscl_strstr(oscl_wchar * str1,const oscl_wchar * str2)316 OSCL_EXPORT_REF oscl_wchar* oscl_strstr(oscl_wchar* str1, const oscl_wchar* str2)
317 {
318 uint32 size = oscl_strlen(str1);
319 uint32 size2 = oscl_strlen(str2);
320 oscl_wchar* p = (oscl_wchar*) str1;
321 while ((*p != '\0') && (size >= size2))
322 {
323 if (!oscl_strncmp(p, str2, size2))
324 return p;
325 else
326 {
327 p += 1;
328 size -= 1;
329 }
330 }
331 return 0;
332 }
333
oscl_strcat(char * dest,const char * src)334 OSCL_EXPORT_REF char* oscl_strcat(char* dest, const char* src)
335 {
336 return strcat(dest, src);
337 }
338
oscl_strcat(oscl_wchar * dest,const oscl_wchar * src)339 OSCL_EXPORT_REF oscl_wchar* oscl_strcat(oscl_wchar* dest, const oscl_wchar* src)
340 {
341 oscl_wchar* tmp = dest + oscl_strlen(dest);
342 for (uint32 i = 0; *src != '\0'; i++)
343 {
344 *tmp++ = *src++;
345 }
346 *tmp = '\0';
347 return dest;
348 }
349