Skip to content
ast.h 7.62 KiB
Newer Older
Seblu's avatar
Seblu committed
/*
** ast.h for 42sh
**
** Made by Seblu
** Login   <seblu@epita.fr>
**
** Started on  Sun Jul 30 04:40:03 2006 Seblu
Seblu's avatar
Seblu committed
** Last update Tue Aug 29 00:35:06 2006 Seblu
Seblu's avatar
Seblu committed
*/

#ifndef AST_H_
# define AST_H_

# include "../common/macro.h"
Seblu's avatar
Seblu committed
typedef struct ast_node  s_ast_node;
Seblu's avatar
Seblu committed

Seblu's avatar
Seblu committed
/*
** If ast node
*/
Seblu's avatar
Seblu committed
typedef struct if_node
Seblu's avatar
Seblu committed
  s_ast_node		*cond;
  s_ast_node		*cond_true;
  s_ast_node		*cond_false;
} s_if_node;
Seblu's avatar
Seblu committed

/*
** For ast node
*/
Seblu's avatar
Seblu committed
typedef struct for_node
Seblu's avatar
Seblu committed
  char			*varname;
  char			**values;
Seblu's avatar
Seblu committed
  s_ast_node		*exec;
} s_for_node;
Seblu's avatar
Seblu committed
/*
** Case item (not an ast node)
*/
Seblu's avatar
Seblu committed
typedef struct case_item s_case_item;
struct case_item
Seblu's avatar
Seblu committed
{
  char			**pattern;
Seblu's avatar
Seblu committed
  s_ast_node		*exec;
  s_case_item		*next;
Seblu's avatar
Seblu committed
};

Seblu's avatar
Seblu committed
/*
** Case ast node
*/
Seblu's avatar
Seblu committed
typedef struct case_node
Seblu's avatar
Seblu committed
{
  char			*word;
Seblu's avatar
Seblu committed
  s_case_item		*items;
} s_case_node;
Seblu's avatar
Seblu committed

/*
** While ast node
*/
Seblu's avatar
Seblu committed
typedef struct while_node
Seblu's avatar
Seblu committed
  s_ast_node		*cond;
  s_ast_node		*exec;
} s_while_node;
Seblu's avatar
Seblu committed

/*
** Enumerate different type of redirection
*/
Seblu's avatar
Seblu committed
typedef enum redir_type
Seblu's avatar
Seblu committed
  {
    R_LESS,		/*  <   */
    R_LESSAND,		/*  <&  */
    R_GREAT,		/*  >   */
    R_GREATAND,		/*  >&  */
    R_DGREAT,		/*  >>  */
    R_LESSGREAT,	/*  <>  */
    R_CLOBBER,		/*  >|  */
    R_DLESS,		/*  <<  */
    R_DLESSDASH		/*  <<- */
Seblu's avatar
Seblu committed
  } e_redir_type;
Seblu's avatar
Seblu committed

/*
** Redirection ast node
*/
Seblu's avatar
Seblu committed
typedef struct redir s_redir;
struct redir
Seblu's avatar
Seblu committed
  e_redir_type		type;
Seblu's avatar
Seblu committed
  int			fd;
Seblu's avatar
Seblu committed
  s_redir		*next;
Seblu's avatar
Seblu committed

/*
** Command ast node
*/
Seblu's avatar
Seblu committed
typedef struct cmd_node
Seblu's avatar
Seblu committed
{
  char			**argv;
Seblu's avatar
Seblu committed
  s_redir		*redirs;
Seblu's avatar
Seblu committed
  char			**prefix;
Seblu's avatar
Seblu committed
} s_cmd_node;
Seblu's avatar
Seblu committed

/*
** Binary ast node
** Generic node, it's a contener !
** T_PIPE, T_SEP* , T_AND, T_OR : binary operator
Seblu's avatar
Seblu committed
** T_BANG : unary operator but ts_bin_op with right pointer is always NULL
*/
Seblu's avatar
Seblu committed
typedef struct bin_node
Seblu's avatar
Seblu committed
  s_ast_node		*lhs;
  s_ast_node		*rhs;
} s_bin_node;
Seblu's avatar
Seblu committed

