diff options
| author | Dominik Kaiser | 2024-03-15 13:02:59 +0100 |
|---|---|---|
| committer | Dominik Kaiser | 2024-03-15 13:02:59 +0100 |
| commit | 02344fc38e2375102a913685c21acc35141c2cb0 (patch) | |
| tree | f5ed6805dd8b19fb02a69f8071370c17bf57d176 | |
| parent | a04e883febff882c89b92a9f61227dec11900156 (diff) | |
| download | ft_printf-02344fc38e2375102a913685c21acc35141c2cb0.tar.gz ft_printf-02344fc38e2375102a913685c21acc35141c2cb0.zip | |
Add error handling
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | ft_printf.h | 15 | ||||
| -rw-r--r-- | src/ft_printaddr.c | 44 | ||||
| -rw-r--r-- | src/ft_printf.c | 113 | ||||
| -rw-r--r-- | src/ft_printhex.c | 51 | ||||
| -rw-r--r-- | src/ft_printnbr.c | 77 |
6 files changed, 194 insertions, 108 deletions
@@ -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 <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/12 18:19:47 by dkaiser #+# #+# */ -/* Updated: 2024/03/13 16:01:09 by dkaiser ### ########.fr */ +/* Updated: 2024/03/15 12:40:58 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef FT_PRINTF_H # define FT_PRINTF_H -#include "libft/libft.h" -#include <stdarg.h> +# include "libft/libft.h" +# include <stdarg.h> -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 <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/03/15 10:33:53 by dkaiser #+# #+# */ +/* Updated: 2024/03/15 12:40:52 by dkaiser ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../ft_printf.h" + +static void printaddr_rec(unsigned long addr, int *len) +{ + char c; + int success; + + if (*len < 0) + return ; + if (addr % 16 < 10) + c = '0' + (addr % 16); + else + c = ('a' - 10) + (addr % 16); + if (addr > 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 <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/12 18:18:59 by dkaiser #+# #+# */ -/* Updated: 2024/03/13 16:02:04 by dkaiser ### ########.fr */ +/* Updated: 2024/03/15 12:40:47 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ #include "../ft_printf.h" #include <stdarg.h> -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 <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/13 15:50:35 by dkaiser #+# #+# */ -/* Updated: 2024/03/13 16:00:38 by dkaiser ### ########.fr */ +/* Updated: 2024/03/15 12:40:38 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ #include "../ft_printf.h" -static int get_len(unsigned int n) +static void printhex_rec(unsigned int nbr, char fmt, int *len) { - int len; + char c; + int success; - len = 0; - if (n == 0) - return 1; - while (n) - { - len++; - n /= 16; - } - return len; + if (*len < 0) + return ; + if (nbr % 16 < 10) + c = '0' + (nbr % 16); + else + c = (fmt - 33) + (nbr % 16); + if (nbr > 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 <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/13 15:18:40 by dkaiser #+# #+# */ -/* Updated: 2024/03/13 15:49:00 by dkaiser ### ########.fr */ +/* Updated: 2024/03/15 12:40:43 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ #include "../ft_printf.h" -#include <unistd.h> -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); } |
