aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--convert_hex_low.c24
-rw-r--r--convert_hex_up.c26
-rw-r--r--convert_int.c10
-rw-r--r--convert_percent.c1
-rw-r--r--convert_ptr.c3
-rw-r--r--convert_str.c2
-rw-r--r--convert_uint.c12
-rw-r--r--extract.c3
-rw-r--r--header.h8
-rw-r--r--parse.c6
-rw-r--r--printer.c38
-rw-r--r--utils.c42
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);
diff --git a/extract.c b/extract.c
index 75d4929..da7df18 100644
--- a/extract.c
+++ b/extract.c
@@ -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);
}
diff --git a/header.h b/header.h
index 6a5a11c..c477147 100644
--- a/header.h
+++ b/header.h
@@ -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
diff --git a/parse.c b/parse.c
index 871ff74..71ccf35 100644
--- a/parse.c
+++ b/parse.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;
}
diff --git a/printer.c b/printer.c
index 34cbd07..a4da1a1 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/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)
{
diff --git a/utils.c b/utils.c
index 09b2bd5..eed55fb 100644
--- a/utils.c
+++ b/utils.c
@@ -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);
+}