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

📄 vex_util.c

📁 The Valgrind distribution has multiple tools. The most popular is the memory checking tool (called M
💻 C
📖 第 1 页 / 共 2 页
字号:
   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 + -