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 newoffset, offset = 0, i, j;
72 const byte* haystackb = haystack;
73 const byte* needleb = needle;
74 byte* start;
75 bool newoffset_set = false;
76
77 if(needlelen == 0)
78 {
79 *pos = 0;
80 return true;
81 }
82
83 if(HEDLEY_UNLIKELY((haystacklen == 0 && needlelen > 0 )|| haystacklen < needlelen))
84 return false;
85
86 CUTIL_LOOP
87 {
88 start = memchr(haystackb+offset, needleb[0], haystacklen-offset);
89 if(!start)
90 {
91 return false;
92 } else if(needlelen == 1) {
93 *pos = (size_t)(start-haystackb);
94 return true;
95 }
96
97 for(i = (size_t)(start-haystackb+1), j = 1; i < haystacklen && j < needlelen; i++, j++)
98 {
99 if(!newoffset_set && haystackb[i] == needleb[0])
100 {
101 newoffset = i;
102 newoffset_set = true;
103 }
104
105 if(haystackb[i] != needleb[j])
106 {
107 break;
108 } else if(j == needlelen-1) {
109 *pos = (size_t)(start-haystackb);
110 return true;
111 }
112 }
113
114 if(newoffset_set)
115 {
116 offset = newoffset;
117 newoffset_set = false;
118 } else {
119 offset = i;
120 }
121 }
122
123
124 return false;
125}
126
127#if __STDC_VERSION__ >= 199901L
128int cutil_asprintf(char** strp, const char* format, ...)
129{
130 va_list ap;
131 size_t needed;
132 int ret;
133
134 va_start(ap, format);
135 needed = (size_t)vsnprintf(NULL, 0, format, ap);
136 va_end(ap);
137
138 *strp = malloc(needed);
139
140 if(!*strp)
141 return -1;
142
143 va_start(ap, format);
144 ret = snprintf(*strp, needed, format, ap);
145 va_end(ap);
146
147 return ret;
148}
149#endif
150