String buffers, part 2d: basic string buffer methods.

Sponsored by fmad.io.
This commit is contained in:
Mike Pall
2021-06-01 05:16:32 +02:00
parent edd5cbadc5
commit a119497bec
18 changed files with 816 additions and 85 deletions

View File

@@ -240,8 +240,8 @@ TValue *lj_meta_cat(lua_State *L, TValue *top, int left)
int fromc = 0;
if (left < 0) { left = -left; fromc = 1; }
do {
if (!(tvisstr(top) || tvisnumber(top)) ||
!(tvisstr(top-1) || tvisnumber(top-1))) {
if (!(tvisstr(top) || tvisnumber(top) || tvisbuf(top)) ||
!(tvisstr(top-1) || tvisnumber(top-1) || tvisbuf(top-1))) {
cTValue *mo = lj_meta_lookup(L, top-1, MM_concat);
if (tvisnil(mo)) {
mo = lj_meta_lookup(L, top, MM_concat);
@@ -277,10 +277,12 @@ TValue *lj_meta_cat(lua_State *L, TValue *top, int left)
** next step: [...][CAT stack ............]
*/
TValue *e, *o = top;
uint64_t tlen = tvisstr(o) ? strV(o)->len : STRFMT_MAXBUF_NUM;
uint64_t tlen = tvisstr(o) ? strV(o)->len :
tvisbuf(o) ? sbufxlen(bufV(o)) : STRFMT_MAXBUF_NUM;
SBuf *sb;
do {
o--; tlen += tvisstr(o) ? strV(o)->len : STRFMT_MAXBUF_NUM;
o--; tlen += tvisstr(o) ? strV(o)->len :
tvisbuf(o) ? sbufxlen(bufV(o)) : STRFMT_MAXBUF_NUM;
} while (--left > 0 && (tvisstr(o-1) || tvisnumber(o-1)));
if (tlen >= LJ_MAX_STR) lj_err_msg(L, LJ_ERR_STROV);
sb = lj_buf_tmp_(L);
@@ -290,6 +292,9 @@ TValue *lj_meta_cat(lua_State *L, TValue *top, int left)
GCstr *s = strV(o);
MSize len = s->len;
lj_buf_putmem(sb, strdata(s), len);
} else if (tvisbuf(o)) {
SBufExt *sbx = bufV(o);
lj_buf_putmem(sb, sbx->r, sbufxlen(sbx));
} else if (tvisint(o)) {
lj_strfmt_putint(sb, intV(o));
} else {