summaryrefslogtreecommitdiff
path: root/src/ft_printf.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ft_printf.c')
-rw-r--r--src/ft_printf.c113
1 files changed, 65 insertions, 48 deletions
diff --git a/src/ft_printf.c b/src/ft_printf.c
index f6984c7..f85f071 100644
--- a/src/ft_printf.c
+++ b/src/ft_printf.c
@@ -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);
}