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)
size_t* bytearray_find(const Bytearray* haystack, const void* needle, int (*cmp)(const void*, const void*));
#define new_bytearray(element_size) bytearray_with_capacity(BYTEARRAY_DEFAULT_SIZE, element_size)
#define bytearray_pop(bytearray, retptr) bytearray_pop_at(bytearray, ((Vector*)vector)->length-1, retptr)
#define bytearray_push(bytearray, item) bytearray_insert(bytearray, ((Vector*)vector)->length, item)
#define bytearray_pop(bytearray, retptr) bytearray_pop_at(bytearray, ((Bytearray*)bytearray)->length-1, retptr)
#define bytearray_push(bytearray, item) bytearray_insert(bytearray, ((Bytearray*)bytearray)->length, item)
#endif /* CUTILS_BYTE_ARRAY_H */
▾Minclude/cutils/extensions.h
@@ -14,10 +14,10 @@
int cutil_strcasecmp(const char* s1, const char* s2);
int cutil_strncasecmp(const char* s1, const char* s2, size_t n);
size_t cutil_strnlen(const char *s, size_t maxlen);
size_t cutil_strnlen(const char* s, size_t maxlen);
char* cutil_strdup(const char *s);
char* cutil_strndup(const char *s, size_t n);
#define cutil_strdup(s) cutil_strndup(s, strlen((const char*)s))
char* cutil_strndup(const char* s, size_t n);
bool cutil_memmem(const void* haystack, size_t haystacklen, const void* needle, size_t needlelen, size_t* pos);
▾Minclude/cutils/misc.h
@@ -29,6 +29,15 @@ typedef unsigned long ulong;
typedef unsigned long long ullong;
#endif /* CUTILS_NO_SHORTHANDLES */
#ifndef CUTILS_NO_MACROS
#define MAX(x,y) ((x) > (y) ? (x) : (y))
#define MIN(x,y) ((x) < (y) ? (x) : (y))
#define LOOP while(1)
#define RANGE(i, start, end) \
for(((i) = (start)); ((start) < (end)) ? ((i) < (end)) : ((i) > (end)); ((start) < (end)) ? (i++) : (i--))
#endif /* CUTILS_NO_MACROS */
#if __STDC_VERSION__ >= 199901L
#ifdef UINT32_MAX
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)
return c1 - c2;
}
size_t cutil_strnlen(const char *s, size_t maxlen)
size_t cutil_strnlen(const char* s, size_t maxlen)
{
size_t len;
@@ -51,23 +51,12 @@ size_t cutil_strnlen(const char *s, size_t maxlen)
return (len);
}
char* cutil_strdup(const char *s)
{
char* ret;
size_t len = strlen(s);
ret = malloc(len+1);
memcpy(ret, s, len+1);
return ret;
}
char* cutil_strndup(const char *s, size_t n)
char* cutil_strndup(const char* s, size_t n)
{
char* ret;
size_t len = cutil_strnlen(s, n);
len = len <= n ? len : n;
len = MIN(len, n);
ret = malloc(len+1);
memcpy(ret, s, len+1);
@@ -77,25 +66,22 @@ char* cutil_strndup(const char *s, size_t n)
bool cutil_memmem(const void* haystack, size_t haystacklen, const void* needle, size_t needlelen, size_t* pos)
{
size_t i, j, tmp;
size_t i, j;
const byte* haystackb = haystack;
const byte* needleb = needle;
if (haystacklen == 0 || needlelen == 0)
if(HEDLEY_UNLIKELY(haystacklen == 0 || needlelen == 0 || haystacklen < needlelen))
return false;
//TODO: use memchr as base search
for(i = 0; i < haystacklen; i++)
{
for(j = 0, tmp = i; j < needlelen && i < haystacklen; j++, i++)
for(j = 0, *pos = i; j < needlelen && i < haystacklen; j++, i++)
{
if(haystackb[i] != needleb[j])
{
break;
} else if(j == needlelen-1){
*pos = tmp;
else if(j == needlelen-1)
return true;
}
}
}
@@ -115,6 +101,9 @@ int cutil_asprintf(char** strp, const char* format, ...)
*strp = malloc(needed);
if(!*strp)
return -1;
va_start(ap, format);
ret = snprintf(*strp, needed, format, ap);
va_end(ap);