* A token rule returns true when a token should end
* otherwise returns false
*/
-typedef bool (*ulas_tokrule)(char current, char prev);
+typedef bool (*ulas_tokrule)(char current);
// simple tokenizer at any space char
-bool ulas_tokrulespace(char current, char prev);
+bool ulas_tokrulespace(char current);
// tokenisze according to pre-defined rules
// returns the amount of bytes of line that were
TESTBEGIN("tok");
assert_tok("test", 4, "test tokens", ulas_tokrulespace);
+ assert_tok("test", 6, " test tokens", ulas_tokrulespace);
assert_tok("tokens", 6, "tokens", ulas_tokrulespace);
assert_tok("", 0, "", ulas_tokrulespace);
assert_tok("", -1, NULL, ulas_tokrulespace);
return 0;
}
-bool ulas_tokrulespace(char current, char prev) { return isspace(current); }
+bool ulas_tokrulespace(char current) { return isspace(current); }
int ulas_tok(char *dst, const char *line, size_t n, ulas_tokrule rule) {
if (!dst || !line || n == 0) {
}
int i = 0;
- char prev = '\0';
+ int write = 0;
char current = '\0';
- for (i = 0; i < n - 1 && line[i]; i++) {
- prev = current;
+
+ // always skip leading terminators
+ while (line[i] && i < n - 1 && rule(line[i])) {
+ i++;
+ }
+
+ for (; i < n - 1 && write < n - 1 && line[i]; i++, write++) {
current = line[i];
- if (rule(current, prev)) {
+ if (rule(current)) {
break;
}
- dst[i] = current;
+ dst[write] = current;
}
- dst[i + 1] = '\0';
+ dst[write + 1] = '\0';
return i;
}