freeswitch/libs/sipcc/cpr/android/cpr_android_string.c

174 lines
4.1 KiB
C
Raw Normal View History

2012-12-18 01:14:30 +00:00
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "cpr_types.h"
#include "cpr_stdlib.h"
#include "cpr_string.h"
#include "cpr_strings.h"
/**
* cpr_strdup
*
* @brief The CPR wrapper for strdup
* The cpr_strdup shall return a pointer to a new string, which is a duplicate
* of the string pointed to by "str" argument. A null pointer is returned if the
* new string cannot be created.
*
* @param[in] str - The string that needs to be duplicated
*
* @return The duplicated string or NULL in case of no memory
*
*/
char *
cpr_strdup (const char *str)
{
char *dup;
size_t len;
if (!str) {
return (char *) NULL;
}
len = strlen(str);
if (len == 0) {
return (char *) NULL;
}
len++;
dup = cpr_malloc(len * sizeof(char));
if (!dup) {
return (char *) NULL;
}
(void) memcpy(dup, str, len);
return dup;
}
/**
* cpr_strcasecmp
*
* @brief The CPR wrapper for strcasecmp
*
* The cpr_strcasecmp performs case insensitive string comparison of the "s1"
* and the "s2" strings.
*
* @param[in] s1 - The first string
* @param[in] s2 - The second string
*
* @return integer <,=,> 0 depending on whether s1 is <,=,> s2
*/
#ifndef CPR_USE_OS_STRCASECMP
int
cpr_strcasecmp (const char *s1, const char *s2)
{
const unsigned char *us1 = (const unsigned char *) s1;
const unsigned char *us2 = (const unsigned char *) s2;
/* No match if only one ptr is NULL */
if ((!s1 && s2) || (s1 && !s2)) {
/*
* If one of these is NULL it will be the lesser of the two
* values and therefore we'll get the proper sign in the int
*/
return (int) (s1 - s2);
}
/* Match if both ptrs the same (e.g. NULL) */
if (s1 == s2)
return 0;
while (*us1 != '\0' && *us2 != '\0' && toupper(*us1) == toupper(*us2)) {
us1++;
us2++;
}
return (toupper(*us1) - toupper(*us2));
}
/**
* cpr_strncasecmp
*
* @brief The CPR wrapper for strncasecmp
*
* The cpr_strncasecmp performs case insensitive string comparison for specific
* length "len".
*
* @param[in] s1 - The first string
* @param[in] s2 - The second string
* @param[in] len - The length to be compared
*
* @return integer <,=,> 0 depending on whether s1 is <,=,> s2
*/
int
cpr_strncasecmp (const char *s1, const char *s2, size_t len)
{
const unsigned char *us1 = (const unsigned char *) s1;
const unsigned char *us2 = (const unsigned char *) s2;
/* No match if only one ptr is NULL */
if ((!s1 && s2) || (s1 && !s2))
return ((int) (s1 - s2));
if ((len == 0) || (s1 == s2))
return 0;
while (len-- > 0 && toupper(*us1) == toupper(*us2)) {
if (len == 0 || *us1 == '\0' || *us2 == '\0')
break;
us1++;
us2++;
}
return (toupper(*us1) - toupper(*us2));
}
#endif
/**
* strcasestr
*
* @brief The same as strstr, but ignores case
*
* The strcasestr performs the strstr function, but ignores the case.
* This function shall locate the first occurrence in the string
* pointed to by s1 of the sequence of bytes (excluding the terminating
* null byte) in the string pointed to by s2.
*
* @param[in] s1 - The input string
* @param[in] s2 - The pattern to be matched
*
* @return A pointer to the first occurrence of string s2 found
* in string s1 or NULL if not found. If s2 is an empty
* string then s1 is returned.
*/
char *
strcasestr (const char *s1, const char *s2)
{
unsigned int i;
if (!s1)
return (char *) NULL;
if (!s2 || (s1 == s2) || (*s2 == '\0'))
return (char *) s1;
while (*s1) {
i = 0;
do {
if (s2[i] == '\0')
return (char *) s1;
if (s1[i] == '\0')
return (char *) NULL;
if (toupper(s1[i]) != toupper(s2[i]))
break;
i++;
} while (1);
s1++;
}
return (char *) NULL;
}