Home | History | Annotate | Download | only in src
      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