📄 vex_util.c
字号:
if (syned) { if (n0 < 0) { minus = True; u0 = (ULong)(-n0); } else { u0 = (ULong)(n0); } } else { u0 = (ULong)n0; } while (1) { buf[bufi++] = toHChar('0' + toUInt(u0 % base)); u0 /= base; if (u0 == 0) break; } if (minus) buf[bufi++] = '-'; buf[bufi] = 0; for (i = 0; i < bufi; i++) if (buf[i] > '9') buf[i] = toHChar(buf[i] + (hexcaps ? 'A' : 'a') - '9' - 1); i = 0; j = bufi-1; while (i <= j) { c = buf[i]; buf[i] = buf[j]; buf[j] = c; i++; j--; }}/* A half-arsed and buggy, but good-enough, implementation of printf. */staticUInt vprintf_wrk ( void(*sink)(HChar), HChar* format, va_list ap ){# define PUT(_ch) \ do { sink(_ch); nout++; } \ while (0)# define PAD(_n) \ do { Int _qq = (_n); for (; _qq > 0; _qq--) PUT(padchar); } \ while (0)# define PUTSTR(_str) \ do { HChar* _qq = _str; for (; *_qq; _qq++) PUT(*_qq); } \ while (0) HChar* saved_format; Bool longlong, ljustify; HChar padchar; Int fwidth, nout, len1, len2, len3; HChar intbuf[100]; /* big enough for a 64-bit # in base 2 */ nout = 0; while (1) { if (!format) break; if (*format == 0) break; if (*format != '%') { PUT(*format); format++; continue; } saved_format = format; longlong = False; ljustify = False; padchar = ' '; fwidth = 0; format++; if (*format == '-') { format++; ljustify = True; } if (*format == '0') { format++; padchar = '0'; } while (*format >= '0' && *format <= '9') { fwidth = fwidth * 10 + (*format - '0'); format++; } if (*format == 'l') { format++; if (*format == 'l') { format++; longlong = True; } } switch (*format) { case 's': { HChar* str = va_arg(ap, HChar*); if (str == NULL) str = "(null)"; len1 = len3 = 0; len2 = vex_strlen(str); if (fwidth > len2) { len1 = ljustify ? 0 : fwidth-len2; len3 = ljustify ? fwidth-len2 : 0; } PAD(len1); PUTSTR(str); PAD(len3); break; } case 'c': { HChar c = (HChar)va_arg(ap, int); HChar str[2]; str[0] = c; str[1] = 0; len1 = len3 = 0; len2 = vex_strlen(str); if (fwidth > len2) { len1 = ljustify ? 0 : fwidth-len2; len3 = ljustify ? fwidth-len2 : 0; } PAD(len1); PUTSTR(str); PAD(len3); break; } case 'd': { Long l; if (longlong) { l = va_arg(ap, Long); } else { l = (Long)va_arg(ap, Int); } convert_int(intbuf, l, 10/*base*/, True/*signed*/, False/*irrelevant*/); len1 = len3 = 0; len2 = vex_strlen(intbuf); if (fwidth > len2) { len1 = ljustify ? 0 : fwidth-len2; len3 = ljustify ? fwidth-len2 : 0; } PAD(len1); PUTSTR(intbuf); PAD(len3); break; } case 'u': case 'x': case 'X': { Int base = *format == 'u' ? 10 : 16; Bool hexcaps = True; /* *format == 'X'; */ ULong l; if (longlong) { l = va_arg(ap, ULong); } else { l = (ULong)va_arg(ap, UInt); } convert_int(intbuf, l, base, False/*unsigned*/, hexcaps); len1 = len3 = 0; len2 = vex_strlen(intbuf); if (fwidth > len2) { len1 = ljustify ? 0 : fwidth-len2; len3 = ljustify ? fwidth-len2 : 0; } PAD(len1); PUTSTR(intbuf); PAD(len3); break; } case 'p': case 'P': { Bool hexcaps = toBool(*format == 'P'); ULong l = Ptr_to_ULong( va_arg(ap, void*) ); convert_int(intbuf, l, 16/*base*/, False/*unsigned*/, hexcaps); len1 = len3 = 0; len2 = vex_strlen(intbuf)+2; if (fwidth > len2) { len1 = ljustify ? 0 : fwidth-len2; len3 = ljustify ? fwidth-len2 : 0; } PAD(len1); PUT('0'); PUT('x'); PUTSTR(intbuf); PAD(len3); break; } default: /* no idea what it is. Print the format literally and move on. */ while (saved_format <= format) { PUT(*saved_format); saved_format++; } break; } format++; } return nout;# undef PUT# undef PAD# undef PUTSTR}/* A general replacement for printf(). Note that only low-level debugging info should be sent via here. The official route is to to use vg_message(). This interface is deprecated.*/static HChar myprintf_buf[1000];static Int n_myprintf_buf;static void add_to_myprintf_buf ( HChar c ){ Bool emit = toBool(c == '\n' || n_myprintf_buf >= 1000-10 /*paranoia*/); myprintf_buf[n_myprintf_buf++] = c; myprintf_buf[n_myprintf_buf] = 0; if (emit) { (*vex_log_bytes)( myprintf_buf, vex_strlen(myprintf_buf) ); n_myprintf_buf = 0; myprintf_buf[n_myprintf_buf] = 0; }}UInt vex_printf ( HChar* format, ... ){ UInt ret; va_list vargs; va_start(vargs,format); n_myprintf_buf = 0; myprintf_buf[n_myprintf_buf] = 0; ret = vprintf_wrk ( add_to_myprintf_buf, format, vargs ); if (n_myprintf_buf > 0) { (*vex_log_bytes)( myprintf_buf, n_myprintf_buf ); } va_end(vargs); return ret;}/* A general replacement for sprintf(). */static HChar *vg_sprintf_ptr;static void add_to_vg_sprintf_buf ( HChar c ){ *vg_sprintf_ptr++ = c;}UInt vex_sprintf ( HChar* buf, HChar *format, ... ){ Int ret; va_list vargs; vg_sprintf_ptr = buf; va_start(vargs,format); ret = vprintf_wrk ( add_to_vg_sprintf_buf, format, vargs ); add_to_vg_sprintf_buf(0); va_end(vargs); vassert(vex_strlen(buf) == ret); return ret;}/*---------------------------------------------------------------*//*--- end vex_util.c ---*//*---------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -