diff options
| -rw-r--r-- | ft_printf.c | 78 | ||||
| -rw-r--r-- | header.h | 13 | ||||
| -rw-r--r-- | parse.c | 6 | ||||
| -rw-r--r-- | printer.c | 188 |
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; } @@ -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 @@ -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); } @@ -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('%'); +} |
