From d963161275bcb3af4097872ba033da3ff9255606 Mon Sep 17 00:00:00 2001 From: Charles Date: Wed, 30 Oct 2019 03:57:47 +0100 Subject: Individual convert functions, more flags - Each conversion type is handle by individual functions in convert_* files - handle the ' ', '#', '+' and length modifier flags. --- printer.c | 117 ++++++++++++++++++++++---------------------------------------- 1 file changed, 41 insertions(+), 76 deletions(-) (limited to 'printer.c') diff --git a/printer.c b/printer.c index e002551..34cbd07 100644 --- a/printer.c +++ b/printer.c @@ -6,7 +6,7 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/10/28 23:19:24 by cacharle #+# #+# */ -/* Updated: 2019/10/29 18:46:48 by cacharle ### ########.fr */ +/* Updated: 2019/10/30 00:56:05 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,8 +15,6 @@ #include #include "header.h" -#define ITOA_HEX_LOWER(x) (ft_itoa_base(x, "0123456789abcdef")) -#define ITOA_HEX_UPPER(x) (ft_itoa_base(x, "0123456789ABCDEF")) char *convert(t_pformat *pformat, va_list ap) { @@ -36,54 +34,30 @@ char *convert(t_pformat *pformat, va_list ap) } if (pformat->flags & FLAG_PRECISION_WILDCARD) pformat->precision = va_arg(ap, int); - if ((str = convert_type(pformat->conversion, ap)) == NULL) - return (NULL); - if (pformat->flags & FLAG_SIGNED && (pformat->conversion == 'd' || pformat->conversion == 'i') - && str[0] != '-') - { - char *tmp = ft_strjoin("+", str); - free(str); - str = tmp; - } - if ((str = handle_precision(pformat, str)) == NULL) - return (NULL); - if (pformat->conversion == 'p') - if ((str = add_address_prefix(str)) == NULL) - return (NULL); - if ((str = handle_padding(pformat, str)) == NULL) + if ((str = convert_type(ap, pformat)) == NULL) return (NULL); return (str); } -char *convert_type(t_conversion conversion, va_list ap) +char *convert_type(va_list ap, t_pformat *pformat) { - char *str; - - str = NULL; - if (conversion == 'c') - { - if ((str = ft_strnew(2)) == NULL) - return (NULL); - str[0] = (char)va_arg(ap, int); - } - else if (conversion == 's') - { - char *tmp = va_arg(ap, char*); - str = tmp == NULL ? ft_strdup("(null)") : ft_strdup(tmp); - } - else if (conversion == 'p') - str = ITOA_HEX_LOWER((long int)va_arg(ap, void*)); - else if (conversion == 'd' || conversion == 'i') - str = ft_itoa(va_arg(ap, int)); - else if (conversion == 'u') - str = ft_itoa(va_arg(ap, unsigned int)); - else if (conversion == 'x') - str = ITOA_HEX_LOWER(va_arg(ap, unsigned int)); - else if (conversion == 'X') - str = ITOA_HEX_UPPER(va_arg(ap, unsigned int)); - else if (conversion == '%') - str = ft_strdup("%"); - return (str); + if (pformat->type == 'c') + return (convert_char(ap, pformat)); + if (pformat->type == 's') + return (convert_str(ap, pformat)); + if (pformat->type == 'p') + return (convert_ptr(ap, pformat)); + if (pformat->type == 'd' || pformat->type == 'i') + return (convert_int(ap, pformat)); + if (pformat->type == 'u') + return (convert_uint(ap, pformat)); + if (pformat->type == 'x') + return (convert_hex_low(ap, pformat)); + if (pformat->type == 'X') + return (convert_hex_up(ap, pformat)); + if (pformat->type == '%') + return (convert_percent(ap, pformat)); + return (NULL); } char *handle_padding(t_pformat *pformat, char *str) @@ -98,33 +72,38 @@ char *handle_padding(t_pformat *pformat, char *str) return (NULL); if (pformat->flags & FLAG_LEFT_ADJUSTED) { - ft_strcpy(tmp, str); i = len; + ft_strcpy(tmp, str); while (i < pformat->min_width) tmp[i++] = ' '; tmp[i] = 0; - ft_strcpy(str, tmp); } else { - if (IN_STR("+-", str[0]) && pformat->flags & FLAG_ZERO_PADDING) - { - tmp[0] = str[0]; - len--; - i = 1; - while (i < pformat->min_width - len) - tmp[i++] = pformat->flags & FLAG_ZERO_PADDING ? '0' : ' '; - ft_strcpy(tmp + i , str + 1); - ft_strcpy(str, tmp); - free(tmp); - return (str); - } i = 0; while (i <= pformat->min_width - len) tmp[i++] = pformat->flags & FLAG_ZERO_PADDING ? '0' : ' '; ft_strcpy(tmp + i - 1, str); - ft_strcpy(str, tmp); } + free(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); } @@ -137,9 +116,7 @@ char *handle_precision(t_pformat *pformat, char *str) len = ft_strlen(str); if (pformat->precision == 0 && str[0] == '0') return (ft_strdup("")); - if (pformat->conversion == 's' && pformat->precision < len) - str[pformat->precision] = '\0'; - else if (IN_STR("diuxXp", pformat->conversion) && len < pformat->precision) + else if (IN_STR("diuxXp", pformat->type) && len < pformat->precision) { if ((tmp = (char*)malloc(sizeof(char) * (pformat->precision + 1))) == NULL) return (NULL); @@ -162,15 +139,3 @@ char *handle_precision(t_pformat *pformat, char *str) } return (str); } - -char *add_address_prefix(char *addr) -{ - char *tmp; - - if ((tmp = ft_strdup(addr)) == NULL) - return (NULL); - if ((addr = ft_strjoin("0x", addr)) == NULL) - return (NULL); - free(tmp); - return (addr); -} -- cgit