diff --git a/funcs_array.h b/funcs_array.h new file mode 100644 index 0000000..be96ca9 --- /dev/null +++ b/funcs_array.h @@ -0,0 +1,12 @@ +#ifndef _FUNCS_ARRAY_ +#define _FUNCS_ARRAY_ +print_t funcs[] = { + {"c", print_char}, + {"s", print_string}, + {"d", print_int}, + {"i", print_int}, + {"u", print_unsigned}, + {"o", print_octal}, + {NULL, NULL} +}; +#endif /* _FUNCS_ARRAY_ */ diff --git a/get_print_functions.c b/get_print_functions.c deleted file mode 100644 index 4b9e3c2..0000000 --- a/get_print_functions.c +++ /dev/null @@ -1,26 +0,0 @@ -#include -#include -#include "holberton.h" - -/** - * call_print_fn - call appropriate print fn - * @ch: format string character - * @funcs: arrays of structures and functions - * @ap: object to be printed - * Return: number of characters printed - */ -int call_print_fn(char ch, print_t funcs[], va_list ap) -{ - int j; - int count = 0; - - for (j = 0; funcs[j].spec != NULL; j++) - { - if (ch == funcs[j].spec[0]) - { - count += funcs[j].fn(ap); - break; - } - } - return (count); -} diff --git a/holberton.h b/holberton.h index e4c2570..f0f6119 100644 --- a/holberton.h +++ b/holberton.h @@ -15,7 +15,6 @@ typedef struct printer int (*fn)(va_list); } print_t; - int _putchar(char c); int _printf(const char *format, ...); int print_char(va_list ap); @@ -24,8 +23,7 @@ int print_int(va_list ap); int print_unsigned(va_list ap); int print_octal(va_list ap); int print_digit(int num, int *count); -int print_digit_unsigned(unsigned int num, int *count); +int print_unsigned_digit(unsigned int num, int *count); int print_digit_octal(unsigned int num, int *count); -int call_print_fn(char ch, print_t funcs[], va_list ap); - -#endif +int call_print_fn(char ch, va_list ap); +#endif /* __HOLBERTON_H__ */ diff --git a/print_funcs.c b/print_funcs.c deleted file mode 100644 index d60c53b..0000000 --- a/print_funcs.c +++ /dev/null @@ -1,163 +0,0 @@ -#include -#include "holberton.h" /* _putchar */ - -/** - * print_char - prints a char parameter from a va_list - * @ap: va_list from calling function - * Return: integer count of characters printed - */ -int print_char(va_list ap) -{ - return (_putchar(va_arg(ap, int))); -} - -/** - * print_string - prints a string parameter from a va_list - * @ap: va_list from calling function - * Return: integer count of characters printed - */ -int print_string(va_list ap) -{ - char *str = va_arg(ap, char *); - int count = 0; - - if (!str) - str = "(null)"; - while (str[count] != '\0') - count += _putchar(str[count]); - - return (count); -} - -/** - * print_int - prints an integer 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(*count_ptr)); - - 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 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) -{ - if (num < 0) - { - 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); -} - -/** - * 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, unsigned 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); -} - - -/** - * print_octal - prints an unsigned int octal from va_list - * @ap: va_list object from calling function - * Return: integer count of characters printed - */ -int print_octal(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, unsigned int); - - (*count_ptr) = print_digit_octal(num, count_ptr); - - return (*count_ptr); -} - -/** - * print_digit_octal - print the digits recursively - * @num: next usigned octal int in the va_arg list - * @count: pointer to integer count digits - * Return: pointer to integer count of character printed - */ -int print_digit_octal(unsigned int num, int *count) -{ - if (num / 8) - print_digit_octal(num / 8, count); - - (*count) += _putchar((num % 8) + '0'); - return (*count); -} diff --git a/print_funcs0.c b/print_funcs0.c new file mode 100644 index 0000000..ade2483 --- /dev/null +++ b/print_funcs0.c @@ -0,0 +1,30 @@ +#include +#include + +/** + * print_char - prints a char parameter from a va_list + * @ap: va_list from calling function + * Return: integer count of characters printed + */ +int print_char(va_list ap) +{ + return (write(1, va_arg(ap, int), 1)); +} + +/** + * print_string - prints a string parameter from a va_list + * @ap: va_list from calling function + * Return: integer count of characters printed + */ +int print_string(va_list ap) +{ + char *str = va_arg(ap, char *); + int count = 0; + + if (!str) + str = "(null)"; + while (str[count] != '\0') + count += write(1, str[count], 1); + + return (count); +} diff --git a/print_funcs1.c b/print_funcs1.c new file mode 100644 index 0000000..2687253 --- /dev/null +++ b/print_funcs1.c @@ -0,0 +1,59 @@ +#include +#include +#include + +/** + * print_int - prints an integer 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(*count_ptr)); + + 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 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) +{ + if (num < 0) + { + if (num == INT_MIN) + { + (*count) += write(1, '-', 1); + num++; + num = -num; + if (num / 10) + print_digit(num / 10, count); + (*count) += write(1, (num % 10) + 1 + '0', 1); + return (*count); + } + else + { + (*count) += write('-'); + num = -num; + } + } + if (num / 10) + print_digit(num / 10, count); + + (*count) += write(1, (num % 10) + '0', 1); + return (*count); +} diff --git a/print_funcs4.c b/print_funcs4.c new file mode 100644 index 0000000..950d00b --- /dev/null +++ b/print_funcs4.c @@ -0,0 +1,80 @@ +#include +#include +#include + +/** + * 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, unsigned int); + + (*count_ptr) = print_unsigned_digit(num, count_ptr); + + return (*count_ptr); +} + +/** + * print_unsigned_digit - 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_unsigned_digit(unsigned int num, int *count) +{ + if (num / 10) + print_unsigned_digit(num / 10, count); + + (*count) += write(1, (num % 10) + '0', 1); + return (*count); +} + + +/** + * print_octal - prints an unsigned int octal from va_list + * @ap: va_list object from calling function + * Return: integer count of characters printed + */ +int print_octal(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, unsigned int); + + (*count_ptr) = print_digit_octal(num, count_ptr); + + return (*count_ptr); +} + +/** + * print_digit_octal - print the digits recursively + * @num: next usigned octal int in the va_arg list + * @count: pointer to integer count digits + * Return: pointer to integer count of character printed + */ +int print_digit_octal(unsigned int num, int *count) +{ + if (num / 8) + print_digit_octal(num / 8, count); + + (*count) += write(1, (num % 8) + '0', 1); + return (*count); +} diff --git a/printf.c b/printf.c index 218107a..c732a8e 100644 --- a/printf.c +++ b/printf.c @@ -1,4 +1,5 @@ -#include "holberton.h" /* _putchar */ +#include "holberton.h" +#include "funcs_array.h" /** * _printf - prints to stdout according to a format string @@ -9,15 +10,7 @@ int _printf(const char *format, ...) { int i, count = 0; va_list ap; - print_t funcs[] = { - {"c", print_char}, - {"s", print_string}, - {"d", print_int}, - {"i", print_int}, - {"u", print_unsigned}, - {"o", print_octal}, - {NULL, NULL} - }; + va_start(ap, format); for (i = 0; format != NULL && format[i] != '\0'; i++) { @@ -37,7 +30,7 @@ int _printf(const char *format, ...) case 'i': case 'u': case 'o': - count += call_print_fn(format[i], funcs, ap); + count += call_print_fn(format[i], ap); break; default: if (!format[i]) @@ -50,3 +43,26 @@ int _printf(const char *format, ...) va_end(ap); return (count); } + + +/** + * call_print_fn - call appropriate print fn + * @ch: format string character + * @ap: object to be printed + * Return: number of characters printed + */ +int call_print_fn(char ch, va_list ap) +{ + int j; + int count = 0; + + for (j = 0; funcs[j].spec != NULL; j++) + { + if (ch == funcs[j].spec[0]) + { + count += funcs[j].fn(ap); + break; + } + } + return (count); +}