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