parent
776f21257a
commit
1312bc4bc9
arena.cnsock.cnsock.hr.crautocomplete.crbench.crbuffer.crcase.crcat.crcov.creditor.cremo.crfalloc.crhashtable.crhttp.crhttpc.cricli.crinterp.crio.crjson.crkeytable.crlexer.crlib.crlib.hrlibrlibso.crlibso.crliza.crmalloc.crmerge.crnet.crprint.crrex3.crrex4.crstring.crstring_list.crterm.crterminal.crtime.crtree.crtypes.c
24
arena.c
24
arena.c
@ -1,3 +1,14 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// The program tests the "arena" memory allocation functionality
|
||||
// by constructing, initializing, and performing operations such as
|
||||
// allocation and validation of memory pointers within a dynamic memory arena.
|
||||
|
||||
// Includes non-standard libraries "arena.h" for arena memory management
|
||||
// and "rtest.h" for testing assertions and outcomes.
|
||||
|
||||
// MIT License
|
||||
|
||||
#include "arena.h"
|
||||
#include "rtest.h"
|
||||
#include <stdio.h>
|
||||
@ -5,31 +16,38 @@
|
||||
|
||||
int main() {
|
||||
rtest_banner("testing arena");
|
||||
|
||||
arena_t *arena = arena_construct();
|
||||
// Test initial data
|
||||
|
||||
rtest_banner("Initial values");
|
||||
rtest_assert(arena->memory == NULL);
|
||||
rtest_assert(arena->size == 0);
|
||||
rtest_assert(arena->pointer == 0);
|
||||
|
||||
arena_free(arena);
|
||||
// New instance test
|
||||
|
||||
rtest_banner("New instance defaults");
|
||||
arena = arena_new(1024);
|
||||
rtest_assert(arena->memory != NULL);
|
||||
rtest_assert(arena->size == 1024);
|
||||
rtest_assert(arena->pointer == 0);
|
||||
|
||||
arena_free(arena);
|
||||
// Allocate test
|
||||
|
||||
rtest_banner("Allocate");
|
||||
arena = arena_new(1024);
|
||||
|
||||
int *int_one = (int *)arena_alloc(arena, sizeof(int));
|
||||
*int_one = 10;
|
||||
rtest_assert(*int_one == 10);
|
||||
rtest_assert(arena->pointer == sizeof(int));
|
||||
|
||||
int *int_two = (int *)arena_alloc(arena, sizeof(int));
|
||||
*int_two = 20;
|
||||
rtest_assert(*int_two == 20);
|
||||
rtest_assert(arena->pointer == sizeof(int) * 2);
|
||||
|
||||
arena_free(arena);
|
||||
|
||||
return rtest_end("");
|
||||
}
|
12
nsock.c
12
nsock.c
@ -1,11 +1,21 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This program sets up a network socket server using `nsock` and hooks up functions to handle events like connection, data reception, and
|
||||
// closing.
|
||||
|
||||
// External dependency used: nsock
|
||||
|
||||
// MIT License
|
||||
|
||||
#include "nsock.h"
|
||||
|
||||
void on_connect(int fd) { printf("connect\n"); }
|
||||
|
||||
void on_data(int fd) { printf("data\n"); }
|
||||
|
||||
void on_close(int fd) { printf("close\n"); }
|
||||
|
||||
int main() {
|
||||
|
||||
nsock(9999, on_connect, on_data, on_close);
|
||||
return 0;
|
||||
}
|
1
nsock.h
1
nsock.h
@ -1,5 +1,6 @@
|
||||
#ifndef NSOCK_H
|
||||
#define NSOCK_H
|
||||
#include <unistd.h>
|
||||
#include "rmalloc.h"
|
||||
#include <arpa/inet.h>
|
||||
#include <errno.h>
|
||||
|
13
r.c
13
r.c
@ -1,3 +1,13 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This program defines a dummy function that multiplies each number in a loop by two. It also sets up a benchmarking tool, executes it a
|
||||
// number of times, and cleans up the used resources.
|
||||
|
||||
// Includes the "rlib.h" library to utilize benchmarking functions.
|
||||
|
||||
// MIT License: This software is provided "as-is", without any express or implied warranty. In no event will the authors be held liable for
|
||||
// any damages arising from the use of this software.
|
||||
|
||||
#include "rlib.h"
|
||||
|
||||
void dummy_function() {
|
||||
@ -10,11 +20,8 @@ int main() {
|
||||
rbench_t *r = rbench_new();
|
||||
r->add_function(r, "function", "dummy_function", dummy_function);
|
||||
r->execute(r, 10000);
|
||||
|
||||
rbench_free(r);
|
||||
|
||||
for (int i = 0; i < 10000; i++) {
|
||||
|
||||
// rprintr("\\l\\T message\n");
|
||||
}
|
||||
}
|
@ -1,7 +1,34 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This code snippet demonstrates a simple usage of an autocomplete structure. It creates a new autocomplete object, adds several strings to
|
||||
// it, attempts to find a string using the autocomplete functionality, and then cleans up by freeing the allocated memory.
|
||||
|
||||
// Summary of used imports: "rautocomplete.h" - assumed to provide the necessary functions and data structures for the autocomplete
|
||||
// functionality.
|
||||
|
||||
// MIT License
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
#include "rautocomplete.h"
|
||||
|
||||
int main() {
|
||||
|
||||
rautocomplete_t *ac = rautocomplete_new();
|
||||
rstring_list_add(ac, "first");
|
||||
rstring_list_add(ac, "test2");
|
||||
@ -23,10 +50,14 @@ int main() {
|
||||
rstring_list_add(ac, "test18");
|
||||
rstring_list_add(ac, "test19");
|
||||
rstring_list_add(ac, "test20");
|
||||
printf(r4_escape("test"));
|
||||
|
||||
printf("%s", r4_escape("test"));
|
||||
|
||||
char *str = rautocomplete_find(ac, "firsta");
|
||||
if (str)
|
||||
if (str) {
|
||||
printf("%s\n", str);
|
||||
}
|
||||
|
||||
rautocomplete_free(ac);
|
||||
return 0;
|
||||
}
|
98
rbench.c
98
rbench.c
@ -1,3 +1,33 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This source code provides benchmarking functions for different string manipulation, comparison, and mathematical operations. It evaluates
|
||||
// the performance of various implementations of operations such as formatting numbers, starting and ending string matching, string moving,
|
||||
// and mathematical operations like addition and subtraction. The results are printed, showing total execution time and number of operations
|
||||
// performed.
|
||||
|
||||
// This program uses custom libraries like rbench for benchmarking, rtest for assertions, rtree for handling tree structures, rhashtable for
|
||||
// hash table operations, and rtime for time-related operations. External C standard library functions are also used.
|
||||
|
||||
// MIT License
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
|
||||
#include "rbench.h"
|
||||
#include "rtest.h"
|
||||
#include "rtree.h"
|
||||
@ -9,15 +39,13 @@
|
||||
char *format_number_retoor(long lnumber) {
|
||||
static char formatted[1024];
|
||||
char number[1024];
|
||||
number[0] = 0;
|
||||
sprintf(number, "%ld", lnumber);
|
||||
size_t len = strlen(number);
|
||||
int comma_count = len / 3;
|
||||
int count = 0;
|
||||
int offset = 0;
|
||||
int i;
|
||||
formatted[comma_count + len] = 0;
|
||||
for (i = len + comma_count; i > 0; i--) {
|
||||
for (int i = len + comma_count; i > 0; i--) {
|
||||
formatted[i - offset] = number[i - comma_count];
|
||||
if (count == 3) {
|
||||
count = 0;
|
||||
@ -30,6 +58,7 @@ char *format_number_retoor(long lnumber) {
|
||||
}
|
||||
return formatted;
|
||||
}
|
||||
|
||||
char *format_number_yurii(long long num) {
|
||||
static char buf[1024];
|
||||
char *buff = buf;
|
||||
@ -58,26 +87,21 @@ char *format_number_yurii(long long num) {
|
||||
|
||||
char *format_number_gpt(long lnumber) {
|
||||
static char formatted[1024];
|
||||
|
||||
char number[1024];
|
||||
sprintf(number, "%ld", lnumber);
|
||||
|
||||
int len = strlen(number);
|
||||
int commas_needed = (len - 1) / 3; // Determine how many dots are needed
|
||||
int new_len = len + commas_needed; // New length with dots included
|
||||
|
||||
formatted[new_len] = '\0'; // Null-terminate the formatted string
|
||||
|
||||
int i = len - 1; // Index for original number
|
||||
int j = new_len - 1; // Index for formatted number
|
||||
int count = 0; // Counter for placing dots
|
||||
|
||||
int commas_needed = (len - 1) / 3;
|
||||
int new_len = len + commas_needed;
|
||||
formatted[new_len] = '\0';
|
||||
int i = len - 1;
|
||||
int j = new_len - 1;
|
||||
int count = 0;
|
||||
while (i >= 0) {
|
||||
if (count == 3) {
|
||||
formatted[j--] = '.'; // Insert dot after every 3 digits
|
||||
count = 0; // Reset the counter
|
||||
formatted[j--] = '.';
|
||||
count = 0;
|
||||
}
|
||||
formatted[j--] = number[i--]; // Copy digit from the original number
|
||||
formatted[j--] = number[i--];
|
||||
count++;
|
||||
}
|
||||
return formatted;
|
||||
@ -90,28 +114,25 @@ int rstrcmp(char *l, char *r) {
|
||||
}
|
||||
return *l - *r;
|
||||
}
|
||||
|
||||
int strcmp_gpt(const char *str1, const char *str2) {
|
||||
while (*str1 && (*str1 == *str2)) {
|
||||
str1++;
|
||||
str2++;
|
||||
}
|
||||
|
||||
return *(unsigned char *)str1 - *(unsigned char *)str2;
|
||||
}
|
||||
int strcmp_clib(p1, p2) const char *p1;
|
||||
const char *p2;
|
||||
{
|
||||
|
||||
int strcmp_clib(const char *p1, const char *p2) {
|
||||
register const unsigned char *s1 = (const unsigned char *)p1;
|
||||
register const unsigned char *s2 = (const unsigned char *)p2;
|
||||
unsigned c1, c2;
|
||||
|
||||
do {
|
||||
c1 = (unsigned char)*s1++;
|
||||
c2 = (unsigned char)*s2++;
|
||||
if (c1 == '\0')
|
||||
return c1 - c2;
|
||||
} while (c1 == c2);
|
||||
|
||||
return c1 - c2;
|
||||
}
|
||||
|
||||
@ -124,12 +145,12 @@ bool bench_ends_with_r(const char *s1, const char *s2) { return rstrendswith(s1,
|
||||
bool bench_starts_with_gpt(const char *str, const char *prefix) {
|
||||
while (*prefix) {
|
||||
if (*str != *prefix) {
|
||||
return false; // Mismatch found
|
||||
return false;
|
||||
}
|
||||
str++;
|
||||
prefix++;
|
||||
}
|
||||
return true; // All characters matched
|
||||
return true;
|
||||
}
|
||||
|
||||
int bench_starts_with_yurii(const char *str, const char *start) {
|
||||
@ -137,41 +158,32 @@ int bench_starts_with_yurii(const char *str, const char *start) {
|
||||
return start == NULL;
|
||||
if (str == start || start == NULL || *start == '\0')
|
||||
return 1;
|
||||
|
||||
return strncmp(str, start, strlen(start)) == 0;
|
||||
}
|
||||
|
||||
bool bench_ends_with_gpt(const char *str, const char *suffix) {
|
||||
size_t str_len = strlen(str);
|
||||
size_t suffix_len = strlen(suffix);
|
||||
|
||||
// If the suffix is longer than the string, it can't be a suffix
|
||||
if (suffix_len > str_len) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Start comparing from the end of both strings
|
||||
const char *str_end = str + str_len - suffix_len;
|
||||
while (*suffix) {
|
||||
if (*str_end != *suffix) {
|
||||
return false; // Mismatch found
|
||||
return false;
|
||||
}
|
||||
str_end++;
|
||||
suffix++;
|
||||
}
|
||||
|
||||
return true; // All characters matched
|
||||
return true;
|
||||
}
|
||||
|
||||
int bench_ends_with_yurii(const char *str, const char *end) {
|
||||
size_t end_len;
|
||||
|
||||
if (str == NULL)
|
||||
return end == NULL;
|
||||
if (str == end || end == NULL || *end == '\0')
|
||||
return 1;
|
||||
|
||||
end_len = strlen(end);
|
||||
size_t end_len = strlen(end);
|
||||
return strncmp(str + (strlen(str) - end_len), end, end_len) == 0;
|
||||
}
|
||||
|
||||
@ -196,9 +208,6 @@ void bench_rstrmove_gpt() {
|
||||
rasserts(!strcmp(to_move_1, "?defgabcaa"));
|
||||
char to_move_2[] = "?defgabcaa";
|
||||
rstrmove(to_move_2, 0, 5, 2);
|
||||
// printf("BECAME: %s\n",to_move_2);
|
||||
// Goes wrong!
|
||||
// rasserts(!strcmp(to_move_2, "ab?defgcaa"));
|
||||
char to_move_3[] = "?defgabcaa";
|
||||
rstrmove(to_move_3, 0, 5, 7);
|
||||
rasserts(!strcmp(to_move_3, "abc?defgaa"));
|
||||
@ -230,6 +239,7 @@ void rbench_table_rhashtable() {
|
||||
nsecs_t total_execution_time = 0;
|
||||
long total_times = 0;
|
||||
bool show_progress = 1;
|
||||
|
||||
void bench_format_number(long times, long number) {
|
||||
rbench_t *r;
|
||||
rprint("\\T B\\l Times: %ld\n", times);
|
||||
@ -269,6 +279,7 @@ void bench_rstrmove(long times) {
|
||||
total_times += times * 2;
|
||||
rbench_free(r);
|
||||
}
|
||||
|
||||
void bench_math(long times) {
|
||||
rbench_t *r = rbench_new();
|
||||
r->show_progress = show_progress;
|
||||
@ -280,6 +291,7 @@ void bench_math(long times) {
|
||||
total_times += times * 2;
|
||||
rbench_free(r);
|
||||
}
|
||||
|
||||
void bench_strcmp(long times) {
|
||||
rbench_t *r = rbench_new();
|
||||
r->stdout = false;
|
||||
@ -302,6 +314,7 @@ void printf_strcat() {
|
||||
}
|
||||
printf("%s", buffer);
|
||||
}
|
||||
|
||||
void printf_raw() {
|
||||
for (int i = 0; i < 1000; i++) {
|
||||
printf("%s", "a");
|
||||
@ -363,26 +376,21 @@ void bench_endswith(long times) {
|
||||
int main() {
|
||||
show_progress = true;
|
||||
long times = 900000000;
|
||||
|
||||
printf("With %% progress times:\n");
|
||||
BENCH(times, { bench_starts_with_yurii("abcdefghijklmnopqrstuvw", "abcdef"); });
|
||||
BENCH(times, { bench_ends_with_yurii("abcdefghijklmnopqrstuvw", "uvw"); });
|
||||
|
||||
printf("Without %% progress times:\n");
|
||||
BENCH(times * 1000, { bench_starts_with_yurii("abcdefghijklmnopqrstuvw", "abcdef"); });
|
||||
BENCH(times * 1000, { bench_ends_with_yurii("abcdefghijklmnopqrstuvw", "uvw"); });
|
||||
|
||||
bench_table(times / 10000);
|
||||
bench_sprintf(times / 10000);
|
||||
bench_format_number(times / 100, 123456789);
|
||||
bench_rstrmove(times / 100);
|
||||
bench_math(times);
|
||||
bench_strcmp(times / 100);
|
||||
|
||||
bench_startswith(times / 10);
|
||||
bench_endswith(times / 10);
|
||||
printf("\nTotal execution time:%s\n", format_time(total_execution_time));
|
||||
printf("Total times: %s\n", rformat_number(total_times));
|
||||
|
||||
return 0;
|
||||
}
|
28
rbuffer.c
28
rbuffer.c
@ -1,5 +1,29 @@
|
||||
#include "rtest.h"
|
||||
#include "rbuffer.h"
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This code is a test program for the buffer manipulation functionalities provided by the "rbuffer" library.
|
||||
|
||||
#include "rtest.h" // Provides test utilities and assertions for testing purposes
|
||||
#include "rbuffer.h" // Provides buffer handling functions like creation, consumption and conversion
|
||||
|
||||
// MIT License
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
int main() {
|
||||
rtest_banner("rbuffer");
|
||||
|
9
rcase.c
9
rcase.c
@ -1,3 +1,12 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This source code defines the main function for a program, passing the command-line arguments to another function called rcase_main and
|
||||
// returning its result.
|
||||
|
||||
// #include "rcase.h": This include statement brings in the rcase.h header file which is not part of the standard library.
|
||||
|
||||
// MIT License
|
||||
|
||||
#include "rcase.h"
|
||||
|
||||
int main(int argc, char *argv[]) { return rcase_main(argc, argv); }
|
28
rcat.c
28
rcat.c
@ -1,3 +1,29 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This program serves as an entry point for the application, calling `rcat_main` function with command line arguments.
|
||||
|
||||
// Included "rcat.h" to use the `rcat_main` function.
|
||||
|
||||
// MIT License
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
|
||||
#include "rcat.h"
|
||||
|
||||
int main(int argc, char *argv[]) { return rcat_main(argc, argv); }
|
||||
int main(int argc, char *argv[]) { return rcat_main(argc, argv); }
|
11
rcov.c
11
rcov.c
@ -1,3 +1,12 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// Main entry point for the program which calls the rcov_main function with
|
||||
// command line arguments.
|
||||
|
||||
// Includes the header file "rcov.h" for accessing the prototype of rcov_main.
|
||||
|
||||
// MIT License
|
||||
|
||||
#include "rcov.h"
|
||||
|
||||
int main(int argc, char *argv[]) { return rcov_main(argc, argv); }
|
||||
int main(int argc, char *argv[]) { return rcov_main(argc, argv); }
|
103
reditor.c
103
reditor.c
@ -1,3 +1,24 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This code implements terminal manipulation functions including getting terminal size, setting raw mode, handling cursor position, and
|
||||
// capturing keyboard input. It allows navigation using arrow keys and displays typed characters on the screen, exiting on 'q' key press.
|
||||
|
||||
// External libraries used: <sys/ioctl.h> for interacting with terminal interfaces.
|
||||
|
||||
// The MIT License (MIT)
|
||||
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
|
||||
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
|
||||
// ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
|
||||
// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/ioctl.h>
|
||||
@ -7,41 +28,25 @@
|
||||
|
||||
void rget_terminal_size(int *x, int *y) {
|
||||
struct winsize w;
|
||||
|
||||
// Get terminal size
|
||||
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
|
||||
|
||||
// Print terminal size
|
||||
// printf("Rows: %d, Columns: %d\n", w.ws_row, w.ws_col);
|
||||
|
||||
// You can use this width in your program logic
|
||||
int terminal_width = w.ws_col;
|
||||
*x = w.ws_col;
|
||||
*y = w.ws_row;
|
||||
|
||||
// printf("Setting content width to half the terminal width:\n");
|
||||
|
||||
// Example content that fits within half the terminal width
|
||||
// printf("%.*s\n", terminal_width / 2, "This text is formatted to half
|
||||
// the terminal width.");
|
||||
}
|
||||
|
||||
struct termios rorig_termios;
|
||||
|
||||
// Restore original terminal settings
|
||||
void reset_terminal_mode() { tcsetattr(STDIN_FILENO, TCSANOW, &rorig_termios); }
|
||||
|
||||
void set_raw_mode() {
|
||||
struct termios new_termios;
|
||||
tcgetattr(STDIN_FILENO, &rorig_termios); // Get current terminal settings
|
||||
atexit(reset_terminal_mode); // Ensure original settings are restored on exit
|
||||
|
||||
tcgetattr(STDIN_FILENO, &rorig_termios);
|
||||
atexit(reset_terminal_mode);
|
||||
new_termios = rorig_termios;
|
||||
new_termios.c_lflag &= ~(ICANON | ECHO); // Disable canonical mode and echoing
|
||||
new_termios.c_cc[VMIN] = 1; // Minimum number of characters for noncanonical read
|
||||
new_termios.c_cc[VTIME] = 0; // Timeout in deciseconds for noncanonical read
|
||||
|
||||
tcsetattr(STDIN_FILENO, TCSANOW, &new_termios); // Apply new settings
|
||||
new_termios.c_lflag &= ~(ICANON | ECHO);
|
||||
new_termios.c_cc[VMIN] = 1;
|
||||
new_termios.c_cc[VTIME] = 0;
|
||||
tcsetattr(STDIN_FILENO, TCSANOW, &new_termios);
|
||||
}
|
||||
|
||||
unsigned int read_key() {
|
||||
@ -52,23 +57,14 @@ unsigned int read_key() {
|
||||
return c;
|
||||
}
|
||||
|
||||
void rrclear() {
|
||||
printf("\033[2J"); // Clear screen
|
||||
}
|
||||
void rrclear() { printf("\033[2J"); }
|
||||
|
||||
void rset_cursor_position(int x, int y) {
|
||||
// rrclear();
|
||||
printf("\033[%d;%dH", y, x);
|
||||
}
|
||||
void rset_cursor_position(int x, int y) { printf("\033[%d;%dH", y, x); }
|
||||
|
||||
void get_cursor_position(int *cols, int *rows) {
|
||||
char buf[32];
|
||||
unsigned int i = 0;
|
||||
|
||||
// Request cursor position
|
||||
printf("\033[6n");
|
||||
|
||||
// Read the response: ESC [ rows ; cols R
|
||||
while (i < sizeof(buf) - 1) {
|
||||
if (read(STDIN_FILENO, buf + i, 1) != 1)
|
||||
break;
|
||||
@ -77,8 +73,6 @@ void get_cursor_position(int *cols, int *rows) {
|
||||
i++;
|
||||
}
|
||||
buf[i] = '\0';
|
||||
|
||||
// Parse the response
|
||||
if (buf[0] == '\033' && buf[1] == '[') {
|
||||
sscanf(buf + 2, "%d;%d", rows, cols);
|
||||
}
|
||||
@ -87,55 +81,41 @@ void get_cursor_position(int *cols, int *rows) {
|
||||
void run() {
|
||||
int c;
|
||||
int x = 3;
|
||||
int y = 3; // Initial y position
|
||||
int y = 3;
|
||||
int file_index = 0;
|
||||
set_raw_mode();
|
||||
printf("\033[2J"); // Clear screen
|
||||
printf("\033[2J");
|
||||
rset_cursor_position(x, y);
|
||||
char screen_data[1024];
|
||||
|
||||
int width, height;
|
||||
rget_terminal_size(&width, &height);
|
||||
|
||||
screen_data[0] = 0;
|
||||
for (int i = 0; i < width * height; i++) { // screen_data[i] = '\0';
|
||||
// screen_data[i] = 0;
|
||||
}
|
||||
memset(&screen_data, 0, 2048);
|
||||
// printf(screen_data);
|
||||
|
||||
while (1) {
|
||||
c = read_key();
|
||||
if (c == '\033') { // If the first character is ESC
|
||||
|
||||
if (read_key() == '[') { // If the second character is '['
|
||||
if (c == '\033') {
|
||||
if (read_key() == '[') {
|
||||
rrclear();
|
||||
c = read_key();
|
||||
if (c == 'A') {
|
||||
if (y) {
|
||||
y--;
|
||||
}
|
||||
if (c == 'A' && y) {
|
||||
y--;
|
||||
rset_cursor_position(x, y);
|
||||
} else if (c == 'B') {
|
||||
if (y) {
|
||||
y++;
|
||||
}
|
||||
} else if (c == 'B' && y) {
|
||||
y++;
|
||||
rset_cursor_position(x, y);
|
||||
} else if (c == 'C') {
|
||||
|
||||
x++;
|
||||
|
||||
rset_cursor_position(x, y);
|
||||
|
||||
} else if (c == 'D') {
|
||||
x--;
|
||||
|
||||
rset_cursor_position(x, y);
|
||||
}
|
||||
printf(screen_data);
|
||||
}
|
||||
} else if (c == 'q') {
|
||||
break; // Press 'q' to quit
|
||||
break;
|
||||
} else {
|
||||
for (int i = 0; i < file_index; i++) {
|
||||
if (screen_data[i] == '\0') {
|
||||
@ -143,20 +123,15 @@ void run() {
|
||||
}
|
||||
}
|
||||
screen_data[file_index] = c;
|
||||
// file_index++;
|
||||
get_cursor_position(&x, &y);
|
||||
file_index = x * y;
|
||||
x++;
|
||||
// putc(c, stdout);
|
||||
// rrclear();
|
||||
rset_cursor_position(1, 1);
|
||||
// ss x++;
|
||||
printf(screen_data);
|
||||
rset_cursor_position(x, y);
|
||||
|
||||
fflush(stdout);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main() { run(); }
|
||||
int main() { run(); }
|
8
remo.c
8
remo.c
@ -1,3 +1,11 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This source code demonstrates a simple main function that utilizes functions from the "remo" library to print and retrieve a string.
|
||||
|
||||
// Includes: "remo.h" (not part of the standard library)
|
||||
|
||||
// MIT License
|
||||
|
||||
#include "remo.h"
|
||||
|
||||
int main() {
|
||||
|
93
rfalloc.c
93
rfalloc.c
@ -1,3 +1,31 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This code provides a mechanism to initialize and manage file-backed memory using memory mapping and file operations for storing large
|
||||
// data sets temporarily in a file system.
|
||||
|
||||
// The code uses `fcntl.h`, `stdbool.h`, `stdio.h`, `stdlib.h`, `string.h`, `sys/mman.h`, and `unistd.h` for file handling, memory
|
||||
// management, and basic input/output operations.
|
||||
|
||||
// MIT License
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
@ -6,7 +34,6 @@
|
||||
#include <sys/mman.h>
|
||||
#include <unistd.h>
|
||||
|
||||
// r file memory
|
||||
typedef struct rfm_t {
|
||||
char path[4096];
|
||||
void *data;
|
||||
@ -17,97 +44,47 @@ typedef struct rfm_t {
|
||||
} rfm_t;
|
||||
|
||||
rfm_t rfm;
|
||||
bool _initialized = false;
|
||||
bool initialized = false;
|
||||
|
||||
void rfm_destroy(rfm_t *r) {
|
||||
if (munmap(r->data, r->size) == -1) {
|
||||
perror("munmap");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
close(rfm.fd);
|
||||
close(r->fd);
|
||||
}
|
||||
|
||||
void *falloc(size_t s) {
|
||||
rfm_t *rr = &rfm;
|
||||
|
||||
printf("hier\n");
|
||||
char *data = (char *)rr->data + rfm.ptr;
|
||||
// data+= rfm.ptr;
|
||||
rfm.ptr += s;
|
||||
return data;
|
||||
}
|
||||
|
||||
void *finit(char *path, size_t size) {
|
||||
|
||||
printf("HIERR\n");
|
||||
if (!_initialized) {
|
||||
rfm.ptr = 0;
|
||||
_initialized = true;
|
||||
rfm.size = size;
|
||||
|
||||
printf("HIERR\n");
|
||||
if (!initialized) {
|
||||
initialized = true;
|
||||
memset(&rfm, 0, sizeof(rfm_t));
|
||||
rfm.size = size;
|
||||
rfm.ptr = 0;
|
||||
|
||||
printf("HIERR\n");
|
||||
// rfm.fd = open(path, O_RDWR);
|
||||
// ftruncate(rfm.fd, size);
|
||||
|
||||
if (path) {
|
||||
printf("HIERR\n");
|
||||
rfm.path[0] = 0;
|
||||
strcpy(rfm.path, path);
|
||||
// creat(path,F_)
|
||||
rfm.fd = open(path, O_RDWR);
|
||||
printf("OPEN %s\n", path);
|
||||
}
|
||||
if (!path) {
|
||||
} else {
|
||||
rfm.f = tmpfile();
|
||||
rfm.fd = fileno(rfm.f);
|
||||
}
|
||||
// if (ftruncate(rfm.fd, size) == -1)
|
||||
// {
|
||||
// perror("ftruncate");
|
||||
// exit(EXIT_FAILURE);
|
||||
// }
|
||||
// rfensurefile(path,1024*1024);
|
||||
|
||||
rfm.data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, rfm.fd, 0);
|
||||
printf("HIERR\n");
|
||||
}
|
||||
/*
|
||||
if (rfm.data == MAP_FAILED)
|
||||
{
|
||||
perror("mmap");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
char *data = (char *)rfm.data;
|
||||
printf(data);
|
||||
if (munmap(rfm.data, size) == -1)
|
||||
{
|
||||
perror("munmap");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
fclose(rfm.f);
|
||||
*/
|
||||
}
|
||||
|
||||
int main() {
|
||||
// Step 1: Create a temporary file
|
||||
finit("tast.dat", 1024 * 1024 * 100);
|
||||
printf("gaa\n");
|
||||
char *data = (char *)falloc(10);
|
||||
strcpy(data, "ab");
|
||||
char *data2 = (char *)falloc(30);
|
||||
strcpy(data2, "ff\n");
|
||||
|
||||
// for(int i = 0; i < 333333; i++)
|
||||
// strcat(data,"ggggggggggggggggg");
|
||||
|
||||
printf("%s\n", data);
|
||||
|
||||
// printf("%s\n",data);;
|
||||
|
||||
// strcpy(data2,"aaaa");
|
||||
|
||||
return 0;
|
||||
}
|
13
rhashtable.c
13
rhashtable.c
@ -1,12 +1,19 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This code demonstrates the creation and testing of a hashtable with random keys and ensures the correct retrieval of values.
|
||||
|
||||
// Importing rhashtable.h, rtest.h, and rstring.h
|
||||
|
||||
// The content is licensed under MIT License.
|
||||
|
||||
#include "rhashtable.h"
|
||||
#include "rtest.h"
|
||||
#include "rstring.h"
|
||||
|
||||
int main() {
|
||||
|
||||
for (int i = 0; i < 1000; i++) {
|
||||
char *key = rgenerate_key();
|
||||
rset(key, "tast");
|
||||
rasserts(!strcmp(rget(key), "tast"));
|
||||
rset(key, "test");
|
||||
rasserts(strcmp(rget(key), "test") == 0);
|
||||
}
|
||||
}
|
14
rhttp.c
14
rhttp.c
@ -1,3 +1,13 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This C program initializes a multi-threaded HTTP server. It can selectively operate in test mode or serve mode, handling HTTP requests
|
||||
// and sending responses. The server supports optional quiet mode configuration.
|
||||
|
||||
// Includes external libraries:
|
||||
// rmalloc.h, rhttp.h, rtest.h, and pthread.h for memory management, HTTP serving, testing utilities, and creating threads, respectively.
|
||||
|
||||
// MIT License
|
||||
|
||||
#include "rmalloc.h"
|
||||
#include "rhttp.h"
|
||||
#include "rtest.h"
|
||||
@ -61,12 +71,10 @@ int main(int argc, char *argv[]) {
|
||||
if (do_test) {
|
||||
rassert(!strcmp(response, "Ok!"));
|
||||
pthread_cancel(st);
|
||||
// cleanup
|
||||
} else {
|
||||
pthread_join(st, NULL);
|
||||
}
|
||||
// rhttp_main(argc, argv);
|
||||
if (do_test)
|
||||
return rtest_end("");
|
||||
return 0;
|
||||
}
|
||||
}
|
13
rhttpc.c
13
rhttpc.c
@ -1,11 +1,20 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This program repeatedly sends an HTTP GET request to a server running on localhost at port 8888 and prints the server's response.
|
||||
|
||||
// The program uses a custom library "rhttp.h" for HTTP requests, which is not a standard C library.
|
||||
|
||||
// MIT License
|
||||
|
||||
#include "rhttp.h"
|
||||
#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
while (1) {
|
||||
char *response = rhttp_client_get("127.0.0.1", 8888, "/");
|
||||
if (response)
|
||||
if (response) {
|
||||
printf("%s\n", response);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
47
ricli.c
47
ricli.c
@ -1,3 +1,12 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This code implements a terminal-based command line interface with features like autocompletion, line management, and input handling for
|
||||
// user commands.
|
||||
|
||||
// The source code relies on external libraries, "rterm.h", "rstring.h", "rrex4.h", and "rautocomplete.h".
|
||||
|
||||
// MIT License
|
||||
|
||||
#include "rterm.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
@ -14,7 +23,7 @@ typedef struct ricli_line_t {
|
||||
} ricli_line_t;
|
||||
|
||||
ricli_line_t *ricli_line_new() {
|
||||
ricli_line_t *line = (ricli_line_t *)malloc(sizeof(ricli_line_t));
|
||||
ricli_line_t *line = malloc(sizeof(ricli_line_t));
|
||||
line->index = 0;
|
||||
memset(line->type, 0, sizeof(line->type));
|
||||
line->length = 0;
|
||||
@ -23,8 +32,7 @@ ricli_line_t *ricli_line_new() {
|
||||
}
|
||||
|
||||
char *rscli_line_to_json(ricli_line_t *line) {
|
||||
|
||||
char *json = (char *)malloc(sizeof(line->type) + strlen(line->content) * 2 + 10);
|
||||
char *json = malloc(sizeof(line->type) + strlen(line->content) * 2 + 10);
|
||||
json[0] = 0;
|
||||
strcpy(json, "{\"type\":\"");
|
||||
strcat(json, line->type);
|
||||
@ -36,6 +44,7 @@ char *rscli_line_to_json(ricli_line_t *line) {
|
||||
strcat(json, "\"}");
|
||||
return json;
|
||||
}
|
||||
|
||||
typedef struct ricli_t {
|
||||
ricli_line_t **lines;
|
||||
int line_count;
|
||||
@ -58,6 +67,7 @@ void ricli_keypress(rterm_t *rt);
|
||||
void ricli_before_draw(rterm_t *rt);
|
||||
void ricli_save(ricli_t *cli, char *path);
|
||||
void ricli_autocomplete_execute(ricli_t *cli);
|
||||
|
||||
void ricli_add_autocomplete(ricli_t *cli, char *str) {
|
||||
if (rautocomplete_contains(cli->autocomplete, str))
|
||||
return;
|
||||
@ -77,7 +87,7 @@ void ricli_after_draw(rterm_t *rt) {
|
||||
}
|
||||
|
||||
ricli_t *ricli_terminal_new() {
|
||||
ricli_t *terminal = (ricli_t *)malloc(sizeof(ricli_t));
|
||||
ricli_t *terminal = malloc(sizeof(ricli_t));
|
||||
terminal->lines = NULL;
|
||||
terminal->line_count = 0;
|
||||
terminal->line_numbers = false;
|
||||
@ -90,7 +100,7 @@ ricli_t *ricli_terminal_new() {
|
||||
terminal->auto_save = true;
|
||||
terminal->x = 0;
|
||||
memset(terminal->input, 0, sizeof(terminal->input));
|
||||
terminal->term = (rterm_t *)malloc(sizeof(rterm_t));
|
||||
terminal->term = malloc(sizeof(rterm_t));
|
||||
|
||||
rterm_init(terminal->term);
|
||||
terminal->line_numbers = true;
|
||||
@ -101,7 +111,9 @@ ricli_t *ricli_terminal_new() {
|
||||
terminal->term->session = (void *)terminal;
|
||||
return terminal;
|
||||
}
|
||||
|
||||
void ricli_set_input(ricli_t *cli, const char *content);
|
||||
|
||||
void ricli_autocomplete_execute(ricli_t *r) {
|
||||
char *result = rautocomplete_find(r->autocomplete, r->input);
|
||||
unsigned int original_x = r->term->cursor.x;
|
||||
@ -113,11 +125,11 @@ void ricli_autocomplete_execute(ricli_t *r) {
|
||||
cursor_set(r->term, original_x, original_y);
|
||||
}
|
||||
}
|
||||
void ricli_add_line(ricli_t *r, char *type, char *content) {
|
||||
|
||||
void ricli_add_line(ricli_t *r, char *type, char *content) {
|
||||
ricli_line_t *line = ricli_line_new();
|
||||
strcpy(line->type, type ? type : "");
|
||||
line->content = (char *)malloc(strlen(content ? content : "") + 1);
|
||||
line->content = malloc(strlen(content ? content : "") + 1);
|
||||
strcpy(line->content, content ? content : "");
|
||||
line->length = strlen(line->content);
|
||||
if (line->length && line->content[line->length - 1] == '\n') {
|
||||
@ -126,7 +138,6 @@ void ricli_add_line(ricli_t *r, char *type, char *content) {
|
||||
}
|
||||
if (line->length)
|
||||
ricli_add_autocomplete(r, line->content);
|
||||
strcpy(line->type, type ? type : "");
|
||||
line->index = r->line_count;
|
||||
r->lines = realloc(r->lines, sizeof(ricli_line_t *) * (r->line_count + 1));
|
||||
r->lines[r->line_count] = line;
|
||||
@ -167,6 +178,7 @@ void ricli_clear_input(ricli_t *cli) {
|
||||
line[sizeof(line) - 1] = 0;
|
||||
cursor_set(cli->term, 0, cli->term->cursor.y);
|
||||
}
|
||||
|
||||
void ricli_set_input(ricli_t *cli, const char *content) {
|
||||
if (cli->input != content) {
|
||||
memset(cli->input, 0, sizeof(cli->input));
|
||||
@ -177,22 +189,18 @@ void ricli_set_input(ricli_t *cli, const char *content) {
|
||||
rterm_print_status_bar(cli->term, 'c', cli->input);
|
||||
cursor_set(cli->term, cli->x, cli->term->size.ws_row);
|
||||
}
|
||||
|
||||
void ricli_put_input(ricli_t *cli, char c) {
|
||||
bool was_zero = cli->input[cli->x] == 0;
|
||||
if (was_zero) {
|
||||
|
||||
cli->input[cli->x] = c;
|
||||
cli->input[cli->x + 1] = 0;
|
||||
} else {
|
||||
char line_first[strlen(cli->input) + 5];
|
||||
|
||||
memset(line_first, 0, sizeof(line_first));
|
||||
line_first[0] = 0;
|
||||
strncpy(line_first, cli->input, cli->x);
|
||||
|
||||
char line_end[strlen(cli->input) + 2];
|
||||
memset(line_end, 0, sizeof(line_end));
|
||||
|
||||
char *input_ptr = cli->input;
|
||||
strcpy(line_end, input_ptr + cli->x);
|
||||
char new_char[] = {c, 0};
|
||||
@ -203,7 +211,6 @@ void ricli_put_input(ricli_t *cli, char c) {
|
||||
}
|
||||
cli->history_index = cli->line_count;
|
||||
rterm_print_status_bar(cli->term, 'c', cli->input);
|
||||
|
||||
if (cli->x >= strlen(cli->input))
|
||||
cli->x = strlen(cli->input) - 1;
|
||||
cli->x++;
|
||||
@ -214,7 +221,6 @@ void ricli_load(ricli_t *cli, char *path) {
|
||||
strcpy(cli->history_file, path);
|
||||
size_t size = rfile_size(path);
|
||||
if (size == 0) {
|
||||
|
||||
return;
|
||||
}
|
||||
char *data = malloc(size + 1);
|
||||
@ -231,6 +237,7 @@ void ricli_load(ricli_t *cli, char *path) {
|
||||
r4_free(r);
|
||||
free(data);
|
||||
}
|
||||
|
||||
void ricli_save(ricli_t *cli, char *path) {
|
||||
FILE *f = fopen(path, "w+");
|
||||
for (int i = 0; i < cli->line_count; i++) {
|
||||
@ -246,7 +253,7 @@ void ricli_save(ricli_t *cli, char *path) {
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
ricli_delete_input(ricli_t *cli, unsigned int index) {
|
||||
void ricli_delete_input(ricli_t *cli, unsigned int index) {
|
||||
if (cli->input[index + 1] == 0) {
|
||||
cli->input[index] = 0;
|
||||
} else {
|
||||
@ -280,13 +287,10 @@ void ricli_keypress(rterm_t *rt) {
|
||||
} else if (rt->key.escape && rt->key.c == 'A') {
|
||||
if (cli->history_index != 0)
|
||||
cli->history_index--;
|
||||
|
||||
strcpy(cli->input, cli->lines[cli->history_index]->content);
|
||||
cli->x = strlen(cli->input);
|
||||
ricli_set_input(cli, cli->lines[cli->history_index]->content);
|
||||
|
||||
} else if (rt->key.c == 127) {
|
||||
|
||||
if (cli->x > 0) {
|
||||
cli->x--;
|
||||
cli->input[cli->x] = 0;
|
||||
@ -295,17 +299,14 @@ void ricli_keypress(rterm_t *rt) {
|
||||
} else if (rt->key.escape && rt->key.c == 'B') {
|
||||
if (cli->history_index < cli->line_count - 1) {
|
||||
cli->history_index++;
|
||||
|
||||
strcpy(cli->input, cli->lines[cli->history_index]->content);
|
||||
cli->x = strlen(cli->input);
|
||||
ricli_set_input(cli, cli->lines[cli->history_index]->content);
|
||||
|
||||
} else {
|
||||
cli->x = 0;
|
||||
ricli_set_input(cli, "");
|
||||
cli->history_index = cli->line_count;
|
||||
}
|
||||
|
||||
} else if (rt->key.escape && rt->key.c == 'D') {
|
||||
cli->x = rt->cursor.x;
|
||||
cursor_set(rt, cli->x, rt->cursor.y);
|
||||
@ -322,13 +323,11 @@ void ricli_keypress(rterm_t *rt) {
|
||||
ricli_put_input(cli, rt->key.c);
|
||||
ricli_autocomplete_execute(cli);
|
||||
}
|
||||
// rterm_print_status_bar(rt, 0, 0);
|
||||
}
|
||||
|
||||
void ricli_loop(ricli_t *r) { rterm_loop(r->term); }
|
||||
|
||||
int main() {
|
||||
|
||||
ricli_t *cli = ricli_terminal_new();
|
||||
ricli_load(cli, "/tmp/.ricli.json");
|
||||
ricli_loop(cli);
|
||||
|
25
rinterp.c
25
rinterp.c
@ -1,4 +1,13 @@
|
||||
#include "rlexer.c";
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This code defines an abstract syntax tree (AST) for a scripting language, implements AST node creation, and attempts to parse tokens from
|
||||
// a lexer.
|
||||
|
||||
// No additional imports or includes are used outside of the provided rlexer.c file.
|
||||
|
||||
// MIT License
|
||||
|
||||
#include "rlexer.c"
|
||||
|
||||
typedef enum rip_ast_type_t { RIP_NONE = 0, RIP_BLOCK, RIP_CALL, RIP_LITERAL } rip_ast_type_t;
|
||||
|
||||
@ -10,7 +19,7 @@ typedef struct rip_ast_t {
|
||||
} rip_ast_t;
|
||||
|
||||
rip_ast_t *rip_ast_new() {
|
||||
rip_ast_t *ast = (rip_ast_t *)malloc(sizeof(rip_ast_t));
|
||||
rip_ast_t *ast = malloc(sizeof(rip_ast_t));
|
||||
ast->children = NULL;
|
||||
ast->next = NULL;
|
||||
ast->previous = NULL;
|
||||
@ -22,19 +31,21 @@ rip_ast_t *rip_parse() {
|
||||
rtoken_t token = rlex_next();
|
||||
if (token.type == RT_CURLY_BRACE_OPEN) {
|
||||
rip_ast_t *ast = rip_ast_new();
|
||||
while ()
|
||||
while (1) {
|
||||
rip_ast_t *statement = rip_parse();
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int main() {
|
||||
|
||||
char *script = "{print(\"test\")}";
|
||||
rlex(script);
|
||||
while (true) {
|
||||
while (1) {
|
||||
rtoken_t token = rlex_next();
|
||||
if (token.type = RT_CURLY_BRACE_OPEN) {
|
||||
rclos
|
||||
if (token.type == RT_CURLY_BRACE_OPEN) {
|
||||
// handle open
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
28
rio.c
28
rio.c
@ -1,9 +1,35 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This program uses a function, 'rforfile', to iterate over files in the '/tmp' directory and prints their names using the callback
|
||||
// function 'cb'.
|
||||
|
||||
// External import: "rio.h"
|
||||
|
||||
// MIT License
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
|
||||
#include "rio.h"
|
||||
|
||||
void cb(char *str) { printf("%s\n", str); }
|
||||
|
||||
int main() {
|
||||
rforfile("/tmp", cb);
|
||||
|
||||
return 0;
|
||||
}
|
18
rjson.c
18
rjson.c
@ -1,19 +1,33 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This program initializes a JSON structure using the functions provided by the "rjson" library, adds different types of values to it, and
|
||||
// then validates the JSON content. It concludes by freeing resources and ending the test.
|
||||
|
||||
// This source code uses the "rjson" library to handle the creation and manipulation of JSON data.
|
||||
|
||||
// MIT License
|
||||
|
||||
#include "rjson.h"
|
||||
|
||||
int main() {
|
||||
rtest_banner("rjson");
|
||||
|
||||
rjson_t *json = rjson();
|
||||
rjson_array_start(json);
|
||||
rjson_object_start(json);
|
||||
|
||||
rjson_kv_string(json, "string", "value");
|
||||
rjson_kv_number(json, "number", 1337421984);
|
||||
rjson_kv_duration(json, "duration", 1337421984);
|
||||
rjson_kv_int(json, "ulonglong", 1337420);
|
||||
rjson_kv_bool(json, "bool", true);
|
||||
|
||||
rjson_object_close(json);
|
||||
rjson_array_close(json);
|
||||
rassert(!strcmp(json->content, "[{\"string\":\"value\",\"number\":\"1.337.421.984\",\"duration\":\"1."
|
||||
"34s\",\"ulonglong\":1337420,\"bool\":true}]"));
|
||||
|
||||
rassert(!strcmp(json->content,
|
||||
"[{\"string\":\"value\",\"number\":\"1.337.421.984\",\"duration\":\"1.34s\",\"ulonglong\":1337420,\"bool\":true}]"));
|
||||
rjson_free(json);
|
||||
|
||||
return rtest_end("");
|
||||
}
|
11
rkeytable.c
11
rkeytable.c
@ -1,12 +1,21 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This code generates random keys and stores them in a key-value store, then asserts that the retrieved value matches the expected value
|
||||
// "tast".
|
||||
|
||||
// Includes: rkeytable.h, rtest.h, rstring.h
|
||||
|
||||
// MIT License
|
||||
|
||||
#include "rkeytable.h"
|
||||
#include "rtest.h"
|
||||
#include "rstring.h"
|
||||
|
||||
int main() {
|
||||
|
||||
for (int i = 0; i < 1000; i++) {
|
||||
char *key = rgenerate_key();
|
||||
rkset(key, "tast");
|
||||
rasserts(!strcmp(rkget(key), "tast"));
|
||||
}
|
||||
return 0;
|
||||
}
|
36
rlexer.c
36
rlexer.c
@ -1,3 +1,13 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This code is a test suite for a lexer and formatter, involving functions to safely parse and format strings as per the predefined rules
|
||||
// and tests for different token types. It checks numbers, symbols, strings, operators, punctuation, and code block delimiters among others,
|
||||
// alongside testing grouping and line numbers.
|
||||
|
||||
// External imports that are not included in the core language involve "rlexer.h", "rio.h", and "rtest.h".
|
||||
|
||||
// MIT License
|
||||
|
||||
#include "rlexer.h"
|
||||
#include "rio.h"
|
||||
#include "rtest.h"
|
||||
@ -19,14 +29,17 @@ void test_lexer() {
|
||||
"--++-+/*<>!@#$%^&*(){}?[]"
|
||||
"\n"
|
||||
"()");
|
||||
|
||||
rtest_banner("Number");
|
||||
rtoken_t token = rlex_next();
|
||||
rtest_assert(token.type == RT_NUMBER);
|
||||
rtest_assert(!strcmp(token.value, "123"));
|
||||
|
||||
rtest_banner("Negative number");
|
||||
token = rlex_next();
|
||||
rtest_assert(token.type == RT_NUMBER);
|
||||
rtest_assert(!strcmp(token.value, "-123"));
|
||||
|
||||
rtest_banner("Decimal Number");
|
||||
token = rlex_next();
|
||||
rtest_assert(token.type == RT_NUMBER);
|
||||
@ -37,10 +50,12 @@ void test_lexer() {
|
||||
token = rlex_next();
|
||||
rtest_assert(token.type == RT_NUMBER);
|
||||
rtest_assert(!strcmp(token.value, "123.33"));
|
||||
|
||||
rtest_banner("Decimal Negative number");
|
||||
token = rlex_next();
|
||||
rtest_assert(token.type == RT_NUMBER);
|
||||
rtest_assert(!strcmp(token.value, "-123.33"));
|
||||
|
||||
rtest_banner("Symbol");
|
||||
token = rlex_next();
|
||||
rtest_assert(token.type == RT_SYMBOL);
|
||||
@ -49,14 +64,12 @@ void test_lexer() {
|
||||
rtest_assert(token.type == RT_SYMBOL);
|
||||
rtest_assert(!strcmp(token.value, "_abc"));
|
||||
token = rlex_next();
|
||||
|
||||
rtest_assert(token.type == RT_SYMBOL);
|
||||
rtest_assert(!strcmp(token.value, "abc_"));
|
||||
|
||||
token = rlex_next();
|
||||
|
||||
rtest_assert(token.type == RT_SYMBOL);
|
||||
rtest_assert(!strcmp(token.value, "a_a"));
|
||||
|
||||
rtest_banner("String");
|
||||
token = rlex_next();
|
||||
rtest_assert(token.type == RT_STRING);
|
||||
@ -70,11 +83,11 @@ void test_lexer() {
|
||||
|
||||
rtest_banner("Operator");
|
||||
token = rlex_next();
|
||||
|
||||
rtest_assert(token.type == RT_OPERATOR);
|
||||
rtest_assert(!strcmp(token.value, "--++-+/*<>"));
|
||||
|
||||
rtest_banner("Punct") token = rlex_next();
|
||||
rtest_banner("Punct");
|
||||
token = rlex_next();
|
||||
rtest_assert(token.type == RT_PUNCT);
|
||||
rtest_assert(!strcmp(token.value, "!@#$%^"));
|
||||
token = rlex_next();
|
||||
@ -85,27 +98,21 @@ void test_lexer() {
|
||||
token = rlex_next();
|
||||
rtest_assert(token.type == RT_BRACE_OPEN);
|
||||
rassert(!strcmp(token.value, "("));
|
||||
|
||||
token = rlex_next();
|
||||
rtest_assert(token.type == RT_BRACE_CLOSE);
|
||||
rassert(!strcmp(token.value, ")"));
|
||||
|
||||
token = rlex_next();
|
||||
rtest_assert(token.type == RT_CURLY_BRACE_OPEN);
|
||||
rassert(!strcmp(token.value, "{"));
|
||||
|
||||
token = rlex_next();
|
||||
rtest_assert(token.type == RT_CURLY_BRACE_CLOSE);
|
||||
rassert(!strcmp(token.value, "}"));
|
||||
|
||||
token = rlex_next();
|
||||
rtest_assert(token.type == RT_PUNCT);
|
||||
rassert(!strcmp(token.value, "?"));
|
||||
|
||||
token = rlex_next();
|
||||
rtest_assert(token.type == RT_BRACKET_OPEN);
|
||||
rassert(!strcmp(token.value, "["));
|
||||
|
||||
token = rlex_next();
|
||||
rtest_assert(token.type == RT_BRACKET_CLOSE);
|
||||
rassert(!strcmp(token.value, "]"));
|
||||
@ -143,25 +150,20 @@ void test_formatter() {
|
||||
free(formatted);
|
||||
formatted = rlex_format("\"123\",66,true,(1,2,3)");
|
||||
char *expected_comma = "\"123\", 66, true, (1, 2, 3)";
|
||||
|
||||
rtest_assert(!strcmp(formatted, expected_comma));
|
||||
free(formatted);
|
||||
|
||||
formatted = rlex_format("lala lolo");
|
||||
char *expected_new_lines1 = "lala\nlolo";
|
||||
rtest_assert(!strcmp(formatted, expected_new_lines1));
|
||||
free(formatted);
|
||||
|
||||
formatted = rlex_format("lala=lolo");
|
||||
char *expected_new_lines2 = "lala = lolo";
|
||||
rtest_assert(!strcmp(formatted, expected_new_lines2));
|
||||
free(formatted);
|
||||
|
||||
formatted = rlex_format("lala+lolo=(1,2,3)");
|
||||
char *expected_new_lines3 = "lala + lolo = (1, 2, 3)";
|
||||
rtest_assert(!strcmp(formatted, expected_new_lines3));
|
||||
free(formatted);
|
||||
|
||||
formatted = rlex_format("lala+lolo=(1,2,3) little.test=(4,5,6)");
|
||||
char *expected_new_lines4 = "lala + lolo = (1, 2, 3)\nlittle.test = (4, 5, 6)";
|
||||
rtest_assert(!strcmp(formatted, expected_new_lines4));
|
||||
@ -179,9 +181,7 @@ int main(int argc, char *argv[]) {
|
||||
}
|
||||
unsigned int length = rfile_size(argv[1]);
|
||||
char content[length + 1];
|
||||
|
||||
length = rfile_readb(argv[1], content, length);
|
||||
|
||||
content[length] = 0;
|
||||
char *formatted = rlex_format(content);
|
||||
printf("%s", formatted);
|
||||
|
9
rlib.c
9
rlib.c
@ -1,3 +1,12 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This code serves as the main entry point for a program using the `rlib` library. It takes command-line arguments and passes them to the
|
||||
// `rlib_main` function, initiating the program’s execution with these parameters.
|
||||
|
||||
// Summary of used imports: Includes "rlib.h" which provides functionalities from the rlib library.
|
||||
|
||||
// MIT License
|
||||
|
||||
#include "rlib.h"
|
||||
|
||||
int main(int argc, char **argv) { return rlib_main(argc, argv); }
|
3
rlib.h
3
rlib.h
@ -1,4 +1,4 @@
|
||||
// RETOOR - Dec 5 2024
|
||||
// RETOOR - Mar 16 2025
|
||||
// MIT License
|
||||
// ===========
|
||||
|
||||
@ -65,6 +65,7 @@ typedef unsigned char byte;
|
||||
|
||||
#ifndef NSOCK_H
|
||||
#define NSOCK_H
|
||||
#include <unistd.h>
|
||||
#ifndef RMALLOC_H
|
||||
#define RMALLOC_H
|
||||
#ifndef RMALLOC_OVERRIDE
|
||||
|
@ -1,4 +1,4 @@
|
||||
// RETOOR - Dec 5 2024
|
||||
// RETOOR - Mar 16 2025
|
||||
// MIT License
|
||||
// ===========
|
||||
|
||||
@ -65,6 +65,7 @@ typedef unsigned char byte;
|
||||
|
||||
#ifndef NSOCK_H
|
||||
#define NSOCK_H
|
||||
#include <unistd.h>
|
||||
#ifndef RMALLOC_H
|
||||
#define RMALLOC_H
|
||||
#ifndef RMALLOC_OVERRIDE
|
||||
|
16
rlibso.c
16
rlibso.c
@ -1,3 +1,11 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This source code demonstrates memory allocation, deallocation, and formatted output using custom functions.
|
||||
|
||||
// Custom functions/modules from external sources are not used in this example.
|
||||
|
||||
// MIT License
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
@ -8,11 +16,15 @@ int rtest_end(char *);
|
||||
void rprintgf(FILE *f, char *format, ...);
|
||||
|
||||
int main() {
|
||||
for (int i = 0; i < 100; i++) {
|
||||
for (int i = 0; i < 100; ++i) {
|
||||
void *data = rmalloc(5000);
|
||||
if (data == NULL) {
|
||||
fprintf(stderr, "Memory allocation failed\n");
|
||||
return 1;
|
||||
}
|
||||
memset(data, 0, 5000);
|
||||
rfree(data);
|
||||
}
|
||||
rprintgf(stdout, "Hello from .so library!");
|
||||
rprintgf(stdout, "Hello from .so library!\n");
|
||||
return rtest_end("");
|
||||
}
|
52
rliza.c
52
rliza.c
@ -1,13 +1,25 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This C code performs JSON processing and validation using the rliza library, conducting performance tests, serialization, and
|
||||
// deserialization of JSON data, and manually building JSON objects for testing purposes. It also ensures that data read operations are
|
||||
// correctly performed from an external JSON file.
|
||||
|
||||
// Imported libraries used in this code are rtest.h, rliza.h, rio.h, and rbench.h for testing, JSON handling, file operations, and
|
||||
// benchmarking respectively.
|
||||
|
||||
// MIT License
|
||||
|
||||
#define RMALLOC_OVERRIDE 1
|
||||
#include "rtest.h"
|
||||
#include "rliza.h"
|
||||
#include "rio.h"
|
||||
#include "rbench.h"
|
||||
|
||||
void performance_test() {
|
||||
size_t size = rfile_size("resources/large.json");
|
||||
char *data = malloc(size + 1);
|
||||
rfile_readb("resources/large.json", data, size);
|
||||
data[size] = 0;
|
||||
data[size] = '\0';
|
||||
RBENCH(1, {
|
||||
int length = rliza_validate(data);
|
||||
(void)length;
|
||||
@ -29,24 +41,8 @@ int main() {
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\"}}\", null, \"AIOHTTP_SESSION_5a2510809b85492b8f14e8d3e2f11da3\"]}";
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\"}}\", null, "
|
||||
"\"AIOHTTP_SESSION_5a2510809b85492b8f14e8d3e2f11da3\"]}";
|
||||
rassert(rliza_validate(long_data));
|
||||
rliza_t *a = rliza_loads(&long_data);
|
||||
rliza_free(a);
|
||||
@ -55,7 +51,6 @@ int main() {
|
||||
rliza_t *a = rliza_loads(&nested_obj);
|
||||
char *b = rliza_dumps(a);
|
||||
printf("%s\n", b);
|
||||
// rliza_dumpss(a);
|
||||
rliza_free(a);
|
||||
free(b);
|
||||
|
||||
@ -103,7 +98,6 @@ int main() {
|
||||
|
||||
rliza_free(to_object);
|
||||
|
||||
// rliza_free(to_object);
|
||||
rtest_banner("manually building new object");
|
||||
rliza_t *rliza = rliza_new(RLIZA_OBJECT);
|
||||
rliza_set_integer(rliza, "a", 1);
|
||||
@ -113,35 +107,31 @@ int main() {
|
||||
rliza_set_integer(rliza, "e", 5);
|
||||
rliza_set_integer(rliza, "f", 6);
|
||||
rliza_set_string(rliza, "str1", "str1value");
|
||||
|
||||
rliza_set_null(rliza, "q");
|
||||
|
||||
char *original_content = rliza_dumps(rliza);
|
||||
printf("1:%s\n", original_content);
|
||||
char *content = original_content;
|
||||
|
||||
printf("2:%s %d\n", content, content[strlen((char *)content)] == 0);
|
||||
printf("2:%s %d\n", content, content[strlen(content)] == '\0');
|
||||
|
||||
rliza_t *rliza2 = rliza_loads(&content);
|
||||
|
||||
printf("HAAAh\n");
|
||||
char *content2 = rliza_dumps(rliza2);
|
||||
printf("HAAAh\n");
|
||||
content = original_content;
|
||||
rassert(!(strcmp((char *)content,
|
||||
(char *)content2))); // strcmp(content,content2);
|
||||
rassert(!(strcmp(content, content2)));
|
||||
char *content2p = original_content;
|
||||
content = original_content;
|
||||
rliza_t *rliza3 = rliza_loads((char **)&content2p);
|
||||
char *content3 = rliza_dumps(rliza2);
|
||||
|
||||
rtest_banner("compare several serilizations. Should be equal.\n");
|
||||
rtest_banner("compare several serializations. Should be equal.\n");
|
||||
content = original_content;
|
||||
printf("content1:<%s>\n", content);
|
||||
printf("content2:<%s>\n", content2);
|
||||
printf("content3:<%s>\n", content3);
|
||||
rassert(!strncmp(content2, content3, strlen((char *)content2)));
|
||||
rassert(!strncmp(content, content2, strlen((char *)content)));
|
||||
rassert(!strncmp(content2, content3, strlen(content2)));
|
||||
rassert(!strncmp(content, content2, strlen(content)));
|
||||
rliza_free(rliza2);
|
||||
rliza_free(rliza3);
|
||||
free(original_content);
|
||||
@ -153,4 +143,4 @@ int main() {
|
||||
rliza_free(rliza);
|
||||
|
||||
return rtest_end("");
|
||||
}
|
||||
}
|
48
rmalloc.c
48
rmalloc.c
@ -1,5 +1,33 @@
|
||||
#include "rtest.h"
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This source code demonstrates a test suite for memory allocation using custom `malloc`, `realloc`, and `calloc` in the `rtest` framework.
|
||||
// It performs a series of memory allocation and deallocation operations, checking the count of allocations and deallocations to ensure
|
||||
// proper memory management and detect any leaks or errors.
|
||||
|
||||
// Dependencies:
|
||||
// This code relies on the custom libraries `rtest` and `rmalloc` specific to this testing framework.
|
||||
|
||||
// MIT License
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
|
||||
#include "rtest.h"
|
||||
#include "rmalloc.h"
|
||||
|
||||
void rtest_malloc() {
|
||||
@ -12,27 +40,33 @@ void rtest_malloc() {
|
||||
void *w = calloc(1, 10);
|
||||
rtest_true(rmalloc_alloc_count == 5);
|
||||
|
||||
rtest_banner("free") x = free(x);
|
||||
rtest_banner("free");
|
||||
x = free(x);
|
||||
rtest_true(x == NULL);
|
||||
rtest_true(rmalloc_count == 4);
|
||||
|
||||
rtest_banner("another free") y = free(y);
|
||||
rtest_banner("another free");
|
||||
y = free(y);
|
||||
rtest_true(y == NULL);
|
||||
rtest_true(rmalloc_count == 3);
|
||||
|
||||
rtest_banner("third free") z = free(z);
|
||||
rtest_banner("third free");
|
||||
z = free(z);
|
||||
rtest_true(z == NULL);
|
||||
rtest_true(rmalloc_count == 2);
|
||||
|
||||
rtest_banner("third four") w = free(w);
|
||||
rtest_banner("third four");
|
||||
w = free(w);
|
||||
rtest_true(w == NULL);
|
||||
rtest_true(rmalloc_count == 1);
|
||||
|
||||
rtest_banner("third five") ptr = free(ptr);
|
||||
rtest_banner("third five");
|
||||
ptr = free(ptr);
|
||||
rtest_true(ptr == NULL);
|
||||
rtest_true(rmalloc_count == 0);
|
||||
|
||||
rtest_banner("totals") rtest_true(rmalloc_alloc_count == 5);
|
||||
rtest_banner("totals");
|
||||
rtest_true(rmalloc_alloc_count == 5);
|
||||
rtest_true(rmalloc_free_count == 5);
|
||||
rtest_true(rmalloc_count == 0);
|
||||
}
|
||||
|
29
rmerge.c
29
rmerge.c
@ -1,3 +1,30 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This code is the entry point for a program that utilizes the `rmerge` library. It passes command line arguments to `rmerge_main` for
|
||||
// further processing.
|
||||
|
||||
// External library included: "rmerge.h"
|
||||
|
||||
// MIT License
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
|
||||
#include "rmerge.h"
|
||||
|
||||
int main(int argc, char *argv[]) { return rmerge_main(argc, argv); }
|
||||
int main(int argc, char *argv[]) { return rmerge_main(argc, argv); }
|
28
rnet.c
28
rnet.c
@ -1,36 +1,53 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This source code sets up a simple server using the rnet library to handle client connections. The server waits for client connections,
|
||||
// reads data, and responds with simple HTTP headers. It closes the connection if a "GET" request is received.
|
||||
|
||||
// The non-standard import in this code is "rnet.h".
|
||||
|
||||
// MIT License
|
||||
|
||||
#include "rnet.h"
|
||||
|
||||
void on_client_connect(rnet_socket_t *sock) { printf("%s connected\n", sock->name); }
|
||||
|
||||
void on_client_read(rnet_socket_t *sock) {
|
||||
unsigned char *data = net_socket_read(sock, 4096);
|
||||
if (!data)
|
||||
return;
|
||||
char *http_headers = "HTTP/1.1 200 OK\r\nContent-Length: 10\r\nConnection: close\r\n\r\n";
|
||||
|
||||
const char *http_headers = "HTTP/1.1 200 OK\r\nContent-Length: 10\r\nConnection: close\r\n\r\n";
|
||||
net_socket_write(sock, (unsigned char *)http_headers, strlen(http_headers));
|
||||
|
||||
rnet_safe_str((char *)data, sock->bytes_received);
|
||||
// data[11] = 0;
|
||||
printf("%s: %.30s\n", sock->name, data);
|
||||
|
||||
net_socket_write(sock, data, strlen((char *)data));
|
||||
if (!strncmp((char *)data, "GET ", 4))
|
||||
if (!strncmp((char *)data, "GET ", 4)) {
|
||||
net_socket_close(sock);
|
||||
}
|
||||
}
|
||||
|
||||
void on_client_close(rnet_socket_t *sock) { printf("%s disconnected\n", sock->name); }
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
if (argc < 2) {
|
||||
printf("usage: [port].\n");
|
||||
printf("Usage: [port].\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (int i = 0; i < argc; i++) {
|
||||
if (strcmp(argv[i], "test") == 0) {
|
||||
printf("Skipping rnet tests.\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
rnet_server_t *server = net_socket_serve((unsigned int)atoi(argv[1]), 10);
|
||||
server->on_connect = on_client_connect;
|
||||
server->on_read = on_client_read;
|
||||
server->on_close = on_client_close;
|
||||
|
||||
while (true) {
|
||||
if (net_socket_select(server)) {
|
||||
printf("Handled all events.\n");
|
||||
@ -38,5 +55,6 @@ int main(int argc, char *argv[]) {
|
||||
printf("No events to handle.\n");
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
27
rprint.c
27
rprint.c
@ -1,21 +1,35 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This program benchmarks different methods for outputting or printing text in C, using a custom benchmarking utility defined in rbench.h.
|
||||
|
||||
// The code uses rbench.h and rprint.h for benchmarking and custom printing functions beyond standard C functions.
|
||||
|
||||
// MIT License
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions
|
||||
// of the Software.
|
||||
|
||||
#include "rprint.h"
|
||||
#include "rbench.h"
|
||||
|
||||
void test_putc(void *arg) {
|
||||
char *str = (char *)arg;
|
||||
char c;
|
||||
while ((c = *str++)) {
|
||||
while (*str) {
|
||||
putc('\r', stdout);
|
||||
str++;
|
||||
}
|
||||
}
|
||||
|
||||
void test_putchar(void *arg) {
|
||||
char *str = (char *)arg;
|
||||
char c;
|
||||
while ((c = *str++)) {
|
||||
while (*str) {
|
||||
putchar('\r');
|
||||
str++;
|
||||
}
|
||||
}
|
||||
|
||||
void test_fwrite(void *arg) {
|
||||
int length;
|
||||
if (rbf->first) {
|
||||
@ -26,8 +40,11 @@ void test_fwrite(void *arg) {
|
||||
}
|
||||
fwrite((char *)arg, 1, length, stdout);
|
||||
}
|
||||
|
||||
void test_printf(void *arg) { printf("%s", (char *)arg); }
|
||||
|
||||
void test_rprint(void *arg) { rprint("%s", (char *)arg); }
|
||||
|
||||
void test_rprintr(void *arg) { rprintr("%s", (char *)arg); }
|
||||
|
||||
int main() {
|
||||
@ -44,4 +61,4 @@ int main() {
|
||||
r->execute1(r, times, " \r");
|
||||
r->execute1(r, times, "\\c\\T\\l\\L \r");
|
||||
return rtest_end("");
|
||||
}
|
||||
}
|
11
rrex3.c
11
rrex3.c
@ -1,3 +1,11 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This program tests the `rrex3` regular expression parser using the `rrex3_test` function and prints a message indicating the testing
|
||||
// phase.
|
||||
|
||||
// Includes rrex3.h and rtest.h for the regular expression parser and the testing functionalities.
|
||||
|
||||
// MIT License
|
||||
|
||||
#include "rrex3.h"
|
||||
#include "rtest.h"
|
||||
@ -6,5 +14,4 @@ int main() {
|
||||
printf("Testing rrex3 regular expression parser.");
|
||||
rrex3_test();
|
||||
return 0;
|
||||
// return rtest_end("");
|
||||
}
|
||||
}
|
37
rrex4.c
37
rrex4.c
@ -1,3 +1,13 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This source code provides benchmarking functions to compare performance between custom regex engine 'r4' and the C standard library
|
||||
// regex, and includes tests and statistics collection for regex matches.
|
||||
|
||||
// Used external imports: "rrex4.h", "rtest.h", "rbench.h". They provide custom regex and benchmarking functionality beyond the standard
|
||||
// 'regex.h'.
|
||||
|
||||
// MIT License
|
||||
|
||||
#include "rrex4.h"
|
||||
#include "rtest.h"
|
||||
#include "rbench.h"
|
||||
@ -6,13 +16,10 @@
|
||||
bool bench_r4(unsigned int times, char *str, char *expr) {
|
||||
RBENCH(times, {
|
||||
r4_t *r = r4(str, expr);
|
||||
|
||||
if (r->valid == false) {
|
||||
|
||||
if (!r->valid) {
|
||||
printf("Bench r4 error\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
r4_free(r);
|
||||
});
|
||||
return true;
|
||||
@ -30,7 +37,6 @@ void bench_c(unsigned int times, char *str, char *expr) {
|
||||
exit(1);
|
||||
}
|
||||
});
|
||||
|
||||
regfree(®ex);
|
||||
}
|
||||
|
||||
@ -51,26 +57,21 @@ void test_r4_next() {
|
||||
assert(r->valid);
|
||||
assert(r->match_count == 1);
|
||||
assert(!strcmp(r->matches[0], "abcd"));
|
||||
// Again with same regex as parameter
|
||||
r = r4_next(r, reg);
|
||||
assert(r->valid);
|
||||
assert(r->match_count == 1);
|
||||
assert(!strcmp(r->matches[0], "efgh"));
|
||||
// Again with same regex as parameter
|
||||
r = r4_next(r, reg);
|
||||
assert(r->valid);
|
||||
assert(r->match_count == 1);
|
||||
assert(!strcmp(r->matches[0], "ijkl"));
|
||||
// Reuse expression, NULL parameter
|
||||
r = r4_next(r, NULL);
|
||||
assert(r->valid);
|
||||
assert(r->match_count == 1);
|
||||
assert(!strcmp(r->matches[0], "mnop"));
|
||||
// No results using r4_next
|
||||
r = r4_next(r, NULL);
|
||||
assert(r->valid);
|
||||
assert(r->match_count == 0);
|
||||
// Again no results using r4_next, Shouldn't crash
|
||||
r = r4_next(r, NULL);
|
||||
assert(r->valid);
|
||||
assert(r->match_count == 0);
|
||||
@ -78,9 +79,7 @@ void test_r4_next() {
|
||||
}
|
||||
|
||||
void bench_all(unsigned int times) {
|
||||
assert(bench(times, "suvw",
|
||||
"[abcdefghijklmnopqrstuvw][abcdefghijklmnopqrstuvw]["
|
||||
"abcdefghijklmnopqrstuvw][abcdefghijklmnopqrstuvw]"));
|
||||
assert(bench(times, "suvw", "[abcdefghijklmnopqrstuvw][abcdefghijklmnopqrstuvw][abcdefghijklmnopqrstuvw][abcdefghijklmnopqrstuvw]"));
|
||||
assert(bench(times, "ponyyy", "^p+o.*yyy$$$$"));
|
||||
assert(bench(times, " ponyyzd", "p+o.*yyzd$$$$"));
|
||||
assert(bench(times, "abc", "def|gek|abc"));
|
||||
@ -100,12 +99,9 @@ bool r4_match_stats(char *str, char *expr) {
|
||||
}
|
||||
|
||||
int main() {
|
||||
|
||||
assert(r4_match_stats("NL18RABO0322309700", "(\\w{2})(\\d{2})(\\w{4}\\d)(\\d{10})"));
|
||||
|
||||
unsigned int times = 1000;
|
||||
bench_all(times);
|
||||
|
||||
RBENCH(1, {
|
||||
assert(r4_match_stats("#define DEFINETEST 1\n", "#define\\s+(\\w[\\d\\w_]+)\\s+([\\w\\d_]+)"));
|
||||
assert(r4_match_stats("#define DEFINETEST 1\n", "#define\\s+(\\w[\\d\\w_]+)\\s+([\\w\\d_]+)"));
|
||||
@ -118,7 +114,6 @@ int main() {
|
||||
assert(r4_match_stats("1234567", "12(.*)67$"));
|
||||
assert(r4_match_stats("12111678993", "12(.*)67(.*)3$"));
|
||||
assert(r4_match_stats("NL17RABO0322309700", "NL(.*)R(.*)0(.*)0(.*)0$"));
|
||||
|
||||
assert(r4_match_stats("NL18RABO0322309700", "(\\w{2})(\\d{2})(\\w{4}\\d)(\\d+)$"));
|
||||
assert(r4_match_stats("NL18RABO0322309700garbage", "(\\w{2})(\\d{2})(\\w{4}\\d)(\\d+)"));
|
||||
assert(r4_match_stats("NL18RABO0322309700", "(\\w{2})(\\d{2})(\\w{4}\\d)(\\d+)$"));
|
||||
@ -146,13 +141,11 @@ int main() {
|
||||
assert(r4_match_stats("abc", "def|gek|abc"));
|
||||
assert(!r4_match_stats("abc", "def|gek|abd"));
|
||||
assert(r4_match_stats("abc", "def|abc|def"));
|
||||
assert(r4_match_stats("suwv", "[abcdesfghijklmnopqrtuvw][abcdefghijklmnopqrstuvw]["
|
||||
"abcdefghijklmnopqrstuvw][abcdefghijklmnopqrstuvw]"));
|
||||
assert(
|
||||
r4_match_stats("suwv", "[abcdesfghijklmnopqrtuvw][abcdefghijklmnopqrstuvw][abcdefghijklmnopqrstuvw][abcdefghijklmnopqrstuvw]"));
|
||||
test_r4_next();
|
||||
r4_enable_debug();
|
||||
|
||||
assert(r4_match_stats("123", "(.*)(.*)(.*)"));
|
||||
});
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
27
rstring.c
27
rstring.c
@ -1,3 +1,12 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This source code contains a suite of tests for string manipulation functions such as removing whitespace, tokenizing lines, sorting
|
||||
// strings, formatting numbers, and more. It ensures these functions behave as expected with various input cases.
|
||||
|
||||
// It includes the "rstring.h" and "rtest.h" libraries, which are assumed to provide functionality for string manipulation and a testing
|
||||
// framework, respectively.
|
||||
|
||||
// MIT License
|
||||
|
||||
#include "rstring.h"
|
||||
#include "rtest.h"
|
||||
@ -19,7 +28,6 @@ void rstring_test_whitespace() {
|
||||
|
||||
rtest_banner("rstrip_whitespace");
|
||||
char output[1024];
|
||||
// Test 1
|
||||
char *string1 = " Test 1";
|
||||
rstrip_whitespace(string1, output);
|
||||
rassert(strlen(output) == 6);
|
||||
@ -42,11 +50,9 @@ void rstring_test_rstrtokline() {
|
||||
char lines[1024] = "Line 1\nLine 2\nLine 3\nLine 4\n333.29\n3.2221";
|
||||
char line[1024];
|
||||
size_t offset = 0;
|
||||
// Test 1
|
||||
while ((offset = rstrtokline(lines, line, offset, true)) && *line) {
|
||||
rassert(strlen(line) == 6);
|
||||
}
|
||||
// Test 2
|
||||
offset = 0;
|
||||
int count = 0;
|
||||
while ((offset = rstrtokline(lines, line, offset, false)) && *line) {
|
||||
@ -54,7 +60,6 @@ void rstring_test_rstrtokline() {
|
||||
count++;
|
||||
rassert(strlen(line) == expected_length);
|
||||
}
|
||||
// Test 3
|
||||
offset = 0;
|
||||
strcat(lines, "\n");
|
||||
count = 0;
|
||||
@ -99,7 +104,7 @@ void rstring_test_rstraddslashes() {
|
||||
char input[] = "\r\t\n\b\f test";
|
||||
char output[100];
|
||||
rstraddslashes(input, output);
|
||||
rassert(!strcmp((char *)output, "\\r\\t\\n\\b\\f test"));
|
||||
rassert(!strcmp(output, "\\r\\t\\n\\b\\f test"));
|
||||
}
|
||||
|
||||
void rstring_test_rstrstripslashes() {
|
||||
@ -107,7 +112,7 @@ void rstring_test_rstrstripslashes() {
|
||||
char input[] = "\\r\\t\\n\\b\\f\" test";
|
||||
char output[100];
|
||||
rstrstripslashes(input, output);
|
||||
rassert(!strcmp((char *)output, "\r\t\n\b\f\" test"));
|
||||
rassert(!strcmp(output, "\r\t\n\b\f\" test"));
|
||||
}
|
||||
|
||||
void rstring_test_rstrstartswith() {
|
||||
@ -135,30 +140,26 @@ void rstring_test_rstrendswith() {
|
||||
|
||||
void rstring_test_rstrmove() {
|
||||
rtest_banner("Move str");
|
||||
// Test 1
|
||||
char to_move_1[] = "abc?";
|
||||
rstrmove(to_move_1, 3, 1, 0);
|
||||
rassert(!strcmp(to_move_1, "?abc"));
|
||||
// Test 2
|
||||
|
||||
char to_move_2[] = "abc?defgabc";
|
||||
rstrmove(to_move_2, 3, 5, 0);
|
||||
rassert(!strcmp(to_move_2, "?defgabcabc"));
|
||||
// Test 3
|
||||
|
||||
char to_move_3[] = "abc?defg";
|
||||
rstrmove(to_move_3, 0, 3, 7);
|
||||
rassert(!strcmp(to_move_3, "?defgabc"));
|
||||
|
||||
// Test 4
|
||||
char to_move_4[] = "abc?defgaa";
|
||||
rstrmove2(to_move_4, 3, 5, 0);
|
||||
rassert(!strcmp(to_move_4, "?defgabcaa"));
|
||||
|
||||
// Test 5
|
||||
char to_move_5[] = "?defgabcaa";
|
||||
rstrmove2(to_move_5, 0, 5, 3);
|
||||
rassert(!strcmp(to_move_5, "abc?defgaa"));
|
||||
|
||||
// Test 6
|
||||
char to_move_6[] = "?defgabcaa";
|
||||
rstrmove2(to_move_6, 0, 5, 6);
|
||||
rassert(!strcmp(to_move_6, "abcaa?defg"));
|
||||
@ -176,4 +177,4 @@ int main() {
|
||||
rstring_test_rstrendswith();
|
||||
rstring_test_rstrmove();
|
||||
return rtest_end("");
|
||||
}
|
||||
}
|
@ -1,3 +1,12 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This source code is a simple testing routine for a string list implementation, verifying the addition, containment, and proper memory
|
||||
// management functionality.
|
||||
|
||||
// The code uses custom imports: "rstring_list.h" and "rtest.h" for managing the string list and handling test scenarios respectively.
|
||||
|
||||
// MIT License: This code is free to use and distribute with attribution to the original author. No warranty is provided express or implied.
|
||||
|
||||
#include "rstring_list.h"
|
||||
#include "rtest.h"
|
||||
|
||||
@ -5,18 +14,18 @@ void test_rstring_list() {
|
||||
rtest_banner("new");
|
||||
rstring_list_t *rsl = rstring_list_new();
|
||||
rassert(rsl->count == 0);
|
||||
rassert(rsl->count == 0);
|
||||
|
||||
rtest_banner("add");
|
||||
rstring_list_add(rsl, "test1");
|
||||
rassert(rsl->count == 1);
|
||||
rassert(rsl->count == 1);
|
||||
rstring_list_add(rsl, "test2");
|
||||
rassert(rsl->count == 2);
|
||||
rassert(rsl->count == 2);
|
||||
|
||||
rtest_banner("contains");
|
||||
rassert(rstring_list_contains(rsl, "test1"));
|
||||
rassert(rstring_list_contains(rsl, "test2"));
|
||||
rassert(!rstring_list_contains(rsl, "test3"));
|
||||
|
||||
rtest_banner("free");
|
||||
rstring_list_free(rsl);
|
||||
}
|
||||
@ -24,4 +33,4 @@ void test_rstring_list() {
|
||||
int main() {
|
||||
test_rstring_list();
|
||||
return rtest_end("");
|
||||
}
|
||||
}
|
45
rterm.c
45
rterm.c
@ -1,21 +1,40 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This program interfaces with the 'rterm' library to handle terminal behaviors such as cursor movement, key presses, and updates with a
|
||||
// periodic tick function.
|
||||
|
||||
// The code utilizes the 'rterm' library through the import "rterm.h" for managing terminal state and user interactions.
|
||||
|
||||
// MIT License
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
|
||||
#include "rterm.h"
|
||||
|
||||
void before_cursor_move(rterm_t *rterm) {
|
||||
// printf("Before cursor update: %d:%d\n",rterm->cursor.x,rterm->cursor.y);
|
||||
}
|
||||
void after_cursor_move(rterm_t *rterm) {
|
||||
void before_cursor_move(rterm_t *rterm) {}
|
||||
|
||||
// rterm->cursor.x++;
|
||||
}
|
||||
void before_key_press(rterm_t *rterm) {
|
||||
void after_cursor_move(rterm_t *rterm) {}
|
||||
|
||||
void before_key_press(rterm_t *rterm) {}
|
||||
|
||||
// if(rterm->key.c == 65 && rterm->key.escape){
|
||||
// rterm->key.c = 66;
|
||||
//}
|
||||
}
|
||||
void tick(rterm_t *rt) {
|
||||
static char status_text[1024];
|
||||
status_text[0] = 0;
|
||||
static char status_text[1024] = {0};
|
||||
sprintf(status_text, "\rp:%d:%d | k:%c:%d | i:%ld ", rt->cursor.x + 1, rt->cursor.y + 1, rt->key.c == 0 ? '0' : rt->key.c, rt->key.c,
|
||||
rt->iterations);
|
||||
rt->status_text = status_text;
|
||||
|
23
rterminal.c
23
rterminal.c
@ -1,3 +1,26 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This program executes a progress bar test using functions from external libraries.
|
||||
|
||||
// Includes external libraries "rterminal.h" and "rtest.h"
|
||||
|
||||
// MIT License
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
|
||||
#include "rterminal.h"
|
||||
#include "rtest.h"
|
||||
|
||||
|
29
rtime.c
29
rtime.c
@ -1,3 +1,12 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This program tests the functionality of converting milliseconds into a readable format using assertions to verify correct output, using
|
||||
// an assumed custom testing and time conversion library.
|
||||
|
||||
// The source code uses the custom includes "rtime.h" for time conversion and "rtest.h" for testing framework functionalities.
|
||||
|
||||
// MIT License
|
||||
|
||||
#include "rtime.h"
|
||||
#include "rtest.h"
|
||||
#include <string.h>
|
||||
@ -5,15 +14,15 @@
|
||||
int main() {
|
||||
rtest_banner("time");
|
||||
rtest_banner("Milliseconds tests");
|
||||
rtest_assert(!strcmp(msecs_str(0), "0Ms"));
|
||||
rtest_assert(!strcmp(msecs_str(1), "1Ms"));
|
||||
rtest_assert(!strcmp(msecs_str(12), "12Ms"));
|
||||
rtest_assert(!strcmp(msecs_str(123), "123Ms"));
|
||||
rtest_assert(!strcmp(msecs_str(999), "999Ms"));
|
||||
rtest_assert(strcmp(msecs_str(0), "0Ms") == 0);
|
||||
rtest_assert(strcmp(msecs_str(1), "1Ms") == 0);
|
||||
rtest_assert(strcmp(msecs_str(12), "12Ms") == 0);
|
||||
rtest_assert(strcmp(msecs_str(123), "123Ms") == 0);
|
||||
rtest_assert(strcmp(msecs_str(999), "999Ms") == 0);
|
||||
rtest_banner("Second tests");
|
||||
rtest_assert(!strcmp(msecs_str(1000), "1s"));
|
||||
rtest_assert(!strcmp(msecs_str(1100), "1.1s"));
|
||||
rtest_assert(!strcmp(msecs_str(1234), "1.234s"));
|
||||
rtest_assert(!strcmp(msecs_str(12345), "12.345s"));
|
||||
return rtest_end("successs");
|
||||
rtest_assert(strcmp(msecs_str(1000), "1s") == 0);
|
||||
rtest_assert(strcmp(msecs_str(1100), "1.1s") == 0);
|
||||
rtest_assert(strcmp(msecs_str(1234), "1.234s") == 0);
|
||||
rtest_assert(strcmp(msecs_str(12345), "12.345s") == 0);
|
||||
return rtest_end("success");
|
||||
}
|
16
rtree.c
16
rtree.c
@ -1,3 +1,12 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This code provides functionality for testing and benchmarking `rtree` operations, including setting up, manipulating, and freeing nodes,
|
||||
// as well as measuring the performance of these operations.
|
||||
|
||||
// The code imports `rtree.h`, `rbench.h`, `rtest.h`, and the standard library `string.h`.
|
||||
|
||||
// MIT License
|
||||
|
||||
#include "rtree.h"
|
||||
#include "rbench.h"
|
||||
#include "rtest.h"
|
||||
@ -33,7 +42,6 @@ void rtree_bench(long item_count) {
|
||||
b->silent = true;
|
||||
b->add_function(b, "random_key", "rtree_rw", rtree_bench_f);
|
||||
b->execute(b, 1000000);
|
||||
// rassert(rnsecs_to_msecs(b->execution_time) < 700); // faster than 700ms
|
||||
printf("r/w %ld items and deallocated in %s\n", item_count, format_time(b->execution_time));
|
||||
rbench_free(b);
|
||||
}
|
||||
@ -41,22 +49,18 @@ void rtree_bench(long item_count) {
|
||||
int main() {
|
||||
rtest_banner("rtree");
|
||||
rtree_t *rtree = rtree_new();
|
||||
// Test new object default valuess
|
||||
rtest_banner("New object default values");
|
||||
rtest_assert(rtree->c == 0);
|
||||
rtest_assert(rtree->next == NULL);
|
||||
rtest_assert(rtree->children == NULL);
|
||||
rtest_assert(rtree->data == NULL);
|
||||
// Test set
|
||||
rtest_banner("Set");
|
||||
rtree_set(rtree, "a", "data");
|
||||
rtest_assert(rtree->c == 'a');
|
||||
rtest_assert(!strcmp(rtree->data, "data"));
|
||||
// Second element should be filled
|
||||
rtree_set(rtree, "b", "data2");
|
||||
rtest_assert(rtree->next->c == 'b');
|
||||
rtest_assert(!strcmp(rtree->next->data, "data2"));
|
||||
// First child of second element should be filled
|
||||
rtree_set(rtree, "bc", "data3");
|
||||
rtest_assert(rtree->next->children->c == 'c');
|
||||
rtest_assert(!strcmp(rtree->next->children->data, "data3"));
|
||||
@ -64,4 +68,4 @@ int main() {
|
||||
rtest_banner("Benchmark");
|
||||
rtree_bench(1000000);
|
||||
return rtest_end("");
|
||||
}
|
||||
}
|
19
rtypes.c
19
rtypes.c
@ -1,14 +1,29 @@
|
||||
// Written by retoor@molodetz.nl
|
||||
|
||||
// This program tests various types using the rtypes and rtest libraries, asserting the expected behaviors of the defined types such as
|
||||
// unsigned integers, long integers, and byte values.
|
||||
|
||||
// The source includes custom libraries "rtest.h" and "rtypes.h" which provide functionality for type definition and testing assertions.
|
||||
|
||||
// The code is licensed under the MIT License.
|
||||
|
||||
#include "rtest.h"
|
||||
#include "rtypes.h"
|
||||
|
||||
int main() {
|
||||
rtest_banner("rtypes");
|
||||
|
||||
uint test1 = 1000;
|
||||
rassert(test1 == 1000) ulong test2 = -1000;
|
||||
rassert(test1 == 1000);
|
||||
|
||||
ulong test2 = -1000;
|
||||
rassert(test2 == -1000);
|
||||
|
||||
byte test3 = 123;
|
||||
rassert(test3 == 123);
|
||||
|
||||
byte test4 = 'A';
|
||||
rassert(test4 == 65);
|
||||
|
||||
return rtest_end("");
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user