/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   parsing.h                                          :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: adjoly <adjoly@student.42angouleme.fr>     +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2024/04/25 12:20:26 by adjoly            #+#    #+#             */
/*   Updated: 2024/06/21 12:41:11 by adjoly           ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#ifndef PARSING_H
# define PARSING_H

# include "libft.h"
# include "tokenizer.h"
# include "env.h"

typedef struct s_cmd
{
	char	*cmd;
	char	**argv;
	int		infile;
	int		outfile;
}	t_cmd;

typedef enum s_quote
{
	NOT_CLOSED = -1,
	FALSE,
	SINGLE = 39,
	DOUBLE = 34
}	t_quote;

bool	check_syntax(char *readline, char **argv);
void	send_error(char *msg, char **argv);
void	check_redir(t_list *redir, char **argv);
t_cmd	*get_redir_fd(void *content, t_env *env);
t_list	*get_cmd_list(t_list *list, t_env *env);
char	**split_argv(char *readline);
char	*env_var_replace(char *readline, t_env *env);
size_t	get_size_with_env(char *readline, t_env *env);
size_t	strlen_till_char(char *s, int c);
void	check_quote(char *readline);
/**
 * @brief				Take the argv of a command a split the argv and the
 *						command it self
 *
 * @param cmd_av		The full argv of the command
 *
 * @return (t_cmd *)	cmd and argv splited into a struct
 */
t_cmd	*split_cmd(char *cmd_av, t_cmd *cmd);

/**
 * @brief				Take a string and an index and check if the character 
 *						at the index is in quote
 *
 * @param s				The string to search in
 * @param i				The index of the character to check
 *
 * @return (t_quote)	The type of quote if between, if not return FALSE or 
 *						NOT_CLOSED if the quote is not closed
 */
t_quote	is_inquote(char	*s, size_t i);

/**
 * @brief				Take a character and check if it is a quote and return the 
 *						type of quote
 *
 * @param c				The character to check
 *
 * @return (t_quote)	The type of quote or FALSE
 */
t_quote	__is_quote(char c);

/*
 *						ONLY FOR DEBUG TO BE REMOVED 
 */
void	print_quote_type(t_quote type);
void	print_redir_sign(t_redirection_sign redir_sign);
void	print_token(t_token *token);
void	print_redir(t_redirection *redir);

#endif