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);
88 if (!f) return WRDE_NOSPACE;
92 while ((w = getword(f))) {
95 tmp = realloc(wv, l*sizeof(char *));
102 if (!feof(f)) err = WRDE_NOSPACE;
105 if (WEXITSTATUS(status)) {
106 if (!(flags & WRDE_APPEND)) {
109 } else if (wv==we->we_wordv) {
115 we->we_wordc = i - we->we_offs;
119 void wordfree(wordexp_t *we)
122 if (!we->we_wordv) return;
123 for (i=0; i<we->we_wordc; i++) free(we->we_wordv[we->we_offs+i]);