aboutsummaryrefslogtreecommitdiff
path: root/src/lib_buffer.c
blob: e45555963fb6e010d38e1df7c06c41bbc69b0ea5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/*
** Buffer library.
** Copyright (C) 2005-2021 Mike Pall. See Copyright Notice in luajit.h
*/

#define lib_buffer_c
#define LUA_LIB

#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"

#include "lj_obj.h"

#if LJ_HASBUFFER
#include "lj_gc.h"
#include "lj_buf.h"
#include "lj_serialize.h"
#include "lj_lib.h"

/* ------------------------------------------------------------------------ */

#define LJLIB_MODULE_buffer

/* Note: this uses interim structs until the SBuf reorg. */

LJLIB_CF(buffer_encode)
{
  cTValue *o = lj_lib_checkany(L, 1);
  StrBuf sbuf;
  sbuf.sb = lj_buf_tmp_(L);
  lj_serialize_put(&sbuf, o);
  setstrV(L, L->top++, lj_buf_str(L, sbuf.sb));
  lj_gc_check(L);
  return 1;
}

LJLIB_CF(buffer_decode)
{
  GCstr *str = lj_lib_checkstr(L, 1);
  const char *p = strdata(str);
  SBuf sb;
  StrBuf sbuf;
  setsbufL(&sb, L);
  setmref(sb.b, p);
  setmref(sb.p, p + str->len);
  setmref(sb.e, p + str->len);
  sbuf.sb = &sb;
  sbuf.r = (char *)p;
  setnilV(L->top++);
  lj_serialize_get(&sbuf, L->top-1);
  lj_gc_check(L);
  return 1;
}

/* ------------------------------------------------------------------------ */

#include "lj_libdef.h"

int luaopen_string_buffer(lua_State *L)
{
  LJ_LIB_REG(L, NULL, buffer);
  return 1;
}

#endif