From 7ae4cdef678a112edb41a240ed6eef1f33ae8393 Mon Sep 17 00:00:00 2001 From: Fernando Gonzalez-Morales <542@holbertonschool.com> Date: Tue, 23 Oct 2018 23:27:57 +0000 Subject: [PATCH] Handled unsigned integer printing. --- holberton.h | 2 ++ print_funcs.c | 52 +++++++++++++++++++++++++++++++++++++++------ printf.c | 2 ++ tests/small_tests.c | 5 +++-- 4 files changed, 53 insertions(+), 8 deletions(-) diff --git a/holberton.h b/holberton.h index 653c8dd..a4ac239 100644 --- a/holberton.h +++ b/holberton.h @@ -18,7 +18,9 @@ int _printf(const char *format, ...); int print_char(va_list ap); int print_string(va_list ap); int print_int(va_list ap); +int print_unsigned(va_list ap); int print_digit(int num, int *count); +int print_digit_unsigned(unsigned int num, int *count); int call_print_fn(char ch, print_t funcs[], va_list ap); #endif diff --git a/print_funcs.c b/print_funcs.c index 823b156..9773016 100644 --- a/print_funcs.c +++ b/print_funcs.c @@ -31,7 +31,7 @@ int print_string(va_list ap) } /** - * print_int - prints a digit from va_list + * print_int - prints an integer from va_list * @ap: va_list object from calling function * Return: integer count of characters printed */ @@ -40,7 +40,7 @@ int print_int(va_list ap) int *count_ptr; int num; - count_ptr = malloc(sizeof(int)); + count_ptr = malloc(sizeof(*count_ptr)); if (!count_ptr) exit(-1); @@ -55,9 +55,9 @@ int print_int(va_list ap) /** * print_digit - print the digits recursively - * @num: next num in the va_arg list - * @count: count digits - * Return: Always 0 + * @num: next int in the va_arg list + * @count: pointer to integer count digits + * Return: pointer to integer count of character printed */ int print_digit(int num, int *count) { @@ -65,7 +65,7 @@ int print_digit(int num, int *count) { (*count) += _putchar('-'); num = -num; - } /* handle int min & max */ + } /* TODO handle int min & max */ if (num / 10) { @@ -75,3 +75,43 @@ int print_digit(int num, int *count) (*count) += _putchar((num % 10) + '0'); return (*count); } + +/** + * print_unsigned - prints an unsigned int from va_list + * @ap: va_list object from calling function + * Return: integer count of characters printed + */ +int print_unsigned(va_list ap) +{ + int *count_ptr; + unsigned int num; + + count_ptr = malloc(sizeof(*count_ptr)); + + if (!count_ptr) + exit(-1); + + *count_ptr = 0; + num = va_arg(ap, int); + + (*count_ptr) = print_digit_unsigned(num, count_ptr); + + return (*count_ptr); +} + +/** + * print_digit_unsigned - print the digits recursively + * @num: next unsigned int in the va_arg list + * @count: pointer to integer count digits + * Return: pointer to integer count of character printed + */ +int print_digit_unsigned(unsigned int num, int *count) +{ + if (num / 10) + { + print_digit_unsigned(num / 10, count); + } + + (*count) += _putchar((num % 10) + '0'); + return (*count); +} diff --git a/printf.c b/printf.c index 48c6e14..b53b898 100644 --- a/printf.c +++ b/printf.c @@ -16,6 +16,7 @@ int _printf(const char *format, ...) {"s", print_string}, {"d", print_int}, {"i", print_int}, + {"u", print_unsigned}, {NULL, NULL} }; va_start(ap, format); @@ -35,6 +36,7 @@ int _printf(const char *format, ...) case 's': case 'd': case 'i': + case 'u': count += call_print_fn(format[i], funcs, ap); break; default: diff --git a/tests/small_tests.c b/tests/small_tests.c index e516e7d..f7e52a5 100644 --- a/tests/small_tests.c +++ b/tests/small_tests.c @@ -1,4 +1,5 @@ #include +#include #include "../holberton.h" /** @@ -10,8 +11,8 @@ int main(void) int a = 0; int b = 0; - a = printf("stdio%"); - b = _printf("ours%"); + a = printf("stdio %u\n", UINT_MAX); + b = _printf("ours %u\n", UINT_MAX); /* printf("%d", a);*/ printf("(%d, %d)\n", a, b);