From 65a087aa348dc2669401cbc69c72d34af17d07a0 Mon Sep 17 00:00:00 2001 From: gbaconni Date: Wed, 13 Apr 2022 08:01:46 +0200 Subject: [PATCH] Add initial code --- .vscode/c_cpp_properties.json | 16 ++++ .vscode/launch.json | 26 ++++++ .vscode/settings.json | 30 +++++++ Makefile | 101 +++++++++++++++++++++ ft_printf | Bin 0 -> 18144 bytes libftprintf/Makefile | 127 +++++++++++++++++++++++++++ libftprintf/ft_printf.c | 25 ++++++ libftprintf/ft_vprintf.c | 42 +++++++++ libftprintf/ft_vprintf_char.c | 26 ++++++ libftprintf/ft_vprintf_decimal.c | 32 +++++++ libftprintf/ft_vprintf_hexadecimal.c | 20 +++++ libftprintf/ft_vprintf_other.c | 24 +++++ libftprintf/ft_vprintf_percent.c | 25 ++++++ libftprintf/ft_vprintf_pointer.c | 20 +++++ libftprintf/ft_vprintf_string.c | 29 ++++++ libftprintf/libft/ft_bzero.c | 18 ++++ libftprintf/libft/ft_calloc.c | 27 ++++++ libftprintf/libft/ft_itoa.c | 77 ++++++++++++++++ libftprintf/libft/ft_memset.c | 23 +++++ libftprintf/libft/ft_strlen.c | 34 +++++++ libftprintf/libft/libft.h | 76 ++++++++++++++++ libftprintf/libftprintf.h | 33 +++++++ main.c | 116 ++++++++++++++++++++++++ 23 files changed, 947 insertions(+) create mode 100644 .vscode/c_cpp_properties.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 Makefile create mode 100755 ft_printf create mode 100644 libftprintf/Makefile create mode 100644 libftprintf/ft_printf.c create mode 100644 libftprintf/ft_vprintf.c create mode 100644 libftprintf/ft_vprintf_char.c create mode 100644 libftprintf/ft_vprintf_decimal.c create mode 100644 libftprintf/ft_vprintf_hexadecimal.c create mode 100644 libftprintf/ft_vprintf_other.c create mode 100644 libftprintf/ft_vprintf_percent.c create mode 100644 libftprintf/ft_vprintf_pointer.c create mode 100644 libftprintf/ft_vprintf_string.c create mode 100644 libftprintf/libft/ft_bzero.c create mode 100644 libftprintf/libft/ft_calloc.c create mode 100644 libftprintf/libft/ft_itoa.c create mode 100644 libftprintf/libft/ft_memset.c create mode 100644 libftprintf/libft/ft_strlen.c create mode 100644 libftprintf/libft/libft.h create mode 100644 libftprintf/libftprintf.h create mode 100644 main.c diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..dab2f43 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,16 @@ +{ + "configurations": [ + { + "name": "linux-gcc-x64", + "includePath": [ + "${workspaceFolder}/**" + ], + "compilerPath": "/usr/bin/gcc", + "cStandard": "${default}", + "cppStandard": "${default}", + "intelliSenseMode": "linux-gcc-x64", + "compilerArgs": [] + } + ], + "version": 4 +} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..9393395 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,26 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "C/C++ Runner: Debug Session", + "type": "cppdbg", + "request": "launch", + "args": [], + "stopAtEntry": false, + "cwd": "~/ft_printf", + "environment": [], + "program": "~/baco/ft_printf/build/Debug/outDebug", + "internalConsoleOptions": "openOnSessionStart", + "MIMode": "gdb", + "miDebuggerPath": "/usr/bin/gdb", + "externalConsole": false, + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..862cfc6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,30 @@ +{ + "C_Cpp_Runner.cCompilerPath": "/usr/bin/gcc", + "C_Cpp_Runner.cppCompilerPath": "/usr/bin/g++", + "C_Cpp_Runner.debuggerPath": "/usr/bin/gdb", + "C_Cpp_Runner.cStandard": "", + "C_Cpp_Runner.cppStandard": "", + "C_Cpp_Runner.msvcBatchPath": "", + "C_Cpp_Runner.warnings": [ + "-Wall", + "-Wextra", + "-Wpedantic" + ], + "C_Cpp_Runner.enableWarnings": true, + "C_Cpp_Runner.warningsAsError": false, + "C_Cpp_Runner.compilerArgs": [], + "C_Cpp_Runner.linkerArgs": [], + "C_Cpp_Runner.includePaths": [], + "C_Cpp_Runner.includeSearch": [ + "*", + "**/*" + ], + "C_Cpp_Runner.excludeSearch": [ + "**/build", + "**/build/**", + "**/.*", + "**/.*/**", + "**/.vscode", + "**/.vscode/**" + ] +} \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..eac2f1e --- /dev/null +++ b/Makefile @@ -0,0 +1,101 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: gbaconni@student.42lausanne.ch +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2022/01/18 15:11:16 by gbaconni #+# #+# # +# Updated: 2022/04/13 07:56:46 by gbaconni ### lausanne.ch # +# # +# **************************************************************************** # +# +# make ft_printf +# make all +# make clean +# make fclean +# make re +# make +# + +NAME = ft_printf + +LIBFTPRINTF = libftprintf +LFLAGS = -L. -L$(LIBFTPRINTF) -lftprintf + +SRC = main.c + +INCLUDE = -I. -I$(LIBFTPRINTF) +HDR = $(LIBFTPRINTF)/libftprintf.h + +CC = gcc +CFLAGS = -Wall -Wextra -Werror +ifeq ($(FAST), 1) + CFLAGS += -v -pipe -O3 -ffast-math -fomit-frame-pointer -funroll-loops + #CFLAGS += -v -pipe -Ofast -ffast-math -funroll-loops -fomit-frame-pointer +endif +ifeq ($(DEBUG), 1) + CFLAGS += -g -O1 -fsanitize=address -fsanitize=undefined -fsanitize=signed-integer-overflow + #CFLAGS += -v -g -O1 -fsanitize=address -fsanitize=undefined -fsanitize=signed-integer-overflow +endif + +RM = rm +RMFLAGS = -f + +VALGRIND = valgrind +VALGRINDFLAGS = --quiet --leak-check=full --show-leak-kinds=all + +NORMINETTE = norminette +NORMINETTEFLAGS = -o + +MAKE = make + +all: $(NAME) + +$(NAME): + @$(MAKE) -C $(LIBFTPRINTF) all >/dev/null 2>&1 + @$(CC) $(CFLAGS) $(INCLUDE) $(SRC) $(LFLAGS) -o $@ + +clean: + @$(RM) $(RMFLAGS) $(NAME) + +fclean: clean + @$(MAKE) -C $(LIBFTPRINTF) fclean + +re: fclean all + +check: + @$(MAKE) -C $(LIBFTPRINTF) check + +debug: + @$(MAKE) -C $(LIBFTPRINTF) re DEBUG=1 + @$(MAKE) re DEBUG=1 + +fast: + @$(MAKE) -C $(LIBFTPRINTF) re FAST=1 + @$(MAKE) re FAST=1 + +test: clean $(NAME) + @./$(NAME) "%c" C || true + @./$(NAME) "%s" "42 Lausanne" || true + @./$(NAME) "%d" 42 || true + +test2: +ifneq ($(DEBUG), 1) + @$(MAKE) test DEBUG=1 +endif + +test3: +ifneq ($(FAST), 1) + @$(MAKE) test FAST=1 +endif + +test4: clean $(NAME) +ifneq ($(DEBUG), 1) + @$(MAKE) test4 DEBUG=1 +else + @$(VALGRIND) $(VALGRINDFLAGS) ./$(NAME) "%c" C || true + @$(VALGRIND) $(VALGRINDFLAGS) ./$(NAME) "%s" "42 Lausanne" || true + @$(VALGRIND) $(VALGRINDFLAGS) ./$(NAME) "%d" 42 || true +endif + diff --git a/ft_printf b/ft_printf new file mode 100755 index 0000000000000000000000000000000000000000..8334ad4ebd9401733dea3f46c493cd6ba010f25c GIT binary patch literal 18144 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 | grep -v '\.[ch]: OK!' || true + +debug: + @$(MAKE) re DEBUG=1 + +fast: + @$(MAKE) re FAST=1 + +func: + @echo "external functions:" + @nm -o *.o | grep ' U _' | grep -v ' U _ft' || true + @echo "" + @echo "allowed functions:" + @nm -o *.o | grep ' U _' | grep -e malloc -e free -e write -e va_start -e va_arg -e va_copy -e va_end || true + @echo "" + @echo "forbidden functions:" + @nm -o *.o | grep ' U _' | grep -v ' U _ft' | grep -v -e malloc -e free -e write -e va_start -e va_arg -e va_copy -e va_end || true + @echo "" + +ft: + @echo "objects:" + @ar -t $(NAME) | grep '\.o$$' + @echo "" + @echo "functions:" + @nm $(NAME) | grep T | grep -o 'ft_.*' | sort -u + diff --git a/libftprintf/ft_printf.c b/libftprintf/ft_printf.c new file mode 100644 index 0000000..c48d305 --- /dev/null +++ b/libftprintf/ft_printf.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_printf.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gbaconni@student.42lausanne.ch +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/18 16:17:58 by gbaconni #+# #+# */ +/* Updated: 2022/04/13 00:21:03 by gbaconni ### lausanne.ch */ +/* */ +/* ************************************************************************** */ + +#include "libftprintf.h" + +int ft_printf(const char *format, ...) +{ + va_list ap; + int ret; + + ret = 0; + va_start(ap, format); + ret += ft_vprintf(format, ap); + va_end(ap); + return (ret); +} diff --git a/libftprintf/ft_vprintf.c b/libftprintf/ft_vprintf.c new file mode 100644 index 0000000..3b2734d --- /dev/null +++ b/libftprintf/ft_vprintf.c @@ -0,0 +1,42 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vprintf.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gbaconni@student.42lausanne.ch +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/20 11:43:52 by gbaconni #+# #+# */ +/* Updated: 2022/04/13 01:24:00 by gbaconni ### lausanne.ch */ +/* */ +/* ************************************************************************** */ + +#include "libftprintf.h" + +int ft_vprintf(char const *format, va_list ap) +{ + int ret; + + ret = 0; + while (*format) + { + if (*format++ == '%') + { + if (*format == '%') + ret += ft_vprintf_percent(format, ap); + else if (*format == 'c') + ret += ft_vprintf_char(format, ap); + else if (*format == 's') + ret += ft_vprintf_string(format, ap); + else if (*format == 'p') + ret += ft_vprintf_pointer(format, ap); + else if (*format == 'd' || *format == 'i' || *format == 'u') + ret += ft_vprintf_decimal(format, ap); + else if (*format == 'x' || *format == 'X') + ret += ft_vprintf_hexadecimal(format, ap); + } + else + ret += ft_vprintf_other(format, ap); + format++; + } + return (ret); +} diff --git a/libftprintf/ft_vprintf_char.c b/libftprintf/ft_vprintf_char.c new file mode 100644 index 0000000..1f550dd --- /dev/null +++ b/libftprintf/ft_vprintf_char.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vprintf_char.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gbaconni@student.42lausanne.ch +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/20 11:54:48 by gbaconni #+# #+# */ +/* Updated: 2022/04/12 08:20:53 by gbaconni ### lausanne.ch */ +/* */ +/* ************************************************************************** */ + +#include "libftprintf.h" + +int ft_vprintf_char(const char *format, va_list ap) +{ + char c; + int ret; + + (void) format; + ret = 0; + c = (char) va_arg(ap, int); + write(1, &c, 1); + ret++; + return (ret); +} diff --git a/libftprintf/ft_vprintf_decimal.c b/libftprintf/ft_vprintf_decimal.c new file mode 100644 index 0000000..bc8c3a1 --- /dev/null +++ b/libftprintf/ft_vprintf_decimal.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vprintf_decimal.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gbaconni@student.42lausanne.ch +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/20 11:55:02 by gbaconni #+# #+# */ +/* Updated: 2022/04/12 23:51:56 by gbaconni ### lausanne.ch */ +/* */ +/* ************************************************************************** */ + +#include "libftprintf.h" + +int ft_vprintf_decimal(const char *format, va_list ap) +{ + int ret; + int len; + int d; + char *s; + + (void) format; + ret = 0; + len = 0; + d = va_arg(ap, int); + s = ft_itoa(d); + len = ft_strlen(s); + write(1, s, len); + ret += len; + free(s); + return (ret); +} diff --git a/libftprintf/ft_vprintf_hexadecimal.c b/libftprintf/ft_vprintf_hexadecimal.c new file mode 100644 index 0000000..2725ff3 --- /dev/null +++ b/libftprintf/ft_vprintf_hexadecimal.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vprintf_hexadecimal.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gbaconni@student.42lausanne.ch +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/20 11:55:33 by gbaconni #+# #+# */ +/* Updated: 2022/04/13 08:00:40 by gbaconni ### lausanne.ch */ +/* */ +/* ************************************************************************** */ + +#include "libftprintf.h" + +int ft_vprintf_hexadecimal(const char *format, va_list ap) +{ + (void) ap; + (void) format; + return (0); +} diff --git a/libftprintf/ft_vprintf_other.c b/libftprintf/ft_vprintf_other.c new file mode 100644 index 0000000..92ff2f4 --- /dev/null +++ b/libftprintf/ft_vprintf_other.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vprintf_other.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gbaconni@student.42lausanne.ch +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/20 12:58:03 by gbaconni #+# #+# */ +/* Updated: 2022/04/13 08:01:05 by gbaconni ### lausanne.ch */ +/* */ +/* ************************************************************************** */ + +#include "libftprintf.h" + +int ft_vprintf_other(const char *format, va_list ap) +{ + int ret; + + (void) ap; + ret = 0; + write(1, format, 1); + ret++; + return (ret); +} diff --git a/libftprintf/ft_vprintf_percent.c b/libftprintf/ft_vprintf_percent.c new file mode 100644 index 0000000..08a45bb --- /dev/null +++ b/libftprintf/ft_vprintf_percent.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vprintf_percent.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gbaconni@student.42lausanne.ch +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/20 11:55:58 by gbaconni #+# #+# */ +/* Updated: 2022/04/13 00:01:47 by gbaconni ### lausanne.ch */ +/* */ +/* ************************************************************************** */ + +#include "libftprintf.h" + +int ft_vprintf_percent(const char *format, va_list ap) +{ + int ret; + + (void) format; + (void) ap; + ret = 0; + write(1, "%", 1); + ret++; + return (ret); +} diff --git a/libftprintf/ft_vprintf_pointer.c b/libftprintf/ft_vprintf_pointer.c new file mode 100644 index 0000000..3e509a0 --- /dev/null +++ b/libftprintf/ft_vprintf_pointer.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vprintf_pointer.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gbaconni@student.42lausanne.ch +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/20 11:56:16 by gbaconni #+# #+# */ +/* Updated: 2022/04/13 08:00:14 by gbaconni ### lausanne.ch */ +/* */ +/* ************************************************************************** */ + +#include "libftprintf.h" + +int ft_vprintf_pointer(const char *format, va_list ap) +{ + (void) ap; + (void) format; + return (0); +} diff --git a/libftprintf/ft_vprintf_string.c b/libftprintf/ft_vprintf_string.c new file mode 100644 index 0000000..c0703f0 --- /dev/null +++ b/libftprintf/ft_vprintf_string.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vprintf_string.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gbaconni@student.42lausanne.ch +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/20 11:56:37 by gbaconni #+# #+# */ +/* Updated: 2022/04/12 23:50:02 by gbaconni ### lausanne.ch */ +/* */ +/* ************************************************************************** */ + +#include "libftprintf.h" + +int ft_vprintf_string(const char *format, va_list ap) +{ + int ret; + int len; + char *s; + + (void) format; + ret = 0; + len = 0; + s = va_arg(ap, char *); + len = ft_strlen(s); + write(1, s, len); + ret += len; + return (ret); +} diff --git a/libftprintf/libft/ft_bzero.c b/libftprintf/libft/ft_bzero.c new file mode 100644 index 0000000..306899f --- /dev/null +++ b/libftprintf/libft/ft_bzero.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_bzero.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gbaconni +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2021/10/11 14:32:52 by gbaconni #+# #+# */ +/* Updated: 2021/10/23 16:21:04 by gbaconni ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_bzero(void *s, size_t n) +{ + ft_memset(s, '\0', n); +} diff --git a/libftprintf/libft/ft_calloc.c b/libftprintf/libft/ft_calloc.c new file mode 100644 index 0000000..2d14162 --- /dev/null +++ b/libftprintf/libft/ft_calloc.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_calloc.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gbaconni +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2021/10/11 14:33:01 by gbaconni #+# #+# */ +/* Updated: 2021/10/23 16:21:19 by gbaconni ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" +#include + +void *ft_calloc(size_t count, size_t size) +{ + void *s; + size_t n; + + n = count * size; + s = (void *) malloc(n); + if (s == NULL) + return (NULL); + ft_bzero(s, n); + return (s); +} diff --git a/libftprintf/libft/ft_itoa.c b/libftprintf/libft/ft_itoa.c new file mode 100644 index 0000000..7336159 --- /dev/null +++ b/libftprintf/libft/ft_itoa.c @@ -0,0 +1,77 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_itoa.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gbaconni +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2021/10/11 14:33:40 by gbaconni #+# #+# */ +/* Updated: 2021/10/23 16:23:10 by gbaconni ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static int ft_intlen(int n); +static char *ft_strrev(char *s); + +char *ft_itoa(int n) +{ + char *s; + int i; + long nbr; + + s = (char *) ft_calloc((ft_intlen(n) + 1), sizeof(char)); + if (s == NULL) + return (NULL); + i = 0; + nbr = n; + if (nbr == 0) + s[i++] = '0'; + if (nbr < 0) + nbr = -nbr; + while (nbr > 0) + { + s[i++] = '0' + nbr % 10; + nbr /= 10; + } + if (n < 0) + s[i++] = '-'; + s[i] = '\0'; + return (ft_strrev(s)); +} + +static int ft_intlen(int n) +{ + size_t len; + + len = 0; + if (n < 0 || n == 0) + len++; + while (!(n < 1 && n > -1)) + { + n /= 10; + len++; + } + return (len); +} + +static char *ft_strrev(char *s) +{ + int len; + int i; + int j; + char c; + + len = ft_strlen(s); + i = 0; + while (i < (len / 2)) + { + j = len - 1 - i; + c = s[i]; + s[i] = s[j]; + s[j] = c; + i++; + } + return (s); +} diff --git a/libftprintf/libft/ft_memset.c b/libftprintf/libft/ft_memset.c new file mode 100644 index 0000000..78537b2 --- /dev/null +++ b/libftprintf/libft/ft_memset.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memset.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gbaconni +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2021/10/11 14:34:07 by gbaconni #+# #+# */ +/* Updated: 2021/10/23 16:24:58 by gbaconni ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memset(void *b, int c, size_t len) +{ + unsigned char *s; + + s = (unsigned char *)b; + while (len--) + *s++ = (unsigned char)c; + return (b); +} diff --git a/libftprintf/libft/ft_strlen.c b/libftprintf/libft/ft_strlen.c new file mode 100644 index 0000000..5e5c51c --- /dev/null +++ b/libftprintf/libft/ft_strlen.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlen.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gbaconni +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2021/10/11 14:35:03 by gbaconni #+# #+# */ +/* Updated: 2021/10/24 13:11:12 by gbaconni ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +size_t ft_strlen(const char *s) +{ + const char *str; + + str = s; + while (*str != '\0') + str++; + return (str - s); +} +/* +size_t ft_strlen(const char *s) +{ + size_t len; + + len = 0; + while (s[len] != '\0') + len++; + return (len); +} +*/ diff --git a/libftprintf/libft/libft.h b/libftprintf/libft/libft.h new file mode 100644 index 0000000..03c9959 --- /dev/null +++ b/libftprintf/libft/libft.h @@ -0,0 +1,76 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* libft.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gbaconni +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2021/10/11 14:35:55 by gbaconni #+# #+# */ +/* Updated: 2021/10/25 10:49:28 by gbaconni ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef LIBFT_H +# define LIBFT_H +# include +# include + +/* Part 1 */ + +int ft_isalpha(int c); +int ft_isdigit(int c); +int ft_isalnum(int c); +int ft_isascii(int c); +int ft_isprint(int c); +size_t ft_strlen(const char *s); +void *ft_memset(void *b, int c, size_t len); +void ft_bzero(void *s, size_t n); +void *ft_memcpy(void *dst, const void *src, size_t n); +void *ft_memmove(void *dst, const void *src, size_t len); +size_t ft_strlcpy(char *dst, const char *src, size_t dstsize); +size_t ft_strlcat(char *dst, const char *src, size_t dstsize); +int ft_toupper(int c); +int ft_tolower(int c); +char *ft_strchr(const char *s, int c); +char *ft_strrchr(const char *s, int c); +int ft_strncmp(const char *s1, const char *s2, size_t n); +void *ft_memchr(const void *s, int c, size_t n); +int ft_memcmp(const void *s1, const void *s2, size_t n); +char *ft_strnstr(const char *haystack, const char *needle, size_t len); +int ft_atoi(const char *str); +void *ft_calloc(size_t count, size_t size); +char *ft_strdup(const char *s1); + +/* Part 2 */ + +char *ft_substr(char const *s, unsigned int start, size_t len); +char *ft_strjoin(char const *s1, char const *s2); +char *ft_strtrim(char const *s1, char const *set); +char **ft_split(char const *s, char c); +char *ft_itoa(int n); +char *ft_strmapi(char const *s, char (*f)(unsigned int, char)); +void ft_striteri(char *s, void (*f)(unsigned int, char*)); +void ft_putchar_fd(char c, int fd); +void ft_putstr_fd(char *s, int fd); +void ft_putendl_fd(char *s, int fd); +void ft_putnbr_fd(int n, int fd); + +/* Bonus */ + +typedef struct s_list +{ + void *content; + struct s_list *next; +} t_list; + +t_list *ft_lstnew(void *content); +void ft_lstadd_front(t_list **alst, t_list *new); +int ft_lstsize(t_list *lst); +t_list *ft_lstlast(t_list *lst); +void ft_lstadd_back(t_list **alst, t_list *new); +void ft_lstdelone(t_list *lst, void (*del)(void *)); +void ft_lstclear(t_list **lst, void (*del)(void *)); +void ft_lstiter(t_list *lst, void (*f)(void *)); +t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *)); + +#endif diff --git a/libftprintf/libftprintf.h b/libftprintf/libftprintf.h new file mode 100644 index 0000000..9abea30 --- /dev/null +++ b/libftprintf/libftprintf.h @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* libftprintf.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gbaconni@student.42lausanne.ch +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/18 15:26:06 by gbaconni #+# #+# */ +/* Updated: 2022/04/12 07:10:26 by gbaconni ### lausanne.ch */ +/* */ +/* ************************************************************************** */ + +#ifndef LIBFTPRINTF_H +# define LIBFTPRINTF_H +# include "libft/libft.h" +# include +# include +# include + +/* Mandatory */ + +int ft_printf(const char *format, ...); +int ft_vprintf(char const *format, va_list ap); +int ft_vprintf_char(const char *format, va_list ap); +int ft_vprintf_string(const char *format, va_list ap); +int ft_vprintf_pointer(const char *format, va_list ap); +int ft_vprintf_decimal(const char *format, va_list ap); +int ft_vprintf_hexadecimal(const char *format, va_list ap); +int ft_vprintf_percent(const char *format, va_list ap); +int ft_vprintf_other(const char *format, va_list ap); + +/* Bonus */ +#endif diff --git a/main.c b/main.c new file mode 100644 index 0000000..3a4a7a5 --- /dev/null +++ b/main.c @@ -0,0 +1,116 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: baco +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/04/13 06:58:46 by gbaconni #+# #+# */ +/* Updated: 2022/04/13 07:54:40 by gbaconni ### lausanne.ch */ +/* */ +/* ************************************************************************** */ + +#include // printf +#include // va_list, va_start, va_end +#include // write +#include // strlen +#include // malloc, free +#include // isdigit +#include "libftprintf/libftprintf.h" + +int isnumber(char *s); +int isstring(char *s); + +int isnumber(char *s) +{ + int i; + + i = 0; + while (s[i]) + { + if (!isdigit(s[i])) + return (0); + i++; + } + return (1); +} + +int isstring(char *s) +{ + int i; + + i = 0; + while (s[i]) + { + if (!isprint(s[i])) + return (0); + i++; + } + return (1); +} + +/* +int diff_printf_decimal(const char *format, va_list ap); +int diff_printf_decimal(const char *format, va_list ap) +{ + int ret; + int d; + char *s; + + ret = 0; + d = 0; + d = atoi(argv[2]); + ret = printf(format, d); + printf(": %d = printf(\"%s\", %d)\n", ret, format, d); + ret = ft_printf(format, d); + printf(": %d = ft_printf(\"%s\", %d)\n", ret, format, d); + return (ret); +} +*/ + +int main(int argc, char *argv[]) +{ + int ret; + char *format; + int d; + char c; + char *s; + + d = 0; + c = '\0'; + s = ""; + (void)s; + if (argc > 1) + { + format = argv[1]; + if (isnumber(argv[2])) + { + d = atoi(argv[2]); + ret = printf(format, d); + printf(": %d = printf(\"%s\", %d)\n", ret, format, d); + ret = ft_printf(format, d); + printf(": %d = ft_printf(\"%s\", %d)\n", ret, format, d); + } + else if (ft_strlen(argv[2]) == 1 && isalnum(argv[2][0])) + { + c = argv[2][0]; + ret = printf(format, c); + printf(": %d = printf(\"%s\", '%c')\n", ret, format, c); + ret = ft_printf(format, c); + printf(": %d = ft_printf(\"%s\", '%c')\n", ret, format, c); + } + else if (ft_strlen(argv[2]) > 1 && isstring(argv[2])) + { + s = argv[2]; + ret = printf(format, s); + printf(": %d = printf(\"%s\", \"%s\")\n", ret, format, s); + ret = ft_printf(format, s); + printf(": %d = ft_printf(\"%s\", \"%s\")\n", ret, format, s); + } + else + { + printf("Error: invalid argument\n"); + } + } + return (0); +}