CapsAdmin

Untitled

May 21st, 2011
338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.05 KB | None | 0 0
  1. /* Push formatted message as a string object to Lua stack. va_list variant. */
  2. const char *lj_str_pushvf(lua_State *L, const char *fmt, va_list argp)
  3. {
  4.   SBuf *sb = &G(L)->tmpbuf;
  5.   lj_str_needbuf(L, sb, (MSize)strlen(fmt));
  6.   lj_str_resetbuf(sb);
  7.   for (;;) {
  8.     const char *e = strchr(fmt, '%');
  9.     if (e == NULL) break;
  10.     addstr(L, sb, fmt, (MSize)(e-fmt));
  11.     /* This function only handles %s, %c, %d, %f and %p formats. */
  12.     switch (e[1]) {
  13.     case 's': {
  14.       const char *s = va_arg(argp, char *);
  15.       if (s == NULL) s = "(null)";
  16.       addstr(L, sb, s, (MSize)strlen(s));
  17.       break;
  18.       }
  19.     case 'c':
  20.       addchar(L, sb, va_arg(argp, int));
  21.       break;
  22.     case 'd': {
  23.       char buff[1+10];
  24.       char *p = buff+sizeof(buff);
  25.       int32_t k = va_arg(argp, int32_t);
  26.       uint32_t i = (uint32_t)(k < 0 ? -k : k);
  27.       do { *--p = (char)('0' + i % 10); } while (i /= 10);
  28.       if (k < 0) *--p = '-';
  29.       addstr(L, sb, p, (MSize)(buff+sizeof(buff)-p));
  30.       break;
  31.       }
  32.     case 'f': {
  33.       char buf[LUAI_MAXNUMBER2STR];
  34.       TValue tv;
  35.       MSize len;
  36.       tv.n = cast_num(va_arg(argp, LUAI_UACNUMBER));
  37.       len = (MSize)lj_str_bufnum(buf, &tv);
  38.       addstr(L, sb, buf, len);
  39.       break;
  40.       }
  41.     case 'p': {
  42. #define FMTP_CHARS  (2*sizeof(ptrdiff_t))
  43.       char buff[2+FMTP_CHARS];
  44.       ptrdiff_t p = (ptrdiff_t)(va_arg(argp, void *));
  45.       ptrdiff_t i, lasti = 2+FMTP_CHARS;
  46. #if LJ_64
  47.       if ((p >> 32) == 0)  /* Shorten output for true 32 bit pointers. */
  48.     lasti = 2+2*4;
  49. #endif
  50.       buff[0] = '0';
  51.       buff[1] = 'x';
  52.       for (i = lasti-1; i >= 2; i--, p >>= 4)
  53.     buff[i] = "0123456789abcdef"[(p & 15)];
  54.       addstr(L, sb, buff, (MSize)lasti);
  55.       break;
  56.       }
  57.     case '%':
  58.       addchar(L, sb, '%');
  59.       break;
  60.     default:
  61.       addchar(L, sb, '%');
  62.       addchar(L, sb, e[1]);
  63.       break;
  64.     }
  65.     fmt = e+2;
  66.   }
  67.   addstr(L, sb, fmt, (MSize)strlen(fmt));
  68.   setstrV(L, L->top, lj_str_new(L, sb->buf, sb->n));
  69.   incr_top(L);
  70.   return strVdata(L->top - 1);
  71. }
Advertisement
Add Comment
Please, Sign In to add comment