CC = cc
CFLAGS = -Wall -Wextra -Werror
-SRC_FILES = src/ft_printf.c src/ft_printnbr.c src/ft_printhex.c
+SRC_FILES = src/ft_printf.c src/ft_printnbr.c src/ft_printhex.c src/ft_printaddr.c
OBJ_FILES = $(SRC_FILES:.c=.o)
LIBFT = libft/libft.a
/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/03/12 18:19:47 by dkaiser #+# #+# */
-/* Updated: 2024/03/13 16:01:09 by dkaiser ### ########.fr */
+/* Updated: 2024/03/15 12:40:58 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef FT_PRINTF_H
# define FT_PRINTF_H
-#include "libft/libft.h"
-#include <stdarg.h>
+# 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);
+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_printaddr.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2024/03/15 10:33:53 by dkaiser #+# #+# */
+/* Updated: 2024/03/15 12:40:52 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);
+ if (*len < 0)
+ return ;
+ success = write(1, &c, 1);
+ if (success < 0)
+ *len = -1;
+ else
+ (*len)++;
+}
+
+int ft_printaddr(void *addr)
+{
+ int len;
+
+ len = write(1, "0x", 2);
+ printaddr_rec((unsigned long)addr, &len);
+ return (len);
+}
/* 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);
}
/* 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 */
+/* Updated: 2024/03/15 12:40:38 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
#include "../ft_printf.h"
-static int get_len(unsigned int n)
+static void printhex_rec(unsigned int nbr, char fmt, int *len)
{
- int len;
+ char c;
+ int success;
- len = 0;
- if (n == 0)
- return 1;
- while (n)
- {
- len++;
- n /= 16;
- }
- return len;
+ 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)++;
}
-static void printhex_rec(unsigned int nbr, char fmt)
+int ft_printhex(unsigned int nbr, char fmt)
{
- char c;
+ int len;
- 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);
+ len = 0;
+ printhex_rec(nbr, fmt, &len);
+ return (len);
}
/* 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 */
+/* Updated: 2024/03/15 12:40:43 by dkaiser ### ########.fr */
/* */
/* ************************************************************************** */
#include "../ft_printf.h"
-#include <unistd.h>
-static int get_len(long n)
+static void printnbr_rec(int n, int *len)
{
- int len;
-
- len = 0;
- if (n == 0)
- return 1;
- if (n < 0)
- len++;
- while (n)
- {
- len++;
- n /= 10;
- }
- return 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 ft_printnbr(int nbr)
{
- ft_putnbr_fd(nbr, 1);
- return get_len(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)
+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);
- write(1, &c, 1);
+ 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 ft_printunbr(unsigned int nbr)
{
- printunbr_rec(nbr);
- return get_len(nbr);
+ int len;
+
+ len = 0;
+ printunbr_rec(nbr, &len);
+ if (len < 0)
+ return (-1);
+ return (len);
}