int vprintf(const char *fmt, va_list ap) { const char *hex = "0123456789abcdef"; char buf[11]; char *s; unsigned u; int ret = 0, i, c; while ((c = *fmt++)) { if (c == '%') { c = *fmt++; switch (c) { case 'c': mon_putchar(va_arg(ap, int)); ret++; continue; case 's': for (s = va_arg(ap, char *); *s; s++) { mon_putchar(*s); ret++; } continue; case 'd': i = va_arg(ap, int); u = (i < 0 ? -i : i); s = buf; do { *s++ = '0' + u % 10U; } while (u /= 10U); if (i < 0) *s++ = '-'; goto dumpbuf; case 'u': u = va_arg(ap, unsigned); s = buf; do { *s++ = '0' + u % 10U; } while (u /= 10U); goto dumpbuf; case 'x': u = va_arg(ap, unsigned); s = buf; do { *s++ = hex[u & 0xfu]; } while (u >>= 4); dumpbuf: while (--s >= buf) { mon_putchar(*s); ret++; } continue; } } mon_putchar(c); ret++; }
/* processChar(): * Used by the main polling loop to deal with incoming characters * on the console. */ void processChar(int c) { static char cmd[64]; static int cmdidx = 0; if (c == '\b') { if (cmdidx > 0) { cmdidx--; mon_printf("\b \b"); } } else if ((c == '\n') || (c == '\r')) { if (cmdidx != 0) { cmd[cmdidx] = 0; mon_printf("\r\n"); mon_docommand(cmd,0); cmdidx = 0; } mon_printf("\r\nPROMPT:"); } else { if (cmdidx < (sizeof(cmd)-1)) { cmd[cmdidx++] = (char)c; mon_putchar(c); } else { mon_printf("\ncmd buffer overflow\n"); cmdidx = 0; } } }
/* * Write buffer to LCD * * return 1 on success, -1 on error */ static ssize_t umoncons_write(int minor, const char *buf, size_t len) { size_t i; for ( i=0 ; i<len ; i++ ) mon_putchar( buf[i] ); return len; }
/* This is used for putchark support */ static void umoncons_write_polled(int minor, char c) { mon_putchar( c ); }