diff options
Diffstat (limited to 'src/lj_buf.c')
-rw-r--r-- | src/lj_buf.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/lj_buf.c b/src/lj_buf.c new file mode 100644 index 00000000..c08d23c9 --- /dev/null +++ b/src/lj_buf.c | |||
@@ -0,0 +1,87 @@ | |||
1 | /* | ||
2 | ** Buffer handling. | ||
3 | ** Copyright (C) 2005-2013 Mike Pall. See Copyright Notice in luajit.h | ||
4 | */ | ||
5 | |||
6 | #include <stdio.h> | ||
7 | |||
8 | #define lj_buf_c | ||
9 | #define LUA_CORE | ||
10 | |||
11 | #include "lj_obj.h" | ||
12 | #include "lj_gc.h" | ||
13 | #include "lj_err.h" | ||
14 | #include "lj_buf.h" | ||
15 | |||
16 | LJ_NOINLINE void LJ_FASTCALL lj_buf_grow(SBuf *sb, char *en) | ||
17 | { | ||
18 | lua_State *L = sbufL(sb); | ||
19 | char *b = sbufB(sb); | ||
20 | MSize sz = (MSize)(en - b); | ||
21 | MSize osz = (MSize)(sbufE(sb) - b), nsz = osz; | ||
22 | MSize n = (MSize)(sbufP(sb) - b); | ||
23 | if (LJ_UNLIKELY(sz > LJ_MAX_MEM)) | ||
24 | lj_err_mem(L); | ||
25 | if (nsz < LJ_MIN_SBUF) nsz = LJ_MIN_SBUF; | ||
26 | while (nsz < sz) nsz += nsz; | ||
27 | b = (char *)lj_mem_realloc(L, b, osz, nsz); | ||
28 | setmref(sb->b, b); | ||
29 | setmref(sb->p, b + n); | ||
30 | setmref(sb->e, b + nsz); | ||
31 | } | ||
32 | |||
33 | char * LJ_FASTCALL lj_buf_tmp(lua_State *L, MSize sz) | ||
34 | { | ||
35 | SBuf *sb = &G(L)->tmpbuf; | ||
36 | setmref(sb->L, L); | ||
37 | return lj_buf_need(sb, sz); | ||
38 | } | ||
39 | |||
40 | void LJ_FASTCALL lj_buf_shrink(lua_State *L, SBuf *sb) | ||
41 | { | ||
42 | char *b = sbufB(sb); | ||
43 | MSize osz = (MSize)(sbufE(sb) - b); | ||
44 | if (osz > 2*LJ_MIN_SBUF) { | ||
45 | MSize n = (MSize)(sbufP(sb) - b); | ||
46 | b = lj_mem_realloc(L, b, osz, (osz >> 1)); | ||
47 | setmref(sb->b, b); | ||
48 | setmref(sb->p, b + n); | ||
49 | setmref(sb->e, b + (osz >> 1)); | ||
50 | } | ||
51 | } | ||
52 | |||
53 | char *lj_buf_wmem(char *p, const void *q, MSize len) | ||
54 | { | ||
55 | const char *s = (const char *)q, *e = s + len; | ||
56 | while (s < e) *p++ = *s++; | ||
57 | return p; | ||
58 | } | ||
59 | |||
60 | void lj_buf_putmem(SBuf *sb, const void *q, MSize len) | ||
61 | { | ||
62 | char *p = lj_buf_more(sb, len); | ||
63 | p = lj_buf_wmem(p, q, len); | ||
64 | setsbufP(sb, p); | ||
65 | } | ||
66 | |||
67 | uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp) | ||
68 | { | ||
69 | const uint8_t *p = (const uint8_t *)*pp; | ||
70 | uint32_t v = *p++; | ||
71 | if (LJ_UNLIKELY(v >= 0x80)) { | ||
72 | int sh = 0; | ||
73 | v &= 0x7f; | ||
74 | do { v |= ((*p & 0x7f) << (sh += 7)); } while (*p++ >= 0x80); | ||
75 | } | ||
76 | *pp = (const char *)p; | ||
77 | return v; | ||
78 | } | ||
79 | |||
80 | char * LJ_FASTCALL lj_buf_wuleb128(char *p, uint32_t v) | ||
81 | { | ||
82 | for (; v >= 0x80; v >>= 7) | ||
83 | *p++ = (char)((v & 0x7f) | 0x80); | ||
84 | *p++ = (char)v; | ||
85 | return p; | ||
86 | } | ||
87 | |||