From e435398aef15b7363e7455e1a8f1d91e359cdebd Mon Sep 17 00:00:00 2001 From: Fernando Gonzalez-Morales <542@holbertonschool.com> Date: Wed, 24 Oct 2018 04:34:02 +0000 Subject: [PATCH 1/6] Moved some functions to two other files. --- print_funcs.c | 163 ------------------------------------------------- print_funcs0.c | 29 +++++++++ 2 files changed, 29 insertions(+), 163 deletions(-) delete mode 100644 print_funcs.c create mode 100644 print_funcs0.c 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..7b32ac0 --- /dev/null +++ b/print_funcs0.c @@ -0,0 +1,29 @@ +#include "holberton.h" + +/** + * 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); +} From 013b8d86a495da2c328fa80c2518c1e31de9e13c Mon Sep 17 00:00:00 2001 From: Fernando Gonzalez-Morales <542@holbertonschool.com> Date: Wed, 24 Oct 2018 04:35:08 +0000 Subject: [PATCH 2/6] This now has functions from Check 1 --- print_funcs1.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 print_funcs1.c diff --git a/print_funcs1.c b/print_funcs1.c new file mode 100644 index 0000000..fd56a44 --- /dev/null +++ b/print_funcs1.c @@ -0,0 +1,58 @@ +#include +#include "holberton.h" + +/** + * 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); +} From 1d2a4346df74f367cc13cc15f396b1ccd059fc11 Mon Sep 17 00:00:00 2001 From: Fernando Gonzalez-Morales <542@holbertonschool.com> Date: Wed, 24 Oct 2018 04:36:05 +0000 Subject: [PATCH 3/6] This now has functions for Check 4 --- print_funcs4.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 print_funcs4.c diff --git a/print_funcs4.c b/print_funcs4.c new file mode 100644 index 0000000..848b56a --- /dev/null +++ b/print_funcs4.c @@ -0,0 +1,78 @@ +#include "holberton.h" + +/** + * 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) += _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); +} From 1e319ea98c17c1c812e0d9c104de79b60b01255d Mon Sep 17 00:00:00 2001 From: Fernando Gonzalez-Morales <542@holbertonschool.com> Date: Wed, 24 Oct 2018 04:41:16 +0000 Subject: [PATCH 4/6] Corrected prototype to print_unsigned_digit --- holberton.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/holberton.h b/holberton.h index e4c2570..791ece0 100644 --- a/holberton.h +++ b/holberton.h @@ -24,7 +24,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); From aa931812b802a6acd1aae6557234e78a465f19ca Mon Sep 17 00:00:00 2001 From: Fernando Gonzalez-Morales <542@holbertonschool.com> Date: Wed, 24 Oct 2018 05:22:24 +0000 Subject: [PATCH 5/6] Resolved betty extra lines by moving funcs[] to separate header --- funcs_array.h | 12 ++++++++++++ get_print_functions.c | 26 -------------------------- holberton.h | 6 ++---- printf.c | 38 +++++++++++++++++++++++++++----------- 4 files changed, 41 insertions(+), 41 deletions(-) create mode 100644 funcs_array.h delete mode 100644 get_print_functions.c 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 791ece0..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); @@ -26,6 +25,5 @@ int print_octal(va_list ap); int print_digit(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/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); +} From d431d9644a0835a746876a0dd116d7932e3b2bf5 Mon Sep 17 00:00:00 2001 From: Fernando Gonzalez-Morales <542@holbertonschool.com> Date: Wed, 24 Oct 2018 05:23:29 +0000 Subject: [PATCH 6/6] Updated split print_funcs --- print_funcs0.c | 7 ++++--- print_funcs1.c | 11 ++++++----- print_funcs4.c | 8 +++++--- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/print_funcs0.c b/print_funcs0.c index 7b32ac0..ade2483 100644 --- a/print_funcs0.c +++ b/print_funcs0.c @@ -1,4 +1,5 @@ -#include "holberton.h" +#include +#include /** * print_char - prints a char parameter from a va_list @@ -7,7 +8,7 @@ */ int print_char(va_list ap) { - return (_putchar(va_arg(ap, int))); + return (write(1, va_arg(ap, int), 1)); } /** @@ -23,7 +24,7 @@ int print_string(va_list ap) if (!str) str = "(null)"; while (str[count] != '\0') - count += _putchar(str[count]); + count += write(1, str[count], 1); return (count); } diff --git a/print_funcs1.c b/print_funcs1.c index fd56a44..2687253 100644 --- a/print_funcs1.c +++ b/print_funcs1.c @@ -1,5 +1,6 @@ #include -#include "holberton.h" +#include +#include /** * print_int - prints an integer from va_list @@ -36,23 +37,23 @@ int print_digit(int num, int *count) { if (num == INT_MIN) { - (*count) += _putchar('-'); + (*count) += write(1, '-', 1); num++; num = -num; if (num / 10) print_digit(num / 10, count); - (*count) += _putchar((num % 10) + 1 + '0'); + (*count) += write(1, (num % 10) + 1 + '0', 1); return (*count); } else { - (*count) += _putchar('-'); + (*count) += write('-'); num = -num; } } if (num / 10) print_digit(num / 10, count); - (*count) += _putchar((num % 10) + '0'); + (*count) += write(1, (num % 10) + '0', 1); return (*count); } diff --git a/print_funcs4.c b/print_funcs4.c index 848b56a..950d00b 100644 --- a/print_funcs4.c +++ b/print_funcs4.c @@ -1,4 +1,6 @@ -#include "holberton.h" +#include +#include +#include /** * print_unsigned - prints an unsigned int from va_list @@ -34,7 +36,7 @@ int print_unsigned_digit(unsigned int num, int *count) if (num / 10) print_unsigned_digit(num / 10, count); - (*count) += _putchar((num % 10) + '0'); + (*count) += write(1, (num % 10) + '0', 1); return (*count); } @@ -73,6 +75,6 @@ int print_digit_octal(unsigned int num, int *count) if (num / 8) print_digit_octal(num / 8, count); - (*count) += _putchar((num % 8) + '0'); + (*count) += write(1, (num % 8) + '0', 1); return (*count); }