xyntax/xyntax.h

179 lines
5.4 KiB
C
Raw Normal View History

2023-08-22 05:43:24 -04:00
/*
* 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