Newer
Older
/*
** ast_cmd.c for 42sh
**
** Made by Seblu
** Login <seblu@epita.fr>
**
** Started on Fri Aug 18 22:13:51 2006 Seblu
*/
#include "ast.h"
s_ast_node *ast_red_create(void)
{
s_ast_node *node;
secmalloc(node, sizeof (s_ast_node));
node->type = T_RED;
node->body.child_red.size = 0;
node->body.child_red.type = NULL;
node->body.child_red.fd = NULL;
node->body.child_red.word = NULL;
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
node->body.child_red.mhs = NULL;
return node;
}
void ast_red_add(s_ast_node *node,
e_red_type type,
int fd,
char *word)
{
if (node->type != T_RED)
return;
s_red_node *reds = (s_red_node *) &node->body.child_red;
++reds->size;
secrealloc(reds->type, reds->type, sizeof (e_red_type) * reds->size);
reds->type[reds->size - 1] = type;
secrealloc(reds->fd, reds->fd, sizeof (int) * reds->size);
reds->fd[reds->size - 1] = fd;
secrealloc(reds->word, reds->word, sizeof (char *) * reds->size);
reds->word[reds->size - 1] = word;
}
void ast_red_print(s_ast_node *node, FILE *fs, unsigned *node_id)
{
unsigned cur_id = *node_id;
if (node->type != T_RED)
return;
s_red_node *reds = (s_red_node *) &node->body.child_red;
if (reds->size == 0)
return;
fprintf(fs, "%u [label = \"Redirection\\n", *node_id);
++*node_id;
for (register size_t i = 0; i < reds->size; ++i)
fprintf(fs, "id=%d, fd=%d, type=%d, word=%s\\n",
i, reds->fd[i], reds->type[i], reds->word[i]);
fprintf(fs, "\"];\n");
fprintf(fs, "%u -> %u\n", cur_id, *node_id);
if (reds->mhs)
ast_print_node(reds->mhs, fs, node_id);
}
{
s_red_node *reds;
if (node->type != T_RED)
return;
reds = (s_red_node *) &node->body.child_red;
if (reds->size) {
free(reds->type);
free(reds->fd);