169 lines
5.3 KiB
C
169 lines
5.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>
|
|
|
|
static int syntax_count = 0;
|
|
static int syntax_active = FALSE;
|
|
static int * syntax_enrange = NULL;
|
|
static int * syntax_derange = NULL;
|
|
static char * * syntax_begin = NULL;
|
|
static char * * syntax_end = NULL;
|
|
static char * syntax_escape = NULL;
|
|
static int * syntax_colour = NULL;
|
|
static int * syntax_effect = NULL;
|
|
|
|
static void syntax_delete (void) {
|
|
int offset;
|
|
|
|
if (syntax_active == FALSE) {
|
|
return;
|
|
}
|
|
|
|
for (offset = 0; offset < syntax_count; ++offset) {
|
|
syntax_begin [offset] = deallocate (syntax_begin [offset]);
|
|
syntax_end [offset] = deallocate (syntax_end [offset]);
|
|
}
|
|
|
|
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_active = FALSE;
|
|
syntax_count = 0;
|
|
}
|
|
|
|
int syntax_define (int enrange, int derange, char * begin, char * end, char escape, int colour, int effect) {
|
|
if (syntax_active == FALSE) {
|
|
syntax_active = TRUE;
|
|
|
|
atexit (syntax_delete);
|
|
}
|
|
|
|
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, subset, select;
|
|
|
|
fatal_failure (syntax_active == FALSE, "syntax_select: Syntax is not active.");
|
|
fatal_failure (string == NULL, "syntax_select: String is null.");
|
|
fatal_failure (length == NULL, "syntax_select: Length is null.");
|
|
|
|
for (select = offset = 0; select != syntax_count; ++select) {
|
|
if (syntax_enrange [select] == FALSE) {
|
|
if (string_compare_limit (string, syntax_begin [select], string_length (syntax_begin [select])) == TRUE) {
|
|
break;
|
|
}
|
|
} else {
|
|
for (subset = 0; subset != string_length (syntax_begin [select]); ++subset) {
|
|
if (string [offset] == syntax_begin [select] [subset]) {
|
|
goto selected;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
selected:
|
|
|
|
if (select >= syntax_count) {
|
|
* length = 1;
|
|
|
|
return (syntax_count);
|
|
}
|
|
|
|
for (offset = 1; string [offset - 1] != '\0'; ++offset) {
|
|
if (string [offset] == syntax_escape [select]) {
|
|
++offset;
|
|
continue;
|
|
}
|
|
|
|
if (syntax_derange [select] == FALSE) {
|
|
if (string_compare_limit (& string [offset], syntax_end [select], string_length (syntax_end [select])) == TRUE) {
|
|
* length = offset + string_length (syntax_end [select]);
|
|
return (select);
|
|
}
|
|
} else {
|
|
subset = 0;
|
|
if (string_compare (syntax_end [select], "") == FALSE) {
|
|
break;
|
|
} do {
|
|
if (string [offset] == syntax_end [select] [subset]) {
|
|
* length = offset;
|
|
goto finished;
|
|
}
|
|
} while (++subset != string_length (syntax_end [select]));
|
|
}
|
|
}
|
|
|
|
finished:
|
|
/*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);
|
|
}
|
|
|
|
#endif
|