diff options
| -rw-r--r-- | convert_hex_low.c | 24 | ||||
| -rw-r--r-- | convert_hex_up.c | 26 | ||||
| -rw-r--r-- | convert_int.c | 10 | ||||
| -rw-r--r-- | convert_percent.c | 1 | ||||
| -rw-r--r-- | convert_ptr.c | 3 | ||||
| -rw-r--r-- | convert_str.c | 2 | ||||
| -rw-r--r-- | convert_uint.c | 12 | ||||
| -rw-r--r-- | extract.c | 3 | ||||
| -rw-r--r-- | header.h | 8 | ||||
| -rw-r--r-- | parse.c | 6 | ||||
| -rw-r--r-- | printer.c | 38 | ||||
| -rw-r--r-- | utils.c | 42 |
12 files changed, 128 insertions, 47 deletions
diff --git a/convert_hex_low.c b/convert_hex_low.c index 39cc188..00b2d76 100644 --- a/convert_hex_low.c +++ b/convert_hex_low.c @@ -1,17 +1,37 @@ #include <stdarg.h> +#include <stdlib.h> #include "header.h" char *convert_hex_low(va_list ap, t_pformat *pformat) { - unsigned int n = va_arg(ap, unsigned int); + long long unsigned int n; + + if (pformat->flags & FLAG_SHORT) + n = va_arg(ap, int); + else if (pformat->flags & FLAG_SHORT_SHORT) + n = va_arg(ap, int); + else if (pformat->flags & FLAG_LONG) + n = va_arg(ap, long unsigned int); + else if (pformat->flags & FLAG_LONG_LONG) + n = va_arg(ap, long long unsigned int); + else + n = va_arg(ap, unsigned int); + char *str = ITOA_HEX_LOW(n); str = handle_precision(pformat, str); + if (pformat->flags & FLAG_ZERO_PADDING) + { + if (pformat->flags & FLAG_ALTERNATE && n != 0) + pformat->min_width -= 2; + str = handle_padding(pformat, str); + } if (pformat->flags & FLAG_ALTERNATE && n != 0) { char *tmp = ft_strjoin("0x", str); free(str); str = tmp; } - str = handle_padding(pformat, str); + if (!(pformat->flags & FLAG_ZERO_PADDING)) + str = handle_padding(pformat, str); return (str); } diff --git a/convert_hex_up.c b/convert_hex_up.c index 7f5e640..eba1226 100644 --- a/convert_hex_up.c +++ b/convert_hex_up.c @@ -1,17 +1,37 @@ #include <stdarg.h> +#include <stdlib.h> #include "header.h" char *convert_hex_up(va_list ap, t_pformat *pformat) { - unsigned int n = va_arg(ap, unsigned int); + long long unsigned int n; + + if (pformat->flags & FLAG_SHORT) + n = va_arg(ap, int); + else if (pformat->flags & FLAG_SHORT_SHORT) + n = va_arg(ap, int); + else if (pformat->flags & FLAG_LONG) + n = va_arg(ap, long unsigned int); + else if (pformat->flags & FLAG_LONG_LONG) + n = va_arg(ap, long long unsigned int); + else + n = va_arg(ap, unsigned int); + char *str = ITOA_HEX_UP(n); str = handle_precision(pformat, str); - if (pformat->flags & FLAG_ALTERNATE) + if (pformat->flags & FLAG_ZERO_PADDING) + { + if (pformat->flags & FLAG_ALTERNATE && n != 0) + pformat->min_width -= 2; + str = handle_padding(pformat, str); + } + if (pformat->flags & FLAG_ALTERNATE && n != 0) { char *tmp = ft_strjoin("0X", str); free(str); str = tmp; } - str = handle_padding(pformat, str); + if (!(pformat->flags & FLAG_ZERO_PADDING)) + str = handle_padding(pformat, str); return (str); } diff --git a/convert_int.c b/convert_int.c index d0ef77e..8bc0b1a 100644 --- a/convert_int.c +++ b/convert_int.c @@ -9,9 +9,9 @@ char *convert_int(va_list ap, t_pformat *pformat) long long int n; if (pformat->flags & FLAG_SHORT) - n = va_arg(ap, short); + n = va_arg(ap, int); else if (pformat->flags & FLAG_SHORT_SHORT) - n = va_arg(ap, signed char); + n = va_arg(ap, int); else if (pformat->flags & FLAG_LONG) n = va_arg(ap, long int); else if (pformat->flags & FLAG_LONG_LONG) @@ -20,16 +20,15 @@ char *convert_int(va_list ap, t_pformat *pformat) n = va_arg(ap, int); is_neg = n < 0; - char *str = ITOA_DEC(n); - if (is_neg) ft_strcpy(str, str + 1); str = handle_precision(pformat, str); if (pformat->flags & FLAG_ZERO_PADDING) { - if (is_neg || pformat->flags & FLAG_SIGNED) + if (is_neg || pformat->flags & FLAG_SIGNED || pformat->flags & FLAG_SPACE) pformat->min_width--; + /* pformat->min_width--; */ str = handle_padding(pformat, str); } if (is_neg) @@ -44,4 +43,3 @@ char *convert_int(va_list ap, t_pformat *pformat) str = handle_padding(pformat, str); return (str); } - diff --git a/convert_percent.c b/convert_percent.c index 2b15340..4b28f8d 100644 --- a/convert_percent.c +++ b/convert_percent.c @@ -5,6 +5,7 @@ char *convert_percent(va_list ap, t_pformat *pformat) { char *str = ft_strdup("%"); + (void)ap; str = handle_padding(pformat, str); return (str); } diff --git a/convert_ptr.c b/convert_ptr.c index c74222c..2c288ac 100644 --- a/convert_ptr.c +++ b/convert_ptr.c @@ -1,9 +1,10 @@ #include <stdarg.h> +#include <stdlib.h> #include "header.h" char *convert_ptr(va_list ap, t_pformat *pformat) { - char *str = ITOA_HEX_LOW(va_arg(ap, void*)); + char *str = ITOA_HEX_LOW((long long unsigned int)va_arg(ap, void*)); str = handle_precision(pformat, str); str = add_hex_prefix(str); diff --git a/convert_str.c b/convert_str.c index dbdf01e..3cea2dc 100644 --- a/convert_str.c +++ b/convert_str.c @@ -7,7 +7,7 @@ char *convert_str(va_list ap, t_pformat *pformat) str = str == NULL ? ft_strdup("(null)") : ft_strdup(str); - if (pformat->precision != -1 && pformat->precision < ft_strlen(str)) + if (pformat->precision != -1 && pformat->precision < (int)ft_strlen(str)) str[pformat->precision] = '\0'; str = handle_padding(pformat, str); diff --git a/convert_uint.c b/convert_uint.c index bf28679..239e47d 100644 --- a/convert_uint.c +++ b/convert_uint.c @@ -3,15 +3,19 @@ char *convert_uint(va_list ap, t_pformat *pformat) { - unsigned int n; + long long unsigned int n; if (pformat->flags & FLAG_SHORT) - n = va_arg(ap, unsigned short); + n = va_arg(ap, int); else if (pformat->flags & FLAG_SHORT_SHORT) - n = va_arg(ap, unsigned char); + n = va_arg(ap, int); + else if (pformat->flags & FLAG_LONG) + n = va_arg(ap, long unsigned int); + else if (pformat->flags & FLAG_LONG_LONG) + n = va_arg(ap, long long unsigned int); else n = va_arg(ap, unsigned int); - char *str = ft_itoa_base(n, "0123456789"); + char *str = ft_itoa_unsigned_base(n, "0123456789"); str = handle_precision(pformat, str); str = handle_padding(pformat, str); return (str); @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/10/29 00:10:36 by cacharle #+# #+# */ -/* Updated: 2019/10/30 03:40:28 by cacharle ### ########.fr */ +/* Updated: 2019/10/30 04:14:50 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -94,4 +94,5 @@ char *extract_length_modifier(t_pformat *pformat, char *fmt) pformat->flags |= FLAG_SHORT; return (fmt + 1); } + return (fmt); } @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/10/29 00:06:46 by cacharle #+# #+# */ -/* Updated: 2019/10/30 03:53:28 by cacharle ### ########.fr */ +/* Updated: 2019/10/30 04:14:35 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -50,8 +50,8 @@ # define FLAG_LONG (1 << 10) # define FLAG_LONG_LONG (1 << 11) -#define ITOA_HEX_LOW(x) (ft_itoa_base(x, "0123456789abcdef")) -#define ITOA_HEX_UP(x) (ft_itoa_base(x, "0123456789ABCDEF")) +#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")) #include <stdio.h> @@ -109,6 +109,7 @@ char *add_hex_prefix(char *str); int strrchr_index(const char *s, char c); char *ft_itoa_base(long long int n, char *base); +char *ft_itoa_unsigned_base(long long unsigned int n, char *base); /* ** extract.c @@ -117,6 +118,7 @@ char *ft_itoa_base(long long int n, char *base); char *extract_standalone_flags(t_pformat *pformat, char *fmt); char *extract_min_width(t_pformat *pformat, char *fmt); char *extract_precision(t_pformat *pformat, char *fmt); +char *extract_length_modifier(t_pformat *pformat, char *fmt); /* ** list.c @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/10/29 00:11:33 by cacharle #+# #+# */ -/* Updated: 2019/10/30 03:41:02 by cacharle ### ########.fr */ +/* Updated: 2019/10/30 04:13:56 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,9 +31,9 @@ int parse(char *format, t_flist **flist) if (format[-1] != '%') continue; if ((parsed = parse_reduced(format)) == NULL) - return (list_destroy(flist)); + return ((int)list_destroy(flist)); if ((tmp = list_new(parsed)) == NULL) - return (list_destroy(flist)); + return ((int)list_destroy(flist)); list_push_front(flist, tmp); format += (*flist)->content->len; } @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/10/28 23:19:24 by cacharle #+# #+# */ -/* Updated: 2019/10/30 00:56:05 by cacharle ### ########.fr */ +/* Updated: 2019/10/30 04:13:18 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -89,24 +89,24 @@ char *handle_padding(t_pformat *pformat, char *str) return (tmp); } -char *handle_nbr_padding(t_pformat *pformat, char *str) -{ - char *tmp; - int len = ft_strlen(str); - int i; - - if (!(IN_STR("+-", str[0]) && pformat->flags & FLAG_ZERO_PADDING)) - return (str); - tmp[0] = str[0]; - len--; - i = 1; - while (i < pformat->min_width - len) - tmp[i++] = '0'; - ft_strcpy(tmp + i , str + 1); - ft_strcpy(str, tmp); - free(tmp); - return (str); -} +/* char *handle_nbr_padding(t_pformat *pformat, char *str) */ +/* { */ +/* char *tmp; */ +/* int len = ft_strlen(str); */ +/* int i; */ +/* */ +/* if (!(IN_STR("+-", str[0]) && pformat->flags & FLAG_ZERO_PADDING)) */ +/* return (str); */ +/* tmp[0] = str[0]; */ +/* len--; */ +/* i = 1; */ +/* while (i < pformat->min_width - len) */ +/* tmp[i++] = '0'; */ +/* ft_strcpy(tmp + i , str + 1); */ +/* ft_strcpy(str, tmp); */ +/* free(tmp); */ +/* return (str); */ +/* } */ char *handle_precision(t_pformat *pformat, char *str) { @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/10/29 00:12:40 by cacharle #+# #+# */ -/* Updated: 2019/10/30 03:53:16 by cacharle ### ########.fr */ +/* Updated: 2019/10/30 04:06:52 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -30,10 +30,10 @@ int strrchr_index(const char *s, char c) return (i); } -static int nbrlen_radix(long int nbr, int radix) +static int nbrlen_radix(long long int nbr, int radix) { - int counter; - long unsigned int u_nbr; + int counter; + long long unsigned int u_nbr; if (nbr == 0) return (1); @@ -74,3 +74,37 @@ char *ft_itoa_base(long long int n, char *base) } return (str); } + +static int nbrlen_unsigned_radix(long long unsigned int nbr, int radix) +{ + int counter; + + if (nbr == 0) + return (1); + counter = 0; + while (nbr > 0) + { + nbr /= radix; + counter++; + } + return (counter); +} + +char *ft_itoa_unsigned_base(long long unsigned int n, char *base) +{ + char *str; + int len; + int radix; + + radix = ft_strlen(base); + len = nbrlen_unsigned_radix(n, radix); + if ((str = (char*)malloc(sizeof(char) * (len + 1))) == NULL) + return (NULL); + str[len] = '\0'; + while (--len >= 0) + { + str[len] = base[n % radix]; + n /= radix; + } + return (str); +} |
