X-Git-Url: http://git.thejh.net/?p=libjh.git;a=blobdiff_plain;f=string.c;h=7e6da4fc0c05c4435e64d80180c4c97e53bc5b36;hp=5ef61b92e385a577ed466f568117a824fb4bc5df;hb=2f75df5a713a9b0373b496aeb4cd83768fd0a488;hpb=a32bce31ecf816bbf0dc3530c6e7dee1e5653ac9 diff --git a/string.c b/string.c index 5ef61b9..7e6da4f 100644 --- a/string.c +++ b/string.c @@ -1,12 +1,25 @@ // Copyright (2013) Jann Horn // This code is licensed under the AGPLv3. -#include +#ifdef __SSE2__ #include +#endif + +#include HEADER #include HEADER #define streq(a,b) (!strcmp((a),(b))) +HEADER #define TPRINTF(name, ...) \ +HEADER char *name; \ +HEADER do { \ +HEADER int __tprintf_size = snprintf(NULL, 0, __VA_ARGS__); \ +HEADER assert(__tprintf_size != -1); \ +HEADER name = alloca(__tprintf_size+1); \ +HEADER int __tprintf_size2 = snprintf(name, __tprintf_size+1, __VA_ARGS__); \ +HEADER assert(__tprintf_size == __tprintf_size2); \ +HEADER } while (0); ////////////////////////////////////////////////////////// + PUBLIC_FN int count_char_occurences(char *s, char c) { int n=0; while (*s) { @@ -22,7 +35,6 @@ PUBLIC_FN size_t count_char_occurences_in_buf(char *b, size_t bl, char c) { size_t res = 0; #ifdef __SSE2__ - #include // do it the simple way until we get to the next 16-byte-aligned address while ((((uint64_t)b)&0xf) && b // do it the simple way until we get to the next 16-byte-aligned address while ((((uint64_t)b)&0xf) && bstr_len) return 0; return streq(str+str_len-sub_len, sub); } + +PUBLIC_FN char **buf_to_linearray(char *buf, ssize_t buflen) { + if (buflen == -1) buflen = strlen(buf); + size_t linecount = count_char_occurences_in_buf(buf, buflen, '\n')+1; + char **ret = malloc(linecount * sizeof(char*) + 1); + ret[linecount] = NULL; + if (ret == NULL) return NULL; + char **r = ret; + *(r++) = buf; /* first line starts at byte zero */ + char *b = buf; + char *be = buf+buflen; + while (b