aboutsummaryrefslogtreecommitdiffstats
path: root/util-src/strbitop.c
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2020-10-15 14:25:09 +0100
committerMatthew Wild <mwild1@gmail.com>2020-10-15 14:25:09 +0100
commit4f4140fbc363160f859292c8b1eccd701ad7b1e1 (patch)
treeb5dbcad554882e92268cdfdc1df7b2664677dcf0 /util-src/strbitop.c
parent58e33e399553ccc457de266c36102308f63bfe02 (diff)
parent64856637cee81b916cc240c55657eb13c0763620 (diff)
downloadprosody-4f4140fbc363160f859292c8b1eccd701ad7b1e1.tar.gz
prosody-4f4140fbc363160f859292c8b1eccd701ad7b1e1.zip
Merge 0.11->trunk
Diffstat (limited to 'util-src/strbitop.c')
-rw-r--r--util-src/strbitop.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/util-src/strbitop.c b/util-src/strbitop.c
new file mode 100644
index 00000000..a26288e5
--- /dev/null
+++ b/util-src/strbitop.c
@@ -0,0 +1,91 @@
+/*
+ * This project is MIT licensed. Please see the
+ * COPYING file in the source package for more information.
+ *
+ * Copyright (C) 2016 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);
+
+ luaL_buffinit(L, &buf);
+
+ if(a == 0 || b == 0) {
+ lua_settop(L, 1);
+ return 1;
+ }
+
+ for(i = 0; i < a; i++) {
+ luaL_addchar(&buf, str_a[i] & str_b[i % b]);
+ }
+
+ 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);
+
+ luaL_buffinit(L, &buf);
+
+ if(a == 0 || b == 0) {
+ lua_settop(L, 1);
+ return 1;
+ }
+
+ for(i = 0; i < a; i++) {
+ luaL_addchar(&buf, str_a[i] | str_b[i % b]);
+ }
+
+ 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);
+
+ luaL_buffinit(L, &buf);
+
+ if(a == 0 || b == 0) {
+ lua_settop(L, 1);
+ return 1;
+ }
+
+ for(i = 0; i < a; i++) {
+ luaL_addchar(&buf, str_a[i] ^ str_b[i % b]);
+ }
+
+ 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;
+}