diff --git a/get_print_functions.c b/get_print_functions.c new file mode 100644 index 0000000..4b9e3c2 --- /dev/null +++ b/get_print_functions.c @@ -0,0 +1,26 @@ +#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 5d751f6..0a23dc2 100644 --- a/holberton.h +++ b/holberton.h @@ -9,10 +9,14 @@ typedef struct printer { char *spec; - int (*fn) (va_list); + int (*fn)(va_list); } print_t; int _putchar(char c); +int _printf(const char *format, ...); +int print_char(va_list ap); +int print_string(va_list ap); +int call_print_fn(char ch, print_t funcs[], va_list ap); #endif diff --git a/print_funcs.c b/print_funcs.c new file mode 100644 index 0000000..b64efec --- /dev/null +++ b/print_funcs.c @@ -0,0 +1,32 @@ +#include /* va_list, va_start, va_arg, va_end macros */ +#include /* NULL macro */ +#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); +} + diff --git a/printf.c b/printf.c index a4117c2..1d47453 100644 --- a/printf.c +++ b/printf.c @@ -1,35 +1,7 @@ -#include /* for testing only */ #include /* va_list, va_start, va_arg, va_end macros */ #include /* NULL macro */ #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; - - while (str[count] != '\0') - count += _putchar(str[count]); - - return (count); -} - - /** * _printf - prints to stdout according to a format string * @format: constant string containing zero or more directives @@ -37,7 +9,7 @@ int print_string(va_list ap) */ int _printf(const char *format, ...) { - int i, j, count = 0; + int i, count = 0; va_list ap; print_t funcs[] = { {"c", print_char}, @@ -60,43 +32,18 @@ int _printf(const char *format, ...) break; case 'c': case 's': - for (j = 0; funcs[j].spec != NULL; j++) - { - if (format[i] == funcs[j].spec[0]) - { - count += funcs[j].fn(ap); - break; - } - } + count += call_print_fn(format[i], funcs, ap); break; default: - exit(-1); + if (format[i] >= 7 && format[i] <= 13) + { + count += _putchar('%'); + count += _putchar(format[i]); + break; + } + return (-1); } } va_end(ap); return (count); } - -/* TODO: REMOVE BEFORE PUSHING TO MASTER! */ -/** - * main - tests _printf against stdio::printf - * Return: 0 on SUCCESS - */ -int main(void) -{ - int a, b; - - a = printf("a\n"); - b = _printf("a\n"); - printf("(%d, %d)\n", a, b); - - a = printf("%c\n", 'A'); - b = _printf("%c\n", 'A'); - printf("(%d, %d)\n", a, b); - - a = printf("%s\n", "Holberton"); - b = _printf("%s\n", "Holberton"); - printf("(%d, %d)\n", a, b); - - return (0); -} diff --git a/tests/small_tests.c b/tests/small_tests.c new file mode 100644 index 0000000..e516e7d --- /dev/null +++ b/tests/small_tests.c @@ -0,0 +1,27 @@ +#include +#include "../holberton.h" + +/** + * main - tests _printf against stdio::printf + * Return: 0 on SUCCESS + */ +int main(void) +{ + int a = 0; + int b = 0; + + a = printf("stdio%"); + b = _printf("ours%"); +/* printf("%d", a);*/ + printf("(%d, %d)\n", a, b); + +/* a = printf("stdio %c\n", '\0'); + b = _printf("ours %c\n", '\0'); + printf("(%d, %d)\n", a, b); + + a = printf("stdio %s\n", "Holberton"); + b = _printf("ours %s\n", "Holberton"); + printf("(%d, %d)\n", a, b); +*/ + return (0); +}