diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1938442 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +xrocedure diff --git a/compile.sh b/compile.sh new file mode 100644 index 0000000..dfe90de --- /dev/null +++ b/compile.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +set -xe + +gcc -g -ansi -Wall -Wextra -Wpedantic -Werror -o xrocedure xrocedure.c + +exit diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..f03ed33 --- /dev/null +++ b/install.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +set -xe + +cp xrocedure /usr/bin/xrocedure + +exit diff --git a/xrocedure.c b/xrocedure.c new file mode 100644 index 0000000..be07f9f --- /dev/null +++ b/xrocedure.c @@ -0,0 +1,167 @@ +#include +#include + +enum { + word_abort, word_else, word_new, word_return, word_abs, word_elsif, word_not, word_reverse, + word_abstract, word_end, word_null, word_accept, word_entry, word_select, word_access, word_of, + word_separate, word_aliased, word_exit, word_or, word_some, word_all, word_others, word_subtype, + word_and, word_for, word_out, word_array, word_function, word_at, word_tagged, word_generic, + word_package, word_task, word_begin, word_goto, word_pragma, word_body, word_private, word_then, + word_type, word_case, word_in, word_constant, word_until, word_is, word_raise, word_use, + word_if, word_declare, word_range, word_delay, word_limited, word_record, word_when, word_delta, + word_loop, word_rem, word_while, word_digits, word_renames, word_with, word_do, word_mod, + word_requeue, word_xor, word_procedure, word_protected, word_interface, word_synchronized, word_exception, word_overriding, + word_terminate, word_count +}; + +int main (void) { + char * separators = ".,:;<=>+-*/&|()\" \t\r\n"; + + char * keywords [] = { + "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" + }; + + int keycodes [word_count] = { 0 }; + int x_keyword [word_count] = { 0 }; + + int word; + + int offset = 0; + int select = 0; + int length = 0; + char * buffer = null; + + int comment, x_comment = 0, + character, x_character = 0, + string, x_string = 0, + brackets, x_brackets = 0, + operators, x_operators = 0, + number, x_number = 0, + identifier, x_identifier = 0; + + comment = syntax_define (false, false, "--", "\n", '\0', 0, 0); + character = syntax_define (false, false, "'", "'", '\\', 0, 0); + string = syntax_define (false, false, "\"", "\"", '\\', 0, 0); + + for (word = 0; word != word_count; ++word) { + keycodes [word] = syntax_define (false, true, keywords [word], separators, '\0', 0, 0); + } + + brackets = syntax_define (true, false, "()", "", '\0', 0, 0); + operators = syntax_define (true, false, ".,:;<=>+-*/&|'", "", '\0', 0, 0); + + number = syntax_define (true, true, "0123456789", separators, '\0', 0, 0); + identifier = syntax_define (true, true, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_", separators, '\0', 0, 0); + + buffer = record (); + + for (offset = 0; buffer [offset] != '\0'; offset += length) { + select = syntax_select (& buffer [offset], & length); + + if (select == comment) x_comment++; + else if (select == character) x_character++; + else if (select == string) x_string++; + else if (select == keycodes [word_abort]) x_keyword [word_abort]++; + else if (select == keycodes [word_else]) x_keyword [word_else]++; + else if (select == keycodes [word_new]) x_keyword [word_new]++; + else if (select == keycodes [word_return]) x_keyword [word_return]++; + else if (select == keycodes [word_abs]) x_keyword [word_abs]++; + else if (select == keycodes [word_elsif]) x_keyword [word_elsif]++; + else if (select == keycodes [word_not]) x_keyword [word_not]++; + else if (select == keycodes [word_reverse]) x_keyword [word_reverse]++; + else if (select == keycodes [word_abstract]) x_keyword [word_abstract]++; + else if (select == keycodes [word_end]) x_keyword [word_end]++; + else if (select == keycodes [word_null]) x_keyword [word_null]++; + else if (select == keycodes [word_accept]) x_keyword [word_accept]++; + else if (select == keycodes [word_entry]) x_keyword [word_entry]++; + else if (select == keycodes [word_select]) x_keyword [word_select]++; + else if (select == keycodes [word_access]) x_keyword [word_access]++; + else if (select == keycodes [word_of]) x_keyword [word_of]++; + else if (select == keycodes [word_separate]) x_keyword [word_separate]++; + else if (select == keycodes [word_aliased]) x_keyword [word_aliased]++; + else if (select == keycodes [word_exit]) x_keyword [word_exit]++; + else if (select == keycodes [word_or]) x_keyword [word_or]++; + else if (select == keycodes [word_some]) x_keyword [word_some]++; + else if (select == keycodes [word_all]) x_keyword [word_all]++; + else if (select == keycodes [word_others]) x_keyword [word_others]++; + else if (select == keycodes [word_subtype]) x_keyword [word_subtype]++; + else if (select == keycodes [word_and]) x_keyword [word_and]++; + else if (select == keycodes [word_for]) x_keyword [word_for]++; + else if (select == keycodes [word_out]) x_keyword [word_out]++; + else if (select == keycodes [word_array]) x_keyword [word_array]++; + else if (select == keycodes [word_function]) x_keyword [word_function]++; + else if (select == keycodes [word_at]) x_keyword [word_at]++; + else if (select == keycodes [word_tagged]) x_keyword [word_tagged]++; + else if (select == keycodes [word_generic]) x_keyword [word_generic]++; + else if (select == keycodes [word_package]) x_keyword [word_package]++; + else if (select == keycodes [word_task]) x_keyword [word_task]++; + else if (select == keycodes [word_begin]) x_keyword [word_begin]++; + else if (select == keycodes [word_goto]) x_keyword [word_goto]++; + else if (select == keycodes [word_pragma]) x_keyword [word_pragma]++; + else if (select == keycodes [word_body]) x_keyword [word_body]++; + else if (select == keycodes [word_private]) x_keyword [word_private]++; + else if (select == keycodes [word_then]) x_keyword [word_then]++; + else if (select == keycodes [word_type]) x_keyword [word_type]++; + else if (select == keycodes [word_case]) x_keyword [word_case]++; + else if (select == keycodes [word_in]) x_keyword [word_in]++; + else if (select == keycodes [word_constant]) x_keyword [word_constant]++; + else if (select == keycodes [word_until]) x_keyword [word_until]++; + else if (select == keycodes [word_is]) x_keyword [word_is]++; + else if (select == keycodes [word_raise]) x_keyword [word_raise]++; + else if (select == keycodes [word_use]) x_keyword [word_use]++; + else if (select == keycodes [word_if]) x_keyword [word_if]++; + else if (select == keycodes [word_declare]) x_keyword [word_declare]++; + else if (select == keycodes [word_range]) x_keyword [word_range]++; + else if (select == keycodes [word_delay]) x_keyword [word_delay]++; + else if (select == keycodes [word_limited]) x_keyword [word_limited]++; + else if (select == keycodes [word_record]) x_keyword [word_record]++; + else if (select == keycodes [word_when]) x_keyword [word_when]++; + else if (select == keycodes [word_delta]) x_keyword [word_delta]++; + else if (select == keycodes [word_loop]) x_keyword [word_loop]++; + else if (select == keycodes [word_rem]) x_keyword [word_rem]++; + else if (select == keycodes [word_while]) x_keyword [word_while]++; + else if (select == keycodes [word_digits]) x_keyword [word_digits]++; + else if (select == keycodes [word_renames]) x_keyword [word_renames]++; + else if (select == keycodes [word_with]) x_keyword [word_with]++; + else if (select == keycodes [word_do]) x_keyword [word_do]++; + else if (select == keycodes [word_mod]) x_keyword [word_mod]++; + else if (select == keycodes [word_requeue]) x_keyword [word_requeue]++; + else if (select == keycodes [word_xor]) x_keyword [word_xor]++; + else if (select == keycodes [word_procedure]) x_keyword [word_procedure]++; + else if (select == keycodes [word_protected]) x_keyword [word_protected]++; + else if (select == keycodes [word_interface]) x_keyword [word_interface]++; + else if (select == keycodes [word_synchronized]) x_keyword [word_synchronized]++; + else if (select == keycodes [word_exception]) x_keyword [word_exception]++; + else if (select == keycodes [word_overriding]) x_keyword [word_overriding]++; + else if (select == keycodes [word_terminate]) x_keyword [word_terminate]++; + else if (select == brackets) x_brackets++; + else if (select == operators) x_operators++; + else if (select == number) x_number++; + else if (select == identifier) x_identifier++; + } + + echo ("Comments : "); echo (number_to_string (x_comment)); echo ("\n"); + echo ("Strings : "); echo (number_to_string (x_string)); echo ("\n"); + echo ("Numbers : "); echo (number_to_string (x_number)); echo ("\n"); + + echo ("Keywords : List\n"); + + for (word = 0; word != word_count; ++word) { + if (x_keyword [word] != 0) { + echo ("\t > "); echo (keywords [word]); echo (" <> "); echo (number_to_string (x_keyword [word])); echo ("\n"); + } + } + + buffer = deallocate (buffer); + + return (log_success); +}