String buffer refactoring, part 2.

Switch to pointers for start/pos/end of buffer.
Abstract out some buffer writers.
This commit is contained in:
Mike Pall
2013-02-27 21:17:27 +01:00
parent 28cfcf7744
commit 116cdd7e9a
18 changed files with 334 additions and 336 deletions

View File

@@ -13,15 +13,20 @@
#include "lj_err.h"
#include "lj_buf.h"
LJ_NOINLINE void lj_buf_grow(lua_State *L, SBuf *sb, MSize sz)
LJ_NOINLINE void lj_buf_grow(lua_State *L, SBuf *sb, char *en)
{
MSize bsz = sb->sz * 2;
char *b = sbufB(sb);
MSize sz = (MSize)(en - b);
MSize osz = (MSize)(sbufE(sb) - b), nsz = osz;
MSize n = (MSize)(sbufP(sb) - b);
if (LJ_UNLIKELY(sz > LJ_MAX_MEM))
lj_err_mem(L);
if (bsz < LJ_MIN_SBUF) bsz = LJ_MIN_SBUF;
while (bsz < sz) bsz += bsz;
sb->buf = lj_mem_realloc(L, sb->buf, sb->sz, bsz);
sb->sz = bsz;
if (nsz < LJ_MIN_SBUF) nsz = LJ_MIN_SBUF;
while (nsz < sz) nsz += nsz;
b = (char *)lj_mem_realloc(L, b, osz, nsz);
setmref(sb->b, b);
setmref(sb->p, b + n);
setmref(sb->e, b + nsz);
}
char *lj_buf_tmp(lua_State *L, MSize sz)
@@ -31,10 +36,49 @@ char *lj_buf_tmp(lua_State *L, MSize sz)
void lj_buf_shrink(lua_State *L, SBuf *sb)
{
MSize sz = sb->sz;
if (sz > 2*LJ_MIN_SBUF) {
sb->buf = lj_mem_realloc(L, sb->buf, sz, (sz >> 1));
sb->sz = (sz >> 1);
char *b = sbufB(sb);
MSize osz = (MSize)(sbufE(sb) - b);
if (osz > 2*LJ_MIN_SBUF) {
MSize n = (MSize)(sbufP(sb) - b);
b = lj_mem_realloc(L, b, osz, (osz >> 1));
setmref(sb->b, b);
setmref(sb->p, b + n);
setmref(sb->e, b + (osz >> 1));
}
}
char *lj_buf_wmem(char *p, const void *q, MSize len)
{
const char *s = (const char *)q, *e = s + len;
while (s < e) *p++ = *s++;
return p;
}
void lj_buf_putmem(lua_State *L, SBuf *sb, const void *q, MSize len)
{
char *p = lj_buf_more(L, sb, len);
p = lj_buf_wmem(p, q, len);
setsbufP(sb, p);
}
uint32_t lj_buf_ruleb128(const char **pp)
{
const uint8_t *p = (const uint8_t *)*pp;
uint32_t v = *p++;
if (LJ_UNLIKELY(v >= 0x80)) {
int sh = 0;
v &= 0x7f;
do { v |= ((*p & 0x7f) << (sh += 7)); } while (*p++ >= 0x80);
}
*pp = (const char *)p;
return v;
}
char *lj_buf_wuleb128(char *p, uint32_t v)
{
for (; v >= 0x80; v >>= 7)
*p++ = (char)((v & 0x7f) | 0x80);
*p++ = (char)v;
return p;
}