I implemented a simple tokenizer. Would love to hear your feedback on code style, best practices:
#include <stdio.h>
#include "lexer.h"
#include "mem.h"
static inline int delimiter(char c);
char **lexer_tokenize(const char *s) {
char **rv, **tmp;
int i, j, k, len, cap;
cap = 4;
rv = mem_malloc(sizeof(char *) * cap);
for (i = 0, j = 0, len = 0;; j++) {
if (delimiter(s[j]) && i < j) {
if (len == cap - 1) {
cap <<= 1;
if ((tmp = mem_realloc(rv, sizeof(char *) * cap))) {
mem_free(rv);
rv = tmp;
} else {
mem_free(rv);
rv = 0;
fprintf(stderr, "tokenize: error resizing result array.\n");
break;
}
}
rv[len] = mem_malloc(sizeof(char) * (j - i + 1));
for (k = 0; (rv[len][k++] = s[i++]) != s[j];)
;
rv[len++][k] = 0;
if (!s[j])
break;
i = j + 1;
}
}
rv[len] = 0;
return rv;
}
static inline int delimiter(char c) {
return c == ' ' || c == '\n' || c == 0 || c == EOF;
}
Would also love to hear tips on performance improvements.