added some macros to misc.h, added malloc check to cutil_asprintf(), optimized cutil_memmem(), changed cutil_strdup to a macro

AuthorKonata <konata@posteo.jp>
Date
Commit6a00763a77783ad7d9824b21838f5f227a3d799e
Parent1be90fe
4 files changed, 25 insertions(+), 27 deletions(-)
Minclude/cutils/byte_array.h
@@ -50,8 +50,8 @@ HEDLEY_NON_NULL(3)
5050 size_t* bytearray_find(const Bytearray* haystack, const void* needle, int (*cmp)(const void*, const void*));
5151
5252 #define new_bytearray(element_size) bytearray_with_capacity(BYTEARRAY_DEFAULT_SIZE, element_size)
53-#define bytearray_pop(bytearray, retptr) bytearray_pop_at(bytearray, ((Vector*)vector)->length-1, retptr)
54-#define bytearray_push(bytearray, item) bytearray_insert(bytearray, ((Vector*)vector)->length, item)
53+#define bytearray_pop(bytearray, retptr) bytearray_pop_at(bytearray, ((Bytearray*)bytearray)->length-1, retptr)
54+#define bytearray_push(bytearray, item) bytearray_insert(bytearray, ((Bytearray*)bytearray)->length, item)
5555
5656 #endif /* CUTILS_BYTE_ARRAY_H */
5757
Minclude/cutils/extensions.h
@@ -14,10 +14,10 @@
1414 int cutil_strcasecmp(const char* s1, const char* s2);
1515 int cutil_strncasecmp(const char* s1, const char* s2, size_t n);
1616
17-size_t cutil_strnlen(const char *s, size_t maxlen);
17+size_t cutil_strnlen(const char* s, size_t maxlen);
1818
19-char* cutil_strdup(const char *s);
20-char* cutil_strndup(const char *s, size_t n);
19+#define cutil_strdup(s) cutil_strndup(s, strlen((const char*)s))
20+char* cutil_strndup(const char* s, size_t n);
2121
2222 bool cutil_memmem(const void* haystack, size_t haystacklen, const void* needle, size_t needlelen, size_t* pos);
2323
Minclude/cutils/misc.h
@@ -29,6 +29,15 @@ typedef unsigned long ulong;
2929 typedef unsigned long long ullong;
3030 #endif /* CUTILS_NO_SHORTHANDLES */
3131
32+#ifndef CUTILS_NO_MACROS
33+#define MAX(x,y) ((x) > (y) ? (x) : (y))
34+#define MIN(x,y) ((x) < (y) ? (x) : (y))
35+#define LOOP while(1)
36+#define RANGE(i, start, end) \
37+for(((i) = (start)); ((start) < (end)) ? ((i) < (end)) : ((i) > (end)); ((start) < (end)) ? (i++) : (i--))
38+#endif /* CUTILS_NO_MACROS */
39+
40+
3241 #if __STDC_VERSION__ >= 199901L
3342 #ifdef UINT32_MAX
3443 uint32_t nethost32(uint32_t const net);
Msrc/extensions.c
@@ -39,7 +39,7 @@ int cutil_strncasecmp(const char* s1, const char* s2, size_t n)
3939 return c1 - c2;
4040 }
4141
42-size_t cutil_strnlen(const char *s, size_t maxlen)
42+size_t cutil_strnlen(const char* s, size_t maxlen)
4343 {
4444 size_t len;
4545
@@ -51,23 +51,12 @@ size_t cutil_strnlen(const char *s, size_t maxlen)
5151 return (len);
5252 }
5353
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)
54+char* cutil_strndup(const char* s, size_t n)
6655 {
6756 char* ret;
6857 size_t len = cutil_strnlen(s, n);
6958
70- len = len <= n ? len : n;
59+ len = MIN(len, n);
7160
7261 ret = malloc(len+1);
7362 memcpy(ret, s, len+1);
@@ -77,25 +66,22 @@ char* cutil_strndup(const char *s, size_t n)
7766
7867 bool cutil_memmem(const void* haystack, size_t haystacklen, const void* needle, size_t needlelen, size_t* pos)
7968 {
80- size_t i, j, tmp;
69+ size_t i, j;
8170 const byte* haystackb = haystack;
8271 const byte* needleb = needle;
8372
8473
85- if (haystacklen == 0 || needlelen == 0)
74+ if(HEDLEY_UNLIKELY(haystacklen == 0 || needlelen == 0 || haystacklen < needlelen))
8675 return false;
87-
76+ //TODO: use memchr as base search
8877 for(i = 0; i < haystacklen; i++)
8978 {
90- for(j = 0, tmp = i; j < needlelen && i < haystacklen; j++, i++)
79+ for(j = 0, *pos = i; j < needlelen && i < haystacklen; j++, i++)
9180 {
9281 if(haystackb[i] != needleb[j])
93- {
9482 break;
95- } else if(j == needlelen-1){
96- *pos = tmp;
83+ else if(j == needlelen-1)
9784 return true;
98- }
9985 }
10086 }
10187
@@ -115,6 +101,9 @@ int cutil_asprintf(char** strp, const char* format, ...)
115101
116102 *strp = malloc(needed);
117103
104+ if(!*strp)
105+ return -1;
106+
118107 va_start(ap, format);
119108 ret = snprintf(*strp, needed, format, ap);
120109 va_end(ap);