From 4e56af0f8a93321cf00ef5d724a9d118d600afe3 Mon Sep 17 00:00:00 2001 From: Hugo LAMY Date: Wed, 19 Feb 2020 18:49:29 +0100 Subject: [PATCH] convert marche mais bug dans convertbase --- Makefile | 4 +- aside.c | 101 +++++++++++++++++++++++ ft_convert.c | 78 ++++++++++++++++++ ft_printf | Bin 18440 -> 18004 bytes ft_printf.c | 222 +++++++++------------------------------------------ ft_printf.h | 4 + 6 files changed, 222 insertions(+), 187 deletions(-) create mode 100644 aside.c create mode 100644 ft_convert.c diff --git a/Makefile b/Makefile index e64c328..9faef73 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,9 @@ _LIBS = libft.a LIBS = $(_LIBS:lib%.a=%) SRCS = ft_printf.c \ - ft_next_word.c + ft_next_word.c \ + aside.c \ + ft_convert.c ODIR = ./builds OBJS = $(SRCS:%.c=$(ODIR)/%.o) diff --git a/aside.c b/aside.c new file mode 100644 index 0000000..3d2ba19 --- /dev/null +++ b/aside.c @@ -0,0 +1,101 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* aside.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hulamy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/19 16:23:01 by hulamy #+# #+# */ +/* Updated: 2020/02/19 18:44:21 by hulamy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_printf.h" + +/* +** SPECIFIER : +** receive a word as a string, check if it start by '%', and return the +** specifier (diuxXspefgn) and th length (h hh l ll) +** -if s is a string, or is a single '%' +** return NULL (to print is as a string) +** -if s is a double '%%', remove one '%', and +** return NULL (to print is as a string) +** -then s is a conversion, go to the length and specifier +** -copy them in 'string' +** -and remove them from s +** -return the length and specifier in a string +*/ + +char *specifier(char *s) +{ + char *string; + int i; + + if (s[0] != '%' || s[1] == '\0') + return (NULL); + if (s[1] == '%') + { + s[1] = '\0'; + return (NULL); + } + i = 1; + while (ft_strchr("#0- +'0123456789.*", s[i]) != NULL) + i++; + string = ft_strdup(s + i); + while (s[i] != '\0') + { + s[i] = '\0'; + i++; + } + return (string); +} + +/* +** print the string +*/ + +int ft_put_word(char *s) +{ + int i; + + i = ft_strlen(s); + ft_putstr(s); + return (i); +} + +/* +** -receive 'i' the number in which '*' will expand +** -turn it into a string +** -calculate the total lentgh of the string '%...' for nbr replacing '*' +** -allocate a new string with this length +** -copy the original str with first '*' expanded into it's corresponding nbr +*/ + +int ft_expand_star(int nbr, char **string) +{ + char *s; + char *strnbr; + int i; + int j; + + strnbr = ft_itoa(nbr); + i = ft_strlen(strnbr) + ft_strlen(*string) - 1; + if (!(s = (char *)malloc(sizeof(char) * (i + 1)))) + return (0); + s[i] = '\0'; + i = 0; + j = 0; + while ((*string)[i] != '\0') + { + s[j] = (*string)[i]; + if (s[j] == '*') + while (*strnbr != '\0') + s[j++] = *(strnbr++); + else + j++; + i++; + } + free(*string); + *string = s; + return (1); +} diff --git a/ft_convert.c b/ft_convert.c new file mode 100644 index 0000000..9e4519f --- /dev/null +++ b/ft_convert.c @@ -0,0 +1,78 @@ + +#include "ft_printf.h" + +/* +** FT_CONVERT : +** -convert the next argument into a string according to the following +** correspondances for diuxXcspefgn : +** [char] [hhd, hhi, c] [int] [d i c] +** [short] [hd, hi] [int] +** [int] [d, i] [int] +** [long] [ld, li] [long] [ld li] +** [long long] [lld, lli] [long] +** [unsigned char] [hhu, hhx, hhX] [unsigned int] [u x X p s] +** [unsigned short] [hu, hx, hX] [unsigned int] +** [unsigned int] [u, x, X, p] [unsigned int] +** [unsigned long] [lu, lx, lX] [unsigned long] [lu lx lX] +** [unsigned long long][llu, llx, llX] [unsigned long] +** [char *] [s, hhn] +** [double] [e, le, f, lf, g, lg] +** [wint_t] [lc] +** [wchar_t] [ls] +** [short *] [hn] +** [int *] [n] +** [long *] [ln] +** [long long *] [lln] +** -'h' and 'hh', are traited just like regular size because of +** default promotion, that promote smaller type than int into int +*/ + +char *conv_i(char c, long int i) +{ + char *s; + + if (c == 'c') + { + s = ft_strdup("0"); + s[0] = i; + return (s); + } + if (c == 'd' || c == 'i') + return (ft_itoa(i)); + return (NULL); +} + +char *conv_u(char c, unsigned long int i) +{ + char *s; + + s = ft_utoa(i); + if (c == 's') + return (strdup((char *)i)); + if (c == 'u') + return (s); + if (c == 'x' || c == 'p') + return (ft_convertbase(s, "0123456789", "0123456789abcdef")); + if (c == 'X') + return (ft_convertbase(s, "0123456789", "0123456789ABCDEF")); + return (NULL); +} + +char *ft_convert(va_list ap, char *type) +{ + char *s; + + if ((s = ft_strchrset(type, "dic")) && ft_strchr(type, 'l')) + return (conv_i(s[0], va_arg(ap, long int))); + if ((s = ft_strchrset(type, "dic"))) + return (conv_i(s[0], va_arg(ap, int))); + if ((s = ft_strchrset(type, "uxX")) && ft_strchr(type, 'l')) + return (conv_u(s[0], va_arg(ap, unsigned long int))); + if ((s = ft_strchrset(type, "uxXp"))) + return (conv_u(s[0], va_arg(ap, unsigned int))); + if ((s = ft_strchrset(type, "s"))) + return (conv_u(s[0], va_arg(ap, unsigned long int))); + if (ft_strchrset(type, "efgn")) + return (NULL); + return (NULL); +} diff --git a/ft_printf b/ft_printf index 0b98061e730fca5019799e0cab02562ef273cefb..dc86627defcf113cb70bc07b5b58fd5a3963c640 100755 GIT binary patch literal 18004 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 HrvLu~JQ