From 4c00c7fb9a648e336973de6d4d40f535dab1410c Mon Sep 17 00:00:00 2001 From: ame Date: Wed, 18 Oct 2023 16:30:38 -0500 Subject: md5 and sorting improvments --- src/crypto.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/crypto.h | 11 ++++++ src/i_common.c | 0 src/i_common.h | 2 ++ src/i_util.c | 12 +++++++ src/i_util.h | 20 +++++++++++ src/len.c | 15 -------- src/reg.c | 19 +++++++++++ src/table.c | 76 +++++++++++++++++++++++++++++++++++++++-- src/table.h | 15 +++++--- src/util.c | 12 ------- src/util.h | 20 ----------- 12 files changed, 255 insertions(+), 53 deletions(-) create mode 100644 src/crypto.c create mode 100644 src/crypto.h create mode 100644 src/i_common.c create mode 100644 src/i_common.h create mode 100644 src/i_util.c create mode 100644 src/i_util.h delete mode 100644 src/len.c create mode 100644 src/reg.c delete mode 100644 src/util.c delete mode 100644 src/util.h (limited to 'src') diff --git a/src/crypto.c b/src/crypto.c new file mode 100644 index 0000000..92ae475 --- /dev/null +++ b/src/crypto.c @@ -0,0 +1,106 @@ +#include "crypto.h" +#include +#include +#include +static const uint32_t K[] = {0xd76aa478, + 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e, + 0x49b40821, 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x2441453, + 0xd8a1e681, 0xe7d3fbc8, 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, + 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, + 0x4881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, 0xf4292244, 0x432aff97, + 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, 0x6fa87e4f, + 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d39}; +static const uint32_t s[] = {7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21}; + +int l_md5(lua_State* L){ + uint32_t a0 = 0x67452301; + uint32_t b0 = 0xefcdab89; + uint32_t c0 = 0x98badcfe; + uint32_t d0 = 0x10325476; + + int len = 0; + char* ww = "wowa"; + uint8_t* a = (uint8_t*)luaL_checklstring(L, 1, NULL); + for(int i = 0; a[i]!='\0'; i++) len++; + + int tlen = ((((len + 8) /64) + 1) * 64) - 8; + + uint8_t* b = NULL; + b = calloc(tlen + 64, 1); + + memcpy(b, a, len); + b[len] = 0x80; + + //add padding + uint32_t lhhh = 8*len; + memcpy(b + tlen, &lhhh, 4); + + + for(int z = 0; z < tlen; z+=(512/8)){ + uint32_t* M = (uint32_t *) (b + z); + + uint32_t A = a0; + uint32_t B = b0; + uint32_t C = c0; + uint32_t D = d0; + + for(int i = 0; i < 64; i++){ + uint32_t F, g; + + if(i < 16){ + F = (B & C) | ((~B) & D); + g = i; + } else if(i < 32){ + F = (D & B) | ((~D) & C); + g = (5*i + 1) % 16; + } else if(i < 48){ + F = B ^ C ^ D; + g = (3*i + 5) % 16; + } else { + F = C ^ (B | (~D)); + g = (7*i) % 16; + } + + + + F = F + A + K[i] + M[g]; + + uint32_t temp = D; + D = C; + C = B; + B = B + (F << s[i] | (F >> (32 - s[i]))); + A = temp; + } + + a0 += A; + b0 += B; + c0 += C; + d0 += D; + + } + char ou[64]; + uint8_t *p; + p=(uint8_t *)&a0; + sprintf(ou,"%2.2x%2.2x%2.2x%2.2x", p[0], p[1], p[2], p[3]); + + p=(uint8_t *)&b0; + sprintf(ou,"%s%2.2x%2.2x%2.2x%2.2x", ou, p[0], p[1], p[2], p[3]); + + p=(uint8_t *)&c0; + sprintf(ou,"%s%2.2x%2.2x%2.2x%2.2x", ou, p[0], p[1], p[2], p[3]); + + p=(uint8_t *)&d0; + sprintf(ou,"%s%2.2x%2.2x%2.2x%2.2x", ou, p[0], p[1], p[2], p[3]); + + lua_pushstring(L, ou); + + free(b); + + return 1; +}; + diff --git a/src/crypto.h b/src/crypto.h new file mode 100644 index 0000000..a62add2 --- /dev/null +++ b/src/crypto.h @@ -0,0 +1,11 @@ +#include "lua.h" +#include "i_util.h" + +int l_md5(lua_State*); + +static const luaL_Reg crypto_function_list [] = { + {"md5",l_md5}, + + {NULL,NULL} +}; + diff --git a/src/i_common.c b/src/i_common.c new file mode 100644 index 0000000..e69de29 diff --git a/src/i_common.h b/src/i_common.h new file mode 100644 index 0000000..66dc56a --- /dev/null +++ b/src/i_common.h @@ -0,0 +1,2 @@ +#define i_swap(A,B) double temp = A; A = B; B = temp; + diff --git a/src/i_util.c b/src/i_util.c new file mode 100644 index 0000000..3e077f4 --- /dev/null +++ b/src/i_util.c @@ -0,0 +1,12 @@ +#include "i_util.h" +#include +#include + +void p_fatal(const char* m){ + fprintf(stderr, "%s[ fatal ] %s %s\n",color_red, m, color_reset); + exit(EXIT_FAILURE); +} + +void p_error(const char* m){ + fprintf(stderr, "%s[ error ]%s %s\n",color_red, color_reset, m); +} diff --git a/src/i_util.h b/src/i_util.h new file mode 100644 index 0000000..b4b609a --- /dev/null +++ b/src/i_util.h @@ -0,0 +1,20 @@ +#define color_black "\e[30m" +#define color_red "\e[31m" +#define color_green "\e[32m" +#define color_yellow "\e[33m" +#define color_blue "\e[34m" +#define color_magenta "\e[35m" +#define color_cyan "\e[36m" +#define color_lgray "\e[37m" +#define color_gray "\e[90m" +#define color_lred "\e[91m" +#define color_lgreen "\e[92m" +#define color_lyellow "\e[93m" +#define color_lblue "\e[94m" +#define color_lmagenta "\e[95m" +#define color_lcyan "\e[96m" +#define color_white "\e[97m" +#define color_reset "\e[0m" + +void p_fatal(const char*); +void p_error(const char*); diff --git a/src/len.c b/src/len.c deleted file mode 100644 index 15e84ac..0000000 --- a/src/len.c +++ /dev/null @@ -1,15 +0,0 @@ -#include "lua.h" -#include "table.h" - -int luaopen_llib(lua_State* L) { - lua_newtable(L); - - //create .array functions - lua_newtable(L); - luaL_register(L, NULL, array_function_list); - lua_setfield(L, -2, "array"); - - //make llib global - lua_setglobal(L, "llib"); - return 1; -} diff --git a/src/reg.c b/src/reg.c new file mode 100644 index 0000000..cdc6267 --- /dev/null +++ b/src/reg.c @@ -0,0 +1,19 @@ +#include "lua.h" +#include "table.h" +#include "crypto.h" + +int luaopen_llib(lua_State* L) { + lua_newtable(L); + + //create .array functions + lua_newtable(L); + luaL_register(L, NULL, array_function_list); + lua_setfield(L, 2, "array"); + + lua_newtable(L); + luaL_register(L, NULL, crypto_function_list); + lua_setfield(L, 2, "crypto"); + //make llib global + lua_setglobal(L, "llib"); + return 1; +} diff --git a/src/table.c b/src/table.c index 06e368f..fa786e7 100644 --- a/src/table.c +++ b/src/table.c @@ -105,6 +105,80 @@ int l_shuffle(lua_State* L) { return 1; } +int l_sum(lua_State* L) { + luaL_checktype(L, 1, LUA_TTABLE); + size_t len = lua_objlen(L,1); + double s = 0; + for(int i = 0; i <= len-1; i++){ + + lua_pushinteger(L,i+1); + lua_gettable(L,1); + + s += luaL_checknumber(L, -1); + lua_pop(L,1); + } + + lua_pushnumber(L, s); + return 1; +} + +int l_indexof(lua_State* L) { + int argc = lua_gettop(L); + double target = luaL_checknumber(L, 2); + luaL_checktype(L, 1, LUA_TTABLE); + size_t len = lua_objlen(L,1); + + //get optional 3rd argument, if its >0 set it to 0 + size_t start = argc == 3 ? luaL_checknumber(L,3) : 0; + start = start > 0 ? start : start; + + double cur = 0; + + for(size_t i = 0; i <= len-1; i++){ + lua_pushinteger(L,i+1); + lua_gettable(L,1); + + double t = luaL_checknumber(L, -1); + if(t==target){ + lua_pushnumber(L, i); + return 1; + } + lua_pop(L,1); + } + + lua_pushnumber(L, -1); + return 1; +} + +int l_sindexof(lua_State* L) { + int argc = lua_gettop(L); + double target = luaL_checknumber(L, 2); + luaL_checktype(L, 1, LUA_TTABLE); + size_t len = lua_objlen(L,1); + int l = 0; + int r = len - 1; + + size_t cid = len/2; + for(size_t i = 0; l<=r; i++){ + int m = l + (r - l) /2; + lua_pushinteger(L,m+1); + lua_gettable(L,1); + + double t = luaL_checknumber(L, -1); + if(t==target){ + lua_pushnumber(L, m); + return 1; + } + if(t > target) l = m + 1; + else r = m - 1; + + lua_pop(L,1); + } + + lua_pushnumber(L, -1); + return 1; +} + int i_hoarepartition(double* arr, int low, int high){ double pivot = arr[((int)((high - low) / 2)) + low]; int i = low - 1; @@ -369,9 +443,7 @@ int l_countingsort(lua_State* L) { lua_pop(L,1); } - //int* count = malloc(sizeof *count * (max + 1)); int* count = calloc(max + 1, sizeof * count); - //for(size_t i = 0; i <= max; i++) count[i] = 0; for(size_t i = 0; i < len; i++){ count[nums[i]]++; diff --git a/src/table.h b/src/table.h index 25c51fa..f3c68ff 100644 --- a/src/table.h +++ b/src/table.h @@ -1,13 +1,16 @@ #include "lua.h" -#include "util.h" - -#define i_swap(A,B) double temp = A; A = B; B = temp; +#include "i_util.h" +#include "i_common.h" int l_len(lua_State*); //[double+int] -> i int l_reverse(lua_State*); //[double+int] -> arr[N] int l_greatest(lua_State*); //[double+int] -> i int l_least(lua_State*); //[double+int] -> i int l_shuffle(lua_State*); //[double+int] -> arr[N] +int l_sum(lua_State*); //[double+int] -> i + +int l_indexof(lua_State*); //[double+int], item -> i +int l_sindexof(lua_State*);//[double+int] (greatest -> least), item -> i //comparison sorts int l_quicksort(lua_State*); //[double+int] -> arr[N] (greatest -> least) @@ -18,7 +21,7 @@ int l_heapsort(lua_State*); //[double+int] -> arr[N] (greatest -> least) //non-comparison sorts //good for large arrays filled with small values -int l_countingsort(lua_State*); //[int], arr[N] >= 0 -> arr[N] (least -> greatest) +int l_countingsort(lua_State*); //[int] (arr[N] >= 0) -> arr[N] (least -> greatest) //esoteric sorts int l_miraclesort(lua_State*); //[double+int] -> arr[-∞<=N<=∞] (greatest -> least) @@ -33,7 +36,11 @@ static const luaL_Reg array_function_list [] = { {"greatest",l_greatest}, {"least",l_least}, {"shuffle",l_shuffle}, + {"sum",l_sum}, + {"index",l_indexof}, + {"sindex",l_sindexof}, + {"quicksort",l_quicksort}, {"mergesort",l_mergesort}, {"shellsort",l_shellsort}, diff --git a/src/util.c b/src/util.c deleted file mode 100644 index 6c16699..0000000 --- a/src/util.c +++ /dev/null @@ -1,12 +0,0 @@ -#include "util.h" -#include -#include - -void p_fatal(const char* m){ - fprintf(stderr, "%s[ fatal ] %s %s\n",color_red, m, color_reset); - exit(EXIT_FAILURE); -} - -void p_error(const char* m){ - fprintf(stderr, "%s[ error ]%s %s\n",color_red, color_reset, m); -} diff --git a/src/util.h b/src/util.h deleted file mode 100644 index b4b609a..0000000 --- a/src/util.h +++ /dev/null @@ -1,20 +0,0 @@ -#define color_black "\e[30m" -#define color_red "\e[31m" -#define color_green "\e[32m" -#define color_yellow "\e[33m" -#define color_blue "\e[34m" -#define color_magenta "\e[35m" -#define color_cyan "\e[36m" -#define color_lgray "\e[37m" -#define color_gray "\e[90m" -#define color_lred "\e[91m" -#define color_lgreen "\e[92m" -#define color_lyellow "\e[93m" -#define color_lblue "\e[94m" -#define color_lmagenta "\e[95m" -#define color_lcyan "\e[96m" -#define color_white "\e[97m" -#define color_reset "\e[0m" - -void p_fatal(const char*); -void p_error(const char*); -- cgit v1.2.3