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