From 34fe699fea0796a05e2e7d4f8e472860446dbf09 Mon Sep 17 00:00:00 2001 From: gbaconni Date: Fri, 29 Apr 2022 11:00:53 +0200 Subject: [PATCH] Add ft_vprintf_precision_bonus and define HEXA_LOWER HEXA_UPPER --- Makefile | 5 ++- libftprintf/Makefile | 8 +++-- libftprintf/ft_vprintf_decimal.c | 20 +++-------- libftprintf/ft_vprintf_hexadecimal.c | 12 +++---- libftprintf/ft_vprintf_pointer.c | 4 +-- libftprintf/ft_vprintf_precision_bonus.c | 31 +++++++++++++++++ libftprintf/ft_vprintf_string.c | 20 +++-------- libftprintf/libftprintf.h | 11 ++++-- tests/Makefile | 44 ++++++++++++++++++++---- 9 files changed, 104 insertions(+), 51 deletions(-) create mode 100644 libftprintf/ft_vprintf_precision_bonus.c diff --git a/Makefile b/Makefile index fdfe93f..5fe971e 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: gbaconni@student.42lausanne.ch +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2022/01/18 15:11:16 by gbaconni #+# #+# # -# Updated: 2022/04/29 09:33:14 by gbaconni ### ########.fr # +# Updated: 2022/04/29 10:12:47 by gbaconni ### ########.fr # # # # **************************************************************************** # # @@ -41,6 +41,9 @@ endif ifeq ($(DEBUG), 1) CFLAGS += -g -O0 -fsanitize=address -fsanitize=undefined -fsanitize=signed-integer-overflow endif +ifeq ($(BONUS), 1) + CFLAGS += -D BONUS=1 +endif VALGRIND = valgrind VALGRINDFLAGS = --quiet --leak-check=full --show-leak-kinds=all diff --git a/libftprintf/Makefile b/libftprintf/Makefile index 7167ae7..53a0913 100644 --- a/libftprintf/Makefile +++ b/libftprintf/Makefile @@ -6,7 +6,7 @@ # By: gbaconni@student.42lausanne.ch +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2022/01/18 15:11:16 by gbaconni #+# #+# # -# Updated: 2022/04/29 09:33:55 by gbaconni ### ########.fr # +# Updated: 2022/04/29 10:20:22 by gbaconni ### ########.fr # # # # **************************************************************************** # # @@ -50,7 +50,8 @@ SRC = \ ft_printf.c SRC_BONUS = \ - ft_vprintf_flags_bonus.c + ft_vprintf_flags_bonus.c \ + ft_vprintf_precision_bonus.c OBJ = ${SRC:.c=.o} OBJ_BONUS = ${SRC_BONUS:.c=.o} @@ -67,6 +68,9 @@ endif ifeq ($(DEBUG), 1) CFLAGS += -g -O0 -fsanitize=address -fsanitize=undefined -fsanitize=signed-integer-overflow endif +ifeq ($(BONUS), 1) + CFLAGS += -D BONUS=1 +endif VALGRIND = valgrind VALGRINDFLAGS = --quiet --leak-check=full --show-leak-kinds=all diff --git a/libftprintf/ft_vprintf_decimal.c b/libftprintf/ft_vprintf_decimal.c index cc7a017..455223a 100644 --- a/libftprintf/ft_vprintf_decimal.c +++ b/libftprintf/ft_vprintf_decimal.c @@ -6,7 +6,7 @@ /* By: gbaconni@student.42lausanne.ch +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/01/20 11:55:02 by gbaconni #+# #+# */ -/* Updated: 2022/04/29 09:09:08 by gbaconni ### lausanne.ch */ +/* Updated: 2022/04/29 10:59:23 by gbaconni ### ########.fr */ /* */ /* ************************************************************************** */ @@ -32,22 +32,10 @@ int ft_vprintf_decimal(const char *format, va_list ap) d = va_arg(ap, int); s = ft_itoa(d); } - - const char *f; - int flags; +#ifdef BONUS int precision; int len; - precision = 0; - flags = ft_vprintf_flags_bonus(format, ap); - f = format; - while (*f != '\0') - { - if (ft_isdigit(*f)) - precision = precision * 10 + *f - '0'; - if (ft_strchr(SPECIFIERS, *f) != NULL) - break ; - f++; - } + precision = ft_vprintf_precision_bonus(format, ap); len = 0; if (precision > 0) { @@ -60,7 +48,7 @@ int ft_vprintf_decimal(const char *format, va_list ap) ret += ft_putchar(' '); } } - +#endif ret += ft_puts(s); free(s); return (ret); diff --git a/libftprintf/ft_vprintf_hexadecimal.c b/libftprintf/ft_vprintf_hexadecimal.c index d222566..3b51a5c 100644 --- a/libftprintf/ft_vprintf_hexadecimal.c +++ b/libftprintf/ft_vprintf_hexadecimal.c @@ -6,7 +6,7 @@ /* By: gbaconni@student.42lausanne.ch +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/01/20 11:55:33 by gbaconni #+# #+# */ -/* Updated: 2022/04/26 17:33:12 by gbaconni ### ########.fr */ +/* Updated: 2022/04/29 10:58:24 by gbaconni ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,18 +18,18 @@ int ft_vprintf_hexadecimal(const char *format, va_list ap) long l; char *s; char c; - int flags; ret = 0; l = va_arg(ap, long); c = *format; if (c == 'x') - s = ft_ltoa_base(l, "0123456789abcdef"); + s = ft_ltoa_base(l, HEXA_LOWER); else - s = ft_ltoa_base(l, "0123456789ABCDEF"); - flags = ft_vprintf_flags_bonus(format, ap); - if (flags & F_HASH) + s = ft_ltoa_base(l, HEXA_UPPER); +#ifdef BONUS + if (ft_vprintf_flags_bonus(format, ap) & F_HASH) ret += ft_puts("0x"); +#endif ret += ft_puts(s); free(s); return (ret); diff --git a/libftprintf/ft_vprintf_pointer.c b/libftprintf/ft_vprintf_pointer.c index e840526..d114e81 100644 --- a/libftprintf/ft_vprintf_pointer.c +++ b/libftprintf/ft_vprintf_pointer.c @@ -6,7 +6,7 @@ /* By: gbaconni@student.42lausanne.ch +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/01/20 11:56:16 by gbaconni #+# #+# */ -/* Updated: 2022/04/26 13:53:06 by gbaconni ### ########.fr */ +/* Updated: 2022/04/29 10:59:11 by gbaconni ### ########.fr */ /* */ /* ************************************************************************** */ @@ -26,7 +26,7 @@ int ft_vprintf_pointer(const char *format, va_list ap) ret = ft_puts(NIL); return (ret); } - s = ft_ltoa_base((long) p, "0123456789abcdef"); + s = ft_ltoa_base((long) p, HEXA_LOWER); ret += ft_puts("0x"); ret += ft_puts(s); free(s); diff --git a/libftprintf/ft_vprintf_precision_bonus.c b/libftprintf/ft_vprintf_precision_bonus.c new file mode 100644 index 0000000..4d0790e --- /dev/null +++ b/libftprintf/ft_vprintf_precision_bonus.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vprintf_string.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gbaconni@student.42lausanne.ch +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/20 11:56:37 by gbaconni #+# #+# */ +/* Updated: 2022/04/29 10:21:31 by gbaconni ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libftprintf.h" + +int ft_vprintf_precision_bonus(const char *format, va_list ap) +{ + int ret; + const char *f; + + ret = 0; + f = format; + while (*f != '\0') + { + if (ft_isdigit(*f)) + ret = ret * 10 + *f - '0'; + if (ft_strchr(SPECIFIERS, *f) != NULL) + break ; + f++; + } + return (ret); +} diff --git a/libftprintf/ft_vprintf_string.c b/libftprintf/ft_vprintf_string.c index 46690f5..8353ac3 100644 --- a/libftprintf/ft_vprintf_string.c +++ b/libftprintf/ft_vprintf_string.c @@ -6,7 +6,7 @@ /* By: gbaconni@student.42lausanne.ch +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/01/20 11:56:37 by gbaconni #+# #+# */ -/* Updated: 2022/04/29 09:03:47 by gbaconni ### lausanne.ch */ +/* Updated: 2022/04/29 10:52:32 by gbaconni ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,29 +25,17 @@ int ft_vprintf_string(const char *format, va_list ap) ret = ft_puts("(null)"); return (ret); } - - const char *f; +#ifdef BONUS int precision; int len; - int flags; - precision = 0; - flags = ft_vprintf_flags_bonus(format, ap); - (void) flags; - f = format; - while (*f != '\0') - { - if (ft_isdigit(*f)) - precision = precision * 10 + *f - '0'; - if (ft_strchr(SPECIFIERS, *f) != NULL) - break ; - f++; - } + precision = ft_vprintf_precision_bonus(format, ap); if (precision > 0) { len = precision - ft_strlen(s); while (len-- > 0) ret += ft_putchar(' '); } +#endif ret += ft_puts(s); return (ret); } diff --git a/libftprintf/libftprintf.h b/libftprintf/libftprintf.h index ee380d3..4899794 100644 --- a/libftprintf/libftprintf.h +++ b/libftprintf/libftprintf.h @@ -6,7 +6,7 @@ /* By: gbaconni@student.42lausanne.ch +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/01/18 15:26:06 by gbaconni #+# #+# */ -/* Updated: 2022/04/29 08:56:40 by gbaconni ### lausanne.ch */ +/* Updated: 2022/04/29 10:58:37 by gbaconni ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,13 +17,17 @@ # include # include -# if defined (__APPLE__) +/* Constants */ + +# ifdef __APPLE__ # define NIL "0x0" # else # define NIL "(nil)" # endif # define SPECIFIERS "cspdiuxX%" +# define HEXA_LOWER "0123456789abcdef" +# define HEXA_UPPER "0123456789ABCDEF" /* Helper */ @@ -48,6 +52,7 @@ int ft_vprintf_percent(const char *format, va_list ap); int ft_vprintf_escape(const char *format, va_list ap); int ft_vprintf_other(const char *format, va_list ap); +# ifdef BONUS /* Bonus */ enum { @@ -58,6 +63,8 @@ enum { F_PLUS = 1 << 4 }; +int ft_vprintf_precision_bonus(const char *format, va_list ap); int ft_vprintf_flags_bonus(const char *format, va_list ap); +# endif #endif diff --git a/tests/Makefile b/tests/Makefile index 2aad5b3..3fefd19 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -6,26 +6,58 @@ # By: gbaconni@student.42lausanne.ch +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2022/04/16 20:12:38 by gbaconni #+# #+# # -# Updated: 2022/04/16 20:22:22 by gbaconni ### lausanne.ch # +# Updated: 2022/04/29 10:00:15 by gbaconni ### ########.fr # # # # **************************************************************************** # -UNAME_S = $(shell uname -s) +KERNEL = $(shell uname -s) +MACHINE = $(shell uname -m) all: test -libftprintf.a: +libftprintf.a: libftprintf @ln -snf ../libftprintf/libftprintf.a libftprintf.a +libftprintf: + @make -C ../libftprintf bonus + +bonus: test-pft + test: test-pft -test-pft: libftprintf.a +test2: test-pft2 + +test3: test-pft3 + +test-pft: + @cd pft && ./test mix + +test-pft2: + @cd pft && ./test + +test-pft3: + @cd pft && ./test c + @cd pft && ./test s + @cd pft && ./test p + @cd pft && ./test d + @cd pft && ./test i + @cd pft && ./test u + @cd pft && ./test x + @cd pft && ./test X + +pft: libftprintf.a @test -d pft || git clone https://github.com/gavinfielder/pft.git pft -ifeq ($(UNAME_S),Linux) +ifeq ($(KERNEL),Linux) @which php >/dev/null 2>&1 || sudo apt-get install -qq -y php-cli @sed -i -r 's/^(INCLUDE_LIBPTHREAD)=.*/\1=1/' pft/options-config.ini +endif +ifeq ($(KERNEL),Darwin) endif @make -C pft - @cd pft && ./test +clean: + @make -C pft clean + +fclean: + @rm -fr pft