aboutsummaryrefslogtreecommitdiff
path: root/src/lj_buf.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lj_buf.c60
1 files changed, 26 insertions, 34 deletions
diff --git a/src/lj_buf.c b/src/lj_buf.c
index c60cc51f..2a1d7f8e 100644
--- a/src/lj_buf.c
+++ b/src/lj_buf.c
@@ -14,6 +14,9 @@
14#include "lj_buf.h" 14#include "lj_buf.h"
15#include "lj_str.h" 15#include "lj_str.h"
16#include "lj_tab.h" 16#include "lj_tab.h"
17#include "lj_strfmt.h"
18
19/* -- Buffer management --------------------------------------------------- */
17 20
18LJ_NOINLINE void LJ_FASTCALL lj_buf_grow(SBuf *sb, char *en) 21LJ_NOINLINE void LJ_FASTCALL lj_buf_grow(SBuf *sb, char *en)
19{ 22{
@@ -32,13 +35,6 @@ LJ_NOINLINE void LJ_FASTCALL lj_buf_grow(SBuf *sb, char *en)
32 setmref(sb->e, b + nsz); 35 setmref(sb->e, b + nsz);
33} 36}
34 37
35char * LJ_FASTCALL lj_buf_tmp(lua_State *L, MSize sz)
36{
37 SBuf *sb = &G(L)->tmpbuf;
38 setsbufL(sb, L);
39 return lj_buf_need(sb, sz);
40}
41
42void LJ_FASTCALL lj_buf_shrink(lua_State *L, SBuf *sb) 38void LJ_FASTCALL lj_buf_shrink(lua_State *L, SBuf *sb)
43{ 39{
44 char *b = sbufB(sb); 40 char *b = sbufB(sb);
@@ -52,6 +48,16 @@ void LJ_FASTCALL lj_buf_shrink(lua_State *L, SBuf *sb)
52 } 48 }
53} 49}
54 50
51char * LJ_FASTCALL lj_buf_tmp(lua_State *L, MSize sz)
52{
53 SBuf *sb = &G(L)->tmpbuf;
54 setsbufL(sb, L);
55 return lj_buf_need(sb, sz);
56}
57
58/* -- Low-level buffer put operations ------------------------------------- */
59
60/* Write memory block to buffer. */
55char *lj_buf_wmem(char *p, const void *q, MSize len) 61char *lj_buf_wmem(char *p, const void *q, MSize len)
56{ 62{
57 const char *s = (const char *)q, *e = s + len; 63 const char *s = (const char *)q, *e = s + len;
@@ -68,15 +74,6 @@ SBuf * lj_buf_putmem(SBuf *sb, const void *q, MSize len)
68} 74}
69 75
70#if LJ_HASJIT 76#if LJ_HASJIT
71SBuf * LJ_FASTCALL lj_buf_putstr(SBuf *sb, GCstr *s)
72{
73 MSize len = s->len;
74 char *p = lj_buf_more(sb, len);
75 p = lj_buf_wmem(p, strdata(s), len);
76 setsbufP(sb, p);
77 return sb;
78}
79
80SBuf * LJ_FASTCALL lj_buf_putchar(SBuf *sb, int c) 77SBuf * LJ_FASTCALL lj_buf_putchar(SBuf *sb, int c)
81{ 78{
82 char *p = lj_buf_more(sb, 1); 79 char *p = lj_buf_more(sb, 1);
@@ -84,19 +81,18 @@ SBuf * LJ_FASTCALL lj_buf_putchar(SBuf *sb, int c)
84 setsbufP(sb, p); 81 setsbufP(sb, p);
85 return sb; 82 return sb;
86} 83}
84#endif
87 85
88SBuf * LJ_FASTCALL lj_buf_putint(SBuf *sb, int32_t k) 86SBuf * LJ_FASTCALL lj_buf_putstr(SBuf *sb, GCstr *s)
89{ 87{
90 setsbufP(sb, lj_str_bufint(lj_buf_more(sb, LJ_STR_INTBUF), k)); 88 MSize len = s->len;
89 char *p = lj_buf_more(sb, len);
90 p = lj_buf_wmem(p, strdata(s), len);
91 setsbufP(sb, p);
91 return sb; 92 return sb;
92} 93}
93 94
94SBuf * LJ_FASTCALL lj_buf_putnum(SBuf *sb, cTValue *o) 95/* -- High-level buffer put operations ------------------------------------ */
95{
96 setsbufP(sb, lj_str_bufnum(lj_buf_more(sb, LJ_STR_NUMBUF), o));
97 return sb;
98}
99#endif
100 96
101SBuf * LJ_FASTCALL lj_buf_putstr_reverse(SBuf *sb, GCstr *s) 97SBuf * LJ_FASTCALL lj_buf_putstr_reverse(SBuf *sb, GCstr *s)
102{ 98{
@@ -184,9 +180,9 @@ SBuf *lj_buf_puttab(SBuf *sb, GCtab *t, GCstr *sep, int32_t i, int32_t e)
184 MSize len = strV(o)->len; 180 MSize len = strV(o)->len;
185 p = lj_buf_wmem(lj_buf_more(sb, len + seplen), strVdata(o), len); 181 p = lj_buf_wmem(lj_buf_more(sb, len + seplen), strVdata(o), len);
186 } else if (tvisint(o)) { 182 } else if (tvisint(o)) {
187 p = lj_str_bufint(lj_buf_more(sb, LJ_STR_INTBUF + seplen), intV(o)); 183 p = lj_strfmt_wint(lj_buf_more(sb, STRFMT_MAXBUF_INT+seplen), intV(o));
188 } else if (tvisnum(o)) { 184 } else if (tvisnum(o)) {
189 p = lj_str_bufnum(lj_buf_more(sb, LJ_STR_NUMBUF + seplen), o); 185 p = lj_strfmt_wnum(lj_buf_more(sb, STRFMT_MAXBUF_NUM+seplen), o);
190 } else { 186 } else {
191 goto badtype; 187 goto badtype;
192 } 188 }
@@ -201,11 +197,14 @@ SBuf *lj_buf_puttab(SBuf *sb, GCtab *t, GCstr *sep, int32_t i, int32_t e)
201 return sb; 197 return sb;
202} 198}
203 199
200/* -- Miscellaneous buffer operations ------------------------------------- */
201
204GCstr * LJ_FASTCALL lj_buf_tostr(SBuf *sb) 202GCstr * LJ_FASTCALL lj_buf_tostr(SBuf *sb)
205{ 203{
206 return lj_str_new(sbufL(sb), sbufB(sb), sbuflen(sb)); 204 return lj_str_new(sbufL(sb), sbufB(sb), sbuflen(sb));
207} 205}
208 206
207/* Concatenate two strings. */
209GCstr *lj_buf_cat2str(lua_State *L, GCstr *s1, GCstr *s2) 208GCstr *lj_buf_cat2str(lua_State *L, GCstr *s1, GCstr *s2)
210{ 209{
211 MSize len1 = s1->len, len2 = s2->len; 210 MSize len1 = s1->len, len2 = s2->len;
@@ -215,6 +214,7 @@ GCstr *lj_buf_cat2str(lua_State *L, GCstr *s1, GCstr *s2)
215 return lj_str_new(L, buf, len1 + len2); 214 return lj_str_new(L, buf, len1 + len2);
216} 215}
217 216
217/* Read ULEB128 from buffer. */
218uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp) 218uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp)
219{ 219{
220 const uint8_t *p = (const uint8_t *)*pp; 220 const uint8_t *p = (const uint8_t *)*pp;
@@ -228,11 +228,3 @@ uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp)
228 return v; 228 return v;
229} 229}
230 230
231char * LJ_FASTCALL lj_buf_wuleb128(char *p, uint32_t v)
232{
233 for (; v >= 0x80; v >>= 7)
234 *p++ = (char)((v & 0x7f) | 0x80);
235 *p++ = (char)v;
236 return p;
237}
238