ft_substr.c \
ft_tolower.c \
ft_toupper.c \
+ ft_printf.c \
+ ft_printnbr.c \
+ ft_printhex.c \
+ ft_printaddr.c
OBJ_FILES = $(SRC_FILES:.c=.o)
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_printaddr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2024/03/15 10:33:53 by dkaiser #+# #+# */
+/* Updated: 2024/03/18 11:42:58 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);
+ success = write(1, &c, 1);
+ if (success < 0 || *len < 2)
+ *len = -1;
+ else
+ (*len)++;
+}
+
+int ft_printaddr(void *addr)
+{
+ int len;
+
+ len = write(1, "0x", 2);
+ printaddr_rec((unsigned long)addr, &len);
+ return (len);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_printf.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2024/03/12 18:18:59 by dkaiser #+# #+# */
+/* Updated: 2024/03/18 11:42:34 by dkaiser ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "ft_printf.h"
+
+static int print_char(char c)
+{
+ return (write(1, &c, 1));
+}
+
+static int print_str(char *str)
+{
+ 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)
+{
+ 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(const char *fmt, ...)
+{
+ int result;
+ int last_result;
+ int success;
+ va_list args;
+
+ 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);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_printf.h :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2024/03/12 18:19:47 by dkaiser #+# #+# */
+/* Updated: 2024/03/15 13:33:09 by dkaiser ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#ifndef FT_PRINTF_H
+# define FT_PRINTF_H
+
+# include <stdarg.h>
+# include <unistd.h>
+
+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
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_printhex.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2024/03/13 15:50:35 by dkaiser #+# #+# */
+/* Updated: 2024/03/18 11:42:46 by dkaiser ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "ft_printf.h"
+
+static void printhex_rec(unsigned int nbr, char fmt, int *len)
+{
+ char c;
+ int success;
+
+ 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)++;
+}
+
+int ft_printhex(unsigned int nbr, char fmt)
+{
+ int len;
+
+ len = 0;
+ printhex_rec(nbr, fmt, &len);
+ return (len);
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_printnbr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2024/03/13 15:18:40 by dkaiser #+# #+# */
+/* Updated: 2024/03/18 11:41:27 by dkaiser ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "ft_printf.h"
+
+static void printnbr_rec(int n, int *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 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, int *len)
+{
+ char c;
+ int success;
+
+ if (*len < 0)
+ return ;
+ c = '0' + n % 10;
+ if (n > 9)
+ 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 len;
+
+ len = 0;
+ printunbr_rec(nbr, &len);
+ if (len < 0)
+ return (-1);
+ return (len);
+}
/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/03/10 16:37:54 by dkaiser #+# #+# */
-/* Updated: 2024/03/11 13:11:23 by dkaiser ### ########.fr */
+/* Updated: 2024/04/12 16:44:02 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef LIBFT_H
# define LIBFT_H
+# include "ft_printf.h"
# include <stdlib.h>
# include <string.h>
# include <unistd.h>