Skip to content
Merged
26 changes: 26 additions & 0 deletions get_print_functions.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#include <stdarg.h>
#include <stdlib.h>
#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);
}
6 changes: 5 additions & 1 deletion holberton.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
32 changes: 32 additions & 0 deletions print_funcs.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#include <stdarg.h> /* va_list, va_start, va_arg, va_end macros */
#include <stdlib.h> /* 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);
}

71 changes: 9 additions & 62 deletions printf.c
Original file line number Diff line number Diff line change
@@ -1,43 +1,15 @@
#include <stdio.h> /* for testing only */
#include <stdarg.h> /* va_list, va_start, va_arg, va_end macros */
#include <stdlib.h> /* 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
* Return: int number of characters printed (excluding terminating null-byte)
*/
int _printf(const char *format, ...)
{
int i, j, count = 0;
int i, count = 0;
va_list ap;
print_t funcs[] = {
{"c", print_char},
Expand All @@ -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);
}
27 changes: 27 additions & 0 deletions tests/small_tests.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#include <stdio.h>
#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);
}