📄 diag.cxx
字号:
case 'D': case 'x': case 'X': case 'u': case 'U': case 'b': case 'B': if (islonglong) { val = va_arg(ap, long long); } else if (islong) { val = (long long)va_arg(ap, long); } else{ val = (long long)va_arg(ap, int); } if ((c == 'd') || (c == 'D')) { if (val < 0) { sign = '-'; val = -val; } } else { // Mask to unsigned, sized quantity if (islong) { val &= ((long long)1 << (sizeof(long) * 8)) - 1; } else{ val &= ((long long)1 << (sizeof(int) * 8)) - 1; } } break; default: break; } // Process output switch (c) { case 'p': // Pointer (*putc)('0', param); (*putc)('x', param); zero_fill = true; left_prec = sizeof(unsigned long)*2; case 'd': case 'D': case 'u': case 'U': case 'x': case 'X': switch (c) { case 'd': case 'D': case 'u': case 'U': length = _cvt(val, buf, 10, "0123456789"); break; case 'p': case 'x': length = _cvt(val, buf, 16, "0123456789abcdef"); break; case 'X': length = _cvt(val, buf, 16, "0123456789ABCDEF"); break; } cp = buf; break; case 's': case 'S': cp = va_arg(ap, char *); if (cp == NULL) cp = "<null>"; else if (!diag_check_string(cp)) { diag_write_string("<Not a string: 0x"); diag_write_hex((cyg_uint32)cp); cp = ">"; } length = 0; while (cp[length] != '\0') length++; break; case 'c': case 'C': c = va_arg(ap, int /*char*/); (*putc)(c, param); res++; continue; case 'b': case 'B': length = left_prec; if (left_prec == 0) { if (islonglong) length = sizeof(long long)*8; else if (islong) length = sizeof(long)*8; else length = sizeof(int)*8; } for (i = 0; i < length-1; i++) { buf[i] = ((val & ((long long)1<<i)) ? '1' : '.'); } cp = buf; break; case '%': (*putc)('%', param); break; default: (*putc)('%', param); (*putc)(c, param); res += 2; } pad = left_prec - length; if (sign != '\0') { pad--; } if (zero_fill) { c = '0'; if (sign != '\0') { (*putc)(sign, param); res++; sign = '\0'; } } else { c = ' '; } if (!pad_on_right) { while (pad-- > 0) { (*putc)(c, param); res++; } } if (sign != '\0') { (*putc)(sign, param); res++; } while (length-- > 0) { c = *cp++; (*putc)(c, param); res++; } if (pad_on_right) { while (pad-- > 0) { (*putc)(' ', param); res++; } } } else { (*putc)(c, param); res++; } } return (res);}struct _sputc_info { char *ptr; int max, len;};static void _sputc(char c, void **param){ struct _sputc_info *info = (struct _sputc_info *)param; if (info->len < info->max) { *(info->ptr)++ = c; *(info->ptr) = '\0'; info->len++; }}intdiag_sprintf(char *buf, const char *fmt, ...){ int ret; va_list ap; struct _sputc_info info; va_start(ap, fmt); info.ptr = buf; info.max = 1024; // Unlimited info.len = 0; ret = _vprintf(_sputc, (void **)&info, fmt, ap); va_end(ap); return (info.len);}intdiag_snprintf(char *buf, size_t len, const char *fmt, ...){ int ret; va_list ap; struct _sputc_info info; va_start(ap, fmt); info.ptr = buf; info.len = 0; info.max = len; ret = _vprintf(_sputc, (void **)&info, fmt, ap); va_end(ap); return (info.len);}int diag_vsprintf(char *buf, const char *fmt, va_list ap){ int ret; struct _sputc_info info; info.ptr = buf; info.max = 1024; // Unlimited info.len = 0; ret = _vprintf(_sputc, (void **)&info, fmt, ap); return (info.len);}intdiag_printf(const char *fmt, ...){ va_list ap; int ret; va_start(ap, fmt); ret = _vprintf(_putc, (void **)0, fmt, ap); va_end(ap); return (ret);}intdiag_vprintf(const char *fmt, va_list ap){ int ret; ret = _vprintf(_putc, (void **)0, fmt, ap); return (ret);}voiddiag_vdump_buf_with_offset(__printf_fun *pf, cyg_uint8 *p, CYG_ADDRWORD s, cyg_uint8 *base){ int i, c; if ((CYG_ADDRWORD)s > (CYG_ADDRWORD)p) { s = (CYG_ADDRWORD)s - (CYG_ADDRWORD)p; } while ((int)s > 0) { if (base) { (*pf)("%08X: ", (CYG_ADDRWORD)p - (CYG_ADDRWORD)base); } else { (*pf)("%08X: ", p); } for (i = 0; i < 16; i++) { if (i < (int)s) { (*pf)("%02X ", p[i] & 0xFF); } else { (*pf)(" "); } if (i == 7) (*pf)(" "); } (*pf)(" |"); for (i = 0; i < 16; i++) { if (i < (int)s) { c = p[i] & 0xFF; if ((c < 0x20) || (c >= 0x7F)) c = '.'; } else { c = ' '; } (*pf)("%c", c); } (*pf)("|\n"); s -= 16; p += 16; }}voiddiag_dump_buf_with_offset(cyg_uint8 *p, CYG_ADDRWORD s, cyg_uint8 *base){ diag_vdump_buf_with_offset(diag_printf, p, s, base);}voiddiag_dump_buf(void *p, CYG_ADDRWORD s){ diag_dump_buf_with_offset((cyg_uint8 *)p, s, 0);}voiddiag_dump_buf_with_offset_32bit(cyg_uint32 *p, CYG_ADDRWORD s, cyg_uint32 *base){ int i; if ((CYG_ADDRWORD)s > (CYG_ADDRWORD)p) { s = (CYG_ADDRWORD)s - (CYG_ADDRWORD)p; } while ((int)s > 0) { if (base) { diag_printf("%08X: ", (CYG_ADDRWORD)p - (CYG_ADDRWORD)base); } else { diag_printf("%08X: ", p); } for (i = 0; i < 4; i++) { if (i < (int)s/4) { diag_printf("%08X ", p[i] ); } else { diag_printf(" "); } } diag_printf("\n"); s -= 16; p += 4; }}externC voiddiag_dump_buf_32bit(void *p, CYG_ADDRWORD s){ diag_dump_buf_with_offset_32bit((cyg_uint32 *)p, s, 0);}voiddiag_dump_buf_with_offset_16bit(cyg_uint16 *p, CYG_ADDRWORD s, cyg_uint16 *base){ int i; if ((CYG_ADDRWORD)s > (CYG_ADDRWORD)p) { s = (CYG_ADDRWORD)s - (CYG_ADDRWORD)p; } while ((int)s > 0) { if (base) { diag_printf("%08X: ", (CYG_ADDRWORD)p - (CYG_ADDRWORD)base); } else { diag_printf("%08X: ", p); } for (i = 0; i < 8; i++) { if (i < (int)s/2) { diag_printf("%04X ", p[i] ); if (i == 3) diag_printf(" "); } else { diag_printf(" "); } } diag_printf("\n"); s -= 16; p += 8; }}externC voiddiag_dump_buf_16bit(void *p, CYG_ADDRWORD s){ diag_dump_buf_with_offset_16bit((cyg_uint16 *)p, s, 0);}/*-----------------------------------------------------------------------*//* EOF infra/diag.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -