From c53055c9b71af24644d7a984e2309ebbc042449f Mon Sep 17 00:00:00 2001 From: Ognjen Milan Robovic Date: Sun, 20 Apr 2025 10:07:41 +0000 Subject: For the love... Of everything good... --- xighlight.c | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 xighlight.c (limited to 'xighlight.c') diff --git a/xighlight.c b/xighlight.c new file mode 100644 index 0000000..3faa370 --- /dev/null +++ b/xighlight.c @@ -0,0 +1,123 @@ +/// _ _ _ _ _ _ +/// __ _(_) __ _| |__ | (_) __ _| |__ | |_ +/// \ \/ / |/ _` | '_ \| | |/ _` | '_ \| __| +/// > <| | (_| | | | | | | (_| | | | | |_ +/// /_/\_\_|\__, |_| |_|_|_|\__, |_| |_|\__| +/// |___/ |___/ +/// +/// Copyright (c) 1997 - Ognjen 'xolatile' Milan Robovic +/// +/// xolatile@chud.cyou - xighlight - Generic source code terminal highlighter using VT100 escape sequences, very very slow... +/// +/// This program is free software, free as in freedom and as in free beer, you can redistribute it and/or modify it under the terms of the GNU +/// General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version if you wish... +/// +/// This program is distributed in the hope that it will be useful, but it is probably not, and without any warranty, without even the implied +/// warranty of merchantability or fitness for a particular purpose, because it is pointless. Please see the GNU (Geenoo) General Public License +/// for more details, if you dare, it is a lot of text that nobody wants to read... + +#include "xtandard.h" +#include "xyntax.h" +#include "xanguage.h" + +static procedure conditionally_exit (language_structure * language, syntax_structure * syntax, boolean terminate) { + syntax = syntax_deinitialize (syntax); + language = language_deinitialize (language); + + if (terminate == true) { + exit (log_success); + } +} + +static procedure print_common (none) { + print ("/B/4xighlight/-: /4Terminal syntax highlighter/-\n\n"); + print ("\tAuthor: /4Ognjen 'xolatile' Milan Robovic/-\n"); + print ("\tLicense: /4GNU//GPLv3/-\n\n"); +} + +static procedure print_help (none) { + print_common (); + + print ("Example usage:\n\n"); + print ("\t/6$ cat file.ext | xighlight [flags]/- /0---/- You need to pass language flag in this case.\n"); + print ("\t/6$ xighlight [flags] < file.ext/- /0---/- You need to pass language flag in this case.\n"); + print ("\t/6$ xighlight file.ext/- /0---/- Language is automatically detected in this case.\n\n"); + print ("Supported languages:\n\n"); + + for (language_enumeration index = 0; index < language_count; ++index) { + character align [32] = ""; + + print ("\t/B/4%s/- /4%s/- /0---/- %s syntax highlighting\n", + language_short_option [index], + string_align_left (string_copy (align, language_long_option [index]), 9, ' '), + language_identifier [index]); + } +} + +static procedure print_version (none) { + print_common (); + + print ("\tVersion: /40 (Zero)/-\n"); +} + +integer main (integer argc, character * * argv) { + natural select = language_count; + natural length = 0; + character * buffer = null; + + syntax_structure * syntax = syntax_initialize (360); + language_structure * language = language_initialize (false); + + for (integer argument = 1; argument < argc; ++argument) { + if (argument_compare (argv [argument], "-h", "--help") == true) { + print_help (); + conditionally_exit (language, syntax, true); + } else if (argument_compare (argv [argument], "-v", "--version") == true) { + print_version (); + conditionally_exit (language, syntax, true); + } + + for (natural index = 0; index < language_count; ++index) { + if (argument_compare (argv [argument], language_short_option [index], language_long_option [index]) == true) { + (* (language_highlighter [index])) (language, syntax); + select = index; + break; + } + } + + if (file_exists (argv [argument]) == true) { + if (select == language_count) { + select = (natural) file_type (argv [argument]); + } + if (buffer == null) { + buffer = file_import (argv [argument]); + } + } + } + + if (buffer == null) { + buffer = record (); + } + + language_conditionally_select (language, syntax, select); + + for (natural offset = 0; buffer [offset] != '\0'; offset += length) { + select = syntax_select (syntax, & buffer [offset], & length); + + if (select >= syntax->count) { + echo_colour (colour_white, effect_normal); + } else { + echo_colour (syntax->colour [select], syntax->effect [select]); + } + + output (& buffer [offset], length); + + echo_cancel (); + } + + conditionally_exit (language, syntax, false); + + buffer = deallocate (buffer); + + return (log_success); +} -- cgit v1.2.3