util-src/table.c
author Kim Alvefur <zash@zash.se>
Sun, 24 Mar 2024 21:32:00 +0100
changeset 13468 2dbc169aae6a
parent 12980 a187600ec7d6
permissions -rw-r--r--
util.startup: Abort before initialization of logging when started as root Prevents creation of log files owned by the root user which could be inaccessible once started correctly.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6613
7c4cf87f4dff util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
#include <lua.h>
7c4cf87f4dff util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     2
#include <lauxlib.h>
7c4cf87f4dff util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     3
12406
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
     4
#ifndef LUA_MAXINTEGER
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
     5
#include <stdint.h>
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
     6
#define LUA_MAXINTEGER PTRDIFF_MAX
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
     7
#endif
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
     8
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
     9
static int Lcreate_table(lua_State *L) {
6613
7c4cf87f4dff util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
	lua_createtable(L, luaL_checkinteger(L, 1), luaL_checkinteger(L, 2));
7c4cf87f4dff util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
	return 1;
7c4cf87f4dff util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
}
7c4cf87f4dff util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
12595
494577d883ff util.table: Fix inaccurate comment
Kim Alvefur <zash@zash.se>
parents: 12579
diff changeset
    14
/* COMPAT: w/ Lua pre-5.2 */
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
    15
static int Lpack(lua_State *L) {
7522
d278a770eddc util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents: 6618
diff changeset
    16
	unsigned int n_args = lua_gettop(L);
d278a770eddc util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents: 6618
diff changeset
    17
	lua_createtable(L, n_args, 1);
d278a770eddc util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents: 6618
diff changeset
    18
	lua_insert(L, 1);
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
    19
7939
582bfb39337f Backed out changeset a3a4ed0d34f4 C99 is ok
Kim Alvefur <zash@zash.se>
parents: 7892
diff changeset
    20
	for(int arg = n_args; arg >= 1; arg--) {
7522
d278a770eddc util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents: 6618
diff changeset
    21
		lua_rawseti(L, 1, arg);
d278a770eddc util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents: 6618
diff changeset
    22
	}
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7838
diff changeset
    23
7522
d278a770eddc util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents: 6618
diff changeset
    24
	lua_pushinteger(L, n_args);
d278a770eddc util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents: 6618
diff changeset
    25
	lua_setfield(L, -2, "n");
d278a770eddc util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents: 6618
diff changeset
    26
	return 1;
d278a770eddc util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents: 6618
diff changeset
    27
}
d278a770eddc util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents: 6618
diff changeset
    28
12406
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    29
/* COMPAT: w/ Lua pre-5.4 */
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    30
static int Lmove (lua_State *L) {
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    31
	lua_Integer f = luaL_checkinteger(L, 2);
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    32
	lua_Integer e = luaL_checkinteger(L, 3);
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    33
	lua_Integer t = luaL_checkinteger(L, 4);
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    34
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    35
	int tt = !lua_isnoneornil(L, 5) ? 5 : 1;  /* destination table */
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    36
	luaL_checktype(L, 1, LUA_TTABLE);
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    37
	luaL_checktype(L, tt, LUA_TTABLE);
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    38
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    39
	if (e >= f) {  /* otherwise, nothing to move */
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    40
		lua_Integer n, i;
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    41
		luaL_argcheck(L, f > 0 || e < LUA_MAXINTEGER + f, 3,
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    42
		  "too many elements to move");
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    43
		n = e - f + 1;  /* number of elements to move */
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    44
		luaL_argcheck(L, t <= LUA_MAXINTEGER - n + 1, 4,
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    45
		"destination wrap around");
12579
1f6f05a98fcd util-src: Remove Lua 5.1 compat macros
Kim Alvefur <zash@zash.se>
parents: 12409
diff changeset
    46
		if (t > e || t <= f || (tt != 1 && !lua_compare(L, 1, tt, LUA_OPEQ))) {
12406
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    47
			for (i = 0; i < n; i++) {
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    48
				lua_rawgeti(L, 1, f + i);
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    49
				lua_rawseti(L, tt, t + i);
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    50
			}
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    51
		} else {
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    52
			for (i = n - 1; i >= 0; i--) {
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    53
				lua_rawgeti(L, 1, f + i);
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    54
				lua_rawseti(L, tt, t + i);
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    55
			}
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    56
		}
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    57
	}
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    58
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    59
	lua_pushvalue(L, tt);  /* return destination table */
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    60
	return 1;
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    61
}
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    62
12980
a187600ec7d6 util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents: 12595
diff changeset
    63
int luaopen_prosody_util_table(lua_State *L) {
7821
54669df178c2 util-src: Make C modules assert that the Lua runtime matches what it was compiled for
Kim Alvefur <zash@zash.se>
parents: 7541
diff changeset
    64
	luaL_checkversion(L);
7972
1c6a07606309 util-src: Specify size of various tables to be allocated
Kim Alvefur <zash@zash.se>
parents: 7939
diff changeset
    65
	lua_createtable(L, 0, 2);
6613
7c4cf87f4dff util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    66
	lua_pushcfunction(L, Lcreate_table);
7c4cf87f4dff util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    67
	lua_setfield(L, -2, "create");
7522
d278a770eddc util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents: 6618
diff changeset
    68
	lua_pushcfunction(L, Lpack);
d278a770eddc util.table: Add pack() function (this is already available in Lua 5.2+)
Matthew Wild <mwild1@gmail.com>
parents: 6618
diff changeset
    69
	lua_setfield(L, -2, "pack");
12406
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    70
	lua_pushcfunction(L, Lmove);
8deb401a21f6 util.table: Backport table.move() from Lua 5.4
Matthew Wild <mwild1@gmail.com>
parents: 7972
diff changeset
    71
	lua_setfield(L, -2, "move");
6613
7c4cf87f4dff util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    72
	return 1;
7c4cf87f4dff util.table, Makefile: New C module that allows pre-allocation of tables to improve performance and decrease memory fragmentation
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    73
}
12980
a187600ec7d6 util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents: 12595
diff changeset
    74
a187600ec7d6 util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents: 12595
diff changeset
    75
int luaopen_util_table(lua_State *L) {
a187600ec7d6 util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents: 12595
diff changeset
    76
	return luaopen_prosody_util_table(L);
a187600ec7d6 util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents: 12595
diff changeset
    77
}