diff --git a/main.h b/main.h index ce36133..1649623 100644 --- a/main.h +++ b/main.h @@ -1,5 +1,6 @@ #ifndef MAIN_H_ #define MAIN_H_ +#include int _printf(const char *format, ...); int _contains(const char *str, char c); int _strlen(const char *str); @@ -7,6 +8,7 @@ char *_strcpy(char *dest, char *src); char *append(char *str, char c); int _puts(char *str); int _putchar(char c); -char* _memset(char *str, int bval); +char *_memset(char *adr, int bval); +int fmt(char c, va_list args); #endif diff --git a/memset.c b/memset.c index 4758670..32788b8 100644 --- a/memset.c +++ b/memset.c @@ -4,19 +4,19 @@ * _memset - sets values of bytes to specific value * * @adr: head address - * @n: number of bytes + * @bval: number of bytes * * Return: pointer to place */ -char* _memset(char *str, int bval) +char *_memset(char *adr, int bval) { int i; - for (i = 0; i < _strlen(str); i++) + for (i = 0; i < _strlen(adr); i++) { - *(str + i) = bval; + *(adr + i) = bval; } - return (str); + return (adr); } diff --git a/printf.c b/printf.c index f9a1bea..d9bd1fa 100644 --- a/printf.c +++ b/printf.c @@ -1,5 +1,4 @@ #include "main.h" -#include #include #include /** @@ -10,61 +9,63 @@ **/ int _printf(const char *format, ...) { - int buff_idx, fmt_idx; /* Indexes */ - unsigned int identifiers, BUFF_SIZE, printed; + unsigned int buff_idx, fmt_idx, buff_size, printed; char *buffer; /*where non formated things are stored*/ va_list args; va_start(args, format); + buff_size = _strlen(format) - _contains(format, '%'); + buffer = (char *) malloc(buff_size); /* sized of the non % instances only*/ - identifiers = _contains(format, '%'); /* instances of %s, %c etc */ - BUFF_SIZE = _strlen(format) - identifiers; - buffer = malloc(BUFF_SIZE); /* sized of the non % instances only*/ - - if (!format) /* No string. No laundry */ + if (!format && !buffer) /* No string. No laundry */ return (0); - buff_idx = 0; /* was there a way to squish these together? */ - fmt_idx = 0; - printed = 0; + buff_idx = fmt_idx = printed = 0; /*chain assignment*/ while (*(format + fmt_idx)) { if ((*(format + fmt_idx) == '%') && (*(format + fmt_idx + 1))) { - if (*buffer) /* printing and clearing buffer on formatted things */ + if (buffer) /* printing and clearing buffer on formatted things */ { - _puts(buffer); - BUFF_SIZE -= _strlen(buffer); - printed += _strlen(buffer); - free(buffer); - buffer = malloc(BUFF_SIZE); + printed += _puts(buffer); + buff_size -= _strlen(buffer); + _memset(buffer, 0); + buffer = (char *) malloc(buff_size); + if (!buffer) + return (-1); buff_idx = 0; } - switch (*(format + fmt_idx + 1)) /*this needs to shrink*/ - { - case 's': - printed += _puts(va_arg(args, char*)); - break; - case 'c': - printed += _putchar(va_arg(args, int)); - break; - case '%': /*add 1 byte*/ - printed += _putchar('%'); - break; - } - fmt_idx += 2; + printed += fmt(*(format + fmt_idx + 1), args); + fmt_idx += 2; } else - { - *(buffer + buff_idx) = *(format + fmt_idx); /* filling up buffer */ - buff_idx++; - fmt_idx++; - } + *(buffer + buff_idx++) = *(format + fmt_idx++); /* filling up buffer */ } - if (*buffer) /*final buffer check*/ + if (buffer) { - printed += _puts(buffer); + _puts(buffer); free(buffer); } - return (printed); + return (printed); +} +/** + * fmt - format because its too chonky for printf + * @c: format character (for now) + * @args: the arguments to pop from + * Return: bytes written to stdout + */ +int fmt(char c, va_list args) +{ + switch (c) /*this needs to shrink*/ + { + case 's': + return (_puts(va_arg(args, char*))); + case 'c': + return (_putchar(va_arg(args, int))); + case '%': /*add 1 byte*/ + return (_putchar('%')); + default: + return (0); + } + } diff --git a/tests/char_print.c b/tests/char_print.c index d62a66e..e81f270 100644 --- a/tests/char_print.c +++ b/tests/char_print.c @@ -10,6 +10,6 @@ int main(void) { char c = 97; - _printf("cat: %css\n", c); + _printf("cat: %css\noh wait is that...a %%\n", c); return (0); }