/* * 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 #include #include #include #define XYNTAX_NORMAL (0) #define XYNTAX_BOLD (1) #define XYNTAX_ITALIC (3) #define XYNTAX_UNDERLINE (4) #define XYNTAX_REVERSE (7) enum { XYNTAX_GREY, XYNTAX_RED, XYNTAX_GREEN, XYNTAX_YELLOW, XYNTAX_BLUE, XYNTAX_PINK, XYNTAX_CYAN, XYNTAX_WHITE }; extern int xyntax_count; extern int * xyntax_mode; extern int * xyntax_enrange; extern int * xyntax_derange; extern char * * xyntax_begin; extern char * * xyntax_end; extern char * xyntax_escape; extern int * xyntax_colour; extern int * xyntax_effect; extern void xyntax_define (int, int, int, char *, char *, char, int, int); extern int xyntax_output (char *); extern void xyntax_delete (void); #endif #ifdef XYNTAX_DEFINITION #undef XYNTAX_DEFINITION int xyntax_count = 0; int * xyntax_mode = NULL; int * xyntax_enrange = NULL; int * xyntax_derange = NULL; char * * xyntax_begin = NULL; char * * xyntax_end = NULL; char * xyntax_escape = NULL; int * xyntax_colour = NULL; int * xyntax_effect = NULL; void xyntax_define (int mode, int enrange, int derange, char * begin, char * end, char escape, int colour, int effect) { xyntax_mode = realloc (xyntax_mode, (unsigned long int) (xyntax_count + 1) * sizeof (* xyntax_mode)); xyntax_enrange = realloc (xyntax_enrange, (unsigned long int) (xyntax_count + 1) * sizeof (* xyntax_enrange)); xyntax_derange = realloc (xyntax_derange, (unsigned long int) (xyntax_count + 1) * sizeof (* xyntax_derange)); xyntax_begin = realloc (xyntax_begin, (unsigned long int) (xyntax_count + 1) * sizeof (* xyntax_begin)); xyntax_end = realloc (xyntax_end, (unsigned long int) (xyntax_count + 1) * sizeof (* xyntax_end)); xyntax_escape = realloc (xyntax_escape, (unsigned long int) (xyntax_count + 1) * sizeof (* xyntax_escape)); xyntax_colour = realloc (xyntax_colour, (unsigned long int) (xyntax_count + 1) * sizeof (* xyntax_colour)); xyntax_effect = realloc (xyntax_effect, (unsigned long int) (xyntax_count + 1) * sizeof (* xyntax_effect)); xyntax_begin [xyntax_count] = calloc (strlen (begin) + 1UL, sizeof (* * xyntax_begin)); xyntax_end [xyntax_count] = calloc (strlen (end) + 1UL, sizeof (* * xyntax_end)); xyntax_mode [xyntax_count] = mode; xyntax_enrange [xyntax_count] = enrange; xyntax_derange [xyntax_count] = derange; xyntax_escape [xyntax_count] = escape; xyntax_colour [xyntax_count] = colour; xyntax_effect [xyntax_count] = effect; (void) strcpy (xyntax_begin [xyntax_count], begin); (void) strcpy (xyntax_end [xyntax_count], end); ++xyntax_count; } int xyntax_output (char * string) { int offset = 0; int select = 0; char format [8] = "\033[ ;3 m"; do { if (xyntax_enrange [select] == 0) { if (strncmp (string, xyntax_begin [select], strlen (xyntax_begin [select])) == 0) { break; } } else { int subset = 0; do { if (string [offset] == xyntax_begin [select] [subset]) { goto selected; } } while (++subset != (int) strlen (xyntax_begin [select])); } } while (++select != xyntax_count); selected: if (select == xyntax_count) { format [2] = (char) XYNTAX_NORMAL + '0'; format [5] = (char) XYNTAX_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) xyntax_effect [select] + '0'; format [5] = (char) xyntax_colour [select] + '0'; (void) write (STDOUT_FILENO, format, sizeof (format)); do { (void) write (STDOUT_FILENO, & string [offset], sizeof (string [offset])); ++offset; if (string [offset] == xyntax_escape [select]) { (void) write (STDOUT_FILENO, & string [offset], sizeof (string [offset])); ++offset; continue; } if (xyntax_derange [select] == 0) { if (strncmp (& string [offset], xyntax_end [select], strlen (xyntax_end [select])) == 0) { (void) write (STDOUT_FILENO, xyntax_end [select], strlen (xyntax_end [select])); (void) write (STDOUT_FILENO, "\033[0m", sizeof ("\033[0m")); return (offset + (int) strlen (xyntax_end [select])); } } else { int subset = 0; if (strcmp (xyntax_end [select], "") == 0) { break; } do { if (string [offset] == xyntax_end [select] [subset]) { goto finished; } } while (++subset != (int) strlen (xyntax_end [select])); } } while (string [offset] != '\0'); finished: (void) write (STDOUT_FILENO, "\033[0m", sizeof ("\033[0m")); return (offset); } void xyntax_delete (void) { --xyntax_count; do { free (xyntax_begin [xyntax_count]); free (xyntax_end [xyntax_count]); } while (--xyntax_count != -1); free (xyntax_mode); free (xyntax_enrange); free (xyntax_derange); free (xyntax_begin); free (xyntax_end); free (xyntax_escape); free (xyntax_colour); free (xyntax_effect); } #endif