File: buffer.c

package info (click to toggle)
lua-lgi 0.9.2-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,376 kB
  • sloc: ansic: 5,082; makefile: 169; sh: 31
file content (104 lines) | stat: -rw-r--r-- 2,322 bytes parent folder | download | duplicates (7)
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
 * Dynamic Lua binding to GObject using dynamic gobject-introspection.
 *
 * Copyright (c) 2010, 2011 Pavel Holejsovsky
 * Licensed under the MIT license:
 * http://www.opensource.org/licenses/mit-license.php
 *
 * Implementation of writable buffer object.
 */

#include <string.h>
#include "lgi.h"

static int
buffer_len (lua_State *L)
{
  luaL_checkudata (L, 1, LGI_BYTES_BUFFER);
  lua_pushnumber (L, lua_objlen (L, 1));
  return 1;
}

static int
buffer_tostring (lua_State *L)
{
  gpointer data = luaL_checkudata (L, 1, LGI_BYTES_BUFFER);
  lua_pushlstring (L, data, lua_objlen (L, 1));
  return 1;
}

static int
buffer_index (lua_State *L)
{
  int index;
  unsigned char *buffer = luaL_checkudata (L, 1, LGI_BYTES_BUFFER);
  index = lua_tonumber (L, 2);
  if (index > 0 && (size_t) index <= lua_objlen (L, 1))
    lua_pushnumber (L, buffer[index - 1]);
  else
    {
      luaL_argcheck (L, !lua_isnoneornil (L, 2), 2, "nil index");
      lua_pushnil (L);
    }
  return 1;
}

static int
buffer_newindex (lua_State *L)
{
  int index;
  unsigned char *buffer = luaL_checkudata (L, 1, LGI_BYTES_BUFFER);
  index = luaL_checkint (L, 2);
  luaL_argcheck (L, index > 0 && (size_t) index <= lua_objlen (L, 1),
                 2, "bad index");
  buffer[index - 1] = luaL_checkint (L, 3) & 0xff;
  return 0;
}

static const luaL_Reg buffer_mt_reg[] = {
  { "__len", buffer_len },
  { "__tostring", buffer_tostring },
  { "__index", buffer_index },
  { "__newindex", buffer_newindex },
  { NULL, NULL }
};

static int
buffer_new (lua_State *L)
{
  size_t size;
  gpointer *buffer;
  const char *source = NULL;

  if (lua_type (L, 1) == LUA_TSTRING)
    source = lua_tolstring (L, 1, &size);
  else
    size = luaL_checknumber (L, 1);
  buffer = lua_newuserdata (L, size);
  if (source)
    memcpy (buffer, source, size);
  else
    memset (buffer, 0, size);
  luaL_getmetatable (L, LGI_BYTES_BUFFER);
  lua_setmetatable (L, -2);
  return 1;
}

static const luaL_Reg buffer_reg[] = {
  { "new", buffer_new },
  { NULL, NULL }
};

void
lgi_buffer_init (lua_State *L)
{
  /* Register metatables. */
  luaL_newmetatable (L, LGI_BYTES_BUFFER);
  luaL_register (L, NULL, buffer_mt_reg);
  lua_pop (L, 1);

  /* Register global API. */
  lua_newtable (L);
  luaL_register (L, NULL, buffer_reg);
  lua_setfield (L, -2, "bytes");
}