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 22 OSCL_EXPORT_REF uint32 oscl_strlen(const char* str) 23 { 24 return (uint32)strlen(str); 25 } 26 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 38 OSCL_EXPORT_REF char* oscl_strncpy(char* dest, const char* src, uint32 count) 39 { 40 return strncpy(dest, src, count); 41 } 42 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 59 OSCL_EXPORT_REF int32 oscl_strcmp(const char* str1, const char* str2) 60 { 61 return (int32)strcmp(str1, str2); 62 } 63 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 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 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 96 OSCL_EXPORT_REF char* oscl_strncat(char* dest, const char* src, uint32 count) 97 { 98 return strncat(dest, src, count); 99 } 100 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 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 128 OSCL_EXPORT_REF char* oscl_strchr(char *str, int32 c) 129 { 130 return (char*)oscl_strchr((const char*)str, c); 131 } 132 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 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 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 175 OSCL_EXPORT_REF char* oscl_strrchr(char *str, int32 c) 176 { 177 return (char*)oscl_strrchr((const char*)str, c); 178 } 179 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 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 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 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 224 OSCL_EXPORT_REF bool oscl_isLetter(const char c) 225 { 226 return ((c >= 65 && c <= 90) || (c >= 97 && c <= 122)); 227 } 228 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 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 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 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 275 OSCL_EXPORT_REF char oscl_tolower(const char car) 276 { 277 return tolower(car); 278 } 279 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 288 OSCL_EXPORT_REF const char* oscl_strstr(const char* str1, const char* str2) 289 { 290 return (const char*)strstr(str1, str2); 291 } 292 293 OSCL_EXPORT_REF char* oscl_strstr(char* str1, const char* str2) 294 { 295 return (char*)strstr(str1, str2); 296 } 297 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 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 334 OSCL_EXPORT_REF char* oscl_strcat(char* dest, const char* src) 335 { 336 return strcat(dest, src); 337 } 338 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