From 575b64d5674088511742bb992e96f79cdb4bea1b Mon Sep 17 00:00:00 2001 From: LinlyBoi Date: Tue, 22 Aug 2023 19:36:48 +0300 Subject: [PATCH 01/12] added a default case --- printf.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/printf.c b/printf.c index d9bd1fa..3f098aa 100644 --- a/printf.c +++ b/printf.c @@ -65,7 +65,9 @@ int fmt(char c, va_list args) case '%': /*add 1 byte*/ return (_putchar('%')); default: - return (0); + _putchar('%'); /* TODO make this cleaner */ + _putchar(c); + return (2); } } From 43c82c55fbcca0c75b3e7d164c3c9e665d6f1cf5 Mon Sep 17 00:00:00 2001 From: LinlyBoi Date: Tue, 22 Aug 2023 19:37:07 +0300 Subject: [PATCH 02/12] this chonker is here now --- tests/chonk.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 tests/chonk.c diff --git a/tests/chonk.c b/tests/chonk.c new file mode 100644 index 0000000..e4e95cf --- /dev/null +++ b/tests/chonk.c @@ -0,0 +1,44 @@ +#include "../main.h" +#include +#include + +/** + * 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); +} From 44951b7b512f184981c7b494e707a24c557a2cbb Mon Sep 17 00:00:00 2001 From: LinlyBoi Date: Tue, 22 Aug 2023 22:02:10 +0300 Subject: [PATCH 03/12] usigned itoa --- main.h | 3 +++ printf.c | 8 +++++++- tests/num_test.c | 12 ++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 tests/num_test.c diff --git a/main.h b/main.h index 1649623..f24843b 100644 --- a/main.h +++ b/main.h @@ -10,5 +10,8 @@ int _puts(char *str); int _putchar(char c); char *_memset(char *adr, int bval); int fmt(char c, va_list args); +char *_str_reverse(char *str); +char *_itoa(int n, int base); +char *_uitoa(unsigned int n, int base); #endif diff --git a/printf.c b/printf.c index 3f098aa..7f4ee74 100644 --- a/printf.c +++ b/printf.c @@ -43,7 +43,7 @@ int _printf(const char *format, ...) } if (buffer) { - _puts(buffer); + printed += _puts(buffer); free(buffer); } return (printed); @@ -64,6 +64,12 @@ int fmt(char c, va_list args) return (_putchar(va_arg(args, int))); case '%': /*add 1 byte*/ return (_putchar('%')); + case 'd': + return (_puts(_itoa(va_arg(args, int), 10))); + case 'i': + return (_puts(_itoa(va_arg(args, int), 10))); + case 'b': + return (_puts(_itoa(va_arg(args, int), 2))); default: _putchar('%'); /* TODO make this cleaner */ _putchar(c); diff --git a/tests/num_test.c b/tests/num_test.c new file mode 100644 index 0000000..31ceb88 --- /dev/null +++ b/tests/num_test.c @@ -0,0 +1,12 @@ +#include "../main.h" +#define shit 0 +#define fr ; +/** + * main - no cap fr %d + * + */ +int main(void) +{ + _printf("the number is: %d\n", 10)fr + return (shit)fr +} From 842becc3b150e0007b420cc8745c3230df07c7c5 Mon Sep 17 00:00:00 2001 From: LinlyBoi Date: Tue, 22 Aug 2023 22:05:21 +0300 Subject: [PATCH 04/12] YIPPEEE --- printf.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/printf.c b/printf.c index 7f4ee74..5623742 100644 --- a/printf.c +++ b/printf.c @@ -67,9 +67,15 @@ int fmt(char c, va_list args) case 'd': return (_puts(_itoa(va_arg(args, int), 10))); case 'i': - return (_puts(_itoa(va_arg(args, int), 10))); + return (_puts(_itoa(va_arg(args, unsigned int), 10))); + case 'u': + return (_puts(_uitoa(va_arg(args, unsigned int), 10))); case 'b': - return (_puts(_itoa(va_arg(args, int), 2))); + return (_puts(_uitoa(va_arg(args, unsigned int), 2))); + case 'o': + return (_puts(_uitoa(va_arg(args, unsigned int), 8))); + case 'x': + return (_puts(_uitoa(va_arg(args, unsigned int), 16))); default: _putchar('%'); /* TODO make this cleaner */ _putchar(c); From a109c7df2f69d4a231809697deb3c2e9ac74a2c9 Mon Sep 17 00:00:00 2001 From: LinlyBoi Date: Tue, 22 Aug 2023 22:05:34 +0300 Subject: [PATCH 05/12] uitoa in i --- printf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/printf.c b/printf.c index 5623742..4930898 100644 --- a/printf.c +++ b/printf.c @@ -67,7 +67,7 @@ int fmt(char c, va_list args) case 'd': return (_puts(_itoa(va_arg(args, int), 10))); case 'i': - return (_puts(_itoa(va_arg(args, unsigned int), 10))); + return (_puts(_uitoa(va_arg(args, unsigned int), 10))); case 'u': return (_puts(_uitoa(va_arg(args, unsigned int), 10))); case 'b': From 25ddd63fc99bec98ef423b142e650f6eba36bcaf Mon Sep 17 00:00:00 2001 From: LinlyBoi Date: Tue, 22 Aug 2023 22:10:48 +0300 Subject: [PATCH 06/12] string to upper prototype --- main.h | 1 + 1 file changed, 1 insertion(+) diff --git a/main.h b/main.h index f24843b..d030ac7 100644 --- a/main.h +++ b/main.h @@ -13,5 +13,6 @@ int fmt(char c, va_list args); char *_str_reverse(char *str); char *_itoa(int n, int base); char *_uitoa(unsigned int n, int base); +char *string_toupper(char *s); #endif From 160a8f58137c89edbe29a56a968da273fb7be4ff Mon Sep 17 00:00:00 2001 From: LinlyBoi Date: Tue, 22 Aug 2023 22:11:10 +0300 Subject: [PATCH 07/12] itoa is pog --- itoa.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/itoa.c | 13 +++++++ 2 files changed, 113 insertions(+) create mode 100644 itoa.c create mode 100644 tests/itoa.c diff --git a/itoa.c b/itoa.c new file mode 100644 index 0000000..97959cf --- /dev/null +++ b/itoa.c @@ -0,0 +1,100 @@ +#include "main.h" +#include +/** + * _str_reverse - reverse a string because I said so + * @str: da string + * Return: number in string form + */ +char *_str_reverse(char *str) +{ + unsigned int i, len; + char *buffer; + + len = _strlen(str); + buffer = malloc(len); + if (!buffer) + return (NULL); + for (i = 0; i < len; i++) + *(buffer + len - 1 - i) = *(str + i); + return (buffer); + + +} +/** + * _itoa - turn NUMBA into a STRING + * @n: NUMBA + * @base: base + * Return: numba in string form + */ +char *_itoa(int n, int base) +{ + int i, isNegative, rem; + char *str; + + str = malloc(1024); + i = isNegative = 0; + if (n == 0) + { + *(str + i++) = '0'; + *(str + i) = '\0'; + return (str); + } + + if (n < 0 && base == 10) + { + isNegative = 1; + n = -n; + } + + while (n != 0) + { + rem = n % base; + *(str + i++) = (rem > 9) ? (rem - 10) + 'a' : rem + '0'; + n = n / base; + } + + if (isNegative) + *(str + i++) = '-'; + + *(str + i) = '\0'; + + str = _str_reverse(str); + + return (str); +} + +/** + * _uitoa - turn NUMBA into a STRING + * @n: NUMBA + * @base: base + * Return: numba in string form + */ +char *_uitoa(unsigned int n, int base) +{ + int i, rem; + char *str; + + str = malloc(1024); + i = 0; + if (n == 0) + { + *(str + i++) = '0'; + *(str + i) = '\0'; + return (str); + } + + + while (n != 0) + { + rem = n % base; + *(str + i++) = (rem > 9) ? (rem - 10) + 'a' : rem + '0'; + n = n / base; + } + + + *(str + i) = '\0'; + + str = _str_reverse(str); + + return (str); +} diff --git a/tests/itoa.c b/tests/itoa.c new file mode 100644 index 0000000..1b6c29e --- /dev/null +++ b/tests/itoa.c @@ -0,0 +1,13 @@ +#include "../main.h" +#define shit 0 +/** + * main - check if this works + */ +int main(void) +{ + char *str; + + str = _itoa(10, 2); + _printf("%s", str); + return (shit); +} From bd7830ee39690787aa8a4cf91ec248e11011a93a Mon Sep 17 00:00:00 2001 From: LinlyBoi Date: Tue, 22 Aug 2023 22:12:43 +0300 Subject: [PATCH 08/12] rename string_toupper --- main.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.h b/main.h index d030ac7..5f434b3 100644 --- a/main.h +++ b/main.h @@ -13,6 +13,6 @@ int fmt(char c, va_list args); char *_str_reverse(char *str); char *_itoa(int n, int base); char *_uitoa(unsigned int n, int base); -char *string_toupper(char *s); +char *str_up(char *s); #endif From 6f160da6ef5f72dbd97ac6b0e1f394a8164a6396 Mon Sep 17 00:00:00 2001 From: LinlyBoi Date: Tue, 22 Aug 2023 22:13:18 +0300 Subject: [PATCH 09/12] str_up --- strings.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/strings.c b/strings.c index ea662e1..adf615f 100644 --- a/strings.c +++ b/strings.c @@ -62,3 +62,23 @@ char *append(char *str, char c) *(new_me + len + 1) = '\0'; return (new_me); } + +/** + * string_toupper - changes all lowercase letters of a string + * to uppercase + * @s: string to modify + * + * Return: the resulting string + */ +char *str_up(char *s) +{ + int i; + + for (i = 0; s[i] != '\0'; i++) + { + if (s[i] >= 'a' && s[i] <= 'z') + s[i] = s[i] - 32; + } + + return (s); +} From 3a53d1d5add4afe679e1b01103e7c8456109423d Mon Sep 17 00:00:00 2001 From: LinlyBoi Date: Tue, 22 Aug 2023 22:13:26 +0300 Subject: [PATCH 10/12] X? --- printf.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/printf.c b/printf.c index 4930898..bba8713 100644 --- a/printf.c +++ b/printf.c @@ -76,6 +76,10 @@ int fmt(char c, va_list args) return (_puts(_uitoa(va_arg(args, unsigned int), 8))); case 'x': return (_puts(_uitoa(va_arg(args, unsigned int), 16))); + case 'X': + return (_puts(str_up(_uitoa(va_arg(args, unsigned int), 16)))); + case 'p': + return (_puts(_uitoa(va_arg(args, unsigned int), 16))); default: _putchar('%'); /* TODO make this cleaner */ _putchar(c); From 1dea5b6dbdf6f164d71de237be806a78fd1f9ed1 Mon Sep 17 00:00:00 2001 From: LinlyBoi Date: Tue, 22 Aug 2023 22:14:12 +0300 Subject: [PATCH 11/12] gimme that --- printf.c | 1 + 1 file changed, 1 insertion(+) diff --git a/printf.c b/printf.c index bba8713..22f3332 100644 --- a/printf.c +++ b/printf.c @@ -21,6 +21,7 @@ int _printf(const char *format, ...) return (0); buff_idx = fmt_idx = printed = 0; /*chain assignment*/ + _memset(buffer, 0); while (*(format + fmt_idx)) { if ((*(format + fmt_idx) == '%') && (*(format + fmt_idx + 1))) From 13b061058cf3b3fbe11a6916adc76763780db9f8 Mon Sep 17 00:00:00 2001 From: LinlyBoi Date: Tue, 22 Aug 2023 22:17:31 +0300 Subject: [PATCH 12/12] THIS WORKS?! almost --- printf.c | 4 ++-- tests/num_test.c | 2 ++ tests/test.sh | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/printf.c b/printf.c index 22f3332..da27e1d 100644 --- a/printf.c +++ b/printf.c @@ -21,7 +21,6 @@ int _printf(const char *format, ...) return (0); buff_idx = fmt_idx = printed = 0; /*chain assignment*/ - _memset(buffer, 0); while (*(format + fmt_idx)) { if ((*(format + fmt_idx) == '%') && (*(format + fmt_idx + 1))) @@ -30,7 +29,7 @@ int _printf(const char *format, ...) { printed += _puts(buffer); buff_size -= _strlen(buffer); - _memset(buffer, 0); + buffer = _memset(buffer, 0); buffer = (char *) malloc(buff_size); if (!buffer) return (-1); @@ -45,6 +44,7 @@ int _printf(const char *format, ...) if (buffer) { printed += _puts(buffer); + buffer = _memset(buffer, 0); free(buffer); } return (printed); diff --git a/tests/num_test.c b/tests/num_test.c index 31ceb88..6798b8e 100644 --- a/tests/num_test.c +++ b/tests/num_test.c @@ -8,5 +8,7 @@ int main(void) { _printf("the number is: %d\n", 10)fr + _printf("the binary is: %b\n", 10)fr + _printf("the cursed i thing is: %i\n", 011); return (shit)fr } diff --git a/tests/test.sh b/tests/test.sh index 363f67a..7f3378b 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -1,3 +1,3 @@ #!/usr/bin/bash -gcc -Wall -pedantic -Werror -Wextra -std=gnu89 $1 ../*.c -o a +gcc -Wno-format -Wall -pedantic -Werror -Wextra -std=gnu89 $1 ../*.c -o a ./a