aboutsummaryrefslogtreecommitdiff
path: root/src/lj_buf.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_buf.c')
-rw-r--r--src/lj_buf.c87
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
16LJ_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
33char * 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
40void 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
53char *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
60void 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
67uint32_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
80char * 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