]> git.xolatile.top Git - emil-xolatilization.git/commitdiff
Added arena allocator for federal agent...
authorxolatile <xolatile@proton.me>
Sat, 5 Apr 2025 20:15:01 +0000 (22:15 +0200)
committerxolatile <xolatile@proton.me>
Sat, 5 Apr 2025 20:15:01 +0000 (22:15 +0200)
xerminal.h
xrena.h [new file with mode: 0755]

index 73bcb960fa005a49bbfacc8216afaf13ebb32489..fb402a819bef8fe6d2a6ab95e36eae08fd3ef7d6 100755 (executable)
@@ -27,8 +27,8 @@ typedef struct {
        uint   screen_width;
        uint   screen_height;
 
-       char   format [terminal_format_length + 1];
-       char   cursor [terminal_cursor_length + 1];
+       char format [terminal_format_length + 1];
+       char cursor [terminal_cursor_length + 1];
 
        bool active;
        bool signal [signal_count];
@@ -293,44 +293,44 @@ static void terminal_render_format (terminal_structure * terminal, const char *
 
        for (; * format != character_null; ++format) {
                switch (* format) {
-                       case '\t': {
+                       case ('\t'): {
                                offset_x += 8;
                        } break;
-                       case '\n': {
+                       case ('\n'): {
                                offset_x *= 0;
                                offset_y += 1;
                        } break;
-                       case '\r': {
+                       case ('\r'): {
                                offset_x *= 0;
                        } break;
-                       case '%': {
+                       case ('%'): {
                                ++format;
                                switch (* format) {
-                                       case '%': {
+                                       case ('%'): {
                                                terminal_render_character (terminal, '%', colour, effect, x + offset_x, y + offset_y);
                                                ++offset_x;
                                        } break;
-                                       case 'i': {
+                                       case ('i'): {
                                                char * number = number_to_string (va_arg (list, int));
                                                terminal_render_string (terminal, number, colour, effect, x + offset_x, y + offset_y);
                                                offset_x += string_length (number);
                                        } break;
-                                       case 't': {
+                                       case ('t'): {
                                                bool toggle = (bool) va_arg (list, int);
                                                terminal_render_toggle (terminal, toggle, x + offset_x, y + offset_y);
                                                offset_x += 3;
                                        } break;
-                                       case 'b': {
+                                       case ('b'): {
                                                bool boolean = (bool) va_arg (list, int);
                                                terminal_render_string (terminal, (boolean == true) ? "true" : "false", colour, effect, x + offset_x, y + offset_y);
                                                offset_x += (boolean == true) ? 4 : 5;
                                        } break;
-                                       case 'c': {
+                                       case ('c'): {
                                                char character = (char) va_arg (list, int);
                                                terminal_render_character (terminal, character, colour, effect, x + offset_x, y + offset_y);
                                                ++offset_x;
                                        } break;
-                                       case 's': {
+                                       case ('s'): {
                                                char * string = va_arg (list, char *);
                                                terminal_render_string (terminal, string, colour, effect, x + offset_x, y + offset_y);
                                                offset_x += string_length (string);
@@ -341,30 +341,30 @@ static void terminal_render_format (terminal_structure * terminal, const char *
                                        } break;
                                }
                        } break;
-                       case '/': {
+                       case ('/'): {
                                ++format;
                                switch (* format) {
-                                       case '/': {
+                                       case ('/'): {
                                                terminal_render_character (terminal, '/', colour, effect, x + offset_x, y + offset_y);
                                                ++offset_x;
                                        } break;
-                                       case 'A': effect = effect_normal;         break;
-                                       case 'B': effect = effect_bold;           break;
-                                       case 'C': effect = effect_italic;         break;
-                                       case 'D': effect = effect_undefined_code; break;
-                                       case 'E': effect = effect_underline;      break;
-                                       case 'F': effect = effect_blink;          break;
-                                       case 'G': effect = effect_reverse;        break;
-                                       case 'H': effect = effect_invisible_text; break;
-                                       case '0': colour = colour_grey;           break;
-                                       case '1': colour = colour_red;            break;
-                                       case '2': colour = colour_green;          break;
-                                       case '3': colour = colour_yellow;         break;
-                                       case '4': colour = colour_blue;           break;
-                                       case '5': colour = colour_pink;           break;
-                                       case '6': colour = colour_cyan;           break;
-                                       case '7': colour = colour_white;          break;
-                                       case '-': {
+                                       case ('A'): effect = effect_normal;         break;
+                                       case ('B'): effect = effect_bold;           break;
+                                       case ('C'): effect = effect_italic;         break;
+                                       case ('D'): effect = effect_undefined_code; break;
+                                       case ('E'): effect = effect_underline;      break;
+                                       case ('F'): effect = effect_blink;          break;
+                                       case ('G'): effect = effect_reverse;        break;
+                                       case ('H'): effect = effect_invisible_text; break;
+                                       case ('0'): colour = colour_grey;           break;
+                                       case ('1'): colour = colour_red;            break;
+                                       case ('2'): colour = colour_green;          break;
+                                       case ('3'): colour = colour_yellow;         break;
+                                       case ('4'): colour = colour_blue;           break;
+                                       case ('5'): colour = colour_pink;           break;
+                                       case ('6'): colour = colour_cyan;           break;
+                                       case ('7'): colour = colour_white;          break;
+                                       case ('-'): {
                                                colour = colour_white;
                                                effect = effect_normal;
                                        } break;
diff --git a/xrena.h b/xrena.h
new file mode 100755 (executable)
index 0000000..df32779
--- /dev/null
+++ b/xrena.h
@@ -0,0 +1,109 @@
+/// __  ___ __ ___ _ __   __ _
+/// \ \/ / '__/ _ \ '_ \ / _` |
+///  >  <| | |  __/ | | | (_| |
+/// /_/\_\_|  \___|_| |_|\__,_|
+///
+/// Copyright (c) 1997 - Ognjen 'xolatile' Milan Robovic
+///
+/// xolatile@chud.cyou - xrena - Probably the most minimalistic arena allocator possible, and undoubtedly evil in implementation details.
+///
+/// This program is free software, free as in freedom and as in free beer, you can redistribute it and/or modify it under the terms of the GNU
+/// General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version if you wish...
+///
+/// This program is distributed in the hope that it will be useful, but it is probably not, and without any warranty, without even the implied
+/// warranty of merchantability or fitness for a particular purpose, because it is pointless. Please see the GNU (Geenoo) General Public License
+/// for more details, if you dare, it is a lot of text that nobody wants to read...
+
+#ifndef arena_block_limit
+#define arena_block_limit (1024 * 1024)
+#endif
+
+static struct {
+       ulong block_count;
+       ulong block_limit;
+       struct {
+               ulong   count;
+               ulong   capacity;
+               char  * buffer;
+       } * * block_array;
+} * arena = null;
+
+static void arena_initialize (void) {
+       ulong current = ++arena->block_count - 1;
+
+       arena->block_limit = arena_block_limit;
+
+       arena->block_array = reallocate (arena->block_array, arena->block_count * sizeof (* arena->block_array));
+
+       arena->block_array [current] = allocate (sizeof (* arena));
+
+       arena->block_array [current]->buffer   = allocate (arena_block_limit);
+       arena->block_array [current]->count    = 0;
+       arena->block_array [current]->capacity = arena_block_limit;
+}
+
+static void arena_deinitialize (void) {
+       for (ulong index = 0; index < arena->block_count; ++index) {
+               arena->block_array [index]->buffer = deallocate (arena->block_array [index]->buffer);
+               arena->block_array [index]         = deallocate (arena->block_array [index]);
+       }
+
+       arena->block_array = deallocate (arena->block_array);
+       arena              = deallocate (arena);
+}
+
+static void * arena_add (ulong size) {
+       ulong current = arena->block_count - 1;
+
+       if (arena == null) {
+               clean_up (arena_deinitialize);
+
+               arena = allocate (sizeof (* arena));
+
+               arena_initialize ();
+       }
+
+       fatal_failure (size > arena->block_limit, "arena_add: Block limit reached.");
+
+       if (arena->block_array [current]->count + size > arena->block_array [current]->capacity) {
+               arena_initialize ();
+       }
+
+       arena->block_array [current]->count += size;
+
+       return ((void*) & arena->block_array [current]->buffer [arena->block_array [current]->count - size]);
+}
+
+static char * arena_add_data (const void * data, ulong size) {
+       void * pointer = arena_add (size);
+
+       memory_copy (pointer, data, size);
+
+       return (pointer);
+}
+
+static char * arena_add_file (const char * path, uint flag, bool null_terminate) {
+       int     file = -1;
+       ulong   size = 0;
+       char  * data = null;
+
+       file = file_open (path, flag);
+       size = file_size (path) + (ulong) null_terminate;
+       data = arena_add (size);
+
+       file_read (file, data, size - (ulong) null_terminate);
+
+       file = file_close (file);
+
+       return (data);
+}
+
+static ulong arena_usage (void) {
+       ulong usage = 0;
+
+       for (ulong block = 0; block < arena->block_count; ++block) {
+               usage += arena->block_array [block]->count;
+       }
+
+       return (usage);
+}