util.strbitop: Library for bitwise operations on strings 0.11
authorKim Alvefur <zash@zash.se>
Sat, 07 Sep 2019 13:37:47 +0200
branch0.11
changeset 11167 37a6a535343e
parent 11166 ee399a0522cc
child 11168 4e5a2af9dd19
util.strbitop: Library for bitwise operations on strings
util-src/GNUmakefile
util-src/makefile
util-src/strbitop.c
--- a/util-src/GNUmakefile	Wed Oct 14 19:02:48 2020 +0200
+++ b/util-src/GNUmakefile	Sat Sep 07 13:37:47 2019 +0200
@@ -7,7 +7,7 @@
 TARGET?=../util/
 
 ALL=encodings.so hashes.so net.so pposix.so signal.so table.so \
-    ringbuffer.so time.so poll.so compat.so
+    ringbuffer.so time.so poll.so compat.so strbitop.so
 
 ifdef RANDOM
 ALL+=crand.so
--- a/util-src/makefile	Wed Oct 14 19:02:48 2020 +0200
+++ b/util-src/makefile	Sat Sep 07 13:37:47 2019 +0200
@@ -6,7 +6,7 @@
 TARGET?=../util/
 
 ALL=encodings.so hashes.so net.so pposix.so signal.so table.so \
-    ringbuffer.so time.so poll.so compat.so
+    ringbuffer.so time.so poll.so compat.so strbitop.so
 
 .ifdef $(RANDOM)
 ALL+=crand.so
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/util-src/strbitop.c	Sat Sep 07 13:37:47 2019 +0200
@@ -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;
+}