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: 2019/11/13 09:29:23 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef HEADER_H
# define HEADER_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
|