extensions.c
Raw
1#include <cutils/extensions.h>
2
3int cutil_strcasecmp(const char* s1, const char* s2)
4{
5 const unsigned char* p1 = (const unsigned char*)s1;
6 const unsigned char* p2 = (const unsigned char*)s2;
7 unsigned char c1, c2;
8
9 do
10 {
11 c1 = (unsigned char)tolower(*p1++);
12 c2 = (unsigned char)tolower(*p2++);
13 if (c1 == '\0')
14 return c1 - c2;
15 }
16 while (c1 == c2);
17
18 return c1 - c2;
19}
20
21int cutil_strncasecmp(const char* s1, const char* s2, size_t n)
22{
23 const unsigned char* p1 = (const unsigned char*)s1;
24 const unsigned char* p2 = (const unsigned char*)s2;
25 unsigned char c1, c2;
26
27 if(n == 0)
28 return 0;
29
30 do
31 {
32 c1 = (unsigned char)tolower(*p1++);
33 c2 = (unsigned char)tolower(*p2++);
34 if (c1 == '\0')
35 return c1 - c2;
36 }
37 while (c1 == c2 && --n);
38
39 return c1 - c2;
40}
41
42size_t cutil_strnlen(const char* s, size_t maxlen)
43{
44 size_t len;
45
46 for(len = 0; len < maxlen; len++, s++)
47 {
48 if (!*s)
49 break;
50 }
51 return (len);
52}
53
54char* cutil_strndup(const char* s, size_t n)
55{
56 char* ret;
57 size_t len = cutil_strnlen(s, n);
58
59 len = CUTIL_MIN(len, n);
60
61 ret = malloc(len+1);
62 if(!ret)
63 return NULL;
64 memcpy(ret, s, len+1);
65
66 return ret;
67}
68
69bool cutil_memmem(const void* haystack, size_t haystacklen, const void* needle, size_t needlelen, size_t* pos)
70{
71 size_t i, j;
72 const byte* haystackb = haystack;
73 const byte* needleb = needle;
74
75 if(needlelen == 0)
76 return true;
77
78 if(HEDLEY_UNLIKELY((haystacklen == 0 && needlelen != 0 )|| haystacklen < needlelen))
79 return false;
80 //TODO: use memchr as base search
81 for(i = 0; i < haystacklen; i++)
82 {
83 for(j = 0, *pos = i; j < needlelen && i < haystacklen; j++, i++)
84 {
85 if(haystackb[i] != needleb[j])
86 break;
87 else if(j == needlelen-1)
88 return true;
89 }
90 }
91
92 return false;
93}
94
95#if __STDC_VERSION__ >= 199901L
96int cutil_asprintf(char** strp, const char* format, ...)
97{
98 va_list ap;
99 size_t needed;
100 int ret;
101
102 va_start(ap, format);
103 needed = (size_t)vsnprintf(NULL, 0, format, ap);
104 va_end(ap);
105
106 *strp = malloc(needed);
107
108 if(!*strp)
109 return -1;
110
111 va_start(ap, format);
112 ret = snprintf(*strp, needed, format, ap);
113 va_end(ap);
114
115 return ret;
116}
117#endif
118