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
|
/*
* This project is MIT licensed. Please see the
* COPYING file in the source package for more information.
*
* Copyright (C) 2016-2020 Kim Alvefur
*/
#include <lua.h>
#include <lauxlib.h>
#if (LUA_VERSION_NUM == 501)
#define luaL_setfuncs(L, R, N) luaL_register(L, NULL, R)
#endif
/* TODO Deduplicate code somehow */
int strop_and(lua_State *L) {
luaL_Buffer buf;
size_t a, b, i;
const char *str_a = luaL_checklstring(L, 1, &a);
const char *str_b = luaL_checklstring(L, 2, &b);
if(a == 0 || b == 0) {
lua_settop(L, 1);
return 1;
}
char *cbuf = luaL_buffinitsize(L, &buf, a);
for(i = 0; i < a; i++) {
cbuf[i] = str_a[i] & str_b[i % b];
}
luaL_addsize(&buf, a);
luaL_pushresult(&buf);
return 1;
}
int strop_or(lua_State *L) {
luaL_Buffer buf;
size_t a, b, i;
const char *str_a = luaL_checklstring(L, 1, &a);
const char *str_b = luaL_checklstring(L, 2, &b);
if(a == 0 || b == 0) {
lua_settop(L, 1);
return 1;
}
char *cbuf = luaL_buffinitsize(L, &buf, a);
for(i = 0; i < a; i++) {
cbuf[i] = str_a[i] | str_b[i % b];
}
luaL_addsize(&buf, a);
luaL_pushresult(&buf);
return 1;
}
int strop_xor(lua_State *L) {
luaL_Buffer buf;
size_t a, b, i;
const char *str_a = luaL_checklstring(L, 1, &a);
const char *str_b = luaL_checklstring(L, 2, &b);
if(a == 0 || b == 0) {
lua_settop(L, 1);
return 1;
}
char *cbuf = luaL_buffinitsize(L, &buf, a);
for(i = 0; i < a; i++) {
cbuf[i] = str_a[i] ^ str_b[i % b];
}
luaL_addsize(&buf, a);
luaL_pushresult(&buf);
return 1;
}
LUA_API int luaopen_util_strbitop(lua_State *L) {
luaL_Reg exports[] = {
{ "sand", strop_and },
{ "sor", strop_or },
{ "sxor", strop_xor },
{ NULL, NULL }
};
lua_newtable(L);
luaL_setfuncs(L, exports, 0);
return 1;
}
|