From e7a62d595ba9b2fc4633854f0eb0725ecf613aaf Mon Sep 17 00:00:00 2001 From: xolatile Date: Tue, 22 Aug 2023 05:43:24 -0400 Subject: [PATCH] Adding... --- example/compile.sh | 8 +++ example/example | Bin 0 -> 21520 bytes example/example.c | 84 +++++++++++++++++++++++++ install.sh | 8 +++ xyntax.h | 178 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 278 insertions(+) create mode 100644 example/compile.sh create mode 100755 example/example create mode 100644 example/example.c create mode 100644 install.sh create mode 100644 xyntax.h diff --git a/example/compile.sh b/example/compile.sh new file mode 100644 index 0000000..2aee9d5 --- /dev/null +++ b/example/compile.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +set -xe + +gcc -ansi -Wall -Wextra -Wpedantic -o example example.c +cat example.c | ./example + +exit diff --git a/example/example b/example/example new file mode 100755 index 0000000000000000000000000000000000000000..b39d9ae6e374c8e29dd65bdccd129c1568716496 GIT binary patch literal 21520 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 literal 0 HcmV?d00001 diff --git a/example/example.c b/example/example.c new file mode 100644 index 0000000..911423b --- /dev/null +++ b/example/example.c @@ -0,0 +1,84 @@ +#define XYNTAX_DECLARATION +#define XYNTAX_DEFINITION + +#include + +#define ALLOCATION_CHUNK (1024) + +int main (void) { + int buffer_size = 0; + int offset = 0; + int word = 0; + char * buffer = NULL; + + char separator [29] = ".,:;<=>+-*/%!&~^()[]{}'\" \t\r\n"; + + char * c_keywords [32] = { + "register", "volatile", "auto", "const", "static", "extern", "if", "else", + "do", "while", "for", "continue", "switch", "case", "default", "break", + "enum", "union", "struct", "typedef", "goto", "void", "return", "sizeof", + "char", "short", "int", "long", "signed", "unsigned", "float", "double" + }; + + char * c_preprocessor [8] = { + "#include", "#define", "#ifdef", "#ifndef", "#undef", "#elif", "#if", "#endif" + }; + + char * c_common [4] = { + "NULL", "FILE", "size_t", "ssize_t" + }; + + xyntax_define (0, 0, 0, "//", "\n", '\0', XYNTAX_GREY, XYNTAX_BOLD); + xyntax_define (0, 0, 0, "/*", "*/", '\0', XYNTAX_GREY, XYNTAX_BOLD); + xyntax_define (0, 0, 0, "'", "'", '\\', XYNTAX_PINK, XYNTAX_BOLD); + xyntax_define (0, 0, 0, "\"", "\"", '\\', XYNTAX_RED, XYNTAX_BOLD); + + do { + xyntax_define (0, 0, 1, c_keywords [word], separator, '\0', XYNTAX_YELLOW, XYNTAX_BOLD); + } while (++word != 32); + + word = 0; + + do { + xyntax_define (0, 0, 1, c_preprocessor [word], separator, '\0', XYNTAX_YELLOW, XYNTAX_NORMAL); + } while (++word != 8); + + word = 0; + + do { + xyntax_define (0, 0, 1, c_common [word], separator, '\0', XYNTAX_YELLOW, XYNTAX_NORMAL); + } while (++word != 4); + + xyntax_define (0, 1, 0, "()[]{}", "", '\0', XYNTAX_GREEN, XYNTAX_BOLD); + xyntax_define (0, 1, 0, ".,:;<=>+-*/%!&~^", "", '\0', XYNTAX_BLUE, XYNTAX_BOLD); + xyntax_define (0, 1, 1, "0123456789", separator, '\0', XYNTAX_CYAN, XYNTAX_BOLD); + xyntax_define (0, 1, 1, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", separator, '\0', XYNTAX_PINK, XYNTAX_ITALIC); + xyntax_define (0, 1, 1, "abcdefghijklmnopqrstuvwxyz", separator, '\0', XYNTAX_WHITE, XYNTAX_ITALIC); + xyntax_define (0, 0, 1, "_", separator, '\0', XYNTAX_YELLOW, XYNTAX_ITALIC); + + buffer = realloc (buffer, ALLOCATION_CHUNK); + + do { + if ((buffer_size + 1) % ALLOCATION_CHUNK == 0) { + buffer = realloc (buffer, (unsigned long int) ((buffer_size + 1) / ALLOCATION_CHUNK + 1) * ALLOCATION_CHUNK); + } + + buffer [buffer_size] = '\0'; + + (void) read (STDIN_FILENO, & buffer [buffer_size], sizeof (* buffer)); + + ++buffer_size; + } while (buffer [buffer_size - 1] != '\0'); + + buffer [buffer_size - 1] = '\0'; + + do { + offset += xyntax_output (& buffer [offset]); + } while (buffer [offset] != '\0'); + + free (buffer); + + xyntax_delete (); + + return (EXIT_SUCCESS); +} diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..9a59e20 --- /dev/null +++ b/install.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +set -xe + +sudo mkdir /usr/include/xolatile +sudo cp xyntax.h /usr/include/xolatile/xyntax.h + +exit diff --git a/xyntax.h b/xyntax.h new file mode 100644 index 0000000..4b6f337 --- /dev/null +++ b/xyntax.h @@ -0,0 +1,178 @@ +/* + * 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 +#include +#include + +#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