/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   libftprintf.h                                      :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: gbaconni@student.42lausanne.ch             +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2022/01/18 15:26:06 by gbaconni          #+#    #+#             */
/*   Updated: 2022/04/29 14:45:30 by gbaconni         ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#ifndef LIBFTPRINTF_H
# define LIBFTPRINTF_H
# include "libft/libft.h"
# include <stdlib.h>
# include <stdarg.h>
# include <unistd.h>

/* Constants */

# ifdef __APPLE__
#  define NIL "0x0"
# else
#  define NIL "(nil)"
# endif

# define SPECIFIERS	"cspdiuxX%"
# define HEXA_LOWER	"0123456789abcdef"
# define HEXA_UPPER	"0123456789ABCDEF"

/* Helper */

int		ft_eoflags(const char *s);
char	*ft_strrev(char *s);
char	*ft_ltoa_base(long n, char *base);
int		ft_putchar(int c);
int		ft_puts(const char *s);
char	*ft_unescape(const char *str);

/* Mandatory */

int		ft_printf(const char *format, ...);
int		ft_vprintf(char const *format, va_list ap);
int		ft_va_char(const char *format, va_list ap);
int		ft_va_string(const char *format, va_list ap);
int		ft_va_pointer(const char *format, va_list ap);
int		ft_va_decimal(const char *format, va_list ap);
int		ft_va_hexadecimal(const char *format, va_list ap);
int		ft_va_percent(const char *format, va_list ap);
int		ft_va_escape(const char *format, va_list ap);
int		ft_va_other(const char *format, va_list ap);

/* Bonus */

enum {
	F_HASH	= 1 << 0,
	F_ZERO	= 1 << 1,
	F_MINUS	= 1 << 2,
	F_SPACE	= 1 << 3,
	F_PLUS	= 1 << 4
};

int		ft_va_precision_bonus(const char *format, va_list ap);
int		ft_va_flags_bonus(const char *format, va_list ap);
int		ft_va_string_bonus(const char *format, va_list ap, char *s);
int		ft_va_decimal_bonus(const char *format, va_list ap, char *s);
int		ft_va_hexadecimal_bonus(const char *format, va_list ap, char *s);

#endif
