|
|
@@ -0,0 +1,178 @@ |
|
|
|
/* |
|
|
|
* 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 <stdlib.h> |
|
|
|
#include <string.h> |
|
|
|
#include <unistd.h> |
|
|
|
|
|
|
|
#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 |