/*
** Funcdec node
*/
Seblu's avatar
Seblu committed
typedef struct funcdec_node
Seblu's avatar
Seblu committed
{
  char			*name;
Seblu's avatar
Seblu committed
  s_ast_node		*body;
} s_funcdec_node;
Seblu's avatar
Seblu committed

/*
** Enumerate all node type
*/
Seblu's avatar
Seblu committed
typedef enum node_type
Seblu's avatar
Seblu committed
  {
    T_IF,
    T_FOR,
Seblu's avatar
Seblu committed
    T_CASE,
Seblu's avatar
Seblu committed
    T_WHILE,
    T_UNTIL,
    T_CMD,
    T_AND,
    T_OR,
    T_SUBSHELL,
    T_FUNCDEC,
    T_BANG,
    T_PIPE,
Seblu's avatar
Seblu committed
    T_SEPAND,
Seblu's avatar
Seblu committed
    T_SEP,
Seblu's avatar
Seblu committed
  } e_node_type;
Seblu's avatar
Seblu committed

/*
** This is a type for a node item
*/
Seblu's avatar
Seblu committed
typedef union node_item
Seblu's avatar
Seblu committed
  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;
Seblu's avatar
Seblu committed

/*
** Generic ast node type
*/
Seblu's avatar
Seblu committed
struct ast_node
Seblu's avatar
Seblu committed
  e_node_type		type;
  u_node_item		body;
Seblu's avatar
Seblu committed
/*!
** Destroy node and all its childs
**
** @param ast mother node to destroy
**
*/
Seblu's avatar
Seblu committed
void		ast_destruct(s_ast_node *ast);
Seblu's avatar
Seblu committed
/*!
** 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
*/
Seblu's avatar
Seblu committed
s_ast_node	*ast_if_create(s_ast_node *cond,
			       s_ast_node *cond_true,
			       s_ast_node *cond_false);
Seblu's avatar
Seblu committed

/*!
** Destruct an if ast node
**
** @param node node to destroy
*/
Seblu's avatar
Seblu committed
void		ast_if_destruct(s_ast_node *node);
Seblu's avatar
Seblu committed

/*!
** 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
*/
Seblu's avatar
Seblu committed
s_ast_node	*ast_for_create(char		*varname,
Seblu's avatar
Seblu committed
				s_ast_node	*exec);
Seblu's avatar
Seblu committed

/*!
** Destruct a for ast node
**
** @param node node to destroy
*/
Seblu's avatar
Seblu committed
void		ast_for_destruct(s_ast_node *node);

/*!
** Create a case ast node
**
** @param word reference word
**
** @return the node
*/
Seblu's avatar
Seblu committed
s_ast_node	*ast_case_create(char *word);

/*!
** 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
*/
Seblu's avatar
Seblu committed
void		ast_case_add_item(s_ast_node	*node,
Seblu's avatar
Seblu committed
				  s_ast_node	*exec);

/*!
** Destruct a case ast node
**
** @param node node to destroy
*/
Seblu's avatar
Seblu committed
void		ast_case_destruct(s_ast_node *node);
Seblu's avatar
Seblu committed

/*!
** Create a while ast node
**
** @param cond poursuit condition
** @param exec tree to execute if cond is true
**
** @return the node
*/
Seblu's avatar
Seblu committed
s_ast_node	*ast_while_create(s_ast_node *cond, s_ast_node *exec);
Seblu's avatar
Seblu committed

/*!
** Destruct a while ast node
**
** @param node node to destroy
*/
Seblu's avatar
Seblu committed
void		ast_while_destruct(s_ast_node *node);
Seblu's avatar
Seblu committed

/*!
** Create a until ast node
**
** @param cond poursuit condition
** @param exec tree to execute if cond is false
**
** @return the node
*/
Seblu's avatar
Seblu committed
s_ast_node	*ast_until_create(s_ast_node *cond, s_ast_node *exec);
Seblu's avatar
Seblu committed

/*!
** Destruct a until ast node
**
** @param node node to destroy
*/
Seblu's avatar
Seblu committed
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);

/*!
** Destruct a cmd node
**
** @param node node to destroy
*/
void		ast_cmd_destruct(s_ast_node *node);
Seblu's avatar
Seblu committed

