aboutsummaryrefslogtreecommitdiff
path: root/src/table.c
diff options
context:
space:
mode:
authorame <[email protected]>2023-12-07 16:01:43 -0600
committerame <[email protected]>2023-12-07 16:01:43 -0600
commit79e6627bf92bb2bfd5a103cc4006994309b48246 (patch)
tree49c417e57164b7783c9c02f75b5b6356478594b5 /src/table.c
parent3c06c70cccd643109d9ee8dde2767460a68dcfb0 (diff)
string stuff & closed file from reading
Diffstat (limited to 'src/table.c')
-rw-r--r--src/table.c451
1 files changed, 39 insertions, 412 deletions
diff --git a/src/table.c b/src/table.c
index aae709f..4e99cf1 100644
--- a/src/table.c
+++ b/src/table.c
@@ -1,5 +1,6 @@
#include "table.h"
#include <stdlib.h>
+#include <string.h>
int l_len(lua_State* L) {
luaL_checktype(L, 1, LUA_TTABLE);
@@ -172,426 +173,52 @@ int l_sindexof(lua_State* L) {
return 1;
}
-int i_hoarepartition(double* arr, int low, int high){
- double pivot = arr[((int)((high - low) / 2)) + low];
- int i = low - 1;
- int j = high + 1;
+int l_split(lua_State* L){
+ size_t input_len = 0;
+ size_t split_len = 0;
+ char* input = (char*)luaL_checklstring(L, 1, &input_len);
+ char* split = (char*)luaL_checklstring(L, 2, &split_len);
+ size_t table_len = 0;
+ lua_newtable(L);
- for(;;){
- i++; j--;
-
- while(arr[i] > pivot) i++;
- while(arr[j] < pivot) j--;
- if(i >= j) return j;
-
- i_swap(arr[i],arr[j]);
- }
-}
-
-void i_quicksort(double* arr, int low, int high){
- if(low >= 0 && high >= 0 && low < high){
- int p = i_hoarepartition(arr, low, high);
- i_quicksort(arr, low, p);
- i_quicksort(arr, p + 1, high);
- }
-}
-
-int l_quicksort(lua_State* L) {
- luaL_checktype(L, 1, LUA_TTABLE);
- size_t len = lua_objlen(L,1);
- double* nums = malloc(sizeof * nums * len);
- for(size_t i = 0; i <= len-1; i++){
+ size_t current_len = 0;
+ char current[input_len];
+ memset(current, 0, input_len);
- lua_pushinteger(L,i+1);
- lua_gettable(L,1);
-
- nums[i] = luaL_checknumber(L, -1);
- lua_pop(L,1);
+ for(size_t i = 0; i <= (input_len - 1) - (split_len - 1); i++){
+ int match = 1;
+ for(size_t z = 0; z <= split_len - 1 && match; z++){
+ if(split[z] != input[z + i]) match = 0;
}
-
- i_quicksort(nums, 0, len - 1);
-
- lua_newtable(L);
- for(size_t i = 0; i != len; i++){
- lua_pushnumber(L,i+1);
- lua_pushnumber(L,nums[i]);
+ if(match){
+ lua_pushnumber(L, table_len++);
+ lua_pushstring(L, current);
lua_settable(L, -3);
- }
-
- free(nums);
- return 1;
-}
-
-void i_merge(double* arr, int b, int m, int e){
- int n1 = m - b + 1;
- int n2 = e - m;
-
- double* left = malloc(sizeof * left * n1);
- double* right = malloc(sizeof * right * n2);
-
- for(int i = 0; i < n1; i++) left[i] = arr[b + i];
- for(int i = 0; i < n2; i++) right[i] = arr[m + 1 + i];
-
- int l_ind = 0;
- int r_ind = 0;
- int k = b;
-
- for(; l_ind < n1 && r_ind < n2; k++){
- if(left[l_ind] >= right[r_ind]){
- arr[k] = left[l_ind];
- l_ind++;
- } else {
- arr[k] = right[r_ind];
- r_ind++;
- }
- }
-
- for(; l_ind < n1; k++){
- arr[k] = left[l_ind];
- l_ind++;
- }
- for(; r_ind < n2; k++){
- arr[k] = right[r_ind];
- r_ind++;
- }
-
- free(left);
- free(right);
-}
-
-void i_mergesort(double* arr, int b, int e){
- if(b < e){
- int mid = (b + e) /2;
- i_mergesort(arr, b, mid);
- i_mergesort(arr, mid + 1, e);
- i_merge(arr, b, mid, e);
- }
-}
-
-int l_mergesort(lua_State* L) {
- luaL_checktype(L, 1, LUA_TTABLE);
- size_t len = lua_objlen(L,1);
- double* nums = malloc(sizeof * nums * len);
- for(size_t i = 0; i <= len-1; i++){
- lua_pushinteger(L,i+1);
- lua_gettable(L,1);
-
- nums[i] = luaL_checknumber(L, -1);
- lua_pop(L,1);
+ memset(current, 0, input_len);
+ current_len = 0;
+ } else {
+ current[current_len] = input[i];
+ current_len++;
}
-
- i_mergesort(nums, 0, len - 1);
-
- lua_newtable(L);
- for(size_t i = 0; i != len; i++){
- lua_pushnumber(L,i+1);
- lua_pushnumber(L,nums[i]);
- lua_settable(L, -3);
- }
-
- free(nums);
- return 1;
-}
-
-void i_heapify(double* arr, int n, int i){
- int largest = i;
- int left = 2 * i + 1;
- int right = 2 * i + 2;
-
- if(left < n && arr[left] < arr[largest])
- largest = left;
-
- if(right < n && arr[right] < arr[largest])
- largest = right;
-
- if(largest != i){
- i_swap(arr[i],arr[largest]);
- i_heapify(arr,n,largest);
}
-}
-
-int l_heapsort(lua_State* L) {
- luaL_checktype(L, 1, LUA_TTABLE);
- size_t len = lua_objlen(L,1);
- double* nums = malloc(sizeof * nums * len);
- for(size_t i = 0; i <= len-1; i++){
-
- lua_pushinteger(L,i+1);
- lua_gettable(L,1);
-
- nums[i] = luaL_checknumber(L, -1);
- lua_pop(L,1);
- }
- for(int i = len / 2 - 1; i >= 0; i--)
- i_heapify(nums,len,i);
-
- for(int i = len - 1; i >= 0; i--){
- i_swap(nums[i],nums[0]);
- i_heapify(nums, i, 0);
- }
- lua_newtable(L);
- for(size_t i = 0; i != len; i++){
- lua_pushnumber(L,i+1);
- lua_pushnumber(L,nums[i]);
- lua_settable(L, -3);
- }
- free(nums);
- return 1;
-}
-
-int l_shellsort(lua_State* L) {
- luaL_checktype(L, 1, LUA_TTABLE);
- size_t len = lua_objlen(L,1);
- double* nums = malloc(sizeof * nums * len);
- for(size_t i = 0; i <= len-1; i++){
-
- lua_pushinteger(L,i+1);
- lua_gettable(L,1);
-
- nums[i] = luaL_checknumber(L, -1);
- lua_pop(L,1);
- }
-
- for(int interval = len/2; interval > 0; interval /=2){
- for(int i = interval; i < len; i++){
- double temp = nums[i];
- int j;
- for(j = i; j >= interval && nums[j - interval] < temp; j -= interval){
- nums[j] = nums[j - interval];
- }
- nums[j] = temp;
- }
- }
-
- lua_newtable(L);
- for(size_t i = 0; i != len; i++){
- lua_pushnumber(L,i+1);
- lua_pushnumber(L,nums[i]);
- lua_settable(L, -3);
- }
+ lua_pushnumber(L, table_len++);
+ lua_pushstring(L, current);
+ lua_settable(L, -3);
- free(nums);
- return 1;
+ return 1;
}
-int l_bubblesort(lua_State* L) {
- luaL_checktype(L, 1, LUA_TTABLE);
- size_t len = lua_objlen(L,1);
- double* nums = malloc(sizeof * nums * len);
- for(size_t i = 0; i <= len-1; i++){
-
- lua_pushinteger(L,i+1);
- lua_gettable(L,1);
-
- nums[i] = luaL_checknumber(L, -1);
- lua_pop(L,1);
- }
-
- int n = len;
- for(;n > 0;){
- int new = 0;
-
- for(int i = 0; i != n-1; i++){
- if(nums[i+1]>nums[i]){
- double temp = nums[i];
- nums[i] = nums[i+1];
- nums[i+1] = temp;
-
- new = i+1;
- }
- }
-
- n = new;
- }
-
- lua_newtable(L);
- for(size_t i = 0; i != len; i++){
- lua_pushnumber(L,i+1);
- lua_pushnumber(L,nums[i]);
- lua_settable(L, -3);
- }
-
- free(nums);
- return 1;
-}
-
-int l_countingsort(lua_State* L) {
- luaL_checktype(L, 1, LUA_TTABLE);
- size_t len = lua_objlen(L,1);
- int* nums = malloc(sizeof * nums * len);
- int* out = malloc(sizeof * nums * len);
- int max = 0;
- for(int i = 0; i <= len-1; i++){
-
- lua_pushinteger(L,i+1);
- lua_gettable(L,1);
-
- nums[i] = luaL_checknumber(L, -1);
- out[i] = 0;
-
- if(nums[i]<0) p_fatal("array.countingsort(<table>) requires all indices to be >= 0");
- max = max < nums[i] ? nums[i] : max;
-
- lua_pop(L,1);
- }
-
- int* count = calloc(max + 1, sizeof * count);
-
- for(size_t i = 0; i < len; i++){
- count[nums[i]]++;
- }
-
- for(size_t i = 1; i <= max; i++){
- count[i] += count[i - 1];
- }
-
- for(int i = len - 1; i >= 0; i--){
- out[count[nums[i]] - 1] = nums[i];
- count[nums[i]]--;
- }
-
- lua_newtable(L);
- for(size_t i = 0; i != len; i++){
- lua_pushnumber(L,i+1);
- lua_pushnumber(L,out[i]);
- lua_settable(L, -3);
- }
-
- free(count);
- free(nums);
- free(out);
- return 1;
-}
-
-int i_sorted(double* arr, size_t len){
- for(size_t i = 0; i != len - 1; i++)
- if(arr[i] > arr[i+1]) return 0;
- return 1;
-}
-
-int l_miraclesort(lua_State* L) {
- luaL_checktype(L, 1, LUA_TTABLE);
- size_t len = lua_objlen(L,1);
- double* nums = malloc(sizeof * nums * len);
- for(size_t i = 0; i <= len-1; i++){
-
- lua_pushinteger(L,i+1);
- lua_gettable(L,1);
-
- nums[i] = luaL_checknumber(L, -1);
- lua_pop(L,1);
- }
-
- for(;!i_sorted(nums,len););
-
- lua_newtable(L);
- for(size_t i = 0; i != len; i++){
- lua_pushnumber(L,i+1);
- lua_pushnumber(L,nums[i]);
- lua_settable(L, -3);
- }
-
- free(nums);
- return 1;
-}
-
-int l_stalinsort(lua_State* L) {
- luaL_checktype(L, 1, LUA_TTABLE);
- size_t len = lua_objlen(L,1);
- size_t rlen = 0;
- double* nums = malloc(sizeof * nums * len);
- for(size_t i = 0; i <= len-1; i++){
-
- lua_pushinteger(L,i+1);
- lua_gettable(L,1);
-
- double n = luaL_checknumber(L, -1);
- if(rlen == 0 || nums[rlen - 1] <= n){
- nums[rlen] = n;
- rlen++;
- }
-
- lua_pop(L,1);
- }
-
-
- lua_newtable(L);
- for(size_t i = 0; i != rlen; i++){
- lua_pushnumber(L,i+1);
- lua_pushnumber(L,nums[i]);
- lua_settable(L, -3);
- }
-
- free(nums);
- return 1;
-}
-
-void i_slowsort(double* arr, int i, int j){
- if(i >= j) return;
-
- int m = (i + j) /2;
-
- i_slowsort(arr, i, m);
- i_slowsort(arr, m + 1, j);
-
- if(arr[j] < arr[m]){
- i_swap(arr[j], arr[m]);
- }
-
- i_slowsort(arr, i, j - 1);
-}
-
-int l_slowsort(lua_State* L) {
- luaL_checktype(L, 1, LUA_TTABLE);
- size_t len = lua_objlen(L,1);
- double* nums = malloc(sizeof * nums * len);
- for(int i = 0; i <= len-1; i++){
-
- lua_pushinteger(L,i+1);
- lua_gettable(L,1);
-
- nums[i] = luaL_checknumber(L, -1);
- lua_pop(L,1);
- }
-
- i_slowsort(nums, 0, len - 1);
-
- lua_newtable(L);
- for(size_t i = 0; i != len; i++){
- lua_pushnumber(L,i+1);
- lua_pushnumber(L,nums[i]);
- lua_settable(L, -3);
- }
-
- free(nums);
- return 1;
-}
-
-int l_bogosort(lua_State* L) {
- luaL_checktype(L, 1, LUA_TTABLE);
- size_t len = lua_objlen(L,1);
- double* nums = malloc(sizeof * nums * len);
- for(size_t i = 0; i <= len-1; i++){
-
- lua_pushinteger(L,i+1);
- lua_gettable(L,1);
-
- nums[i] = luaL_checknumber(L, -1);
- lua_pop(L,1);
- }
-
- for(;!i_sorted(nums, len);){
- i_shuffle(nums, len);
- }
-
- lua_newtable(L);
- for(size_t i = 0; i != len; i++){
- lua_pushnumber(L,i+1);
- lua_pushnumber(L,nums[i]);
- lua_settable(L, -3);
- }
-
- free(nums);
- return 1;
+int l_to_char_array(lua_State* L){
+ size_t input_len = 0;
+ char* input = (char*)luaL_checklstring(L, 1, &input_len);
+ lua_newtable(L);
+
+ for(size_t i = 0; i <= input_len - 1; i++){
+ lua_pushnumber(L, i + 1);
+ char uwu = input[i];
+ lua_pushstring(L, &uwu);
+ lua_settable(L, -3);
+ }
+ return 1;
}