⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diag.cxx

📁 eCos操作系统源码
💻 CXX
📖 第 1 页 / 共 2 页
字号:
            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 + -