📄 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++;
}
}
int
diag_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);
}
int
diag_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);
}
int
diag_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);
}
int
diag_vprintf(const char *fmt, va_list ap)
{
int ret;
ret = _vprintf(_putc, (void **)0, fmt, ap);
return (ret);
}
void
diag_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;
}
}
void
diag_dump_buf_with_offset(cyg_uint8 *p,
CYG_ADDRWORD s,
cyg_uint8 *base)
{
diag_vdump_buf_with_offset(diag_printf, p, s, base);
}
void
diag_dump_buf(void *p, CYG_ADDRWORD s)
{
diag_dump_buf_with_offset((cyg_uint8 *)p, s, 0);
}
void
diag_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 void
diag_dump_buf_32bit(void *p, CYG_ADDRWORD s)
{
diag_dump_buf_with_offset_32bit((cyg_uint32 *)p, s, 0);
}
void
diag_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 void
diag_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 + -