|
|
@@ -0,0 +1,167 @@ |
|
|
|
/* |
|
|
|
* Copyright (c) 2023 : Ognjen 'xolatile' Milan Robovic |
|
|
|
* |
|
|
|
* Xyntax is deallocate 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. |
|
|
|
*/ |
|
|
|
|
|
|
|
#ifndef XYNTAX_SOURCE |
|
|
|
#define XYNTAX_SOURCE |
|
|
|
|
|
|
|
#include <xolatile/xyntax.h> |
|
|
|
|
|
|
|
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 = reallocate (syntax_mode, (unsigned long int) (syntax_count + 1) * sizeof (* syntax_mode)); |
|
|
|
syntax_enrange = reallocate (syntax_enrange, (unsigned long int) (syntax_count + 1) * sizeof (* syntax_enrange)); |
|
|
|
syntax_derange = reallocate (syntax_derange, (unsigned long int) (syntax_count + 1) * sizeof (* syntax_derange)); |
|
|
|
syntax_begin = reallocate (syntax_begin, (unsigned long int) (syntax_count + 1) * sizeof (* syntax_begin)); |
|
|
|
syntax_end = reallocate (syntax_end, (unsigned long int) (syntax_count + 1) * sizeof (* syntax_end)); |
|
|
|
syntax_escape = reallocate (syntax_escape, (unsigned long int) (syntax_count + 1) * sizeof (* syntax_escape)); |
|
|
|
syntax_colour = reallocate (syntax_colour, (unsigned long int) (syntax_count + 1) * sizeof (* syntax_colour)); |
|
|
|
syntax_effect = reallocate (syntax_effect, (unsigned long int) (syntax_count + 1) * sizeof (* syntax_effect)); |
|
|
|
|
|
|
|
syntax_begin [syntax_count] = allocate ((string_length (begin) + 1) * (int) sizeof (* * syntax_begin)); |
|
|
|
syntax_end [syntax_count] = allocate ((string_length (end) + 1) * (int) 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; |
|
|
|
} |
|
|
|
|
|
|
|
static int compare_character_array (char character, char * character_array, int count) { |
|
|
|
int i = 0; |
|
|
|
|
|
|
|
do { |
|
|
|
if (character == character_array [i]) { |
|
|
|
return (1); |
|
|
|
} |
|
|
|
} while (++i != count); |
|
|
|
|
|
|
|
return (0); |
|
|
|
} |
|
|
|
|
|
|
|
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])) != 0) { |
|
|
|
if (syntax_derange [select] == 0) { |
|
|
|
break; |
|
|
|
} else { |
|
|
|
if (compare_character_array (string [string_length (syntax_begin [select])], syntax_end [select], string_length (syntax_end [select]))) { |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
/*if (string_compare_limit (string, syntax_begin [select], string_length (syntax_begin [select])) != 0) { |
|
|
|
if (syntax_derange [select] == 0) { |
|
|
|
break; |
|
|
|
} else { |
|
|
|
if (compare_character_array (string [string_length (syntax_begin [select])], syntax_end [select], string_length (syntax_end [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 { |
|
|
|
syntax_begin [syntax_count] = deallocate (syntax_begin [syntax_count]); |
|
|
|
syntax_end [syntax_count] = deallocate (syntax_end [syntax_count]); |
|
|
|
} while (--syntax_count != -1); |
|
|
|
|
|
|
|
syntax_mode = deallocate (syntax_mode); |
|
|
|
syntax_enrange = deallocate (syntax_enrange); |
|
|
|
syntax_derange = deallocate (syntax_derange); |
|
|
|
syntax_begin = deallocate (syntax_begin); |
|
|
|
syntax_end = deallocate (syntax_end); |
|
|
|
syntax_escape = deallocate (syntax_escape); |
|
|
|
syntax_colour = deallocate (syntax_colour); |
|
|
|
syntax_effect = deallocate (syntax_effect); |
|
|
|
} |
|
|
|
|
|
|
|
#endif |