added case insensitive strcmp and extra memswap implementation + tests

AuthorKonata <konata@posteo.jp>
Date
Commitf9407df0201ad4394d75a2cee05d7b9097a434d0
Parente8864d4
3 files changed, 74 insertions(+), 9 deletions(-)
▾Minclude/cutils/misc.h
@@ -17,6 +17,7 @@
#include <string.h>
#include <stdlib.h>
#include <cutils/common.h>
#include <ctype.h>
#if __STDC_VERSION__ >= 199901L
#include <stdint.h>
@@ -24,6 +25,15 @@
#ifdef UINT32_MAX
uint32_t ntoh32(uint32_t const net);
#endif
HEDLEY_INLINE
static void memqswap_stack(void* item1, void* item2, size_t length)
{
unsigned char tmp[length];
memcpy(tmp, item1, length);
memcpy(item1, item2, length);
memcpy(item2, tmp, length);
free(tmp);
}
#else
typedef unsigned long max_uint_t;
#endif
@@ -31,8 +41,8 @@
HEDLEY_INLINE
static void memswap(void* item1, void* item2, size_t length)
{
char *item1_tmp, *item2_tmp;
char tmp;
unsigned char *item1_tmp, *item2_tmp;
unsigned char tmp;
item1_tmp = item1;
item2_tmp = item2;
@@ -46,16 +56,11 @@ static void memswap(void* item1, void* item2, size_t length)
}
HEDLEY_INLINE
static bool memqswap(void* item1, void* item2, size_t length)
static void memqswap(void* item1, void* item2, void* tmp, size_t length)
{
void* tmp = malloc(length);
if(!tmp)
return false;
memcpy(tmp, item1, length);
memcpy(item1, item2, length);
memcpy(item2, tmp, length);
free(tmp);
return true;
}
#if __STDC_VERSION__ >= 201112L
@@ -63,6 +68,8 @@ static bool memqswap(void* item1, void* item2, size_t length)
#endif
void sleep_ms(unsigned int milliseconds);
int strcmp_nocase(const char* s1, const char* s2);
int strncmp_nocase(const char* s1, const char* s2, size_t n);
#if __STDC_VERSION__ >= 201112L
struct timespec timespec_diff(const struct timespec* old_ts, const struct timespec* new_ts);
▾Msrc/misc.c
@@ -10,6 +10,45 @@ void sleep_ms(unsigned int milliseconds)
#endif
}
int strcmp_nocase(const char* s1, const char* s2)
{
const unsigned char* p1 = (const unsigned char*)s1;
const unsigned char* p2 = (const unsigned char*)s2;
unsigned char c1, c2;
do
{
c1 = (unsigned char)tolower(*p1++);
c2 = (unsigned char)tolower(*p2++);
if (c1 == '\0')
return c1 - c2;
}
while (c1 == c2);
return c1 - c2;
}
int strncmp_nocase(const char* s1, const char* s2, size_t n)
{
const unsigned char* p1 = (const unsigned char*)s1;
const unsigned char* p2 = (const unsigned char*)s2;
unsigned char c1, c2;
if(n == 0)
return 0;
do
{
c1 = (unsigned char)tolower(*p1++);
c2 = (unsigned char)tolower(*p2++);
if (c1 == '\0')
return c1 - c2;
}
while (c1 == c2 && --n);
return c1 - c2;
}
#if __STDC_VERSION__ >= 199901L
#ifdef UINT32_MAX
uint32_t ntoh32(uint32_t const net)
▾Msrc/test.c
@@ -246,15 +246,28 @@ static void test_ll(void)
delete_ll(ll, NULL);
}
}
int main(int argc, char** argv)
{
/* memswap tests */
int a = 5;
int b = 2;
void* tmp = malloc(sizeof(int));
memswap(&a, &b, sizeof(int));
assert(a == 2 && b == 5);
#if __STDC_VERSION__ >= 199901L
memqswap_stack(&a, &b, sizeof(int));
assert(a == 5 && b == 2);
memqswap(&a, &b, tmp, sizeof(int));
assert(a == 2 && b == 5);
#else
memqswap(&a, &b, tmp, sizeof(int));
assert(a == 5 && b == 2);
#endif
free(tmp);
/* memswap tests */
test_vector();
test_string();
@@ -264,6 +277,12 @@ int main(int argc, char** argv)
#endif
test_ll();
/* misc tests */
sleep_ms(1000);
assert(strcmp_nocase("ASD", "aSd") == 0);
assert(strcmp_nocase("BSD", "asd") > 0);
assert(strcmp_nocase("ASD", "bsd") < 0);
assert(strncmp_nocase("ASDn", "asd", 3) == 0);
assert(strncmp_nocase("ASDn", "asd", 4) >0);
return 0;
}