From 87f9f02d1fa62121173c33175a2107fbfb06ce30 Mon Sep 17 00:00:00 2001 From: Ben Sima Date: Fri, 29 Jun 2018 20:09:42 -0700 Subject: Prototype-quality printf Needed help on the convert function --- xyo-networks/printf.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 xyo-networks/printf.c (limited to 'xyo-networks/printf.c') diff --git a/xyo-networks/printf.c b/xyo-networks/printf.c new file mode 100644 index 0000000..4fa165c --- /dev/null +++ b/xyo-networks/printf.c @@ -0,0 +1,91 @@ +#include +#include +#include "printf.h" + +/* + * my_printf("str: %s\nchr: %c\nhex: %x\nint: %d\noct: %o", + 1, 1, 1, 1, 1); +*/ + +int +main() +{ + my_printf("str: %s\nchr: %c\nhex: %x\nint: %d\noct: %o", + "hi", 'a', 0x32, 10, 8); + return 0; +} + +void +my_printf(char *format, ...) +{ + char *c; // a char in the `format` string + va_list args; + + va_start(args, format); + + for (c = format; *c != '\0'; c++) + { + while (*c != '%') + { + putchar(*c); + c++; + } + + c++; + + switch(*c) + { + case 'c': + { + putchar(va_arg(args, int)); + putchar('\n'); + break; + } + + case 'd': + { + puts(convert(va_arg(args, int), 10)); + break; + } + + case 'o': + { + puts(convert(va_arg(args, unsigned int), 8)); + break; + } + + case 'x': + { + puts(convert(va_arg(args, unsigned int), 16)); + break; + } + + case 's': + { + puts(va_arg(args, char*)); + break; + } + } + } + + va_end(args); +} + + +char* +convert(unsigned int num, int base) +{ + static char rep[]= "0123456789ABCDEF"; + static char buffer[50]; + char *ptr; + + ptr = &buffer[49]; + *ptr = '\0'; + + do { + *--ptr = rep[num%base]; + num /= base; + } while (num != 0); + + return(ptr); +} -- cgit v1.2.3