aboutsummaryrefslogtreecommitdiff
path: root/printer.c
diff options
context:
space:
mode:
Diffstat (limited to 'printer.c')
-rw-r--r--printer.c117
1 files changed, 41 insertions, 76 deletions
diff --git a/printer.c b/printer.c
index e002551..34cbd07 100644
--- a/printer.c
+++ b/printer.c
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <stdarg.h>
#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);
-}