summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rw-r--r--ft_printaddr.c42
-rw-r--r--ft_printf.c90
-rw-r--r--ft_printf.h24
-rw-r--r--ft_printhex.c44
-rw-r--r--ft_printnbr.c80
-rw-r--r--libft.h3
7 files changed, 286 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index 1fdbab6..9e94fb2 100644
--- a/Makefile
+++ b/Makefile
@@ -36,6 +36,10 @@ SRC_FILES = ft_atoi.c \
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)
diff --git a/ft_printaddr.c b/ft_printaddr.c
new file mode 100644
index 0000000..f60ce0d
--- /dev/null
+++ b/ft_printaddr.c
@@ -0,0 +1,42 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* 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);
+}
diff --git a/ft_printf.c b/ft_printf.c
new file mode 100644
index 0000000..fc77f81
--- /dev/null
+++ b/ft_printf.c
@@ -0,0 +1,90 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* 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);
+}
diff --git a/ft_printf.h b/ft_printf.h
new file mode 100644
index 0000000..22f6a2a
--- /dev/null
+++ b/ft_printf.h
@@ -0,0 +1,24 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* 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
diff --git a/ft_printhex.c b/ft_printhex.c
new file mode 100644
index 0000000..4605eac
--- /dev/null
+++ b/ft_printhex.c
@@ -0,0 +1,44 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* 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);
+}
diff --git a/ft_printnbr.c b/ft_printnbr.c
new file mode 100644
index 0000000..2a42ed8
--- /dev/null
+++ b/ft_printnbr.c
@@ -0,0 +1,80 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* 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);
+}
diff --git a/libft.h b/libft.h
index 148094f..0e35f35 100644
--- a/libft.h
+++ b/libft.h
@@ -6,13 +6,14 @@
/* 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>