String buffer refactoring, part 4.

Add lua_State pointer to SBuf for buffer resizing.
This commit is contained in:
Mike Pall
2013-02-28 13:37:56 +01:00
parent 3c0157f426
commit 9ec869b362
11 changed files with 68 additions and 62 deletions

View File

@@ -222,27 +222,28 @@ GCstr * LJ_FASTCALL lj_str_fromnumber(lua_State *L, cTValue *o)
const char *lj_str_pushvf(lua_State *L, const char *fmt, va_list argp)
{
SBuf *sb = &G(L)->tmpbuf;
lj_buf_need(L, sb, (MSize)strlen(fmt));
setsbufL(sb, L);
lj_buf_need(sb, (MSize)strlen(fmt));
lj_buf_reset(sb);
for (;;) {
const char *e = strchr(fmt, '%');
if (e == NULL) break;
lj_buf_putmem(L, sb, fmt, (MSize)(e-fmt));
lj_buf_putmem(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)";
lj_buf_putmem(L, sb, s, (MSize)strlen(s));
lj_buf_putmem(sb, s, (MSize)strlen(s));
break;
}
case 'c':
lj_buf_putb(L, sb, va_arg(argp, int));
lj_buf_putb(sb, va_arg(argp, int));
break;
case 'd': {
char buf[LJ_STR_INTBUF];
char *p = lj_str_bufint(buf, va_arg(argp, int32_t));
lj_buf_putmem(L, sb, p, (MSize)(buf+LJ_STR_INTBUF-p));
lj_buf_putmem(sb, p, (MSize)(buf+LJ_STR_INTBUF-p));
break;
}
case 'f': {
@@ -251,7 +252,7 @@ const char *lj_str_pushvf(lua_State *L, const char *fmt, va_list argp)
MSize len;
tv.n = (lua_Number)(va_arg(argp, LUAI_UACNUMBER));
len = (MSize)lj_str_bufnum(buf, &tv);
lj_buf_putmem(L, sb, buf, len);
lj_buf_putmem(sb, buf, len);
break;
}
case 'p': {
@@ -260,7 +261,7 @@ const char *lj_str_pushvf(lua_State *L, const char *fmt, va_list argp)
ptrdiff_t p = (ptrdiff_t)(va_arg(argp, void *));
ptrdiff_t i, lasti = 2+FMTP_CHARS;
if (p == 0) {
lj_buf_putmem(L, sb, "NULL", 4);
lj_buf_putmem(sb, "NULL", 4);
break;
}
#if LJ_64
@@ -271,20 +272,20 @@ const char *lj_str_pushvf(lua_State *L, const char *fmt, va_list argp)
buf[1] = 'x';
for (i = lasti-1; i >= 2; i--, p >>= 4)
buf[i] = "0123456789abcdef"[(p & 15)];
lj_buf_putmem(L, sb, buf, (MSize)lasti);
lj_buf_putmem(sb, buf, (MSize)lasti);
break;
}
case '%':
lj_buf_putb(L, sb, '%');
lj_buf_putb(sb, '%');
break;
default:
lj_buf_putb(L, sb, '%');
lj_buf_putb(L, sb, e[1]);
lj_buf_putb(sb, '%');
lj_buf_putb(sb, e[1]);
break;
}
fmt = e+2;
}
lj_buf_putmem(L, sb, fmt, (MSize)strlen(fmt));
lj_buf_putmem(sb, fmt, (MSize)strlen(fmt));
setstrV(L, L->top, lj_buf_str(L, sb));
incr_top(L);
return strVdata(L->top - 1);