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 1/2] 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); From 57ca92456986196bc9deffa551c5bee55c02bc56 Mon Sep 17 00:00:00 2001 From: Fernando Gonzalez-Morales <542@holbertonschool.com> Date: Tue, 23 Oct 2018 23:51:13 +0000 Subject: [PATCH 2/2] Handled INT_MIN for Check 1 --- print_funcs.c | 26 ++++++++++++++++++-------- tests/small_tests.c | 4 ++-- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/print_funcs.c b/print_funcs.c index 9773016..350a2fc 100644 --- a/print_funcs.c +++ b/print_funcs.c @@ -1,5 +1,6 @@ #include /* va_list, va_start, va_arg, va_end macros */ #include /* NULL macro */ +#include #include "holberton.h" /* _putchar */ /** @@ -63,14 +64,24 @@ int print_digit(int num, int *count) { if (num < 0) { - (*count) += _putchar('-'); - num = -num; - } /* TODO handle int min & max */ - + if (num == INT_MIN) + { + (*count) += _putchar('-'); + num++; + num = -num; + if (num / 10) + print_digit(num / 10, count); + (*count) += _putchar((num % 10) + 1 + '0'); + return (*count); + } + else + { + (*count) += _putchar('-'); + num = -num; + } + } if (num / 10) - { print_digit(num / 10, count); - } (*count) += _putchar((num % 10) + '0'); return (*count); @@ -108,9 +119,8 @@ int print_unsigned(va_list ap) 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/tests/small_tests.c b/tests/small_tests.c index f7e52a5..66384b1 100644 --- a/tests/small_tests.c +++ b/tests/small_tests.c @@ -11,8 +11,8 @@ int main(void) int a = 0; int b = 0; - a = printf("stdio %u\n", UINT_MAX); - b = _printf("ours %u\n", UINT_MAX); + a = printf("stdio %d\n", INT_MIN); + b = _printf("ours %d\n", INT_MIN); /* printf("%d", a);*/ printf("(%d, %d)\n", a, b);