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) {
if (sub_len>str_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<be) {
+ if (*b == '\n') {
+ *b = '\0';
+ *(r++) = b+1;
+ }
+ b++;
+ }
+ return ret;
+}