Newer
Older
/*
** ast.h for 42sh
**
** Made by Seblu
** Login <seblu@epita.fr>
**
** Started on Sun Jul 30 04:40:03 2006 Seblu
s_ast_node *cond;
s_ast_node *cond_true;
s_ast_node *cond_false;
} s_if_node;
s_ast_node *cond;
s_ast_node *exec;
} s_while_node;
/*
** Enumerate different type of redirection
*/
{
R_LESS, /* < */
R_LESSAND, /* <& */
R_GREAT, /* > */
R_GREATAND, /* >& */
R_DGREAT, /* >> */
R_LESSGREAT, /* <> */
R_CLOBBER, /* >| */
R_DLESS, /* << */
R_DLESSDASH /* <<- */
size_t size;
e_red_type *type;
int *fd;
char **word;
s_ast_node *mhs;
} s_red_node;
** Generic node, it's a contener !
** T_PIPE, T_SEP* , T_AND, T_OR : binary operator
** T_BANG : unary operator but ts_bin_op with right pointer is always NULL
*/
s_ast_node *lhs;
s_ast_node *rhs;
} s_bin_node;
T_WHILE,
T_CMD,
T_AND,
T_OR,
T_SUBSHELL,
T_FUNCDEC,
T_BANG,
T_PIPE,
/*
** Global constant of total count of node type
*/
enum { NODE_TYPE_COUNT = 14 };
/*
** This is a type for a node item
*/
s_if_node child_if;
s_for_node child_for;
s_case_node child_case;
s_while_node child_while;
s_cmd_node child_cmd;
s_bin_node child_and;
s_bin_node child_or;
s_bin_node child_subshell;
s_funcdec_node child_funcdec;
s_bin_node child_bang;
s_bin_node child_pipe;
s_bin_node child_sep;
s_bin_node child_sepand;
/*!
** Print an ast to @arg filename file
**
** @param ast ast to print
** @param filename filename where ast is printed. if it's NULL
** random file name is generated.
*/
void ast_print(s_ast_node *ast, const char *filename);
/*!
** Print an ast node
**
** @param ast ast node to add to file
** @param fs file stream where print ast
*/
void ast_print_node(s_ast_node *ast, FILE *fs, unsigned int *node_id);
/*!
** Destroy node and all its childs
**
** @param ast mother node to destroy
**
*/
/*!
** Create an if ast node
**
** @param cond if condition
** @param cond_true tree if condition is true
** @param cond_false tree if condition is false
**
** @return the node
*/
s_ast_node *ast_if_create(s_ast_node *cond,
s_ast_node *cond_true,
s_ast_node *cond_false);
/*!
** Print an if ast node
**
** @param ast ast node to add to file
** @param fs file stream where print ast
** @param node_id first free node id
*/
void ast_if_print(s_ast_node *node, FILE *fs, unsigned int *node_id);
/*!
** Destruct an if ast node
**
** @param node node to destroy
*/
/*!
** Create a for ast node
**
** @param varname variable name
** @param values word list that var @value varname will take.
** @warning values is a NULL termined list of string
** @param exec tree to execute with @value varname correctly set
**
** @return the node
*/
/*!
** Print a for ast node
**
** @param ast ast node to add to file
** @param fs file stream where print ast
** @param node_id first free node id
*/
void ast_for_print(s_ast_node *node, FILE *fs, unsigned *node_id);
/*!
** Destruct a for ast node
**
** @param node node to destroy
*/
/*!
** Create a case ast node
**
** @param word reference word
**
** @return the node
*/
/*!
** Add a case item into a case node. An item is counpound of a set of word
** which match with reference word an case node and the corresponding
**
** @param node node where item will be added
** @param pattern list of word that can match to reference
** @param exec exec corresponding with match
*/
/*!
** Print a case ast node
**
** @param ast ast node to add to file
** @param fs file stream where print ast
** @param node_id first free node id
*/
void ast_case_print(s_ast_node *node, FILE *fs, unsigned *node_id);
/*!
** Destruct a case ast node
**
** @param node node to destroy
*/
/*!
** Create a while ast node
**
** @param cond poursuit condition
** @param exec tree to execute if cond is true
**
** @return the node
*/
s_ast_node *ast_while_create(s_ast_node *cond, s_ast_node *exec);
/*!
** Print an ast while (while) node
**
** @param ast ast node to add to file
** @param fs file stream where print ast
** @param node_id first free node id
*/
void ast_while_print(s_ast_node *node, FILE *fs, unsigned int *node_id);
/*!
** Destruct a while ast node
**
** @param node node to destroy
*/
/*!
** Create a cmd ast node
**
** @return the node
*/
s_ast_node *ast_cmd_create(void);
/*!
** Add a arg vector to a cmd node
**
** @param node node where add
** @param argv new arg vector
*/
void ast_cmd_add_argv(s_ast_node *node, char *argv);
/*!
** Add a prefix to a cmd node
**
** @param node node for addition
** @param assignment_word word to add
*/
void ast_cmd_add_prefix(s_ast_node *node, char *assignment_word);
/*!
** Print an ast cmd node
**
** @param ast ast node to add to file
** @param fs file stream where print ast
** @param node_id first free node id
*/
void ast_cmd_print(s_ast_node *node, FILE *fs, unsigned int *node_id);
/*!
** Destruct a cmd node
**
** @param node node to destroy
*/
void ast_cmd_destruct(s_ast_node *node);
/*!
** Create an and (&&) ast node
**
** @param lhs left child
** @param rhs right child
**
** @return the node
*/
s_ast_node *ast_and_create(s_ast_node *lhs, s_ast_node *rhs);
/*!
** Print an ast and (&&) node
**
** @param ast ast node to add to file
** @param fs file stream where print ast
** @param node_id first free node id
*/
void ast_and_print(s_ast_node *node, FILE *fs, unsigned int *node_id);
/*!
** Destruct an and (&&) node
**
** @param node node to destroy
*/
/*!
** Create an or (||) ast node
**
** @param lhs left child
** @param rhs right child
**
** @return the node
*/
s_ast_node *ast_or_create(s_ast_node *lhs, s_ast_node *rhs);
/*!
** Print an ast or (||) node
**
** @param ast ast node to add to file
** @param fs file stream where print ast
** @param node_id first free node id
*/
void ast_or_print(s_ast_node *node, FILE *fs, unsigned int *node_id);
/*!
** Destruct an or (||) node
**
** @param node node to destroy
*/
**
** @param child subshell tree
**
** @return the node
*/
s_ast_node *ast_subshell_create(s_ast_node *child);
** Print an ast subshell (()) node
**
** @param ast ast node to add to file
** @param fs file stream where print ast
** @param node_id first free node id
*/
void ast_subshell_print(s_ast_node *node, FILE *fs, unsigned int *node_id);
/*!
** Destruct a subshell (()) node
/*!
** Create a funcdec (function declaration) ast node
**
** @param name function name
** @param body function body
**
** @return the node
*/
s_ast_node *ast_funcdec_create(char *name, s_ast_node *body);
/*!
** Print an function declaration node
**
** @param ast ast node to add to file
** @param fs file stream where print ast
** @param node_id first free node id
*/
void ast_funcdec_print(s_ast_node *node, FILE *fs, unsigned *node_id);
/*!
** Destruct a funcdec ast node
**
** @param node node to destroy
*/
/*!
** Create a bang (!) ast node
**
** @param child under bang tree
**
** @return the node
*/
s_ast_node *ast_bang_create(s_ast_node *child);
/*!
** Print an ast bang (!) node
**
** @param ast ast node to add to file
** @param fs file stream where print ast
** @param node_id first free node id
*/
void ast_bang_print(s_ast_node *node, FILE *fs, unsigned int *node_id);
/*!
** Destruct a bang (!) node
**
** @param node node to destroy
*/
/*!
** Create a pipe (|) ast node
**
** @param lhs left child
** @param rhs right child
**
** @return the node
*/
s_ast_node *ast_pipe_create(s_ast_node *lhs, s_ast_node *rhs);
/*!
** Print an ast pipe (|) node
**
** @param ast ast node to add to file
** @param fs file stream where print ast
** @param node_id first free node id
*/
void ast_pipe_print(s_ast_node *node, FILE *fs, unsigned int *node_id);
/*!
** Destruct a pipe (|) node
**
** @param node node to destroy
*/
/*!
** Create a separtor (;) ast node
**
** @param lhs left child
** @param rhs right child
**
** @return the node
*/
s_ast_node *ast_sep_create(s_ast_node *lhs, s_ast_node *rhs);
/*!
** Print an ast sep (;) node
**
** @param ast ast node to add to file
** @param fs file stream where print ast
** @param node_id first free node id
*/
void ast_sep_print(s_ast_node *node, FILE *fs, unsigned int *node_id);
/*!
** Destruct a sep (;) node
**
** @param node node to destroy
*/
/*!
** Create a sepand (&) ast node
**
** @param lhs left child
** @param rhs right child
**
** @return the node
*/
s_ast_node *ast_sepand_create(s_ast_node *lhs, s_ast_node *rhs);
/*!
** Print an ast sepand (&) node
**
** @param ast ast node to add to file
** @param fs file stream where print ast
** @param node_id first free node id
*/
void ast_sepand_print(s_ast_node *node, FILE *fs, unsigned int *node_id);
/*!
** Destruct a sepand (&) node
**
** @param node node to destroy
*/
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
/*!
** Create a redirection ast node
**
** @return the node
*/
s_ast_node *ast_red_create(void);
/*!
** Add a redirection to a redirection node
**
** @param node node where add
** @param type type of redirection
** @param fd fd parameter of redirection
** @param word file or word parameter of redirection
*/
void ast_red_add(s_ast_node *node,
e_red_type type,
int fd,
char *word);
/*!
** Print an ast red node
**
** @param ast ast node to add to file
** @param fs file stream where print ast
** @param node_id first free node id
*/
void ast_red_print(s_ast_node *node, FILE *fs, unsigned int *node_id);
/*!
** Destruct a red node
**
** @param node node to destroy
*/
void ast_red_destruct(s_ast_node *node);