1
0
mirror of https://git.lain.church/emil/libhl.git synced 2025-05-10 13:46:45 +00:00

Extendable buffer...

This commit is contained in:
xolatile 2023-08-15 16:32:00 -04:00
parent 3842fbcfd3
commit a0ce6d4fef

View File

@ -4,8 +4,6 @@
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#define BB (7817)
enum { NORMAL, BOLD, DARKNESS, ITALIC, UNDERLINE, BLINK, DUNNO_6, REVERSE, INVISIBLE }; enum { NORMAL, BOLD, DARKNESS, ITALIC, UNDERLINE, BLINK, DUNNO_6, REVERSE, INVISIBLE };
enum { GREY, RED, GREEN, YELLOW, BLUE, PINK, CYAN, WHITE, CANCEL }; enum { GREY, RED, GREEN, YELLOW, BLUE, PINK, CYAN, WHITE, CANCEL };
@ -29,266 +27,272 @@ static int effect_keyword = BOLD;
static int effect_preprocessor = BOLD; static int effect_preprocessor = BOLD;
static int effect_default = BOLD; static int effect_default = BOLD;
static char buffer [BB] = ""; static char * buffer = NULL;
static unsigned long int buffer_size = 0;
static void render_character ( static void render_character (
char character char character
) { ) {
putchar (character); putchar (character);
} }
static void render_string ( static void render_string (
char * string char * string
) { ) {
while (* string) render_character (* string++); while (* string) render_character (* string++);
} }
static void render_colour ( static void render_colour (
int colour, int colour,
int effect int effect
) { ) {
if (colour == CANCEL) { if (colour == CANCEL) {
render_string ("\033[0m"); render_string ("\033[0m");
return; return;
} }
render_string ("\033["); render_string ("\033[");
render_character ((char) (effect % 9) + '0'); render_character ((char) (effect % 9) + '0');
render_string (";3"); render_string (";3");
render_character ((char) (colour % 8) + '0'); render_character ((char) (colour % 8) + '0');
render_character ('m'); render_character ('m');
} }
static int is_space ( static int is_space (
char character char character
) { ) {
if ((character == ' ') || (character == '\t') || (character == '\r') || (character == '\n')) { if ((character == ' ') || (character == '\t') || (character == '\r') || (character == '\n')) {
return (1); return (1);
} else { } else {
return (0); return (0);
} }
} }
static int is_separator ( static int is_separator (
char character char character
) { ) {
if ((character == ' ') || (character == '\t') || (character == '\r') || (character == '\n') || if ((character == ' ') || (character == '\t') || (character == '\r') || (character == '\n') ||
(character == '+') || (character == '-') || (character == '*') || (character == '/') || (character == '+') || (character == '-') || (character == '*') || (character == '/') ||
(character == '(') || (character == ')') || (character == '[') || (character == ']') || (character == '(') || (character == ')') || (character == '[') || (character == ']') ||
(character == '{') || (character == '}') || (character == '<') || (character == '>') || (character == '{') || (character == '}') || (character == '<') || (character == '>') ||
(character == ';') || (character == ':') || (character == ',') || (character == '.') || (character == ';') || (character == ':') || (character == ',') || (character == '.') ||
(character == '!') || (character == '&') || (character == '|') || (character == '?') || (character == '!') || (character == '&') || (character == '|') || (character == '?') ||
(character == '~') || (character == '^') || (character == '%') || (character == '=')) { (character == '~') || (character == '^') || (character == '%') || (character == '=')) {
return (1); return (1);
} else { } else {
return (0); return (0);
} }
} }
static int compare_multiple_strings ( static int compare_multiple_strings (
char * string, char * string,
const char * * strings, const char * * strings,
const int count const int count
) { ) {
int i = 0; int i = 0;
do { do {
if (strcmp (string, strings [i]) == 0) { if (strcmp (string, strings [i]) == 0) {
return (1); return (1);
} }
++i; ++i;
} while (i != count); } while (i != count);
return (0); return (0);
} }
static int render_short_comment ( static int render_short_comment (
int data_offset int data_offset
) { ) {
render_colour (colour_short_comment, effect_short_comment); render_colour (colour_short_comment, effect_short_comment);
do { do {
render_character (buffer [data_offset]); render_character (buffer [data_offset]);
++data_offset; ++data_offset;
} while ((buffer [data_offset] != '\n') && (buffer [data_offset] != '\0')); } while ((buffer [data_offset] != '\n') && (buffer [data_offset] != '\0'));
render_character (buffer [data_offset]); render_character (buffer [data_offset]);
++data_offset; ++data_offset;
return (data_offset); return (data_offset);
} }
static int render_long_comment ( static int render_long_comment (
int data_offset int data_offset
) { ) {
render_colour (colour_long_comment, effect_long_comment); render_colour (colour_long_comment, effect_long_comment);
do { do {
render_character (buffer [data_offset]); render_character (buffer [data_offset]);
++data_offset; ++data_offset;
} while (((buffer [data_offset] != '/') || } while (((buffer [data_offset] != '/') ||
(buffer [data_offset - 1] != '*')) && (buffer [data_offset - 1] != '*')) &&
(buffer [data_offset] != '\0')); (buffer [data_offset] != '\0'));
render_character (buffer [data_offset]); render_character (buffer [data_offset]);
++data_offset; ++data_offset;
return (data_offset); return (data_offset);
} }
static int render_short_string ( static int render_short_string (
int data_offset int data_offset
) { ) {
render_colour (colour_short_string, effect_short_string); render_colour (colour_short_string, effect_short_string);
do { do {
render_character (buffer [data_offset]); render_character (buffer [data_offset]);
++data_offset; ++data_offset;
if (buffer [data_offset - 1] == '\\') { if (buffer [data_offset - 1] == '\\') {
render_character (buffer [data_offset]); render_character (buffer [data_offset]);
++data_offset; ++data_offset;
} }
} while ((buffer [data_offset] != '\'') && (buffer [data_offset] != '\0')); } while ((buffer [data_offset] != '\'') && (buffer [data_offset] != '\0'));
render_character (buffer [data_offset]); render_character (buffer [data_offset]);
++data_offset; ++data_offset;
return (data_offset); return (data_offset);
} }
static int render_long_string ( static int render_long_string (
int data_offset int data_offset
) { ) {
render_colour (colour_long_string, effect_long_string); render_colour (colour_long_string, effect_long_string);
do { do {
render_character (buffer [data_offset]); render_character (buffer [data_offset]);
++data_offset; ++data_offset;
if (buffer [data_offset - 1] == '\\') { if (buffer [data_offset - 1] == '\\') {
render_character (buffer [data_offset]); render_character (buffer [data_offset]);
++data_offset; ++data_offset;
} }
} while ((buffer [data_offset] != '"') && (buffer [data_offset] != '\0')); } while ((buffer [data_offset] != '"') && (buffer [data_offset] != '\0'));
render_character (buffer [data_offset]); render_character (buffer [data_offset]);
++data_offset; ++data_offset;
return (data_offset); return (data_offset);
} }
static int render_separator ( static int render_separator (
int data_offset int data_offset
) { ) {
if (is_space (buffer [data_offset]) != 0) { if (is_space (buffer [data_offset]) != 0) {
render_colour (WHITE, NORMAL); render_colour (WHITE, NORMAL);
} else { } else {
render_colour (colour_separator, effect_separator); render_colour (colour_separator, effect_separator);
} }
render_character (buffer [data_offset]); render_character (buffer [data_offset]);
++data_offset; ++data_offset;
return (data_offset); return (data_offset);
} }
static int render_number ( static int render_number (
int data_offset int data_offset
) { ) {
render_colour (colour_number, effect_number); render_colour (colour_number, effect_number);
do { do {
render_character (buffer [data_offset]); render_character (buffer [data_offset]);
++data_offset; ++data_offset;
} while ((is_separator (buffer [data_offset]) == 0) && (buffer [data_offset] != '\0')); } while ((is_separator (buffer [data_offset]) == 0) && (buffer [data_offset] != '\0'));
return (data_offset); return (data_offset);
} }
static int render_word ( static int render_word (
int data_offset int data_offset
) { ) {
const char * c_keywords [32] = { const char * c_keywords [32] = {
"register", "volatile", "auto", "const", "static", "extern", "if", "else", "register", "volatile", "auto", "const", "static", "extern", "if", "else",
"do", "while", "for", "continue", "switch", "case", "default", "break", "do", "while", "for", "continue", "switch", "case", "default", "break",
"enum", "union", "struct", "typedef", "goto", "void", "return", "sizeof", "enum", "union", "struct", "typedef", "goto", "void", "return", "sizeof",
"char", "short", "int", "long", "signed", "unsigned", "float", "double" "char", "short", "int", "long", "signed", "unsigned", "float", "double"
}; };
const char * preprocessor_keywords [16] = { const char * preprocessor_keywords [16] = {
"#include", "#pragma", "#define", "#undef", "#ifdef", "#ifndef", "#elifdef", "#elifndef", "#include", "#pragma", "#define", "#undef", "#ifdef", "#ifndef", "#elifdef", "#elifndef",
"#if", "#elif", "#else", "#endif", "#embed", "#line", "#error", "#warning" "#if", "#elif", "#else", "#endif", "#embed", "#line", "#error", "#warning"
}; };
char * word = NULL; char * word = NULL;
int i = 0; int i = 0;
do { do {
word = realloc (word, sizeof (* word) * (unsigned long int) (i + 1)); word = realloc (word, sizeof (* word) * (unsigned long int) (i + 1));
word [i] = buffer [data_offset + i]; word [i] = buffer [data_offset + i];
++i; ++i;
} while ((is_separator (buffer [data_offset + i]) == 0) && (buffer [data_offset + i] != '\0')); } while ((is_separator (buffer [data_offset + i]) == 0) && (buffer [data_offset + i] != '\0'));
word = realloc (word, sizeof (* word) * (unsigned long int) (i + 1)); word = realloc (word, sizeof (* word) * (unsigned long int) (i + 1));
word [i] = '\0'; word [i] = '\0';
if (compare_multiple_strings (word, c_keywords, 32) != 0) { if (compare_multiple_strings (word, c_keywords, 32) != 0) {
render_colour (colour_keyword, effect_keyword); render_colour (colour_keyword, effect_keyword);
} else if (compare_multiple_strings (word, preprocessor_keywords, 16) != 0) { } else if (compare_multiple_strings (word, preprocessor_keywords, 16) != 0) {
render_colour (colour_preprocessor, effect_preprocessor); render_colour (colour_preprocessor, effect_preprocessor);
} else { } else {
render_colour (colour_default, effect_default); render_colour (colour_default, effect_default);
} }
do { do {
render_character (buffer [data_offset]); render_character (buffer [data_offset]);
++data_offset; ++data_offset;
} while ((is_separator (buffer [data_offset]) == 0) && (buffer [data_offset] != '\0')); } while ((is_separator (buffer [data_offset]) == 0) && (buffer [data_offset] != '\0'));
return (data_offset); return (data_offset);
} }
int main ( int main (
int argc, int argc,
char * * argv char * * argv
) { ) {
int offset = 0; int offset = 0;
int i = 0;
if (argc != 1) { if (argc != 1) {
(void) argv; (void) argv;
puts ("ARGUMENTS \"Heyo world!\""); puts ("ARGUMENTS \"Heyo world!\"");
return (-1); return (-1);
} }
printf (""); do {
++buffer_size;
buffer = realloc (buffer, buffer_size);
read (STDIN_FILENO, & buffer [buffer_size - 1], sizeof (* buffer));
} while ((buffer [buffer_size] != '\0') || (buffer_size != 10000));
do { ++buffer_size;
buffer [i] = (char) fgetc(stdin); buffer = realloc (buffer, buffer_size);
++i; buffer [buffer_size] = '\0';
} while ((buffer [i] != '\0') || (i != BB));
/* Checking if long comments work... */ /* Checking if long comments work... */
// Checking if long comments work... // Checking if long comments work...
while (buffer [offset] != '\0') { while (buffer [offset] != '\0') {
if ((buffer [offset] == '/') && (buffer [offset + 1] == '/')) { if ((buffer [offset] == '/') && (buffer [offset + 1] == '/')) {
offset = render_short_comment (offset); offset = render_short_comment (offset);
} else if ((buffer [offset] == '/') && (buffer [offset + 1] == '*')) { } else if ((buffer [offset] == '/') && (buffer [offset + 1] == '*')) {
offset = render_long_comment (offset); offset = render_long_comment (offset);
} else if (buffer [offset] == '\'') { } else if (buffer [offset] == '\'') {
offset = render_short_string (offset); offset = render_short_string (offset);
} else if (buffer [offset] == '"') { } else if (buffer [offset] == '"') {
offset = render_long_string (offset); offset = render_long_string (offset);
} else if (is_separator (buffer [offset]) != 0) { } else if (is_separator (buffer [offset]) != 0) {
offset = render_separator (offset); offset = render_separator (offset);
} else if ((buffer [offset] >= '0') && (buffer [offset] <= '9')) { } else if ((buffer [offset] >= '0') && (buffer [offset] <= '9')) {
offset = render_number (offset); offset = render_number (offset);
} else { } else {
offset = render_word (offset); offset = render_word (offset);
} }
render_colour (CANCEL, NORMAL); render_colour (CANCEL, NORMAL);
} }
return (0); free (buffer);
return (0);
} }