1 /* { dg-additional-options "-O2" } */
2
3 extern void free (void *__ptr) __attribute__ ((__nothrow__ , __leaf__));
4
5 enum pipecmd_tag
6 {
7 PIPECMD_PROCESS,
8 PIPECMD_SEQUENCE
9 };
10
11 struct pipecmd {
12 enum pipecmd_tag tag;
13 union {
14 struct pipecmd_process {
15 int argc;
16 int argv_max;
17 char **argv;
18 } process;
19 struct pipecmd_sequence {
20 int ncommands;
21 int commands_max;
22 struct pipecmd **commands;
23 } sequence;
24 } u;
25 };
26
27 static char *argstr_get_word (const char **argstr)
28 {
29 while (**argstr) {
30 switch (**argstr) {
31 case ' ':
32 case '\t':
33 return (void *) 0;
34 }
35 }
36 return (void *) 0;
37 }
38
39 struct pipecmd *pipecmd_new_argstr (const char *argstr)
40 {
41 argstr_get_word (&argstr);
42 return (void *) 0;
43 }
44
45 void pipecmd_free (struct pipecmd *cmd)
46 {
47 int i;
48
49 if (!cmd)
50 return;
51
52 switch (cmd->tag) {
53 case PIPECMD_PROCESS: {
54 struct pipecmd_process *cmdp = &cmd->u.process;
55
56 for (i = 0; i < cmdp->argc; ++i)
57 free (cmdp->argv[i]);
58 free (cmdp->argv);
59
60 break;
61 }
62
63 case PIPECMD_SEQUENCE: {
64 struct pipecmd_sequence *cmds = &cmd->u.sequence;
65
66 for (i = 0; i < cmds->ncommands; ++i)
67 pipecmd_free (cmds->commands[i]);
68 free (cmds->commands);
69
70 break;
71 }
72 }
73
74 free (cmd);
75 }