diff --git a/holberton.h b/holberton.h index 0a23dc2..653c8dd 100644 --- a/holberton.h +++ b/holberton.h @@ -17,6 +17,8 @@ int _putchar(char c); 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_digit(int num, int *count); int call_print_fn(char ch, print_t funcs[], va_list ap); #endif diff --git a/print_digits.c b/print_digits.c new file mode 100644 index 0000000..e069151 --- /dev/null +++ b/print_digits.c @@ -0,0 +1,38 @@ +#include +#include +#include "holberton.h" + +int *print_num(int num, int *count); + +int main(int argc, char *argv[]) +{ + int *count; + int counter = 0; + + (void) argc; + count = &counter; + + print_num(atoi(argv[1]), count); + _putchar('\n'); + printf("%d\n", *count); + return (0); +} + + +int *print_num(int num, int *count) +{ + + if (num < 0) + { + _putchar('-'); + num = -num; + } + + if (num / 10) + { + print_num(num / 10, count); + } + + (*count) += _putchar((num % 10) + '0'); + return (count); +} diff --git a/print_funcs.c b/print_funcs.c index b64efec..823b156 100644 --- a/print_funcs.c +++ b/print_funcs.c @@ -30,3 +30,48 @@ int print_string(va_list ap) return (count); } +/** + * print_int - prints a digit from va_list + * @ap: va_list object from calling function + * Return: integer count of characters printed + */ +int print_int(va_list ap) +{ + int *count_ptr; + int num; + + count_ptr = malloc(sizeof(int)); + + if (!count_ptr) + exit(-1); + + *count_ptr = 0; + num = va_arg(ap, int); + + (*count_ptr) = print_digit(num, count_ptr); + + return (*count_ptr); +} + +/** + * print_digit - print the digits recursively + * @num: next num in the va_arg list + * @count: count digits + * Return: Always 0 + */ +int print_digit(int num, int *count) +{ + if (num < 0) + { + (*count) += _putchar('-'); + num = -num; + } /* handle int min & max */ + + if (num / 10) + { + print_digit(num / 10, count); + } + + (*count) += _putchar((num % 10) + '0'); + return (*count); +} diff --git a/printf.c b/printf.c index 1d47453..48c6e14 100644 --- a/printf.c +++ b/printf.c @@ -14,9 +14,10 @@ int _printf(const char *format, ...) print_t funcs[] = { {"c", print_char}, {"s", print_string}, + {"d", print_int}, + {"i", print_int}, {NULL, NULL} }; - va_start(ap, format); for (i = 0; format != NULL && format[i] != '\0'; i++) { @@ -32,6 +33,8 @@ int _printf(const char *format, ...) break; case 'c': case 's': + case 'd': + case 'i': count += call_print_fn(format[i], funcs, ap); break; default: