Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Push formatted message as a string object to Lua stack. va_list variant. */
- const char *lj_str_pushvf(lua_State *L, const char *fmt, va_list argp)
- {
- SBuf *sb = &G(L)->tmpbuf;
- lj_str_needbuf(L, sb, (MSize)strlen(fmt));
- lj_str_resetbuf(sb);
- for (;;) {
- const char *e = strchr(fmt, '%');
- if (e == NULL) break;
- addstr(L, sb, fmt, (MSize)(e-fmt));
- /* This function only handles %s, %c, %d, %f and %p formats. */
- switch (e[1]) {
- case 's': {
- const char *s = va_arg(argp, char *);
- if (s == NULL) s = "(null)";
- addstr(L, sb, s, (MSize)strlen(s));
- break;
- }
- case 'c':
- addchar(L, sb, va_arg(argp, int));
- break;
- case 'd': {
- char buff[1+10];
- char *p = buff+sizeof(buff);
- int32_t k = va_arg(argp, int32_t);
- uint32_t i = (uint32_t)(k < 0 ? -k : k);
- do { *--p = (char)('0' + i % 10); } while (i /= 10);
- if (k < 0) *--p = '-';
- addstr(L, sb, p, (MSize)(buff+sizeof(buff)-p));
- break;
- }
- case 'f': {
- char buf[LUAI_MAXNUMBER2STR];
- TValue tv;
- MSize len;
- tv.n = cast_num(va_arg(argp, LUAI_UACNUMBER));
- len = (MSize)lj_str_bufnum(buf, &tv);
- addstr(L, sb, buf, len);
- break;
- }
- case 'p': {
- #define FMTP_CHARS (2*sizeof(ptrdiff_t))
- char buff[2+FMTP_CHARS];
- ptrdiff_t p = (ptrdiff_t)(va_arg(argp, void *));
- ptrdiff_t i, lasti = 2+FMTP_CHARS;
- #if LJ_64
- if ((p >> 32) == 0) /* Shorten output for true 32 bit pointers. */
- lasti = 2+2*4;
- #endif
- buff[0] = '0';
- buff[1] = 'x';
- for (i = lasti-1; i >= 2; i--, p >>= 4)
- buff[i] = "0123456789abcdef"[(p & 15)];
- addstr(L, sb, buff, (MSize)lasti);
- break;
- }
- case '%':
- addchar(L, sb, '%');
- break;
- default:
- addchar(L, sb, '%');
- addchar(L, sb, e[1]);
- break;
- }
- fmt = e+2;
- }
- addstr(L, sb, fmt, (MSize)strlen(fmt));
- setstrV(L, L->top, lj_str_new(L, sb->buf, sb->n));
- incr_top(L);
- return strVdata(L->top - 1);
- }
Advertisement
Add Comment
Please, Sign In to add comment