9 static char *getword(FILE *f)
12 return getdelim(&s, (size_t [1]){0}, 0, f) < 0 ? 0 : s;
15 int wordexp(const char *s, wordexp_t *we, int flags)
21 char *redir = (flags & WRDE_SHOWERR) ? "" : "2>/dev/null";
27 if (flags & WRDE_REUSE) wordfree(we);
29 if (flags & WRDE_NOCMD) for (i=0; s[i]; i++) switch (s[i]) {
57 if (!(sq|dq|np)) return WRDE_BADCHAR;
60 if (s[i+1]=='(' && s[i+2]=='(') {
64 } else if (s[i+1] != '(') break;
70 if (flags & WRDE_APPEND) {
76 if (flags & WRDE_DOOFFS) {
77 if (we->we_offs > SIZE_MAX/sizeof(void *)/4)
84 if (!cmd) return WRDE_NOSPACE;
85 snprintf(cmd, len, "printf %%s\\\\0 %s %s", s, redir);
86 printf("{%s}\n", cmd);
89 if (!f) return WRDE_NOSPACE;
93 while ((w = getword(f))) {
96 tmp = realloc(wv, l*sizeof(char *));
103 if (!feof(f)) err = WRDE_NOSPACE;
106 if (WEXITSTATUS(status)) {
107 if (!(flags & WRDE_APPEND)) {
110 } else if (wv==we->we_wordv) {
116 we->we_wordc = i - we->we_offs;
120 void wordfree(wordexp_t *we)
123 if (!we->we_wordv) return;
124 for (i=0; i<we->we_wordc; i++) free(we->we_wordv[we->we_offs+i]);