#include #include "monitor.h" int xatoi (char **str, long *res) { DWORD val; BYTE c, radix, s = 0; while ((c = **str) == ' ') (*str)++; if (c == '-') { s = 1; c = *(++(*str)); } if (c == '0') { c = *(++(*str)); if (c <= ' ') { *res = 0; return 1; } if (c == 'x') { radix = 16; c = *(++(*str)); } else { if (c == 'b') { radix = 2; c = *(++(*str)); } else { if ((c >= '0')&&(c <= '9')) radix = 8; else return 0; } } } else { if ((c < '1')||(c > '9')) return 0; radix = 10; } val = 0; while (c > ' ') { if (c >= 'a') c -= 0x20; c -= '0'; if (c >= 17) { c -= 7; if (c <= 9) return 0; } if (c >= radix) return 0; val = val * radix + c; c = *(++(*str)); } if (s) val = -val; *res = val; return 1; } void xputc (char c) { if (c == '\n') uart0_put('\r'); uart0_put(c); } void xputs (const char* str) { while (*str) xputc(*str++); } void xitoa (long val, int radix, int len) { BYTE c, r, sgn = 0, pad = ' '; BYTE s[20], i = 0; DWORD v; if (radix < 0) { radix = -radix; if (val < 0) { val = -val; sgn = '-'; } } v = val; r = radix; if (len < 0) { len = -len; pad = '0'; } if (len > 20) return; do { c = (BYTE)(v % r); if (c >= 10) c += 7; c += '0'; s[i++] = c; v /= r; } while (v); if (sgn) s[i++] = sgn; while (i < len) s[i++] = pad; do xputc(s[--i]); while (i); } void xprintf (const char* str, ...) { va_list arp; int d, r, w, s, l; va_start(arp, str); while ((d = *str++) != 0) { if (d != '%') { xputc(d); continue; } d = *str++; w = r = s = l = 0; if (d == '0') { d = *str++; s = 1; } while ((d >= '0')&&(d <= '9')) { w += w * 10 + (d - '0'); d = *str++; } if (s) w = -w; if (d == 'l') { l = 1; d = *str++; } if (!d) break; if (d == 's') { xputs(va_arg(arp, char*)); continue; } if (d == 'c') { xputc((char)va_arg(arp, int)); continue; } if (d == 'u') r = 10; if (d == 'd') r = -10; if (d == 'X') r = 16; if (d == 'b') r = 2; if (!r) break; if (l) { xitoa((long)va_arg(arp, long), r, w); } else { if (r > 0) xitoa((unsigned long)va_arg(arp, int), r, w); else xitoa((long)va_arg(arp, int), r, w); } } va_end(arp); } void put_dump (const BYTE *buff, DWORD ofs, int cnt) { BYTE n; xprintf("%08lX ", ofs); for(n = 0; n < cnt; n++) xprintf(" %02X", buff[n]); xputc(' '); for(n = 0; n < cnt; n++) { if ((buff[n] < 0x20)||(buff[n] >= 0x7F)) xputc('.'); else xputc(buff[n]); } xputc('\n'); } void get_line (char *buff, int len) { char c; int idx = 0; for (;;) { c = xgetc(); if (c == '\r') break; if ((c == '\b') && idx) { idx--; xputc(c); } if (((BYTE)c >= ' ') && (idx < len - 1)) { buff[idx++] = c; xputc(c); } } buff[idx] = 0; xputc('\n'); }