aboutsummaryrefslogtreecommitdiff
path: root/convert_int.c
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2019-10-30 03:57:47 +0100
committerCharles <sircharlesaze@gmail.com>2019-10-30 03:57:47 +0100
commitd963161275bcb3af4097872ba033da3ff9255606 (patch)
tree41476dcab3fa209ae6f49c6f1abe37d454674a12 /convert_int.c
parent07c9232121c8d6cb1e473bd7b623792253375d93 (diff)
downloadft_printf-d963161275bcb3af4097872ba033da3ff9255606.tar.gz
ft_printf-d963161275bcb3af4097872ba033da3ff9255606.tar.bz2
ft_printf-d963161275bcb3af4097872ba033da3ff9255606.zip
Individual convert functions, more flags
- Each conversion type is handle by individual functions in convert_* files - handle the ' ', '#', '+' and length modifier flags.
Diffstat (limited to 'convert_int.c')
-rw-r--r--convert_int.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/convert_int.c b/convert_int.c
new file mode 100644
index 0000000..d0ef77e
--- /dev/null
+++ b/convert_int.c
@@ -0,0 +1,47 @@
+#include <stdlib.h>
+#include <stdarg.h>
+#include "header.h"
+
+char *convert_int(va_list ap, t_pformat *pformat)
+{
+ char *tmp;
+ int is_neg;
+ long long int n;
+
+ if (pformat->flags & FLAG_SHORT)
+ n = va_arg(ap, short);
+ else if (pformat->flags & FLAG_SHORT_SHORT)
+ n = va_arg(ap, signed char);
+ else if (pformat->flags & FLAG_LONG)
+ n = va_arg(ap, long int);
+ else if (pformat->flags & FLAG_LONG_LONG)
+ n = va_arg(ap, long long int);
+ else
+ 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)
+ pformat->min_width--;
+ str = handle_padding(pformat, str);
+ }
+ if (is_neg)
+ tmp = ft_strjoin("-", str);
+ else if (pformat->flags & FLAG_SIGNED || pformat->flags & FLAG_SPACE)
+ tmp = ft_strjoin(pformat->flags & FLAG_SPACE ? " " : "+", str);
+ else
+ tmp = ft_strdup(str);
+ free(str);
+ str = tmp;
+ if (!(pformat->flags & FLAG_ZERO_PADDING))
+ str = handle_padding(pformat, str);
+ return (str);
+}
+