Merge 0.11->trunk
authorKim Alvefur <zash@zash.se>
Thu, 15 Oct 2020 16:51:16 +0200
changeset 11174 4bda303d54ed
parent 11170 51e5149ed0ad (current diff)
parent 11173 6dde2c9fa272 (diff)
child 11177 cbe1edecb8fa
Merge 0.11->trunk
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spec/util_strbitop.lua	Thu Oct 15 16:51:16 2020 +0200
@@ -0,0 +1,41 @@
+local strbitop = require "util.strbitop";
+describe("util.strbitop", function ()
+	describe("sand()", function ()
+		it("works", function ()
+			assert.equal(string.rep("Aa", 100), strbitop.sand(string.rep("a", 200), "Aa"));
+		end);
+		it("returns empty string if first argument is empty", function ()
+			assert.equal("", strbitop.sand("", ""));
+			assert.equal("", strbitop.sand("", "key"));
+		end);
+		it("returns initial string if key is empty", function ()
+			assert.equal("hello", strbitop.sand("hello", ""));
+		end);
+	end);
+
+	describe("sor()", function ()
+		it("works", function ()
+			assert.equal(string.rep("a", 200), strbitop.sor(string.rep("Aa", 100), "a"));
+		end);
+		it("returns empty string if first argument is empty", function ()
+			assert.equal("", strbitop.sor("", ""));
+			assert.equal("", strbitop.sor("", "key"));
+		end);
+		it("returns initial string if key is empty", function ()
+			assert.equal("hello", strbitop.sor("hello", ""));
+		end);
+	end);
+
+	describe("sxor()", function ()
+		it("works", function ()
+			assert.equal(string.rep("Aa", 100), strbitop.sxor(string.rep("a", 200), " \0"));
+		end);
+		it("returns empty string if first argument is empty", function ()
+			assert.equal("", strbitop.sxor("", ""));
+			assert.equal("", strbitop.sxor("", "key"));
+		end);
+		it("returns initial string if key is empty", function ()
+			assert.equal("hello", strbitop.sxor("hello", ""));
+		end);
+	end);
+end);
--- a/util-src/strbitop.c	Thu Oct 15 14:25:09 2020 +0100
+++ b/util-src/strbitop.c	Thu Oct 15 16:51:16 2020 +0200
@@ -2,7 +2,7 @@
  * This project is MIT licensed. Please see the
  * COPYING file in the source package for more information.
  *
- * Copyright (C) 2016 Kim Alvefur
+ * Copyright (C) 2016-2020 Kim Alvefur
  */
 
 #include <lua.h>
@@ -14,11 +14,11 @@
 
 /* TODO Deduplicate code somehow */
 
-int strop_and(lua_State* L) {
+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);
+	const char *str_a = luaL_checklstring(L, 1, &a);
+	const char *str_b = luaL_checklstring(L, 2, &b);
 
 	luaL_buffinit(L, &buf);
 
@@ -27,19 +27,22 @@
 		return 1;
 	}
 
+	char *cbuf = luaL_buffinitsize(L, &buf, a);
+
 	for(i = 0; i < a; i++) {
-		luaL_addchar(&buf, str_a[i] & str_b[i % b]);
+		cbuf[i] = str_a[i] & str_b[i % b];
 	}
 
+	luaL_addsize(&buf, a);
 	luaL_pushresult(&buf);
 	return 1;
 }
 
-int strop_or(lua_State* L) {
+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);
+	const char *str_a = luaL_checklstring(L, 1, &a);
+	const char *str_b = luaL_checklstring(L, 2, &b);
 
 	luaL_buffinit(L, &buf);
 
@@ -48,31 +51,35 @@
 		return 1;
 	}
 
+	char *cbuf = luaL_buffinitsize(L, &buf, a);
+
 	for(i = 0; i < a; i++) {
-		luaL_addchar(&buf, str_a[i] | str_b[i % b]);
+		cbuf[i] = str_a[i] | str_b[i % b];
 	}
 
+	luaL_addsize(&buf, a);
 	luaL_pushresult(&buf);
 	return 1;
 }
 
-int strop_xor(lua_State* L) {
+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);
+	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++) {
-		luaL_addchar(&buf, str_a[i] ^ str_b[i % b]);
+		cbuf[i] = str_a[i] ^ str_b[i % b];
 	}
 
+	luaL_addsize(&buf, a);
 	luaL_pushresult(&buf);
 	return 1;
 }