• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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