aboutsummaryrefslogtreecommitdiff
path: root/test_mini/libft/src/io/ft_printf/ft_vasprintf.h
blob: 2d364c89a3d50c135a6cdd364d9b27fa572b660c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   header.h                                           :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: cacharle <marvin@42.fr>                    +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2019/10/29 00:06:46 by cacharle          #+#    #+#             */
/*   Updated: 2020/01/15 11:39:15 by cacharle         ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#ifndef FT_VASPRINTF_H
# define FT_VASPRINTF_H

# include <unistd.h>
# include <stdlib.h>
# include <stdarg.h>
# include "libft.h"

# define STATUS_ERROR -1

# define SPECIFIERS_STR "nfcspdiuxX%"
# define FLAGS_STR      "#0- +'"

# define IS_STANDALONE_FLAG(c) (ft_strchr(FLAGS_STR, c) != NULL)

# define FLAG_MINUS               (1 << 0)
# define FLAG_ZERO                (1 << 1)
# define FLAG_SIGNED              (1 << 2)
# define FLAG_SPACE               (1 << 3)
# define FLAG_ALTERNATE           (1 << 4)
# define FLAG_SHORT               (1 << 5)
# define FLAG_SHORT_SHORT         (1 << 6)
# define FLAG_LONG                (1 << 7)
# define FLAG_LONG_LONG           (1 << 8)
# define FLAG_WIDTH_WILDCARD      (1 << 9)
# define FLAG_PRECISION_WILDCARD  (1 << 10)
# define FLAG_WIDTH_OVERWRITE     (1 << 11)

# define ITOA_HEX_LOW(x) (ft_itoa_unsigned_base(x, "0123456789abcdef"))
# define ITOA_HEX_UP(x)  (ft_itoa_unsigned_base(x, "0123456789ABCDEF"))
# define ITOA_DEC(x)     (ft_itoa_base(x, "0123456789"))

typedef int						t_bool;
typedef short					t_flags;
typedef long long int			t_big_int;
typedef long long unsigned int	t_big_uint;

typedef struct
{
	int				precision;
	int				width;
	t_flags			flags;
	char			specifier;
	int				fmt_len;
	int				size;
	long long int	*written;
}					t_pformat;

typedef struct		s_flist
{
	struct s_flist	*next;
	t_pformat		*content;
}					t_flist;

typedef struct		s_printf_status
{
	va_list			ap;
	t_flist			*flist;
	const char		*format;
	char			*out;
	int				out_size;
}					t_printf_status;

/*
** ft_printf.c
*/

int					ft_printf(const char *format, ...);
const char			*add_conversion(t_printf_status *status,
									t_pformat *pformat);
const char			*add_between(t_printf_status *status);
int					destroy_status_error(t_printf_status *status);

/*
** parse.c
*/

int					parse(const char *format, t_flist **flist);
t_pformat			*parse_reduced(const char *fmt);

/*
** printer.c
*/

char				*convert(t_pformat *pformat, va_list ap);
char				*convert_specifier(va_list ap, t_pformat *pformat);
char				*handle_width(t_pformat *pformat, char *str);
char				*handle_precision(t_pformat *pformat, char *str);

/*
** utils.c
*/

char				*ft_itoa_base(long long int n, char *base);
char				*ft_itoa_unsigned_base(long long unsigned int n,
											char *base);
void				*ft_memjoin_free(void *dst, int dst_size, void *src,
										int src_size);

/*
** extract.c
*/

const char			*extract_flags(t_pformat *pformat, const char *fmt);
const char			*extract_width(t_pformat *pformat, const char *fmt);
const char			*extract_precision(t_pformat *pformat, const char *fmt);
const char			*extract_length_modifier(t_pformat *pformat,
												const char *fmt);

/*
** list.c
*/

t_flist				*list_new(t_pformat *content);
void				*list_destroy(t_flist **lst);
void				list_push_front(t_flist **lst, t_flist *new);
void				list_pop_front(t_flist **lst);
t_flist				*list_reverse(t_flist *lst);

/*
** convert_*.c
*/

char				*convert_char(va_list ap, t_pformat *pformat);
char				*convert_str(va_list ap, t_pformat *pformat);
char				*convert_ptr(va_list ap, t_pformat *pformat);
char				*convert_int(va_list ap, t_pformat *pformat);
char				*convert_uint(va_list ap, t_pformat *pformat);
char				*convert_hex(va_list ap, t_pformat *pformat);
char				*convert_percent(va_list ap, t_pformat *pformat);
char				*convert_written(va_list ap, t_pformat *pformat);
char				*convert_double(va_list ap, t_pformat *pformat);
char				*convert_none(va_list ap, t_pformat *pformat);

/*
** length_modifier.c
*/

t_big_uint			length_modifier_unsigned_int(
							va_list ap, t_pformat *pformat);
t_big_int			length_modifier_int(va_list ap, t_pformat *pformat);

#endif