diff --git a/Makefile b/Makefile index 3569988..ac94fdf 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: tmaze +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2019/02/09 15:12:22 by tmaze #+# #+# # -# Updated: 2019/02/09 15:45:01 by tmaze ### ########.fr # +# Updated: 2019/02/11 14:01:32 by tmaze ### ########.fr # # # #******************************************************************************# @@ -16,9 +16,10 @@ CCSTD := NAME := libftprintf.a -SRCS := ft_printf.c pf_getflags.c +SRCS := ft_printf.c pf_getflags.c pf_strchr.c pf_isdigit.c pf_atoi.c pf_toupper.c pf_convc.c pf_memset.c pf_strlen.c pf_strnew.c pf_convs.c OBJS_DIR := objs OBJS := $(SRCS:.c=.o) +INCLS := -Iincludes .PHONY = all clean fclean re diff --git a/includes/libftprintf.h b/includes/libftprintf.h index 0ae1547..177177d 100644 --- a/includes/libftprintf.h +++ b/includes/libftprintf.h @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/07 13:03:44 by tmaze #+# #+# */ -/* Updated: 2019/02/09 14:38:22 by tmaze ### ########.fr */ +/* Updated: 2019/02/11 10:06:43 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,8 +14,11 @@ # define LIBFTPRINTF_H # include +# include # include +# include + typedef struct s_flags { enum e_convtype @@ -39,8 +42,17 @@ typedef struct s_flags int width; int precision; char size; + char *buffer; } t_flags; +void *pf_memset(void *b, int c, size_t len); +size_t pf_strlen(const char *s); +char *pf_strnew(size_t size); +char *pf_strchr(const char *s, int c); +int pf_isdigit(int c); +int pf_atoi(const char *str); +int pf_toupper(int c); + void pf_putflags(t_flags *flags); size_t pf_getflags(const char *format, t_flags *flags); diff --git a/srcs/ft_printf.c b/srcs/ft_printf.c index e484ec0..d8db396 100644 --- a/srcs/ft_printf.c +++ b/srcs/ft_printf.c @@ -6,23 +6,73 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/07 13:31:16 by tmaze #+# #+# */ -/* Updated: 2019/02/07 14:21:34 by tmaze ### ########.fr */ +/* Updated: 2019/02/11 14:00:11 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "libftprintf.h" +int pf_convp(t_flags *flags, va_list *ap) +{ + flags = NULL; + ap = NULL; + return (1); +} + +int pf_convd(t_flags *flags, va_list *ap) +{ + flags = NULL; + ap = NULL; + return (1); +} + +int pf_convi(t_flags *flags, va_list *ap) +{ + flags = NULL; + ap = NULL; + return (1); +} + +int pf_convo(t_flags *flags, va_list *ap) +{ + flags = NULL; + ap = NULL; + return (1); +} + +int pf_convu(t_flags *flags, va_list *ap) +{ + flags = NULL; + ap = NULL; + return (1); +} + +int pf_convx(t_flags *flags, va_list *ap) +{ + flags = NULL; + ap = NULL; + return (1); +} + +int pf_convf(t_flags *flags, va_list *ap) +{ + flags = NULL; + ap = NULL; + return (1); +} + int ft_printf(const char *format, ...) { va_list ap; size_t i; size_t j; t_flags flags; - static int (*convf[10])(t_flags *flags, va_list *ap) = {pf_convc, + static int (*convf[11])(t_flags *flags, va_list *ap) = {pf_convc, pf_convc, pf_convs, pf_convp, pf_convd, pf_convi, pf_convo, pf_convu, pf_convx, pf_convx, pf_convf}; va_start(ap, format); + flags.buffer = NULL; i = 0; while (format[i]) { @@ -31,6 +81,18 @@ int ft_printf(const char *format, ...) j++; write(1, &format[i], j); i += j; - j = pf_getflags(&format[i], &flags); + if (format[i] == '%') + { + pf_getflags(&format[i], &flags); + if ((j = (*convf[flags.convtype])(&flags, &ap)) != -1) + { + va_end(ap); + return (-1); + } + i += j; + write(1, flags.buffer, pf_strlen(flags.buffer)); + free(flags.buffer); + } } + return (i); } diff --git a/srcs/pf_atoi.c b/srcs/pf_atoi.c new file mode 100644 index 0000000..25f3d5e --- /dev/null +++ b/srcs/pf_atoi.c @@ -0,0 +1,40 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* pf_atoi.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/02/11 07:51:09 by tmaze #+# #+# */ +/* Updated: 2019/02/11 07:51:31 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libftprintf.h" + +int pf_atoi(const char *str) +{ + int nbnum; + int mult; + int ret; + + nbnum = 0; + while (str[nbnum] == ' ' || str[nbnum] == '\t' || str[nbnum] == '\n'\ + || str[nbnum] == '\v' || str[nbnum] == '\f' || str[nbnum] == '\r') + nbnum++; + if (str[nbnum] == '+' || str[nbnum] == '-') + nbnum++; + while (str[nbnum] != '\0' && pf_isdigit(str[nbnum])) + nbnum++; + nbnum--; + ret = 0; + mult = 1; + while (nbnum >= 0 && pf_isdigit(str[nbnum])) + { + ret += (str[nbnum--] - '0') * mult; + mult *= 10; + } + if (nbnum >= 0 && str[nbnum] == '-') + ret *= -1; + return (ret); +} diff --git a/includes/libftprintf.h~ b/srcs/pf_convc.c similarity index 51% rename from includes/libftprintf.h~ rename to srcs/pf_convc.c index a1f51b3..166725e 100644 --- a/includes/libftprintf.h~ +++ b/srcs/pf_convc.c @@ -1,41 +1,32 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* libftprintf.h :+: :+: :+: */ +/* pf_convc.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2019/02/07 13:03:44 by tmaze #+# #+# */ -/* Updated: 2019/02/07 13:12:20 by tmaze ### ########.fr */ +/* Created: 2019/02/11 09:07:45 by tmaze #+# #+# */ +/* Updated: 2019/02/11 11:36:49 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ -#ifndef LIBFTPRINTF_H -# define LIBFTPRINTF_H +#include "libftprintf.h" -# include -# include - -typedef struct s_flags +int pf_convc(t_flags *flags, va_list *ap) { - enum e_convtype - { - c, - s, - p, - d, - i, - o, - u, - x, - X, - f - } convtype; - char minus; - char sign; - int width; - int precision; - -} + char c; + size_t i; -#endif + c = (flags->convtype == 0) ? '%' : (char)va_arg(*ap, int); + i = 0; + flags->width = (flags->width == 0) ? 1 : flags->width; + if ((flags->buffer = pf_strnew(flags->width)) == NULL) + return (1); + if (flags->minus) + flags->buffer[i++] = c; + pf_memset(&(flags->buffer[i]), ' ', flags->width - 1); + i += flags->width - 1; + if (!flags->minus) + flags->buffer[i] = c; + return (0); +} diff --git a/srcs/pf_convs.c b/srcs/pf_convs.c new file mode 100644 index 0000000..9862cb1 --- /dev/null +++ b/srcs/pf_convs.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* pf_convs.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/02/11 11:46:29 by tmaze #+# #+# */ +/* Updated: 2019/02/11 14:02:21 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libftprintf.h" + +int pf_convs(t_flags *flags, va_list *ap) +{ + char *s; + size_t i; + + + flags = NULL; + i = 0; + s = va_arg(*ap, char*); + printf("--- pf_convs ---\n%s\n", s); + return (-1); +} diff --git a/srcs/pf_getflags.c b/srcs/pf_getflags.c index 9f90d7d..bd3fa37 100644 --- a/srcs/pf_getflags.c +++ b/srcs/pf_getflags.c @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/07 14:14:38 by tmaze #+# #+# */ -/* Updated: 2019/02/09 14:36:30 by tmaze ### ########.fr */ +/* Updated: 2019/02/11 11:34:27 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,31 +25,18 @@ void pf_initflags(t_flags *flags) void pf_putflags(t_flags *flags) { - ft_putendl("--- putflags ---"); - ft_putstr("convtype->"); - ft_putnbr(flags->convtype); - ft_putstr("/nminus->"); - ft_putchar(flags->minus); - ft_putstr("/nsign->"); - ft_putchar(flags->sign); - ft_putstr("/nhash->"); - ft_putchar(flags->hash); - ft_putstr("/nwidth->"); - ft_putnbr(flags->width); - ft_putstr("/nprecision->"); - ft_putnbr(flags->precision); - ft_putstr("/nsize->"); - ft_putchar(flags->size); - ft_putchar("/n"); + printf("--- putflags ---\nconvtype-> %d\nminus-> %c\nsign-> %c\nhash-> %c\nwidth-> %d\nprecision-> %d\nsize-> %c\nbuffer-> '%s'\n", flags->convtype, flags->minus, flags->sign, flags->hash, flags->width, flags->precision, flags->size, flags->buffer); } size_t pf_getflags(const char *format, t_flags *flags) { size_t i; + size_t j; + static char convs[12] = "%cspdiouxXf\0"; pf_initflags(flags); i = 0; - while (format[++i] && ft_strchr("%cspdiouxXf", format[i]) != NULL) + while (format[++i] && pf_strchr(convs, format[i]) == NULL) { if (format[i] == '-') flags->minus = '-'; @@ -57,14 +44,14 @@ size_t pf_getflags(const char *format, t_flags *flags) flags->hash = '#'; if (format[i] == ' ' || format[i] == '+') flags->sign = format[i]; - if (ft_isdigit(format[i]) - || (format[i] == '.' && ft_isdigit(format[i + 1]))) + if (pf_isdigit(format[i]) + || (format[i] == '.' && pf_isdigit(format[i + 1]))) { - if (ft_isdigit(format[i])) - flags->width = ft_atoi(&format[i]); + if (pf_isdigit(format[i])) + flags->width = pf_atoi(&format[i]); else - flags->precision = ft_atoi(&format[i + 1]); - while (format[i + 1] && ft_isdigit(format[i + 1])) + flags->precision = pf_atoi(&format[i + 1]); + while (format[i + 1] && pf_isdigit(format[i + 1])) i++; continue ; } @@ -72,9 +59,15 @@ size_t pf_getflags(const char *format, t_flags *flags) { flags->size = format[i]; if (format[i + 1] && format[i + 1] == format[i]) - flags->size = ft_toupper(format[++i]); + flags->size = pf_toupper(format[++i]); } } - flags->convtype = format[i]; - return (i); + j = 0; + while (convs[j]) + { + if (format[i] == convs[j]) + flags->convtype = j; + j++; + } + return (i + 1); } diff --git a/srcs/pf_getflags.c~ b/srcs/pf_isdigit.c similarity index 74% rename from srcs/pf_getflags.c~ rename to srcs/pf_isdigit.c index a9f03c5..a7edea1 100644 --- a/srcs/pf_getflags.c~ +++ b/srcs/pf_isdigit.c @@ -1,18 +1,18 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* pf_getflags.c :+: :+: :+: */ +/* pf_isdigit.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2019/02/07 14:14:38 by tmaze #+# #+# */ -/* Updated: 2019/02/07 14:20:13 by tmaze ### ########.fr */ +/* Created: 2019/02/11 07:43:44 by tmaze #+# #+# */ +/* Updated: 2019/02/11 07:53:22 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "libftprintf.h" -size_t *pf_getflags(const char *format, t_flags *flags) +int pf_isdigit(int c) { - + return (c >= '0' && c <= '9'); } diff --git a/srcs/ft_putendl.c b/srcs/pf_memset.c similarity index 67% rename from srcs/ft_putendl.c rename to srcs/pf_memset.c index c7d1cd6..f71e257 100644 --- a/srcs/ft_putendl.c +++ b/srcs/pf_memset.c @@ -1,20 +1,23 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* ft_putendl.c :+: :+: :+: */ +/* pf_memset.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2018/04/07 22:37:44 by tmaze #+# #+# */ -/* Updated: 2019/01/13 17:44:21 by tmaze ### ########.fr */ +/* Created: 2019/02/11 09:57:23 by tmaze #+# #+# */ +/* Updated: 2019/02/11 09:59:01 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ -#include "libft.h" +#include "libftprintf.h" -void ft_putendl(char const *s) +void *pf_memset(void *b, int c, size_t len) { - if (s != NULL) - ft_putstr(s); - ft_putchar('\n'); + size_t i; + + i = 0; + while (i < len) + ((char*)b)[i++] = c; + return (b); } diff --git a/srcs/ft_putstr.c b/srcs/pf_strchr.c similarity index 64% rename from srcs/ft_putstr.c rename to srcs/pf_strchr.c index 3d7077e..f664837 100644 --- a/srcs/ft_putstr.c +++ b/srcs/pf_strchr.c @@ -1,19 +1,29 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* ft_putstr.c :+: :+: :+: */ +/* pf_strchr.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2018/04/07 19:13:17 by tmaze #+# #+# */ -/* Updated: 2018/04/12 11:23:29 by tmaze ### ########.fr */ +/* Created: 2019/02/11 07:42:57 by tmaze #+# #+# */ +/* Updated: 2019/02/11 07:43:10 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ -#include "libft.h" +#include "libftprintf.h" -void ft_putstr(char const *s) +char *pf_strchr(const char *s, int c) { + int i; + char *tmp; + if (s != NULL) - write(1, s, ft_strlen(s)); + { + i = -1; + tmp = (char*)s; + while (++i == 0 || tmp[i - 1]) + if (tmp[i] == c) + return (&tmp[i]); + } + return (NULL); } diff --git a/srcs/ft_putchar.c b/srcs/pf_strlen.c similarity index 68% rename from srcs/ft_putchar.c rename to srcs/pf_strlen.c index 0290a79..08fc55c 100644 --- a/srcs/ft_putchar.c +++ b/srcs/pf_strlen.c @@ -1,18 +1,23 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* ft_putchar.c :+: :+: :+: */ +/* pf_strlen.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2018/04/07 19:03:57 by tmaze #+# #+# */ -/* Updated: 2018/04/07 23:02:29 by tmaze ### ########.fr */ +/* Created: 2019/02/11 10:05:26 by tmaze #+# #+# */ +/* Updated: 2019/02/11 10:05:29 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ -#include "libft.h" +#include "libftprintf.h" -void ft_putchar(char c) +size_t pf_strlen(const char *s) { - write(1, &c, 1); + int i; + + i = 0; + while (s != NULL && s[i] != '\0') + i++; + return (i); } diff --git a/srcs/pf_strnew.c b/srcs/pf_strnew.c new file mode 100644 index 0000000..cdd94b9 --- /dev/null +++ b/srcs/pf_strnew.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* pf_strnew.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: tmaze +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/02/11 09:54:18 by tmaze #+# #+# */ +/* Updated: 2019/02/11 09:59:23 by tmaze ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libftprintf.h" + +char *pf_strnew(size_t size) +{ + void *ret; + + if ((ret = malloc(size + 1)) != NULL) + pf_memset(ret, 0, size + 1); + return (ret); +} diff --git a/srcs/ft_printf.c~ b/srcs/pf_toupper.c similarity index 73% rename from srcs/ft_printf.c~ rename to srcs/pf_toupper.c index 143b2e2..dd16639 100644 --- a/srcs/ft_printf.c~ +++ b/srcs/pf_toupper.c @@ -1,21 +1,18 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* ft_printf.c :+: :+: :+: */ +/* pf_toupper.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2019/02/07 13:31:16 by tmaze #+# #+# */ -/* Updated: 2019/02/07 13:34:43 by tmaze ### ########.fr */ +/* Created: 2019/02/11 07:51:45 by tmaze #+# #+# */ +/* Updated: 2019/02/11 07:51:54 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "libftprintf.h" -int ft_printf(const char *format, ...) +int pf_toupper(int c) { - va_list ap; - size_t i; - - va_start(); + return ((c >= 'a' && c <= 'z') ? c - 32 : c); }