X-Git-Url: https://git.distorted.org.uk/~mdw/termux-packages/blobdiff_plain/6ee3449e0c47b9bc2b1d88820fd1b7341eb35a51..72f69cdc35d351db485f2021d9a98d4101e88bc8:/packages/command-not-found/command-not-found.c diff --git a/packages/command-not-found/command-not-found.c b/packages/command-not-found/command-not-found.c index 08641a25..a43a8ea6 100644 --- a/packages/command-not-found/command-not-found.c +++ b/packages/command-not-found/command-not-found.c @@ -2,14 +2,13 @@ #include #include -#define STRINGIFY(x) #x -#define TOSTRING(x) STRINGIFY(x) +#include "commands.h" -inline int termux_min3(unsigned int a, unsigned int b, unsigned int c) { +static inline int termux_min3(unsigned int a, unsigned int b, unsigned int c) { return (a < b ? (a < c ? a : c) : (b < c ? b : c)); } -int termux_levenshtein_distance(char const* restrict s1, char const* restrict s2) { +static int termux_levenshtein_distance(char const* restrict s1, char const* restrict s2) { unsigned int s1len = strlen(s1); unsigned int s2len = strlen(s2); unsigned int matrix[s2len+1][s1len+1]; @@ -31,30 +30,20 @@ int main(int argc, char** argv) { } char* command_not_found = argv[1]; - FILE* commands_file = fopen(TOSTRING(TERMUX_COMMANDS_LISTING), "r"); - if (commands_file == NULL) { - perror(TOSTRING(TERMUX_COMMANDS_LISTING)); - return 1; - } - int best_distance = -1; int guesses_at_best_distance = 0; char current_package[128]; char best_package_guess[128]; char best_command_guess[128]; - char* current_line = NULL; - while (true) { - size_t buffer_length = sizeof(current_line); - ssize_t read_bytes = getline(¤t_line, &buffer_length, commands_file); - if (read_bytes <= 1) break; - size_t line_length = strlen(current_line); - current_line[line_length-1] = 0; + const int num_commands = sizeof(commands) / sizeof(commands[0]); + for (int i = 0; i < num_commands; i++) { + char const* current_line = commands[i]; if (current_line[0] == ' ') { // Binary - char* binary_name = current_line + 1; + char const* binary_name = current_line + 1; int distance = termux_levenshtein_distance(command_not_found, binary_name); if (distance == 0 && strcmp(command_not_found, binary_name) == 0) { - printf("The program '%s' is currently not installed. You can install it by executing:\n apt install %s\n", binary_name, current_package); - return 0; + printf("The program '%s' is not installed. Install it by executing:\n apt install %s\n", binary_name, current_package); + return 127; } else if (best_distance == distance) { guesses_at_best_distance++; } else if (best_distance == -1 || best_distance > distance) { @@ -77,15 +66,10 @@ int main(int argc, char** argv) { printf(" Command '%s' from package '%s'\n", best_command_guess, best_package_guess); } else { // Multiple suggestions at the same distance - show them all: - rewind(commands_file); - while (true) { - size_t buffer_length = sizeof(current_line); - ssize_t read_bytes = getline(¤t_line, &buffer_length, commands_file); - if (read_bytes <= 1) break; - size_t line_length = strlen(current_line); - current_line[line_length-1] = 0; + for (int i = 0; i < num_commands; i++) { + char const* current_line = commands[i]; if (current_line[0] == ' ') { // Binary - char* binary_name = current_line + 1; + char const* binary_name = current_line + 1; int distance = termux_levenshtein_distance(command_not_found, binary_name); if (best_distance == distance) { printf(" Command '%s' from package '%s'\n", binary_name, current_package); @@ -96,5 +80,6 @@ int main(int argc, char** argv) { } } } + return 127; }