]> git.dkaiser.de - 42/ft_printf.git/commitdiff
Add error handling
authorDominik Kaiser <dkaiser@1-C-9.42heilbronn.de>
Fri, 15 Mar 2024 12:02:59 +0000 (13:02 +0100)
committerDominik Kaiser <dkaiser@1-C-9.42heilbronn.de>
Fri, 15 Mar 2024 12:02:59 +0000 (13:02 +0100)
Makefile
ft_printf.h
src/ft_printaddr.c [new file with mode: 0644]
src/ft_printf.c
src/ft_printhex.c
src/ft_printnbr.c

index 8ac63f87d093b8d8e6da8f5e36f177b06f0cd0e8..bb1667f78b71604dc1bd61695196e76be582dae1 100644 (file)
--- 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
index 2a3fbb981b138f8d849148def87a373f3a29d4ba..eb43e4435b2b8064dffa4b5fe7a5509abe54dea0 100644 (file)
@@ -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 (file)
index 0000000..8b43ed9
--- /dev/null
@@ -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);
+}
index f6984c78459db61cfa65b0e269b46872b68f16db..f85f07134b9687b3852c65c8e455856cab9fce48 100644 (file)
@@ -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);
 }
index e96b322da0f1ad522a44681fe07a2c049958edc7..d65de1ce7ff0c07c9bcd5a4ef0422588d5528b71 100644 (file)
@@ -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);
 }
index cd20025386456ae30ea6943c326056086681f371..282e7a86bbd67009bd36922c5ea4b9efcf96509c 100644 (file)
@@ -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);
 }