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];
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);
} 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;
--- /dev/null
+/// __ ___ __ ___ _ __ __ _
+/// \ \/ / '__/ _ \ '_ \ / _` |
+/// > <| | | __/ | | | (_| |
+/// /_/\_\_| \___|_| |_|\__,_|
+///
+/// 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);
+}