aboutsummaryrefslogtreecommitdiff
path: root/ft_printf
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-02-14 19:21:32 +0100
committerCharles <sircharlesaze@gmail.com>2020-02-14 19:21:32 +0100
commitb9a3fe5af32ebe91c2cc0346ec74844a06b2697f (patch)
tree24806cc7065e86ae7525b11e3727dfc98cf396c7 /ft_printf
parent724b3b6a1620078a003a0507554886d7cdb27bde (diff)
downloadexam_rank_02-b9a3fe5af32ebe91c2cc0346ec74844a06b2697f.tar.gz
exam_rank_02-b9a3fe5af32ebe91c2cc0346ec74844a06b2697f.tar.bz2
exam_rank_02-b9a3fe5af32ebe91c2cc0346ec74844a06b2697f.zip
1st try
Diffstat (limited to 'ft_printf')
-rw-r--r--ft_printf/ft_printf.c176
-rw-r--r--ft_printf/main.c11
2 files changed, 0 insertions, 187 deletions
diff --git a/ft_printf/ft_printf.c b/ft_printf/ft_printf.c
deleted file mode 100644
index d2abc40..0000000
--- a/ft_printf/ft_printf.c
+++ /dev/null
@@ -1,176 +0,0 @@
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdarg.h>
-
-typedef struct
-{
- int precision;
- int width;
- char specifier;
-} t_format_spec;
-
-void ft_putchar(char c)
-{
- write(STDOUT_FILENO, &c, 1);
-}
-
-int ft_strlen(char *s)
-{
- int c;
-
- c = 0;
- while (s[c])
- c++;
- return (c);
-}
-
-void ft_putstr(char *s)
-{
- write(STDOUT_FILENO, s, ft_strlen(s));
-}
-
-int ft_isdigit(char c)
-{
- return (c >= '0' && c <= '9');
-}
-
-int ft_atoi_skip(char **s)
-{
- int nb;
- int is_neg;
-
- is_neg = **s == '-';
- nb = 0;
- while (ft_isdigit(**s))
- {
- nb *= 10;
- nb += **s - '0';
- (*s)++;
- }
- return (is_neg ? -nb : nb);
-}
-
-char *parse(char *format, t_format_spec *spec)
-{
- int tmp;
-
- if (ft_isdigit(*format))
- tmp = ft_atoi_skip(&format);
- if (*format == '.')
- {
- spec->precision = tmp;
- if (ft_isdigit(*++format))
- spec->width = ft_atoi_skip(&format);
- }
- else
- spec->width = tmp;
- if (*format != 's' && *format != 'd' && *format != 'x')
- return (NULL);
- spec->specifier = *format++;
- return (format);
-}
-
-int count_digits(int nb, int radix)
-{
- int counter;
-
- counter = nb < 0 ? 1 : 0;
- while (nb > 0)
- {
- nb /= radix;
- counter++;
- }
- return (counter);
-}
-
-char *ft_itoa_base(int nb, char *base)
-{
- int len;
- int radix;
- char *s;
-
- radix = ft_strlen(base);
- len = count_digits(nb, radix);
- if ((s = (char*)malloc(sizeof(char) * (len + 1))) == NULL)
- return (NULL);
- s[len] = 0;
- if (nb < 0)
- s[0] = '-';
- while (--len >= (nb < 0 ? 1 : 0))
- {
- s[len] = base[nb % radix];
- nb /= radix;
- }
- return (s);
-}
-
-int handle_s(va_list ap, t_format_spec *spec)
-{
- char *tmp;
-
- tmp = va_arg(ap, char*);
- ft_putstr(tmp);
- return (ft_strlen(tmp));
-}
-
-int handle_d(va_list ap, t_format_spec *spec)
-{
- int tmp;
- char *s;
-
- tmp = va_arg(ap, int);
- s = ft_itoa_base(tmp, "0123456789");
- ft_putstr(s);
- return ft_strlen(s);
-}
-
-int handle_x(va_list ap, t_format_spec *spec)
-{
- int tmp;
- char *s;
-
- tmp = va_arg(ap, int);
- s = ft_itoa_base(tmp, "0123456789abcdef");
- ft_putstr(s);
- return ft_strlen(s);
-}
-
-int print_spec(va_list ap, t_format_spec *spec)
-{
- if (spec->specifier == 's')
- return (handle_s(ap, spec));
- else if (spec->specifier == 'd')
- return (handle_d(ap, spec));
- else if (spec->specifier == 'x')
- return (handle_x(ap, spec));
- else
- return (-1);
-}
-
-int ft_printf(char *format, ...)
-{
- va_list ap;
- int counter;
- t_format_spec spec;
-
- va_start(ap, format);
-
-
- counter = 0;
- while (*format)
- {
- if (*format == '%')
- {
- if ((format = parse(format + 1, &spec)) == NULL)
- return (-1);
- counter += print_spec(ap, &spec);
- }
- else
- {
- ft_putchar(*format++);
- counter++;
- }
- }
- va_end(ap);
- return (counter);
-}
diff --git a/ft_printf/main.c b/ft_printf/main.c
deleted file mode 100644
index 57a3e33..0000000
--- a/ft_printf/main.c
+++ /dev/null
@@ -1,11 +0,0 @@
-int ft_printf(char *format, ...);
-
-int main(void)
-{
- ft_printf("bonjour\n");
- ft_printf("bon\n\0jour\n");
-
- ft_printf("s: %s\n", "yoyo");
- ft_printf("d: %d\n", 123);
- ft_printf("x: %x\n", 0xffee);
-}