123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- #include <stdarg.h>
- #include <stdint.h>
- #include "driver_uart.h"
- #define printf_putc(c) driver_uart_putc(UART_COMM, c)
- static int vpf_str_to_num(const char * fmt, int * num)
- {
- const char * p;
- int res, d, isd;
- res = 0;
- for(p = fmt; *fmt != '\0'; p++)
- {
- isd = (*p >= '0' && *p <= '9');
- if(!isd)
- break;
- d = *p - '0';
- res *= 10;
- res += d;
- }
- *num = res;
- return ((int)(p - fmt));
- }
- static void vpf_num_to_str(uint32_t a, int ish, int pl, int pc)
- {
- char buf[32];
- uint32_t base;
- int idx, i, t;
- for(i = 0; i < sizeof(buf); i++)
- buf[i] = pc;
- base = 10;
- if(ish)
- base = 16;
- idx = 0;
- do {
- t = a % base;
- if(t >= 10)
- buf[idx] = t - 10 + 'a';
- else
- buf[idx] = t + '0';
- a /= base;
- idx++;
- } while (a > 0);
- if(pl > 0)
- {
- if(pl >= sizeof(buf))
- pl = sizeof(buf) - 1;
- if(idx < pl)
- idx = pl;
- }
- buf[idx] = '\0';
- for(i = idx - 1; i >= 0; i--)
- printf_putc(buf[i]);
- }
- static int vpf(const char * fmt, va_list va)
- {
- const char * p, * q;
- int f, c, vai, pl, pc, i;
- unsigned char t;
- pc = ' ';
- for(p = fmt; *p != '\0'; p++)
- {
- f = 0;
- pl = 0;
- c = *p;
- q = p;
- if(*p == '%')
- {
- q = p;
- p++;
- if(*p >= '0' && *p <= '9')
- p += vpf_str_to_num(p, &pl);
- f = *p;
- }
- if((f == 'd') || (f == 'x'))
- {
- vai = va_arg(va, int);
- vpf_num_to_str(vai, f == 'x', pl, pc);
- }
- else
- {
- for(i = 0; i < (p - q); i++)
- printf_putc(q[i]);
- t = (unsigned char)(f != 0 ? f : c);
- printf_putc(t);
- }
- }
- return 0;
- }
- int printf(const char * fmt, ...)
- {
- va_list va;
- va_start(va, fmt);
- vpf(fmt, va);
- va_end(va);
- return 0;
- }
|