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 = MIN(len, n);
60
61 ret = malloc(len+1);
62 memcpy(ret, s, len+1);
63
64 return ret;
65}
66
67bool cutil_memmem(const void* haystack, size_t haystacklen, const void* needle, size_t needlelen, size_t* pos)
68{
69 size_t i, j;
70 const byte* haystackb = haystack;
71 const byte* needleb = needle;
72
73
74 if(HEDLEY_UNLIKELY(haystacklen == 0 || needlelen == 0 || haystacklen < needlelen))
75 return false;
76 //TODO: use memchr as base search
77 for(i = 0; i < haystacklen; i++)
78 {
79 for(j = 0, *pos = i; j < needlelen && i < haystacklen; j++, i++)
80 {
81 if(haystackb[i] != needleb[j])
82 break;
83 else if(j == needlelen-1)
84 return true;
85 }
86 }
87
88 return false;
89}
90
91#if __STDC_VERSION__ >= 199901L
92int cutil_asprintf(char** strp, const char* format, ...)
93{
94 va_list ap;
95 size_t needed;
96 int ret;
97
98 va_start(ap, format);
99 needed = (size_t)vsnprintf(NULL, 0, format, ap);
100 va_end(ap);
101
102 *strp = malloc(needed);
103
104 if(!*strp)
105 return -1;
106
107 va_start(ap, format);
108 ret = snprintf(*strp, needed, format, ap);
109 va_end(ap);
110
111 return ret;
112}
113#endif
114