From: Dominik Kaiser Date: Fri, 15 Mar 2024 12:02:59 +0000 (+0100) Subject: Add error handling X-Git-Url: https://git.dkaiser.de/?a=commitdiff_plain;h=02344fc38e2375102a913685c21acc35141c2cb0;p=42%2Fft_printf.git Add error handling --- diff --git a/Makefile b/Makefile index 8ac63f8..bb1667f 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ NAME = libftprintf.a CC = cc CFLAGS = -Wall -Wextra -Werror -SRC_FILES = src/ft_printf.c src/ft_printnbr.c src/ft_printhex.c +SRC_FILES = src/ft_printf.c src/ft_printnbr.c src/ft_printhex.c src/ft_printaddr.c OBJ_FILES = $(SRC_FILES:.c=.o) LIBFT = libft/libft.a diff --git a/ft_printf.h b/ft_printf.h index 2a3fbb9..eb43e44 100644 --- a/ft_printf.h +++ b/ft_printf.h @@ -6,18 +6,19 @@ /* By: dkaiser +# include "libft/libft.h" +# include -int ft_printf(char *fmt, ...); -int ft_printnbr(int nbr); -int ft_printunbr(unsigned int nbr); -int ft_printhex(unsigned int nbr, char fmt); +int ft_printf(const char *fmt, ...); +int ft_printnbr(int nbr); +int ft_printunbr(unsigned int nbr); +int ft_printhex(unsigned int nbr, char fmt); +int ft_printaddr(void *addr); #endif // FT_PRINTF_H diff --git a/src/ft_printaddr.c b/src/ft_printaddr.c new file mode 100644 index 0000000..8b43ed9 --- /dev/null +++ b/src/ft_printaddr.c @@ -0,0 +1,44 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_printaddr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: dkaiser 15) + printaddr_rec(addr / 16, len); + if (*len < 0) + return ; + success = write(1, &c, 1); + if (success < 0) + *len = -1; + else + (*len)++; +} + +int ft_printaddr(void *addr) +{ + int len; + + len = write(1, "0x", 2); + printaddr_rec((unsigned long)addr, &len); + return (len); +} diff --git a/src/ft_printf.c b/src/ft_printf.c index f6984c7..f85f071 100644 --- a/src/ft_printf.c +++ b/src/ft_printf.c @@ -6,69 +6,86 @@ /* By: dkaiser -static int print_char(char c) +static int print_char(char c) { - ft_putchar_fd(c, 1); - return 1; + return (write(1, &c, 1)); } -static int print_str(char *str) +static int print_str(char *str) { - if (str) - { - ft_putstr_fd(str, 1); - return ft_strlen(str); - } - else - { - ft_putstr_fd("(null)", 1); - return 6; - } + int success; + int len; + + if (str) + { + len = 0; + while (str[len]) + len++; + success = write(1, str, len); + if (success < 0) + return (-1); + return (len); + } + else + { + success = write(1, "(null)", 6); + if (success == 6) + return (6); + return (-1); + } } -static int print_conv(va_list args, char c) +static int print_conv(va_list args, char c) { - if (c == 'c') - return print_char(va_arg(args, int)); - if (c == 's') - return print_str(va_arg(args, char*)); - if (c == 'p') - ; - if (c == 'd' || c == 'i') - return ft_printnbr(va_arg(args, int)); - if (c == 'u') - return ft_printunbr(va_arg(args, unsigned int)); - if (c == 'x' || c == 'X') - return ft_printhex(va_arg(args, unsigned int), c); - if (c == '%') - return print_char('%'); - return -2147483648; + if (c == 'c') + return (print_char(va_arg(args, int))); + if (c == 's') + return (print_str(va_arg(args, char *))); + if (c == 'p') + return (ft_printaddr(va_arg(args, void *))); + if (c == 'd' || c == 'i') + return (ft_printnbr(va_arg(args, int))); + if (c == 'u') + return (ft_printunbr(va_arg(args, unsigned int))); + if (c == 'x' || c == 'X') + return (ft_printhex(va_arg(args, unsigned int), c)); + if (c == '%') + return (print_char('%')); + return (-1); } -int ft_printf(char *fmt, ...) +int ft_printf(const char *fmt, ...) { - int result; - va_list args; + int result; + int last_result; + int success; + va_list args; - result = 0; - va_start(args, fmt); - while(*fmt) - { - if (*fmt == '%') - result += print_conv(args, *(++fmt)); - else - result++; - fmt++; - if (result < 0) - return -1; - } - va_end(args); - return (result); + result = 0; + va_start(args, fmt); + while (*fmt) + { + last_result = result; + if (*fmt == '%') + result += print_conv(args, *(++fmt)); + else + { + success = write(1, fmt, 1); + if (success <= 0) + return (-1); + result++; + } + fmt++; + if (result < last_result) + return (-1); + } + va_end(args); + return (result); } diff --git a/src/ft_printhex.c b/src/ft_printhex.c index e96b322..d65de1c 100644 --- a/src/ft_printhex.c +++ b/src/ft_printhex.c @@ -6,42 +6,39 @@ /* By: dkaiser 15) + printhex_rec(nbr / 16, fmt, len); + if (*len < 0) + return ; + success = write(1, &c, 1); + if (success < 0) + *len = -1; + else + (*len)++; } -static void printhex_rec(unsigned int nbr, char fmt) +int ft_printhex(unsigned int nbr, char fmt) { - char c; + int len; - if (nbr % 16 < 10) - c = '0' + (nbr % 16); - else - c = fmt - 35 + (nbr % 16); - if (nbr > 15) - printhex_rec(nbr, fmt); - write(1, &c, 1); -} - -int ft_printhex(unsigned int nbr, char fmt) -{ - printhex_rec(nbr, fmt); - return get_len(nbr); + len = 0; + printhex_rec(nbr, fmt, &len); + return (len); } diff --git a/src/ft_printnbr.c b/src/ft_printnbr.c index cd20025..282e7a8 100644 --- a/src/ft_printnbr.c +++ b/src/ft_printnbr.c @@ -6,48 +6,75 @@ /* By: dkaiser -static int get_len(long n) +static void printnbr_rec(int n, int *len) { - int len; - - len = 0; - if (n == 0) - return 1; - if (n < 0) - len++; - while (n) - { - len++; - n /= 10; - } - return len; + char c; + int success; + + if (*len < 0) + return ; + c = '0' + n % 10; + if (n > 9) + printnbr_rec(n / 10, len); + if (*len < 0) + return ; + success = write(1, &c, 1); + if (success < 0) + *len = -1; + else + (*len)++; } -int ft_printnbr(int nbr) +int ft_printnbr(int nbr) { - ft_putnbr_fd(nbr, 1); - return get_len(nbr); + int len; + + len = 0; + if (nbr == -2147483648) + return (write(1, "-2147483648", 11)); + if (nbr < 0) + { + len = write(1, "-", 1); + nbr *= -1; + } + printnbr_rec(nbr, &len); + if (len < 0) + return (-1); + return (len); } -static void printunbr_rec(unsigned int n) +static void printunbr_rec(unsigned int n, int *len) { char c; + int success; + if (*len < 0) + return ; c = '0' + n % 10; if (n > 9) - printunbr_rec(n / 10); - write(1, &c, 1); + printunbr_rec(n / 10, len); + if (*len < 0) + return ; + success = write(1, &c, 1); + if (success < 0) + *len = -1; + else + (*len)++; } -int ft_printunbr(unsigned int nbr) +int ft_printunbr(unsigned int nbr) { - printunbr_rec(nbr); - return get_len(nbr); + int len; + + len = 0; + printunbr_rec(nbr, &len); + if (len < 0) + return (-1); + return (len); }