summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Kaiser2024-03-13 16:05:39 +0100
committerDominik Kaiser2024-03-13 16:05:39 +0100
commitb2bc6137aee0742dc1bc566ce2674e92988bdf65 (patch)
tree5bea3c0388e2d8a9d41806c50c36e8cbc9ccc7d1
parentddb39c38dcdae5f4efbf0ce0a26c4c4276eff024 (diff)
downloadft_printf-b2bc6137aee0742dc1bc566ce2674e92988bdf65.tar.gz
ft_printf-b2bc6137aee0742dc1bc566ce2674e92988bdf65.zip
Add all functions but %p
-rw-r--r--ft_printf.h9
-rw-r--r--src/ft_printf.c58
-rw-r--r--src/ft_printhex.c47
-rw-r--r--src/ft_printnbr.c53
4 files changed, 164 insertions, 3 deletions
diff --git a/ft_printf.h b/ft_printf.h
index a148f73..2a3fbb9 100644
--- a/ft_printf.h
+++ b/ft_printf.h
@@ -6,13 +6,18 @@
/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/03/12 18:19:47 by dkaiser #+# #+# */
-/* Updated: 2024/03/12 18:20:41 by dkaiser ### ########.fr */
+/* Updated: 2024/03/13 16:01:09 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef FT_PRINTF_H
# define FT_PRINTF_H
-int ft_printf(char *fmt, ...);
+#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);
#endif // FT_PRINTF_H
diff --git a/src/ft_printf.c b/src/ft_printf.c
index fe152f6..f6984c7 100644
--- a/src/ft_printf.c
+++ b/src/ft_printf.c
@@ -6,13 +6,69 @@
/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/03/12 18:18:59 by dkaiser #+# #+# */
-/* Updated: 2024/03/12 18:20:15 by dkaiser ### ########.fr */
+/* Updated: 2024/03/13 16:02:04 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
#include "../ft_printf.h"
+#include <stdarg.h>
+
+static int print_char(char c)
+{
+ ft_putchar_fd(c, 1);
+ return 1;
+}
+
+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;
+ }
+}
+
+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;
+}
int ft_printf(char *fmt, ...)
{
+ int result;
+ 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);
}
diff --git a/src/ft_printhex.c b/src/ft_printhex.c
new file mode 100644
index 0000000..e96b322
--- /dev/null
+++ b/src/ft_printhex.c
@@ -0,0 +1,47 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_printhex.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* 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 */
+/* */
+/* ************************************************************************** */
+
+#include "../ft_printf.h"
+
+static int get_len(unsigned int n)
+{
+ int len;
+
+ len = 0;
+ if (n == 0)
+ return 1;
+ while (n)
+ {
+ len++;
+ n /= 16;
+ }
+ return len;
+}
+
+static void printhex_rec(unsigned int nbr, char fmt)
+{
+ char c;
+
+ 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);
+}
diff --git a/src/ft_printnbr.c b/src/ft_printnbr.c
new file mode 100644
index 0000000..cd20025
--- /dev/null
+++ b/src/ft_printnbr.c
@@ -0,0 +1,53 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_printnbr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* 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 */
+/* */
+/* ************************************************************************** */
+
+#include "../ft_printf.h"
+#include <unistd.h>
+
+static int get_len(long n)
+{
+ int len;
+
+ len = 0;
+ if (n == 0)
+ return 1;
+ if (n < 0)
+ len++;
+ while (n)
+ {
+ len++;
+ n /= 10;
+ }
+ return len;
+}
+
+int ft_printnbr(int nbr)
+{
+ ft_putnbr_fd(nbr, 1);
+ return get_len(nbr);
+}
+
+static void printunbr_rec(unsigned int n)
+{
+ char c;
+
+ c = '0' + n % 10;
+ if (n > 9)
+ printunbr_rec(n / 10);
+ write(1, &c, 1);
+}
+
+int ft_printunbr(unsigned int nbr)
+{
+ printunbr_rec(nbr);
+ return get_len(nbr);
+}