diff options
Diffstat (limited to '')
-rw-r--r-- | src/lj_buf.c | 60 |
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 | ||
18 | LJ_NOINLINE void LJ_FASTCALL lj_buf_grow(SBuf *sb, char *en) | 21 | LJ_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 | ||
35 | char * 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 | |||
42 | void LJ_FASTCALL lj_buf_shrink(lua_State *L, SBuf *sb) | 38 | void 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 | ||
51 | char * 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. */ | ||
55 | char *lj_buf_wmem(char *p, const void *q, MSize len) | 61 | char *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 |
71 | SBuf * 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 | |||
80 | SBuf * LJ_FASTCALL lj_buf_putchar(SBuf *sb, int c) | 77 | SBuf * 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 | ||
88 | SBuf * LJ_FASTCALL lj_buf_putint(SBuf *sb, int32_t k) | 86 | SBuf * 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 | ||
94 | SBuf * 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 | ||
101 | SBuf * LJ_FASTCALL lj_buf_putstr_reverse(SBuf *sb, GCstr *s) | 97 | SBuf * 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 | |||
204 | GCstr * LJ_FASTCALL lj_buf_tostr(SBuf *sb) | 202 | GCstr * 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. */ | ||
209 | GCstr *lj_buf_cat2str(lua_State *L, GCstr *s1, GCstr *s2) | 208 | GCstr *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. */ | ||
218 | uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp) | 218 | uint32_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 | ||
231 | char * 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 | |||