1 #define _POSIX_C_SOURCE 200809L
15 static void append(char* const s
, size_t const len_r
) {
17 char** const w
= words
.words
+ (words
.len
- 1u);
18 bool const re
= size_l
;
19 size_t const ll
= re
? size_l
- 1u : strcspn(*w
, "()");
20 out_of_memory_if(SIZE_MAX
- ll
< len_r
+ 1u);
21 size_l
= ll
+ len_r
+ 1u;
23 *w
= try_realloc(*w
, size_l
);
25 char* const p
= try_malloc(size_l
);
29 memcpy(*w
+ ll
, s
, len_r
);
30 (*w
)[size_l
- 1u] = '\0';
34 int main(int argc
, char** argv
) {
35 setlocale(LC_ALL
, "");
44 for (size_t i
= 1u; argv
[i
]; ++i
) {
46 push(&words
, argv
[i
]);
49 for (char* s
= argv
[i
]; (s
= strpbrk(s
, "()")); ) {
50 bool const open
= *s
== '(';
52 if (open
&& level
!= SIZE_MAX
&& !level
++) {
55 } else if (!open
&& level
&& !--level
) {
56 Pipe
const p
= make_pipe();
57 pid_t
const pid
= try_fork();
62 char** const v
= alloc(i
+ 3u);
68 memcpy(v
+ 2, argv
, i
);
72 ReadWord w
= read_word(p
.read
);
73 append(w
.word
, w
.len
);
76 w
= read_word(p
.read
);
83 append(s
, strcspn(s
, "()"));
88 accept_interactive_signals(true);
89 try_execv(words
.words
);