diff --git a/compile.sh b/compile.sh index 891af0c..6e785c5 100644 --- a/compile.sh +++ b/compile.sh @@ -2,6 +2,6 @@ set -xe -gcc -ansi -Wall -Wextra -Wpedantic -Werror -o xighlight xighlight.c +gcc -g -ansi -Wall -Wextra -Wpedantic -Werror -o xighlight xighlight.c exit diff --git a/xighlight.c b/xighlight.c index 14df3ad..fe63c06 100644 --- a/xighlight.c +++ b/xighlight.c @@ -13,12 +13,14 @@ static void highlight_c (void) { char * separators = ".,:;<=>+-*/%!&~^?|()[]{}'\" \t\r\n"; char * 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" + "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" }; + program_mode = "C highlighting mode\n"; + syntax_define_separators (separators); syntax_define_default (COLOUR_RED, EFFECT_NORMAL, COLOUR_CYAN, EFFECT_BOLD); @@ -28,7 +30,7 @@ static void highlight_c (void) { syntax_define_range ("#", "\n", '\\', COLOUR_PINK, EFFECT_NORMAL); syntax_define_range ("'", "'", '\\', COLOUR_PINK, EFFECT_BOLD); - syntax_define_operators (".,:;<=>+*-/%!&~^?|()[]{}", COLOUR_BLUE, EFFECT_BOLD); + syntax_define_operators (".,:;<=>+*-/%!&~^?|()[]{}", COLOUR_BLUE, EFFECT_BOLD); syntax_define_words (keywords, 32, COLOUR_BLUE, EFFECT_NORMAL); } @@ -37,18 +39,20 @@ static void highlight_ada (void) { char * separators = ".,:;<=>+-*/&|()\" \t\r\n"; char * keywords [73] = { - "abort", "else", "new", "return", "abs", "elsif", "not", "reverse", - "abstract", "end", "null", "accept", "entry", "select", "access", "of", - "separate", "aliased", "exit", "or", "some", "all", "others", "subtype", - "and", "for", "out", "array", "function", "at", "tagged", "generic", - "package", "task", "begin", "goto", "pragma", "body", "private", "then", - "type", "case", "in", "constant", "until", "is", "raise", "use", - "if", "declare", "range", "delay", "limited", "record", "when", "delta", - "loop", "rem", "while", "digits", "renames", "with", "do", "mod", - "requeue", "xor", "procedure", "protected", "interface", - "synchronized", "exception", "overriding", "terminate" + "abort", "else", "new", "return", "abs", "elsif", "not", "reverse", + "abstract", "end", "null", "accept", "entry", "select", "access", "of", + "separate", "aliased", "exit", "or", "some", "all", "others", "subtype", + "and", "for", "out", "array", "function", "at", "tagged", "generic", + "package", "task", "begin", "goto", "pragma", "body", "private", "then", + "type", "case", "in", "constant", "until", "is", "raise", "use", + "if", "declare", "range", "delay", "limited", "record", "when", "delta", + "loop", "rem", "while", "digits", "renames", "with", "do", "mod", + "requeue", "xor", "procedure", "protected", "interface", "synchronized", "exception", "overriding", + "terminate" }; + program_mode = "Ada highlighting mode\n"; + syntax_define_separators (separators); syntax_define_default (COLOUR_RED, EFFECT_NORMAL, COLOUR_CYAN, EFFECT_BOLD); @@ -56,30 +60,99 @@ static void highlight_ada (void) { 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_operators (".,:;<=>+-*/&|()'", COLOUR_BLUE, EFFECT_BOLD); syntax_define_words (keywords, 73, COLOUR_BLUE, EFFECT_NORMAL); } +static void highlight_cpp (void) { + char * separators = ".,:;<=>+-*/%!&~^?|()[]{}'\" \t\r\n"; + + char * keywords [102] = { + "alignas", "alignof", "and", "and_eq", "asm", "atomic_cancel", "atomic_commit", "atomic_noexcept", + "auto", "bitand", "bitor", "bool", "break", "case", "catch", "char", + "char8_t", "char16_t", "char32_t", "class", "compl", "concept", "const", "consteval", + "constexpr", "constinit", "const_cast", "continue", "co_await", "co_return", "co_yield", "decltype", + "default", "delete", "do", "double", "dynamic_cast", "else", "enum", "explicit", + "export", "extern", "false", "float", "for", "friend", "goto", "if", + "inline", "int", "long", "mutable", "namespace", "new", "noexcept", "not", + "not_eq", "nullptr", "operator", "or", "or_eq", "private", "protected", "public", + "reflexpr", "register", "reinterpret_cast", "requires", "return", "short", "signed", "sizeof", + "static", "static_assert", "static_cast", "struct", "switch", "synchronized", "template", "this", + "thread_local", "throw", "true", "try", "typedef", "typeid", "typename", "union", + "unsigned", "using", "virtual", "void", "volatile", "wchar_t", "while", "xor", + "xor_eq", "final", "override", "import", "module", "transaction_safe" + }; + + program_mode = "C++ highlighting mode\n"; + + syntax_define_separators (separators); + + syntax_define_default (COLOUR_RED, EFFECT_NORMAL, COLOUR_CYAN, EFFECT_BOLD); + + syntax_define_range ("/*", "*/", '\0', COLOUR_GREY, EFFECT_BOLD); + syntax_define_range ("//", "\n", '\0', COLOUR_GREY, EFFECT_BOLD); + syntax_define_range ("#", "\n", '\\', COLOUR_PINK, EFFECT_NORMAL); + syntax_define_range ("'", "'", '\\', COLOUR_PINK, EFFECT_BOLD); + + 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); +} +*/ int main (int argc, char * * argv) { int offset = 0; int select = 0; int length = 0; char * buffer = NULL; - if (argc != 1) { - if (string_compare (argv [1], "c") != 0) { + program_name = "Xighlight -- Syntax highlighting program\n"; + program_license = "GNU/GPLv3 -- GNU General Public License (version 3)\n"; + + if (argc == 2) { + int type = file_type (argv [1]); + + fatal_failure (type == -1, "xighlight: Unknown file type."); + + buffer = file_import (argv [1]); + + if ((type == FILE_TYPE_C_SOURCE) || (type == FILE_TYPE_C_HEADER)) { highlight_c (); - } else if (string_compare (argv [1], "ada") != 0) { + } else if ((type == FILE_TYPE_ADA_BODY) || (type == FILE_TYPE_ADA_SPECIFICATION)) { highlight_ada (); + } else if ((type == FILE_TYPE_CPP_SOURCE) || (type == FILE_TYPE_CPP_HEADER)) { + highlight_cpp (); } else { - highlight_c (); + echo ("0123456789" + type); + fatal_failure (1, "Unknown highlighting mode:"); } } else { + buffer = record (); + highlight_c (); } - buffer = record (); + echo (program_name); + echo (program_license); + echo (program_mode); for (offset = 0; buffer [offset] != '\0'; offset += length) { select = syntax_select (& buffer [offset], & length);