From 6c15c79cc045c14474cf8e4fbefc4b641cac32b3 Mon Sep 17 00:00:00 2001 From: xolatile Date: Sun, 17 Sep 2023 16:17:16 -0400 Subject: [PATCH] Extended language support... --- README.md | 7 ++-- xighlight.c | 112 ++++++++++++++++++++++++++++++++++++++---------------------- 2 files changed, 76 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index 4af9870..caa94c4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # xighlight +I'm gonna update this, I swear... + xighlight -- Program for highlighting C source code in terminal. - Quickly written program to test out xtandard and xyntax, doesn't handle files, instead it records from standard input... @@ -21,8 +23,9 @@ $ sudo sh install.sh Using: ```bash -$ cat my_c_program.c | xighlight -$ xighlight < my_c_program.c +$ cat my_c_program.ext | xighlight +$ xighlight < my_c_program.ext +$ xighlight -i my_c_program.ext ``` This is what it prints to standard output, when standard input is C source code: diff --git a/xighlight.c b/xighlight.c index fe63c06..87ecbbb 100644 --- a/xighlight.c +++ b/xighlight.c @@ -9,6 +9,39 @@ #include #include +static int highlighted = 0; + +static void echo_version (void) { + echo ("xighlight: Terminal syntax highlighter (version 144000)\n"); +} + +static void echo_license (void) { + echo ("xighlight: Terminal syntax highlighter (GNU general public license version 3)\n"); +} + +static void highlight_common (void) { /* Should be changed to support basic GCC, Clang, Valgrind and Splint output... */ + char * separators = ".,:;<=>+-*/%!&~^?|()[]{}'\" \t\r\n"; + + if (highlighted != 0) { + syntax_delete (); + } + + syntax_define_separators (separators); + + syntax_define_default (COLOUR_RED, EFFECT_NORMAL, COLOUR_CYAN, EFFECT_BOLD); + + syntax_define_range ("'", "'", '\\', COLOUR_PINK, EFFECT_BOLD); + syntax_define_range ("`", "'", '\\', COLOUR_PINK, EFFECT_BOLD); + + syntax_define_operators (".,:;<=>+*-/%!&~^?|()[]{}", COLOUR_BLUE, EFFECT_BOLD); + + (void) syntax_insert (1, 1, "abcdefghijklmnopqrstuvwxyz", syntax_separator, '\0', COLOUR_WHITE, EFFECT_NORMAL); + (void) syntax_insert (1, 1, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", syntax_separator, '\0', COLOUR_WHITE, EFFECT_BOLD); + (void) syntax_insert (1, 1, "_", syntax_separator, '\0', COLOUR_PINK, EFFECT_BOLD); + + highlighted = 1; +} + static void highlight_c (void) { char * separators = ".,:;<=>+-*/%!&~^?|()[]{}'\" \t\r\n"; @@ -19,7 +52,9 @@ static void highlight_c (void) { "char", "short", "int", "long", "signed", "unsigned", "float", "double" }; - program_mode = "C highlighting mode\n"; + if (highlighted != 0) { + syntax_delete (); + } syntax_define_separators (separators); @@ -33,6 +68,8 @@ static void highlight_c (void) { syntax_define_operators (".,:;<=>+*-/%!&~^?|()[]{}", COLOUR_BLUE, EFFECT_BOLD); syntax_define_words (keywords, 32, COLOUR_BLUE, EFFECT_NORMAL); + + highlighted = 1; } static void highlight_ada (void) { @@ -51,7 +88,9 @@ static void highlight_ada (void) { "terminate" }; - program_mode = "Ada highlighting mode\n"; + if (highlighted != 0) { + syntax_delete (); + } syntax_define_separators (separators); @@ -63,6 +102,8 @@ static void highlight_ada (void) { syntax_define_operators (".,:;<=>+-*/&|()'", COLOUR_BLUE, EFFECT_BOLD); syntax_define_words (keywords, 73, COLOUR_BLUE, EFFECT_NORMAL); + + highlighted = 1; } static void highlight_cpp (void) { @@ -84,7 +125,9 @@ static void highlight_cpp (void) { "xor_eq", "final", "override", "import", "module", "transaction_safe" }; - program_mode = "C++ highlighting mode\n"; + if (highlighted != 0) { + syntax_delete (); + } syntax_define_separators (separators); @@ -98,62 +141,47 @@ static void highlight_cpp (void) { syntax_define_operators (".,:;<=>+*-/%!&~^?|()[]{}", COLOUR_BLUE, EFFECT_BOLD); syntax_define_words (keywords, 102, COLOUR_BLUE, EFFECT_NORMAL); -} -/* -static void highlight_ (void) { - char * separators = ".,:;<=>+*-/&|()\" \t\r\n"; - - char * keywords [73] = { - }; - - syntax_define_separators (separators); - - syntax_define_default (COLOUR_RED, EFFECT_NORMAL, COLOUR_CYAN, EFFECT_BOLD); - - syntax_define_range ("--", "\n", '\0', COLOUR_GREY, EFFECT_BOLD); - syntax_define_range ("'", "'", '\0', COLOUR_PINK, EFFECT_BOLD); - syntax_define_operators (".,:;<=>+*-/&|()'", COLOUR_BLUE, EFFECT_BOLD); - - syntax_define_words (keywords, 73, COLOUR_BLUE, EFFECT_NORMAL); + highlighted = 1; } -*/ + int main (int argc, char * * argv) { int offset = 0; int select = 0; int length = 0; char * buffer = NULL; - program_name = "Xighlight -- Syntax highlighting program\n"; - program_license = "GNU/GPLv3 -- GNU General Public License (version 3)\n"; + argument_define ("-v", "--version", echo_version); + argument_define ("-l", "--license", echo_license); + argument_define ("-c", "--c", highlight_c); + argument_define ("-a", "--ada", highlight_ada); + argument_define ("-C", "--c++", highlight_cpp); - if (argc == 2) { - int type = file_type (argv [1]); - - fatal_failure (type == -1, "xighlight: Unknown file type."); + if (argc != 1) { + argument_select (argc, argv); + } - buffer = file_import (argv [1]); + if (buffer == NULL) { + if (argument_input == NULL) { + buffer = record (); + } else { + select = file_type (argument_input); + buffer = file_import (argument_input); + } + } - if ((type == FILE_TYPE_C_SOURCE) || (type == FILE_TYPE_C_HEADER)) { + if (highlighted == 0) { + if ((select == FILE_TYPE_C_SOURCE) || (select == FILE_TYPE_C_HEADER)) { highlight_c (); - } else if ((type == FILE_TYPE_ADA_BODY) || (type == FILE_TYPE_ADA_SPECIFICATION)) { + } else if ((select == FILE_TYPE_ADA_BODY) || (select == FILE_TYPE_ADA_SPECIFICATION)) { highlight_ada (); - } else if ((type == FILE_TYPE_CPP_SOURCE) || (type == FILE_TYPE_CPP_HEADER)) { + } else if ((select == FILE_TYPE_CPP_SOURCE) || (select == FILE_TYPE_CPP_HEADER)) { highlight_cpp (); } else { - echo ("0123456789" + type); - fatal_failure (1, "Unknown highlighting mode:"); + highlight_common (); } - } else { - buffer = record (); - - highlight_c (); } - echo (program_name); - echo (program_license); - echo (program_mode); - for (offset = 0; buffer [offset] != '\0'; offset += length) { select = syntax_select (& buffer [offset], & length); @@ -172,5 +200,7 @@ int main (int argc, char * * argv) { syntax_delete (); + argument_delete (); + return (EXIT_SUCCESS); }