Comparison

util-src/strbitop.c @ 11173:cbe1edecb8fa

Merge 0.11->trunk
author Kim Alvefur <zash@zash.se>
date Thu, 15 Oct 2020 17:14:03 +0200
parent 11172:712b2e6a09d9
child 11175:235537247aa3
comparison
equal deleted inserted replaced
11170:4bda303d54ed 11173:cbe1edecb8fa
1 /* 1 /*
2 * This project is MIT licensed. Please see the 2 * This project is MIT licensed. Please see the
3 * COPYING file in the source package for more information. 3 * COPYING file in the source package for more information.
4 * 4 *
5 * Copyright (C) 2016-2020 Kim Alvefur 5 * Copyright (C) 2016 Kim Alvefur
6 */ 6 */
7 7
8 #include <lua.h> 8 #include <lua.h>
9 #include <lauxlib.h> 9 #include <lauxlib.h>
10 10
18 luaL_Buffer buf; 18 luaL_Buffer buf;
19 size_t a, b, i; 19 size_t a, b, i;
20 const char *str_a = luaL_checklstring(L, 1, &a); 20 const char *str_a = luaL_checklstring(L, 1, &a);
21 const char *str_b = luaL_checklstring(L, 2, &b); 21 const char *str_b = luaL_checklstring(L, 2, &b);
22 22
23 luaL_buffinit(L, &buf); 23 if(a == 0 || b == 0) {
24 lua_settop(L, 1);
25 return 1;
26 }
27
28 for(i = 0; i < a; i++) {
29 luaL_addchar(&buf, str_a[i] & str_b[i % b]);
30 }
31
32 luaL_pushresult(&buf);
33 return 1;
34 }
35
36 int strop_or(lua_State *L) {
37 luaL_Buffer buf;
38 size_t a, b, i;
39 const char *str_a = luaL_checklstring(L, 1, &a);
40 const char *str_b = luaL_checklstring(L, 2, &b);
24 41
25 if(a == 0 || b == 0) { 42 if(a == 0 || b == 0) {
26 lua_settop(L, 1); 43 lua_settop(L, 1);
27 return 1; 44 return 1;
28 } 45 }
29 46
30 char *cbuf = luaL_buffinitsize(L, &buf, a);
31
32 for(i = 0; i < a; i++) { 47 for(i = 0; i < a; i++) {
33 cbuf[i] = str_a[i] & str_b[i % b]; 48 luaL_addchar(&buf, str_a[i] | str_b[i % b]);
34 } 49 }
35 50
36 luaL_addsize(&buf, a);
37 luaL_pushresult(&buf); 51 luaL_pushresult(&buf);
38 return 1; 52 return 1;
39 } 53 }
40 54
41 int strop_or(lua_State *L) { 55 int strop_xor(lua_State *L) {
42 luaL_Buffer buf; 56 luaL_Buffer buf;
43 size_t a, b, i; 57 size_t a, b, i;
44 const char *str_a = luaL_checklstring(L, 1, &a); 58 const char *str_a = luaL_checklstring(L, 1, &a);
45 const char *str_b = luaL_checklstring(L, 2, &b); 59 const char *str_b = luaL_checklstring(L, 2, &b);
46 60
49 if(a == 0 || b == 0) { 63 if(a == 0 || b == 0) {
50 lua_settop(L, 1); 64 lua_settop(L, 1);
51 return 1; 65 return 1;
52 } 66 }
53 67
54 char *cbuf = luaL_buffinitsize(L, &buf, a);
55
56 for(i = 0; i < a; i++) { 68 for(i = 0; i < a; i++) {
57 cbuf[i] = str_a[i] | str_b[i % b]; 69 luaL_addchar(&buf, str_a[i] ^ str_b[i % b]);
58 } 70 }
59 71
60 luaL_addsize(&buf, a);
61 luaL_pushresult(&buf);
62 return 1;
63 }
64
65 int strop_xor(lua_State *L) {
66 luaL_Buffer buf;
67 size_t a, b, i;
68 const char *str_a = luaL_checklstring(L, 1, &a);
69 const char *str_b = luaL_checklstring(L, 2, &b);
70
71 if(a == 0 || b == 0) {
72 lua_settop(L, 1);
73 return 1;
74 }
75
76 char *cbuf = luaL_buffinitsize(L, &buf, a);
77
78 for(i = 0; i < a; i++) {
79 cbuf[i] = str_a[i] ^ str_b[i % b];
80 }
81
82 luaL_addsize(&buf, a);
83 luaL_pushresult(&buf); 72 luaL_pushresult(&buf);
84 return 1; 73 return 1;
85 } 74 }
86 75
87 LUA_API int luaopen_util_strbitop(lua_State *L) { 76 LUA_API int luaopen_util_strbitop(lua_State *L) {