xyntax/xyntax.c

183 lines
6.3 KiB
C

/*
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.
*/
#ifndef XYNTAX_SOURCE
#define XYNTAX_SOURCE
#include <xolatile/xtandard.c>
#include <xolatile/xyntax.h>
int syntax_count = 0;
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;
char * syntax_separator = NULL;
int syntax_define (int enrange, int derange, char * begin, char * end, char escape, int colour, int effect) {
fatal_failure (begin == NULL, "syntax_define: Begin string is null pointer.");
fatal_failure (end == NULL, "syntax_define: End string is null pointer.");
++syntax_count;
syntax_enrange = reallocate (syntax_enrange, syntax_count * (int) sizeof (* syntax_enrange));
syntax_derange = reallocate (syntax_derange, syntax_count * (int) sizeof (* syntax_derange));
syntax_begin = reallocate (syntax_begin, syntax_count * (int) sizeof (* syntax_begin));
syntax_end = reallocate (syntax_end, syntax_count * (int) sizeof (* syntax_end));
syntax_escape = reallocate (syntax_escape, syntax_count * (int) sizeof (* syntax_escape));
syntax_colour = reallocate (syntax_colour, syntax_count * (int) sizeof (* syntax_colour));
syntax_effect = reallocate (syntax_effect, syntax_count * (int) sizeof (* syntax_effect));
syntax_begin [syntax_count - 1] = allocate ((string_length (begin) + 1) * (int) sizeof (* * syntax_begin));
syntax_end [syntax_count - 1] = allocate ((string_length (end) + 1) * (int) sizeof (* * syntax_end));
syntax_enrange [syntax_count - 1] = enrange;
syntax_derange [syntax_count - 1] = derange;
syntax_escape [syntax_count - 1] = escape;
syntax_colour [syntax_count - 1] = colour;
syntax_effect [syntax_count - 1] = effect;
string_copy (syntax_begin [syntax_count - 1], begin);
string_copy (syntax_end [syntax_count - 1], end);
return (syntax_count - 1);
}
int syntax_select (char * string, int * length) {
int offset = 0;
int select = 0;
fatal_failure (string == NULL, "syntax_select: String is null.");
fatal_failure (length == NULL, "syntax_select: Length is null.");
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 (character_compare_array (string [string_length (syntax_begin [select])], syntax_end [select]) != 0) {
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) {
* length = 1;
return (0);
}
do {
++offset;
if (string [offset] == syntax_escape [select]) {
++offset;
continue;
}
if (syntax_derange [select] == 0) {
if (string_compare_limit (& string [offset], syntax_end [select], string_length (syntax_end [select]))) {
* length = offset + string_length (syntax_end [select]);
return (select);
}
} else {
int subset = 0;
if (string_compare (syntax_end [select], "") == 0) {
break;
} do {
if (string [offset] == syntax_end [select] [subset]) {
* length = offset;
return (select);
}
} while (++subset != (int) string_length (syntax_end [select]));
}
} while (string [offset - 1] != '\0');
return (select);
}
void syntax_delete (void) {
if (syntax_count == 0) {
return;
}
--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_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);
syntax_separator = deallocate (syntax_separator);
syntax_count = 0;
}
/* Simplification... */
void syntax_define_separators (char * separator) {
syntax_separator = allocate (string_length (separator) + 1);
string_copy (syntax_separator, separator);
}
void syntax_define_default (int case_sensitive, int string_colour, int string_effect, int number_colour, int number_effect) {
(void) syntax_define (1, 0, " \t\r\n", "", '\0', COLOUR_WHITE, EFFECT_BOLD);
(void) syntax_define (0, 0, "\"", "\"", '\\', string_colour, string_effect);
(void) syntax_define (1, 1, "0123456789", syntax_separator, '\0', number_colour, number_effect);
if (case_sensitive != 0) {
(void) syntax_define (1, 1, "abcdefghijklmnopqrstuvwxyz", syntax_separator, '\0', COLOUR_WHITE, EFFECT_NORMAL);
(void) syntax_define (1, 1, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", syntax_separator, '\0', COLOUR_WHITE, EFFECT_BOLD);
(void) syntax_define (1, 1, "_", syntax_separator, '\0', COLOUR_GREY, EFFECT_BOLD);
} else {
(void) syntax_define (1, 1, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_", syntax_separator, '\0', COLOUR_WHITE, EFFECT_NORMAL);
}
}
void syntax_define_words (char * * word_array, int word_count, int word_colour, int word_effect) {
int word;
for (word = 0; word != word_count; ++word) {
(void) syntax_define (0, 1, word_array [word], syntax_separator, '\0', word_colour, word_effect);
}
}
void syntax_define_range (char * range_begin, char * range_end, char range_escape, int range_colour, int range_effect) {
(void) syntax_define (0, 0, range_begin, range_end, range_escape, range_colour, range_effect);
}
void syntax_define_operators (char * operator_array, int operator_colour, int operator_effect) {
(void) syntax_define (1, 0, operator_array, "", '\0', operator_colour, operator_effect);
}
#endif