diff --git a/README.md b/README.md index 11ab88e..8cb0d25 100644 --- a/README.md +++ b/README.md @@ -4,4 +4,4 @@ First Holberton School group project in the Low Level Programming track. ## Authors -Fernando González-Morales, Stefan Silverio +`Fernando González-Morales, Stefan Silverio` diff --git a/_putchar.c b/_putchar.c new file mode 100644 index 0000000..b859fa9 --- /dev/null +++ b/_putchar.c @@ -0,0 +1,12 @@ +#include + +/** + * _putchar - writes the character c to stdout + * @c: The character to print + * Return: 1 on SUCCESS, + * -1 on error and errno is set appropriately. + */ +int _putchar(char c) +{ + return (write(1, &c, 1)); +} diff --git a/holberton.h b/holberton.h new file mode 100644 index 0000000..eafd1e6 --- /dev/null +++ b/holberton.h @@ -0,0 +1,19 @@ +#ifndef __HOLBERTON_H__ +#define __HOLBERTON_H__ + +/** + * struct printer - format printer struct + * @spec: the format specifier + * @fn: the function that handles spec + */ +typedef struct printer +{ + char *spec; + int (*fn) (va_list); +} print_t; + + +int _putchar(char c); +int _printf(const char *format, ...); + +#endif diff --git a/printf.c b/printf.c new file mode 100644 index 0000000..fe4b8d3 --- /dev/null +++ b/printf.c @@ -0,0 +1,78 @@ +#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 + * Return: int number of characters printed (excluding terminating null-byte) + */ +int _printf(const char *format, ...) +{ + int i, j, count = 0; + va_list ap; + print_t funcs[] = { + {"c", print_char}, + {"s", print_string}, + {NULL, NULL} + }; + + va_start(ap, format); + for (i = 0; format != NULL && format[i] != '\0'; i++) + { + if (format[i] != '%') + { + count += _putchar(format[i]); + continue; + } + switch (format[++i]) + { + case '%': + count += _putchar('%'); + 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; + } + } + break; + default: + exit(-1); + } + } + va_end(ap); + return (count); +} + diff --git a/tests/printf_tests.c b/tests/printf_tests.c new file mode 100644 index 0000000..abe6158 --- /dev/null +++ b/tests/printf_tests.c @@ -0,0 +1,44 @@ +#include +#include +#include "holberton.h" + +/** + * main - Entry point + * + * Return: Always 0 + */ +int main(void) +{ + int len; + int len2; + unsigned int ui; + void *addr; + + len = _printf("Let's try to printf a simple sentence.\n"); + len2 = printf("Let's try to printf a simple sentence.\n"); + ui = (unsigned int)INT_MAX + 1024; + addr = (void *)0x7ffe637541f0; + _printf("Length:[%d, %i]\n", len, len); + printf("Length:[%d, %i]\n", len2, len2); + _printf("Negative:[%d]\n", -762534); + printf("Negative:[%d]\n", -762534); + _printf("Unsigned:[%u]\n", ui); + printf("Unsigned:[%u]\n", ui); + _printf("Unsigned octal:[%o]\n", ui); + printf("Unsigned octal:[%o]\n", ui); + _printf("Unsigned hexadecimal:[%x, %X]\n", ui, ui); + printf("Unsigned hexadecimal:[%x, %X]\n", ui, ui); + _printf("Character:[%c]\n", 'H'); + printf("Character:[%c]\n", 'H'); + _printf("String:[%s]\n", "I am a string !"); + printf("String:[%s]\n", "I am a string !"); + _printf("Address:[%p]\n", addr); + printf("Address:[%p]\n", addr); + len = _printf("Percent:[%%]\n"); + len2 = printf("Percent:[%%]\n"); + _printf("Len:[%d]\n", len); + printf("Len:[%d]\n", len2); + _printf("Unknown:[%r]\n"); + printf("Unknown:[%r]\n"); + return (0); +} diff --git a/tests/small_tests.c b/tests/small_tests.c new file mode 100644 index 0000000..c0e1ff8 --- /dev/null +++ b/tests/small_tests.c @@ -0,0 +1,25 @@ +#include +#include "../holberton.h" + +/** + * 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); +}