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
78#if __STDC_VERSION__ >= 199901L
79int cutil_asprintf(char** strp, const char* format, ...)
80{
81 va_list ap;
82 size_t needed;
83 int ret;
84
85 va_start(ap, format);
86 needed = (size_t)vsnprintf(NULL, 0, format, ap);
87 va_end(ap);
88
89 *strp = malloc(needed);
90
91 va_start(ap, format);
92 ret = snprintf(*strp, needed, format, ap);
93 va_end(ap);
94
95 return ret;
96}
97#endif
98