aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ft_printf.c78
-rw-r--r--header.h13
-rw-r--r--parse.c6
-rw-r--r--printer.c188
4 files changed, 241 insertions, 44 deletions
diff --git a/ft_printf.c b/ft_printf.c
index 9540489..49781e1 100644
--- a/ft_printf.c
+++ b/ft_printf.c
@@ -5,65 +5,63 @@
int ft_printf(const char *format, ...)
{
- int i;
+ int print_len;
va_list ap;
+ /* va_list ap_start; */
+ /* int ap_index; */
t_list *format_list;
- t_conversion conv;
+ char *str;
if ((format_list = parse(format)) == NULL)
return (-1);
+ /* ap_index = 0; */
va_start(ap, format);
- i = -1;
- while (format[++i])
+
+ /* va_copy(ap_start, ap); */
+ print_len = -1;
+ while (format[++print_len])
{
- if (format[i] == '%')
+ if (format[print_len] == '%')
{
- conv = format_list->data->conversion;
- if (conv == CONVERSION_CHAR)
- ft_putchar(va_arg(ap, char));
- else if (conv == CONVERSION_STR)
- ft_putstr(va_arg(ap, char*));
- else if (conv == CONVERSION_PTR)
- {
- ft_putstr("0x");
- PUTXNBR(va_arg(ap, long unsigned int));
- }
- else if (conv == CONVERSION_DECIMAL || conv == CONVERSION_INT)
- ft_putnbr(va_arg(ap, int));
- else if (conv == CONVERSION_UINT)
- ft_putunbr(va_arg(ap, unsigned int));
- else if (conv == CONVERSION_HEX_LOWER)
- PUTXNBR(va_arg(ap, unsigned int));
- else if (conv == CONVERSION_HEX_UPPER)
- PUTXMAJNBR(va_arg(ap, unsigned int));
- else if (conv == CONVERSION_PERCENT)
- ft_putchar('%');
- i += format_list->data->len;
+ /* if (format_list->data->ap_index != -1) */
+ /* { */
+ /* ap_index = format_list->data->ap_index; */
+ /* } */
+ /* else */
+ /* ap_index++; */
+ /* printf("\n%d\n", format_list->data->left_adjusted); */
+ if ((str = convert_to_str(format_list->data, ap)) == NULL)
+ return (-1);
+ ft_putstr(str);
+ free(str);
+
+
+ print_len += format_list->data->len;
list_pop_front(&format_list);
}
else
- write(STDOUT_FILENO, format + i, 1);
+ write(STDOUT_FILENO, format + print_len, 1);
}
va_end(ap);
- return (0);
+ return (print_len);
}
int main()
{
- int test;
+ /* int test; */
- ft_printf("char: %c\n", 'r');
- ft_printf("string: %s\n", "bonjour");
- ft_printf("pointer: %p\n", &test);
- ft_printf("int: %d or %i\n", 45, 54);
- ft_printf("uint: %u\n", 1 << 31);
- ft_printf("hex lower: %x\n", 0xabcf012);
- ft_printf("hex upper: %X\n", 0xabcf012);
- ft_printf("percent: %%\n");
+ /* ft_printf("char: %c\n", 'r'); */
+ /* ft_printf("string: %s\n", "bonjour"); */
+ /* ft_printf("pointer: %p\n", &test); */
+ /* ft_printf("int: %d or %i\n", 45, 54); */
+ /* ft_printf("uint: %u\n", 1 << 31); */
+ /* ft_printf("hex lower: %x\n", 0xabcf012); */
+ /* ft_printf("hex upper: %X\n", 0xabcf012); */
+ /* ft_printf("percent: %%\n"); */
/* ft_printf("precision %.2d\n", 43); */
- ft_printf("min width %4d\n", 43);
- ft_printf("zero padding %04d\n", 43);
- ft_printf("right adjusted %-4d\n", 43);
+ ft_printf("min width |%9d|\n", 43);
+ ft_printf("zero padding |%09d|\n", 43);
+ ft_printf("left adjusted |%-9d|\n", 43);
return 0;
}
diff --git a/header.h b/header.h
index 52f20e0..ec8ab82 100644
--- a/header.h
+++ b/header.h
@@ -1,6 +1,8 @@
#ifndef HEADER_H
# define HEADER_H
+# include <stdarg.h>
+
# define TRUE 1
# define FALSE 0
@@ -29,10 +31,9 @@ typedef int t_bool;
typedef struct
{
- int arg_position;
+ int ap_index;
t_bool left_adjusted;
t_bool zero_padding;
- // * and . flags
int min_field_width;
t_conversion conversion;
int len;
@@ -69,6 +70,14 @@ void ft_putstr(char *str);
void ft_putnbr(int nb);
void ft_putxnbr(long unsigned int n, char *hex_symbols);
void ft_putunbr(unsigned int n);
+void print_conversion(t_conversion conversion, va_list ap);
+int nbrlen(int nbr);
+char *ft_itoa(int n);
+char *ft_strnew(int size);
+char *ft_strdup(char *s);
+char *ft_strcpy(char *dest, const char *src);
+void add_padding(t_pformat *pformat, char *str);
+char *convert_to_str(t_pformat *pformat, va_list ap);
/*
** utils.c
diff --git a/parse.c b/parse.c
index 4ca73bd..b1d40a1 100644
--- a/parse.c
+++ b/parse.c
@@ -56,6 +56,8 @@ t_pformat *parse_conversion(char *conversion)
if ((conversion = parse_arg_position(conversion, pformat)) == NULL)
return (NULL);
start = conversion;
+ pformat->zero_padding = FALSE;
+ pformat->left_adjusted = FALSE;
while (IS_STANDALONE_FLAG(*start))
{
if (!pformat->zero_padding)
@@ -75,7 +77,7 @@ char *parse_arg_position(char *conversion, t_pformat *pformat)
{
if (strrchr_index(conversion, '$') != -1)
{
- if ((pformat->arg_position = ft_atoi(conversion)) == 0)
+ if ((pformat->ap_index = ft_atoi(conversion)) == 0)
{
free(pformat);
return (NULL);
@@ -85,6 +87,6 @@ char *parse_arg_position(char *conversion, t_pformat *pformat)
conversion++;
}
else
- pformat->arg_position = -1;
+ pformat->ap_index = -1;
return (conversion);
}
diff --git a/printer.c b/printer.c
index 787cd0a..04f93d4 100644
--- a/printer.c
+++ b/printer.c
@@ -1,4 +1,6 @@
#include <unistd.h>
+#include <stdlib.h>
+#include <stdarg.h>
#include "header.h"
void ft_putchar(char c)
@@ -40,3 +42,189 @@ void ft_putunbr(unsigned int n)
ft_putunbr(n / 10);
ft_putchar(n % 10 + '0');
}
+
+int nbrlen(int nbr)
+{
+ int counter;
+ unsigned int u_nbr;
+
+ if (nbr == 0)
+ return (1);
+ counter = 0;
+ u_nbr = nbr;
+ if (nbr < 0)
+ {
+ counter++;
+ u_nbr = -nbr;
+ }
+ while (u_nbr > 0)
+ {
+ u_nbr /= 10;
+ counter++;
+ }
+ return (counter);
+}
+
+char *ft_itoa(int n)
+{
+ char *str;
+ int len;
+ int is_negative;
+ unsigned int u_nbr;
+
+ len = nbrlen(n);
+ if ((str = (char*)malloc(sizeof(char) * (len + 1))) == NULL)
+ return (NULL);
+ str[len] = '\0';
+ is_negative = 0;
+ u_nbr = n;
+ if (n < 0)
+ {
+ is_negative = 1;
+ str[0] = '-';
+ u_nbr = -n;
+ }
+ len--;
+ while (len >= (is_negative ? 1 : 0))
+ {
+ str[len] = u_nbr % 10 + '0';
+ u_nbr /= 10;
+ len--;
+ }
+ return (str);
+}
+
+char *ft_strnew(int size)
+{
+ char *str;
+
+ if ((str = (char*)malloc(sizeof(char) * (size + 1))) == NULL)
+ return (NULL);
+ str[size] = '\0';
+ while (size-- > 0)
+ str[size] = '\0';
+ return (str);
+}
+
+char *ft_strdup(char *s)
+{
+ char *clone;
+ size_t i;
+ size_t len;
+
+ len = ft_strlen(s);
+ if ((clone = (char*)malloc(sizeof(char) * (len + 1))) == NULL)
+ return (NULL);
+ i = 0;
+ while (i < len)
+ {
+ clone[i] = s[i];
+ i++;
+ }
+ clone[i] = '\0';
+ return (clone);
+}
+
+char *ft_strcpy(char *dest, const char *src)
+{
+ int i;
+
+ i = 0;
+ while (src[i])
+ {
+ dest[i] = src[i];
+ i++;
+ }
+ dest[i] = '\0';
+ return (dest);
+}
+
+char *convert_to_str(t_pformat *pformat, va_list ap)
+{
+ char *str;
+ t_conversion conversion = pformat->conversion;
+
+ str = NULL;
+ if (conversion == CONVERSION_CHAR)
+ {
+ if ((str = ft_strnew(2)) == NULL)
+ return (NULL);
+ str[0] = (char)va_arg(ap, int);
+ }
+ else if (conversion == CONVERSION_STR)
+ str = ft_strdup(va_arg(ap, char*));
+ /* else if (conversion == CONVERSION_PTR) */
+ /* { */
+ /* ft_putstr("0x"); */
+ /* PUTXNBR(va_arg(ap, long unsigned int)); */
+ /* } */
+ else if (conversion == CONVERSION_DECIMAL || conversion == CONVERSION_INT)
+ str = ft_itoa(va_arg(ap, int));
+ /* else if (conversion == CONVERSION_UINT) */
+ /* ft_putunbr(va_arg(ap, unsigned int)); */
+ /* else if (conversion == CONVERSION_HEX_LOWER) */
+ /* PUTXNBR(va_arg(ap, unsigned int)); */
+ /* else if (conversion == CONVERSION_HEX_UPPER) */
+ /* PUTXMAJNBR(va_arg(ap, unsigned int)); */
+ else if (conversion == CONVERSION_PERCENT)
+ {
+ if ((str = ft_strnew(2)) == NULL)
+ return (NULL);
+ str[0] = '%';
+ }
+ add_padding(pformat, str);
+ return (str);
+}
+
+void add_padding(t_pformat *pformat, char *str)
+{
+ char *tmp;
+ int len;
+ int i;
+
+ if (pformat->min_field_width == -1)
+ return;
+ if ((len = ft_strlen(str)) >= pformat->min_field_width)
+ return;
+ tmp = (char*)malloc(sizeof(char) * (pformat->min_field_width + 1));
+ if (!pformat->left_adjusted)
+ {
+ i = 0;
+ while (i <= pformat->min_field_width - len)
+ tmp[i++] = pformat->zero_padding ? '0' : ' ';
+ ft_strcpy(tmp + i - 1, str);
+ ft_strcpy(str, tmp);
+ }
+ else
+ {
+ ft_strcpy(tmp, str);
+ i = len;
+ while (i < pformat->min_field_width)
+ tmp[i++] = ' ';
+ ft_strcpy(str, tmp);
+ }
+ free(tmp);
+}
+
+void print_conversion(t_conversion conversion, va_list ap)
+{
+ if (conversion == CONVERSION_CHAR)
+ ft_putchar((char)va_arg(ap, int));
+ else if (conversion == CONVERSION_STR)
+ ft_putstr(va_arg(ap, char*));
+ else if (conversion == CONVERSION_PTR)
+ {
+ ft_putstr("0x");
+ PUTXNBR(va_arg(ap, long unsigned int));
+ }
+ else if (conversion == CONVERSION_DECIMAL || conversion == CONVERSION_INT)
+ ft_putnbr(va_arg(ap, int));
+ else if (conversion == CONVERSION_UINT)
+ ft_putunbr(va_arg(ap, unsigned int));
+ else if (conversion == CONVERSION_HEX_LOWER)
+ PUTXNBR(va_arg(ap, unsigned int));
+ else if (conversion == CONVERSION_HEX_UPPER)
+ PUTXMAJNBR(va_arg(ap, unsigned int));
+ else if (conversion == CONVERSION_PERCENT)
+ ft_putchar('%');
+}