diff --git a/Makefile b/Makefile index 39aad45..4daa681 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/17 11:51:17 by gbaconni ### lausanne.ch # +# Updated: 2022/04/17 13:18:09 by gbaconni ### lausanne.ch # # # # **************************************************************************** # # diff --git a/main.c b/main.c index a02c388..71a2e99 100644 --- a/main.c +++ b/main.c @@ -6,7 +6,7 @@ /* By: baco +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/04/13 06:58:46 by gbaconni #+# #+# */ -/* Updated: 2022/04/17 09:59:04 by gbaconni ### lausanne.ch */ +/* Updated: 2022/04/17 18:51:22 by gbaconni ### lausanne.ch */ /* */ /* ************************************************************************** */ @@ -18,40 +18,13 @@ #include // isdigit #include // assert #include +#include +#include +#include +#include // wait #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); -} - void ft_begin(int *fd) { pipe(fd); @@ -61,10 +34,64 @@ void ft_begin(int *fd) void ft_end(int *fd, char *str) { - close(fd[1]); - read(fd[0], str, sizeof(str)); - close(fd[0]); + char c; + dup2(fd[2], STDOUT_FILENO); + fflush(stdout); + close(fd[1]); + while (read(fd[0], &c, 1) > 0) + *str++ = c; + *str = '\0'; + close(fd[0]); +} + +void ft_begin2(char *out) +{ + freopen("/dev/null", "a", stdout); + setbuf(stdout, out); +} + +void ft_end2(void) +{ + freopen("/dev/tty", "a", stdout); +} + +int ft_sprintf(char *str, const char *format, ...) +{ + va_list ap; + int ret; + int state; + char c; + pid_t cpid; + int pipefd[3]; + const int piperead = 0; + const int pipewrite = 1; + const int pipestdout = 2; + + ret = 0; + pipe(pipefd); + cpid = fork(); + if (cpid == 0) + { + close(pipefd[piperead]); + pipefd[pipestdout] = dup(STDOUT_FILENO); + dup2(pipefd[pipewrite], STDOUT_FILENO); + va_start(ap, format); + ret = ft_vprintf(format, ap); + va_end(ap); + fflush(stdout); + dup2(pipefd[pipestdout], STDOUT_FILENO); + close(pipefd[pipestdout]); + close(pipefd[pipewrite]); + exit (ret); + } else { + close(pipefd[pipewrite]); + while (read(pipefd[piperead], &c, 1) > 0) + *str++ = c; + close(pipefd[piperead]); + wait(&state); + return (WEXITSTATUS(state)); + } } int main(int argc, char *argv[]) @@ -79,7 +106,7 @@ int main(int argc, char *argv[]) char *s; int x; void *ptr; - int fd[3]; + int fd[3]; d = 0; c = '\0'; @@ -95,23 +122,26 @@ int main(int argc, char *argv[]) if (format[1] == 'c') { c = argv[2][0]; - ret = printf(format, c); + ret = sprintf(out, format, c); printf("%d = printf(\"%s\", '%c')\n%s\n", ret, format, c, out); ft_begin(fd); ft_ret = ft_printf(format, c); ft_end(fd, ft_out); - printf("%d = ft_printf(\"%s\", '%c')\n%s\n", ret, format, c, ft_out); + printf("%d = ft_printf(\"%s\", '%c')\n%s\n\n", ft_ret, format, c, ft_out); assert(ret == ft_ret); assert(strcmp(out, ft_out) == 0); } else if (format[1] == 's') { s = argv[2]; - ret = printf(format, s); - printf(": %d = printf(\"%s\", \"%s\")\n", ret, format, s); + ret = sprintf(out, format, s); + printf("%d = printf(\"%s\", \"%s\")\n%s\n", ret, format, s, out); + ft_begin(fd); ft_ret = ft_printf(format, s); - printf(": %d = ft_printf(\"%s\", \"%s\")\n", ret, format, s); + ft_end(fd, ft_out); + printf("%d = ft_printf(\"%s\", \"%s\")\n%s\n\n", ft_ret, format, s, ft_out); assert(ret == ft_ret); + assert(strcmp(out, ft_out) == 0); } else if (format[1] == 'p') { @@ -121,39 +151,51 @@ int main(int argc, char *argv[]) s = NULL; ptr = NULL; } - ret = printf(format, ptr); - printf(": %d = printf(\"%s\", \"%s\")\n", ret, format, s); + ret = sprintf(out, format, ptr); + printf("%d = printf(\"%s\", %p)\n%s\n", ret, format, ptr, out); + ft_begin(fd); ft_ret = ft_printf(format, ptr); - printf(": %d = ft_printf(\"%s\", \"%s\")\n", ret, format, s); + ft_end(fd, ft_out); + printf("%d = ft_printf(\"%s\", %p)\n%s\n\n", ft_ret, format, ptr, ft_out); assert(ret == ft_ret); + assert(strcmp(out, ft_out) == 0); } else if (format[1] == 'd' || format[1] == 'i' || format[1] == 'u') { d = atoi(argv[2]); - ret = printf(format, d); - printf(": %d = printf(\"%s\", %d)\n", ret, format, d); + ret = sprintf(out, format, d); + printf("%d = printf(\"%s\", %d)\n%s\n", ret, format, d, out); + ft_begin(fd); ft_ret = ft_printf(format, d); - printf(": %d = ft_printf(\"%s\", %d)\n", ret, format, d); + ft_end(fd, ft_out); + printf("%d = ft_printf(\"%s\", %d)\n%s\n\n", ft_ret, format, d, ft_out); assert(ret == ft_ret); + assert(strcmp(out, ft_out) == 0); } else if (format[1] == 'x' || format[1] == 'X') { d = atoi(argv[2]); - ret = printf(format, d); - printf(": %d = printf(\"%s\", %d)\n", ret, format, d); + ret = sprintf(out, format, d); + printf("%d = printf(\"%s\", %d)\n%s\n", ret, format, d, out); + ft_begin(fd); ft_ret = ft_printf(format, d); - printf(": %d = ft_printf(\"%s\", %d)\n", ret, format, d); + ft_end(fd, ft_out); + printf("%d = ft_printf(\"%s\", %d)\n%s\n\n", ft_ret, format, d, ft_out); assert(ret == ft_ret); + assert(strcmp(out, ft_out) == 0); } } else { s = argv[2]; - ret = printf(format, s); - printf(": %d = printf(\"%s\", \"%s\")\n", ret, format, s); + ret = sprintf(out, format, s); + printf("%d = printf(\"%s\", \"%s\")\n%s\n", ret, format, s, out); + ft_begin(fd); ft_ret = ft_printf(format, s); - printf(": %d = ft_printf(\"%s\", \"%s\")\n", ret, format, s); + ft_end(fd, ft_out); + printf("%d = ft_printf(\"%s\", \"%s\")\n%s\n\n", ft_ret, format, s, ft_out); assert(ret == ft_ret); + assert(strcmp(out, ft_out) == 0); } } return (0);