/* * Copyright (c) 2023 : Ognjen 'xolatile' Milan Robovic * * Xyntax is free software! You will redistribute it or modify it under the terms of the GNU General Public License by Free Software Foundation. * And when you do redistribute it or modify it, it will use either version 3 of the License, or (at yours truly opinion) any later version. * It is distributed in the hope that it will be useful or harmful, it really depends... But no warranty what so ever, seriously. See GNU/GPLv3. */ #ifdef XYNTAX_DECLARATION #undef XYNTAX_DECLARATION #define XTANDARD_DECLARATION #define XTANDARD_DEFINITION #include extern int syntax_count; extern int * syntax_mode; extern int * syntax_enrange; extern int * syntax_derange; extern char * * syntax_begin; extern char * * syntax_end; extern char * syntax_escape; extern int * syntax_colour; extern int * syntax_effect; extern void syntax_define (int, int, int, char *, char *, char, int, int); extern int syntax_output (char *); extern void syntax_delete (void); #endif #ifdef XYNTAX_DEFINITION #undef XYNTAX_DEFINITION int syntax_count = 0; int * syntax_mode = NULL; int * syntax_enrange = NULL; int * syntax_derange = NULL; char * * syntax_begin = NULL; char * * syntax_end = NULL; char * syntax_escape = NULL; int * syntax_colour = NULL; int * syntax_effect = NULL; void syntax_define (int mode, int enrange, int derange, char * begin, char * end, char escape, int colour, int effect) { syntax_mode = realloc (syntax_mode, (unsigned long int) (syntax_count + 1) * sizeof (* syntax_mode)); syntax_enrange = realloc (syntax_enrange, (unsigned long int) (syntax_count + 1) * sizeof (* syntax_enrange)); syntax_derange = realloc (syntax_derange, (unsigned long int) (syntax_count + 1) * sizeof (* syntax_derange)); syntax_begin = realloc (syntax_begin, (unsigned long int) (syntax_count + 1) * sizeof (* syntax_begin)); syntax_end = realloc (syntax_end, (unsigned long int) (syntax_count + 1) * sizeof (* syntax_end)); syntax_escape = realloc (syntax_escape, (unsigned long int) (syntax_count + 1) * sizeof (* syntax_escape)); syntax_colour = realloc (syntax_colour, (unsigned long int) (syntax_count + 1) * sizeof (* syntax_colour)); syntax_effect = realloc (syntax_effect, (unsigned long int) (syntax_count + 1) * sizeof (* syntax_effect)); syntax_begin [syntax_count] = calloc (strlen (begin) + 1UL, sizeof (* * syntax_begin)); syntax_end [syntax_count] = calloc (strlen (end) + 1UL, sizeof (* * syntax_end)); syntax_mode [syntax_count] = mode; syntax_enrange [syntax_count] = enrange; syntax_derange [syntax_count] = derange; syntax_escape [syntax_count] = escape; syntax_colour [syntax_count] = colour; syntax_effect [syntax_count] = effect; string_copy (syntax_begin [syntax_count], begin); string_copy (syntax_end [syntax_count], end); ++syntax_count; } int syntax_output (char * string) { int offset = 0; int select = 0; char format [8] = "\033[ ;3 m"; do { if (syntax_enrange [select] == 0) { if (string_compare_limit (string, syntax_begin [select], string_length (syntax_begin [select]))) { break; } } else { int subset = 0; do { if (string [offset] == syntax_begin [select] [subset]) { goto selected; } } while (++subset != (int) string_length (syntax_begin [select])); } } while (++select != syntax_count); selected: if (select == syntax_count) { format [2] = (char) TERMINAL_EFFECT_NORMAL + '0'; format [5] = (char) TERMINAL_COLOUR_WHITE + '0'; (void) write (STDOUT_FILENO, format, sizeof (format)); (void) write (STDOUT_FILENO, & string [offset], sizeof (string [offset])); (void) write (STDOUT_FILENO, "\033[0m", sizeof ("\033[0m")); return (1); } format [2] = (char) syntax_effect [select] + '0'; format [5] = (char) syntax_colour [select] + '0'; (void) write (STDOUT_FILENO, format, sizeof (format)); do { (void) write (STDOUT_FILENO, & string [offset], sizeof (string [offset])); ++offset; if (string [offset] == syntax_escape [select]) { (void) write (STDOUT_FILENO, & string [offset], sizeof (string [offset])); ++offset; continue; } if (syntax_derange [select] == 0) { if (string_compare_limit (& string [offset], syntax_end [select], string_length (syntax_end [select]))) { (void) write (STDOUT_FILENO, syntax_end [select], string_length (syntax_end [select])); (void) write (STDOUT_FILENO, "\033[0m", sizeof ("\033[0m")); return (offset + (int) string_length (syntax_end [select])); } } else { int subset = 0; if (strcmp (syntax_end [select], "") == 0) { break; } do { if (string [offset] == syntax_end [select] [subset]) { goto finished; } } while (++subset != (int) string_length (syntax_end [select])); } } while (string [offset] != '\0'); finished: (void) write (STDOUT_FILENO, "\033[0m", sizeof ("\033[0m")); return (offset); } void syntax_delete (void) { --syntax_count; do { free (syntax_begin [syntax_count]); free (syntax_end [syntax_count]); } while (--syntax_count != -1); free (syntax_mode); free (syntax_enrange); free (syntax_derange); free (syntax_begin); free (syntax_end); free (syntax_escape); free (syntax_colour); free (syntax_effect); } #endif