/* ************************************************************************** */ /* */ /* ::: o_ :::::: ::: */ /* ft_printf.c :+: / :+::+: :+: */ /* +:+ > +:++:+ +:+ */ /* By: whaffman +#+ +:+ +#++#++:++#++ */ /* +#+ +#+#+ +#++#+ +#+ \o/ */ /* Created: 2024/10/11 14:49:07 by whaffman #+#+# #+#+# #+# #+# | */ /* Updated: 2024/10/15 12:43:16 by whaffman ### ### ### ### / \ */ /* */ /* ************************************************************************** */ #include #include #include #include "libft.h" #include "libft/libft.h" #include "ft_printf.h" int ft_isbase(char *str) { int i; int n; n = 0; while (str[n]) { i = 1; if (str[n] == '-' || str[n] == '+') return (0); while (str[n + i]) { if (str[n] == str[n + i]) return (0); i++; } n++; } return (n); } void ft_write_str(char c, char *str) { int i; i = 0; while (str[i]) { i++; } str[i++] = c; str[i] = '\0'; } void ft_putnbr_base(unsigned long nbr, char *base, char *result) { unsigned int b; b = ft_isbase(base); if (b < 2) return ; if (nbr < b) ft_write_str(base[nbr], result); else if (nbr >= b) { ft_putnbr_base(nbr / b, base, result); ft_putnbr_base(nbr % b, base, result); } } void ft_putnbr_signed(long nbr, char *base, char *result) { if (nbr < 0) { *result = '-'; ft_putnbr_base((unsigned long)(-nbr), base, result); } else ft_putnbr_base((unsigned long) nbr, base, result); } int print_char(va_list args) { char c; c = va_arg(args, int); return (write(1, &c, 1)); } int print_string(va_list args) { char *str; size_t len; str = va_arg(args, char *); if (!str) { write(1, "(null)", 6); return (6); } len = ft_strlen(str); return (write(1, str, len)); } int print_number(va_list args) { long n; size_t len; char *str; int wrote; wrote = 0; str = ft_calloc(sizeof(char), 12); if (!str) return (wrote); n = va_arg(args, int); ft_putnbr_signed(n, "0123456789", str); len = ft_strlen(str); wrote = write(1, str, len); free(str); return (wrote); } int print_unumber(va_list args) { long n; size_t len; char *str; int wrote; wrote = 0; str = ft_calloc(sizeof(char), 12); if (!str) return (wrote); n = va_arg(args, unsigned int); ft_putnbr_base(n, "0123456789", str); len = ft_strlen(str); wrote = write(1, str, len); free(str); return (wrote); } int print_hex(va_list args, int uppercase) { long n; size_t len; char *str; int wrote; wrote = 0; str = ft_calloc(sizeof(char), 20); if (!str) return (wrote); n = va_arg(args, unsigned int); if (uppercase) ft_putnbr_base(n, "0123456789ABCDEF", str); else ft_putnbr_base(n, "0123456789abcdef", str); len = ft_strlen(str); wrote = write(1, str, len); free(str); return (wrote); } int print_pointer(va_list args) { long n; size_t len; char *str; int wrote; wrote = 0; n = va_arg(args, unsigned long); if (!n) { write(1, "(nil)", 5); return (5); } str = ft_calloc(sizeof(char), 20); if (!str) return (wrote); ft_strlcpy(str, "0x", 3); ft_putnbr_base(n, "0123456789abcdef", str); len = ft_strlen(str); wrote = write(1, str, len); free(str); return (wrote); } int parse_conversion(const char **format, va_list args) { int wrote; wrote = 0; if (**format == 'c') wrote = print_char(args); else if (**format == 's') wrote = print_string(args); else if (ft_strchr("di", **format)) wrote = print_number(args); else if (ft_strchr("u", **format)) wrote = print_unumber(args); else if (ft_strchr("p", **format)) wrote = print_pointer(args); else if (ft_strchr("x", **format)) wrote = print_hex(args, 0); else if (ft_strchr("X", **format)) wrote = print_hex(args, 1); return (wrote); } int parse_placeholder(const char **format, va_list args) { const char conversions[] = "cspdiuxX%"; int wrote; (*format)++; wrote = 0; while (**format && !ft_strchr(conversions, **format)) (*format)++; if (**format == '%') wrote = write(1, *format, 1); else wrote = parse_conversion(format, args); return (wrote); } int ft_printf(const char *format, ...) { int wrote; int result; va_list args; result = 0; va_start(args, format); while (*format && result >= 0) { if (*format == '%') wrote = parse_placeholder(&format, args); else wrote = write(1, format, 1); if (wrote < 0) { result = wrote; break; } result += wrote; format++; } va_end(args); return (result); } /* int main(void) { const char str[] = "HOIe"; ft_printf("test:\n"); ft_printf("%%%% = %%\n--\n"); ft_printf("%%c = %c\n--\n", 't'); ft_printf("%%s = %s\n--\n", str); ft_printf("%%d = %d\n--\n", 255); ft_printf("%%i = %i\n--\n", 255); ft_printf("%%u = %u\n--\n", 255); ft_printf("%%p = %p\n--\n", str); ft_printf("%%x = %x\n--\n", 255); ft_printf("%%X = %X\n--\n", 255); ft_printf(" %% %% %%\n"); ft_printf(" %% %% %%\n"); ft_printf(" %% %% %%\n"); return (0); } */