summaryrefslogtreecommitdiff
path: root/ft_printf.c
diff options
context:
space:
mode:
Diffstat (limited to 'ft_printf.c')
-rw-r--r--ft_printf.c90
1 files changed, 90 insertions, 0 deletions
diff --git a/ft_printf.c b/ft_printf.c
new file mode 100644
index 0000000..b107513
--- /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/15 13:05:57 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);
+}