aboutsummaryrefslogtreecommitdiff
path: root/xighlight.c
diff options
context:
space:
mode:
Diffstat (limited to 'xighlight.c')
-rw-r--r--xighlight.c123
1 files changed, 123 insertions, 0 deletions
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);
+}