changed naming form extension functions, added strnlen, str[n]dup and asprintf, added bitfuncs.h, changed find functions, added typedefs in misc.h

AuthorKonata <konata@posteo.jp>
Date
Commit03135e880923b24e4f513459cf330fe224972aea
Parent2558d6d
17 files changed, 203 insertions(+), 68 deletions(-)
Minclude/cutils/backport.h
@@ -1,5 +1,5 @@
1-#ifndef BACKPORT_H
2-#define BACKPORT_H
1+#ifndef CUTILS_BACKPORT_H
2+#define CUTILS_BACKPORT_H
33
44 #include <limits.h>
55 #if __STDC_VERSION__ >= 199901L
@@ -116,4 +116,4 @@
116116 #endif
117117
118118
119-#endif /* BACKPORT_H */
119+#endif /* CUTILS_BACKPORT_H */
Ainclude/cutils/bitfuncs.h
@@ -0,0 +1,17 @@
1+#ifndef CUTILS_BITFUNCS_H
2+#define CUTILS_BITFUNCS_H
3+
4+#include <stdlib.h>
5+#include <cutils/common.h>
6+
7+#define numbits(type) (sizeof(type)*CHAR_BIT)
8+
9+#define bitstring(type, value) _bitstring(numbits(type), (type)(value))
10+/* FIXME: fix out of range calls (bitstring(unsigned char, 256)) */
11+char* _bitstring(size_t size, uintmax_t value);
12+
13+#define getbit(type, value, bit) (((value) & (((type)1 << (bit)))) >> (bit))
14+#define setbit(type, value, bit) ((value) |= ((type)1 << (bit)))
15+#define clearbit(type, value, bit) ((value) &= (type)~((type)1 << (bit)))
16+
17+#endif /* CUTILS_BITFUNCS_H */
Minclude/cutils/byte_array.h
@@ -1,5 +1,5 @@
1-#ifndef BYTE_ARRAY_H
2-#define BYTE_ARRAY_H
1+#ifndef CUTILS_BYTE_ARRAY_H
2+#define CUTILS_BYTE_ARRAY_H
33 #include <stdlib.h>
44 #include <string.h>
55 #include <errno.h>
@@ -9,7 +9,7 @@
99
1010 typedef struct Bytearray
1111 {
12- char* items;
12+ byte* items;
1313 size_t capacity;
1414 size_t length;
1515 size_t element_size;
@@ -34,5 +34,5 @@ HEDLEY_NON_NULL(3)
3434 size_t* bytearray_find(const Bytearray* haystack, const void* needle, int (*cmp)(const void*, const void*));
3535
3636
37-#endif /* BYTE_ARRAY_H */
37+#endif /* CUTILS_BYTE_ARRAY_H */
3838
Minclude/cutils/common.h
@@ -4,5 +4,6 @@
44 #include <cutils/backport.h>
55 #include <cutils/hedley.h>
66 #include <cutils/extensions.h>
7+#include <cutils/misc.h>
78
89 #endif /* CUTILS_COMMON_H */
Minclude/cutils/cutils.h
@@ -1,5 +1,5 @@
1-#ifndef CUTILS_H
2-#define CUTILS_H
1+#ifndef CUTILS_CUTILS_H
2+#define CUTILS_CUTILS_H
33
44 #include <cutils/vector.h>
55 #include <cutils/dyn_string.h>
@@ -8,5 +8,6 @@
88 #include <cutils/linked-list.h>
99 #include <cutils/extensions.h>
1010 #include <cutils/backport.h>
11+#include <cutils/bitfuncs.h>
1112
12-#endif /* CUTILS_H */
13+#endif /* CUTILS_CUTILS_H */
Minclude/cutils/dyn_string.h
@@ -1,5 +1,5 @@
1-#ifndef DYN_STRING_H
2-#define DYN_STRING_H
1+#ifndef CUTILS_DYN_STRING_H
2+#define CUTILS_DYN_STRING_H
33
44 #define STRING_DEFAULT_SIZE 8
55
@@ -31,8 +31,8 @@ void string_remove_range(String* string, size_t index, size_t length);
3131 bool string_adjust_size(String* string, size_t size);
3232 /* TODO: rework find functions to take extra argument of result count
3333 * and then find that many and return them in a vector/linked list */
34-size_t* string_find_char(const String* haystack, const char needle);
35-size_t* string_find_str(const String* haystack, const String* needle);
34+bool string_find_char(const String* haystack, const char needle, size_t* pos);
35+bool string_find_str(const String* haystack, const String* needle, size_t* pos);
3636
3737 bool string_concat(String* string, const String* other);
3838
@@ -42,4 +42,4 @@ char* to_cstring(const String* string);
4242 char* to_cstring_del(String* string);
4343
4444
45-#endif /* DYN_STRING_H */
45+#endif /* CUTILS_DYN_STRING_H */
Minclude/cutils/extensions.h
@@ -1,5 +1,5 @@
1-#ifndef EXTENSIONS_H
2-#define EXTENSIONS_H
1+#ifndef CUTILS_EXTENSIONS_H
2+#define CUTILS_EXTENSIONS_H
33
44 #include <cutils/hedley.h>
55 #include <errno.h>
@@ -7,12 +7,23 @@
77 #include <cutils/backport.h>
88 #include <string.h>
99 #include <ctype.h>
10+#include <stdarg.h>
11+#include <stdio.h>
1012
11-int strcmp_nocase(const char* s1, const char* s2);
12-int strncmp_nocase(const char* s1, const char* s2, size_t n);
13+int cutil_strcasecmp(const char* s1, const char* s2);
14+int cutil_strncasecmp(const char* s1, const char* s2, size_t n);
15+
16+size_t cutil_strnlen(const char *s, size_t maxlen);
17+
18+char* cutil_strdup(const char *s);
19+char* cutil_strndup(const char *s, size_t n);
20+
21+#if __STDC_VERSION__ >= 199901L
22+int cutil_asprintf(char** strp, const char* format, ...);
23+#endif
1324
1425 HEDLEY_INLINE
15-static void* reallocsafe(void *ptr, size_t nmemb, size_t size)
26+static void* cutil_reallocarray(void *ptr, size_t nmemb, size_t size)
1627 {
1728 size_t new_size = nmemb * size;
1829
@@ -26,17 +37,17 @@ static void* reallocsafe(void *ptr, size_t nmemb, size_t size)
2637 }
2738
2839 HEDLEY_INLINE
29-static void* reallocsafe_inc(void *ptr, size_t nmemb, size_t size, size_t add)
40+static void* cutil_reallocarray_inc(void *ptr, size_t nmemb, size_t size, size_t add)
3041 {
3142 if(SIZE_MAX - add < size)
3243 {
3344 errno = ENOMEM;
3445 return NULL;
3546 } else {
36- return reallocsafe(ptr, nmemb, size+add);
47+ return cutil_reallocarray(ptr, nmemb, size+add);
3748 }
3849 }
3950
4051
4152
42-#endif /* EXTENSIONS_H */
53+#endif /* CUTILS_EXTENSIONS_H */
Minclude/cutils/linked-list.h
@@ -1,5 +1,5 @@
1-#ifndef LINKED_LIST_H
2-#define LINKED_LIST_H
1+#ifndef CUTILS_LINKED_LIST_H
2+#define CUTILS_LINKED_LIST_H
33
44 #include <cutils/common.h>
55 #include <stdlib.h>
@@ -84,4 +84,4 @@ static void ll_swap(LinkedList* ll, size_t item1, size_t item2)
8484 }
8585
8686
87-#endif /* LINKED_LIST_H */
87+#endif /* CUTILS_LINKED_LIST_H */
Minclude/cutils/misc.h
@@ -1,5 +1,5 @@
1-#ifndef MISC_H
2-#define MISC_H
1+#ifndef CUTILS_MISC_H
2+#define CUTILS_MISC_H
33
44 #ifdef __unix__
55 #ifndef _BSD_SOURCE
@@ -19,6 +19,16 @@
1919 #include <cutils/common.h>
2020 #include <ctype.h>
2121
22+typedef unsigned char byte;
23+
24+#ifndef CUTILS_NO_SHORTHANDLES
25+typedef unsigned char uchar;
26+typedef unsigned short ushort;
27+typedef unsigned int uint;
28+typedef unsigned long ulong;
29+typedef unsigned long long ullong;
30+#endif /* CUTILS_NO_SHORTHANDLES */
31+
2232 #if __STDC_VERSION__ >= 199901L
2333 #ifdef UINT32_MAX
2434 uint32_t ntoh32(uint32_t const net);
@@ -26,7 +36,7 @@
2636 HEDLEY_INLINE
2737 static void memqswap_stack(void* item1, void* item2, size_t length)
2838 {
29- unsigned char tmp[length];
39+ byte tmp[length];
3040 memcpy(tmp, item1, length);
3141 memcpy(item1, item2, length);
3242 memcpy(item2, tmp, length);
@@ -36,8 +46,8 @@
3646 HEDLEY_INLINE
3747 static void memswap(void* item1, void* item2, size_t length)
3848 {
39- unsigned char *item1_tmp, *item2_tmp;
40- unsigned char tmp;
49+ byte *item1_tmp, *item2_tmp;
50+ byte tmp;
4151
4252 item1_tmp = item1;
4353 item2_tmp = item2;
@@ -70,4 +80,4 @@ void sleep_ms(unsigned int milliseconds);
7080 uintmax_t timespec_ms(const struct timespec* ts);
7181 #endif
7282
73-#endif /* MISC_H */
83+#endif /* CUTILS_MISC_H */
Minclude/cutils/vector.h
@@ -1,5 +1,5 @@
1-#ifndef VECTOR_H
2-#define VECTOR_H
1+#ifndef CUTILS_VECTOR_H
2+#define CUTILS_VECTOR_H
33
44 #define VECTOR_DEFAULT_SIZE 4
55
@@ -34,4 +34,4 @@ HEDLEY_NON_NULL(3)
3434 size_t* vector_find(const Vector* haystack, const void* needle, int (*cmp)(const void*, const void*));
3535
3636
37-#endif /* VECTOR_H */
37+#endif /* CUTILS_VECTOR_H */
Asrc/bitfuncs.c
@@ -0,0 +1,22 @@
1+#include <cutils/bitfuncs.h>
2+
3+char* _bitstring(size_t size, uintmax_t value)
4+{
5+ char* ret = NULL;
6+ size_t i, pos;
7+
8+ bool leading_zero = true;
9+ for(i = 1, pos = 0; i <= size; i++)
10+ {
11+ byte tmp = (byte)((value & ((uintmax_t)1 << (size-i))) >> (size-i));
12+ if(tmp && leading_zero)
13+ {
14+ leading_zero = false;
15+ ret = malloc(size-i);
16+ ret[size-i-1] = '\0';
17+ }
18+ if(!leading_zero)
19+ ret[pos++] = tmp ? '1' : '0';
20+ }
21+ return ret;
22+}
Msrc/byte_array.c
@@ -95,8 +95,8 @@ bool bytearray_adjust_size(Bytearray* bytearray, size_t size)
9595 {
9696 while(bytearray->capacity < size)
9797 {
98- char* tmp = bytearray->items;
99- bytearray->items = reallocsafe_inc(bytearray->items, sizeof(*bytearray->items), bytearray->capacity, bytearray->capacity);
98+ byte* tmp = bytearray->items;
99+ bytearray->items = cutil_reallocarray_inc(bytearray->items, bytearray->capacity, bytearray->element_size, bytearray->capacity);
100100 if(!bytearray->items)
101101 {
102102 bytearray->items = tmp;
@@ -111,8 +111,8 @@ bool bytearray_shrink(Bytearray* bytearray)
111111 {
112112 while(bytearray->capacity > bytearray->length*2)
113113 {
114- char* tmp = bytearray->items;
115- bytearray->items = realloc(bytearray->items, (bytearray->capacity*bytearray->element_size)/2);
114+ byte* tmp = bytearray->items;
115+ bytearray->items = cutil_reallocarray(bytearray->items, bytearray->capacity/2, bytearray->element_size);
116116 if(!bytearray->items)
117117 {
118118 bytearray->items = tmp;
Msrc/dyn_string.c
@@ -75,41 +75,39 @@ bool string_concat(String* string, const String* other)
7575 return true;
7676 }
7777
78-size_t* string_find_char(const String* haystack, const char needle)
78+bool string_find_char(const String* haystack, const char needle, size_t* pos)
7979 {
80- size_t i, *ret;
80+ size_t i;
8181
8282 for(i = 0; i < haystack->length; i++)
8383 {
8484 if(haystack->chars[i] == needle)
8585 {
86- ret = malloc(sizeof(*ret));
87- *ret = i;
88- return ret;
86+ *pos = i;
87+ return true;
8988 }
9089 }
91- return NULL;
90+ return false;
9291 }
9392
94-size_t* string_find_str(const String* haystack, const String* needle)
93+bool string_find_str(const String* haystack, const String* needle, size_t* pos)
9594 {
96- size_t *ret, i, j, tmp;
95+ size_t i, j, tmp;
9796
9897 for(i = 0; i < haystack->length; i++)
9998 {
100- for(j = 0, tmp = i; j < needle->length; j++, i++)
99+ for(j = 0, tmp = i; j < needle->length && i < haystack->length; j++, i++)
101100 {
102101 if(haystack->chars[i] != needle->chars[j])
103102 {
104103 break;
105104 } else if(j == needle->length-1){
106- ret = malloc(sizeof(*ret));
107- *ret = tmp;
108- return ret;
105+ *pos = tmp;
106+ return true;
109107 }
110108 }
111109 }
112- return NULL;
110+ return false;
113111 }
114112
115113 bool string_adjust_size(String* string, size_t size)
@@ -117,7 +115,7 @@ bool string_adjust_size(String* string, size_t size)
117115 while(string->capacity < size)
118116 {
119117 char* tmp = string->chars;
120- string->chars = reallocsafe_inc(string->chars, sizeof(*string->chars), string->capacity, string->capacity);
118+ string->chars = cutil_reallocarray_inc(string->chars, sizeof(*string->chars), string->capacity, string->capacity);
121119 if(!string->chars)
122120 {
123121 string->chars = tmp;
Msrc/extensions.c
@@ -1,6 +1,6 @@
11 #include <cutils/extensions.h>
22
3-int strcmp_nocase(const char* s1, const char* s2)
3+int cutil_strcasecmp(const char* s1, const char* s2)
44 {
55 const unsigned char* p1 = (const unsigned char*)s1;
66 const unsigned char* p2 = (const unsigned char*)s2;
@@ -18,7 +18,7 @@ int strcmp_nocase(const char* s1, const char* s2)
1818 return c1 - c2;
1919 }
2020
21-int strncmp_nocase(const char* s1, const char* s2, size_t n)
21+int cutil_strncasecmp(const char* s1, const char* s2, size_t n)
2222 {
2323 const unsigned char* p1 = (const unsigned char*)s1;
2424 const unsigned char* p2 = (const unsigned char*)s2;
@@ -38,3 +38,60 @@ int strncmp_nocase(const char* s1, const char* s2, size_t n)
3838
3939 return c1 - c2;
4040 }
41+
42+size_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+
54+char* 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+
65+char* 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
79+int 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
Msrc/meson.build
@@ -1,4 +1,4 @@
1-src = ['vector.c', 'dyn_string.c', 'misc.c', 'byte_array.c', 'linked-list.c', 'extensions.c']
1+src = ['vector.c', 'dyn_string.c', 'misc.c', 'byte_array.c', 'linked-list.c', 'extensions.c', 'bitfuncs.c']
22 srctest = src + ['test.c']
33
44 cutils_lib = library('cutils', src, include_directories : inc, install: true)
Msrc/test.c
@@ -70,7 +70,7 @@ static void test_string(void)
7070 String* string;
7171 String* string2;
7272 char* cstring;
73- size_t* tmp;
73+ size_t tmp;
7474
7575 string = new_string();
7676
@@ -107,9 +107,8 @@ static void test_string(void)
107107
108108 string = from_cstring("abcd");
109109 string2 = from_cstring("cd");
110- tmp = string_find_str(string, string2);
111- assert(*tmp == 2);
112- free(tmp);
110+ string_find_str(string, string2, &tmp);
111+ assert(tmp == 2);
113112
114113 delete_string(string2);
115114 delete_string(string);
@@ -127,7 +126,7 @@ static void test_bytearray(void)
127126 bytearray_push(bt, "d");
128127 bytearray_push(bt, "\0");
129128
130- assert(strcmp(bt->items, "abcd") == 0);
129+ assert(strcmp((char*)bt->items, "abcd") == 0);
131130
132131 tmpchar = bytearray_pop(bt, NULL);
133132 assert(*tmpchar == '\0');
@@ -248,6 +247,24 @@ static void test_ll(void)
248247 }
249248 }
250249
250+static void test_bitfuncs(void)
251+{
252+ byte tmp = 0;
253+
254+ setbit(byte, tmp, 0);
255+ assert(tmp == 1);
256+ setbit(byte, tmp, 1);
257+ assert(tmp == 3);
258+ setbit(byte, tmp, 2);
259+ assert(tmp == 7);
260+
261+ clearbit(byte, tmp, 2);
262+ assert(tmp == 3);
263+
264+ assert(getbit(byte, tmp, 0) == 1);
265+ assert(getbit(byte, tmp, 5) == 0);
266+}
267+
251268 int main(int argc, char** argv)
252269 {
253270 /* memswap tests */
@@ -276,13 +293,14 @@ int main(int argc, char** argv)
276293 test_timespec();
277294 #endif
278295 test_ll();
296+ test_bitfuncs();
279297
280298 /* misc tests */
281299 sleep_ms(1000);
282- assert(strcmp_nocase("ASD", "aSd") == 0);
283- assert(strcmp_nocase("BSD", "asd") > 0);
284- assert(strcmp_nocase("ASD", "bsd") < 0);
285- assert(strncmp_nocase("ASDn", "asd", 3) == 0);
286- assert(strncmp_nocase("ASDn", "asd", 4) >0);
300+ assert(cutil_strcasecmp("ASD", "aSd") == 0);
301+ assert(cutil_strcasecmp("BSD", "asd") > 0);
302+ assert(cutil_strcasecmp("ASD", "bsd") < 0);
303+ assert(cutil_strncasecmp("ASDn", "asd", 3) == 0);
304+ assert(cutil_strncasecmp("ASDn", "asd", 4) >0);
287305 return 0;
288306 }
Msrc/vector.c
@@ -90,7 +90,7 @@ bool vector_adjust_size(Vector* vector, size_t size)
9090 while(vector->capacity < size)
9191 {
9292 void** tmp = vector->items;
93- vector->items = reallocsafe_inc(vector->items, sizeof(*vector->items), vector->capacity, vector->capacity);
93+ vector->items = cutil_reallocarray_inc(vector->items, vector->capacity, sizeof(*vector->items), vector->capacity);
9494 if(!vector->items)
9595 {
9696 vector->items = tmp;
@@ -106,7 +106,7 @@ bool vector_shrink(Vector* vector)
106106 while(vector->capacity > (vector->length*2))
107107 {
108108 void** tmp = vector->items;
109- vector->items = realloc(vector->items, vector->capacity/2*sizeof(*vector->items));
109+ vector->items = cutil_reallocarray(vector->items, vector->capacity/2, sizeof(*vector->items));
110110 if(!vector->items)
111111 {
112112 vector->items = tmp;