/*!
** Create an and (&&) ast node
**
** @param lhs left child
** @param rhs right child
**
** @return the node
*/
Seblu's avatar
Seblu committed
s_ast_node	*ast_and_create(s_ast_node *lhs, s_ast_node *rhs);
Seblu's avatar
Seblu committed

/*!
** Destruct an and (&&) node
**
** @param node node to destroy
*/
Seblu's avatar
Seblu committed
void		ast_and_destruct(s_ast_node *node);
Seblu's avatar
Seblu committed

/*!
** Create an or (||) ast node
**
** @param lhs left child
** @param rhs right child
**
** @return the node
*/
Seblu's avatar
Seblu committed
s_ast_node	*ast_or_create(s_ast_node *lhs, s_ast_node *rhs);
Seblu's avatar
Seblu committed

/*!
** Destruct an or (||) node
**
** @param node node to destroy
*/
Seblu's avatar
Seblu committed
void		ast_or_destruct(s_ast_node *node);
Seblu's avatar
Seblu committed

/*!
** Create a subshell ($()) ast node
**
** @param child subshell tree
**
** @return the node
*/
Seblu's avatar
Seblu committed
s_ast_node	*ast_subshell_create(s_ast_node *child);
Seblu's avatar
Seblu committed

/*!
** Destruct a subshell ($()) node
**
** @param node node to destroy
*/
Seblu's avatar
Seblu committed
void		ast_subshell_destruct(s_ast_node *node);
Seblu's avatar
Seblu committed

/*!
** Create a funcdec (function declaration) ast node
**
** @param name function name
** @param body function body
**
** @return the node
*/
Seblu's avatar
Seblu committed
s_ast_node	*ast_fundec_create(char *name, s_ast_node *body);
Seblu's avatar
Seblu committed

/*!
** Destruct a funcdec ast node
**
** @param node node to destroy
*/
Seblu's avatar
Seblu committed
void		ast_funcdec_destruct(s_ast_node *node);
Seblu's avatar
Seblu committed

/*!
** Create a bang (!) ast node
**
** @param child under bang tree
**
** @return the node
*/
Seblu's avatar
Seblu committed
s_ast_node	*ast_bang_create(s_ast_node *child);
Seblu's avatar
Seblu committed

/*!
** Destruct a bang (!) node
**
** @param node node to destroy
*/
Seblu's avatar
Seblu committed
void		ast_bang_destruct(s_ast_node *node);
Seblu's avatar
Seblu committed

/*!
** Create a pipe (|) ast node
**
** @param lhs left child
** @param rhs right child
**
** @return the node
*/
Seblu's avatar
Seblu committed
s_ast_node	*ast_pipe_create(s_ast_node *lhs, s_ast_node *rhs);
Seblu's avatar
Seblu committed

/*!
** Destruct a pipe (|) node
**
** @param node node to destroy
*/
Seblu's avatar
Seblu committed
void		ast_pipe_destruct(s_ast_node *node);
Seblu's avatar
Seblu committed

/*!
** Create a separtor (;) ast node
**
** @param lhs left child
** @param rhs right child
**
** @return the node
*/
Seblu's avatar
Seblu committed
s_ast_node	*ast_sep_create(s_ast_node *lhs, s_ast_node *rhs);
Seblu's avatar
Seblu committed

/*!
** Destruct a sep (;) node
**
** @param node node to destroy
*/
Seblu's avatar
Seblu committed
void		ast_sep_destruct(s_ast_node *node);
Seblu's avatar
Seblu committed
/*!
** Create a sepand (&) ast node
**
** @param lhs left child
** @param rhs right child
**
** @return the node
*/
Seblu's avatar
Seblu committed
s_ast_node	*ast_sepand_create(s_ast_node *lhs, s_ast_node *rhs);
Seblu's avatar
Seblu committed

/*!
** Destruct a sepand (&) node
**
** @param node node to destroy
*/
Seblu's avatar
Seblu committed
void		ast_sepand_destruct(s_ast_node *node);
Seblu's avatar
Seblu committed

#endif /* !AST_H_ */