2 e2b5610c 2022-04-11 op * Copyright (c) 2022 Omar Polo <op@openbsd.org>
4 e2b5610c 2022-04-11 op * Permission to use, copy, modify, and distribute this software for any
5 e2b5610c 2022-04-11 op * purpose with or without fee is hereby granted, provided that the above
6 e2b5610c 2022-04-11 op * copyright notice and this permission notice appear in all copies.
8 e2b5610c 2022-04-11 op * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 e2b5610c 2022-04-11 op * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 e2b5610c 2022-04-11 op * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 e2b5610c 2022-04-11 op * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 e2b5610c 2022-04-11 op * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 e2b5610c 2022-04-11 op * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 e2b5610c 2022-04-11 op * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 e2b5610c 2022-04-11 op #include <ctype.h>
18 e2b5610c 2022-04-11 op #include <string.h>
19 e2b5610c 2022-04-11 op #include <stdlib.h>
21 e2b5610c 2022-04-11 op #include "tokenize.h"
23 e2b5610c 2022-04-11 op #ifndef WDELIMS
24 e2b5610c 2022-04-11 op /* everything but a-zA-Z */
25 e2b5610c 2022-04-11 op #define WDELIMS " \t\n!\"#$%&'()*+,-./0123456789:;<=>?@[\\]^_`{|}~"
29 e2b5610c 2022-04-11 op tokenize(const char *s)
31 e2b5610c 2022-04-11 op char *d, *dup, *t, **tok = NULL;
33 e2b5610c 2022-04-11 op size_t cap = 0, len = 0, newcap;
35 e2b5610c 2022-04-11 op if ((dup = strdup(s)) == NULL)
39 e2b5610c 2022-04-11 op for (t = d; *t; ++t)
40 e2b5610c 2022-04-11 op *t = tolower(*t);
42 e2b5610c 2022-04-11 op while ((t = strsep(&d, WDELIMS)) != NULL) {
43 e2b5610c 2022-04-11 op if (*t == '\0')
46 e2b5610c 2022-04-11 op /* keep the space for a NULL terminator */
47 e2b5610c 2022-04-11 op if (len+1 >= cap) {
48 e2b5610c 2022-04-11 op newcap = cap * 1.5;
49 e2b5610c 2022-04-11 op if (newcap == 0)
51 e2b5610c 2022-04-11 op newtok = recallocarray(tok, cap, newcap,
52 e2b5610c 2022-04-11 op sizeof(char *));
53 e2b5610c 2022-04-11 op if (newtok == NULL)
59 e2b5610c 2022-04-11 op if ((tok[len++] = strdup(t)) == NULL)
64 16b32c38 2022-04-11 op if (tok == NULL)
65 16b32c38 2022-04-11 op return calloc(1, sizeof(char *));
69 e2b5610c 2022-04-11 op freetoks(tok);
75 e2b5610c 2022-04-11 op freetoks(char **tok)
79 e2b5610c 2022-04-11 op if (tok == NULL)
82 e2b5610c 2022-04-11 op for (i = tok; *i != NULL; ++i)