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 /* <<- */
typedef struct redir s_redir;
struct redir
** 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_UNTIL,
T_CMD,
T_AND,
T_OR,
T_SUBSHELL,
T_FUNCDEC,
T_BANG,
T_PIPE,
/*
** 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_while_node child_until;
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;
} u_node_item;
/*!
** 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);
/*!
** 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
*/
/*!
** 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
*/
/*!
** 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 until ast node
**
** @param cond poursuit condition
** @param exec tree to execute if cond is false
**
** @return the node
*/
s_ast_node *ast_until_create(s_ast_node *cond, s_ast_node *exec);
/*!
** Print an ast until (until) 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_until_print(s_ast_node *node, FILE *fs, unsigned int *node_id);
/*!
** Destruct a until ast node
**
** @param node node to destroy
*/
void ast_until_destruct(s_ast_node *node);
/*!
** Create a cmd ast node
**
** @return the node
*/
s_ast_node *ast_cmd_create(void);
/*!
** Add a redirection to a cmd 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_cmd_add_redir(s_ast_node *node,
e_redir_type type,
int fd,
char *word);
/*!
** 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_fundec_create(char *name, s_ast_node *body);
/*!
** 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
*/