diff --git a/line.h b/line.h index ba0443b..b76ea21 100644 --- a/line.h +++ b/line.h @@ -5,6 +5,7 @@ // External includes: // - <readline/readline.h> // - <readline/history.h> +// - <glob.h> // MIT License: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction. @@ -12,13 +13,14 @@ #include <readline/history.h> #include <string.h> #include <stdbool.h> +#include <glob.h> #define HISTORY_FILE ".r_history" bool line_initialized = false; char* line_command_generator(const char* text, int state) { - static int list_index, len; + static int list_index, len = 0; const char* commands[] = {"help", "exit", "list", "review", "refactor", "obfuscate", NULL}; if (!state) { @@ -36,8 +38,33 @@ char* line_command_generator(const char* text, int state) { return NULL; } +char* line_file_generator(const char* text, int state) { + static int list_index; + glob_t glob_result; + char pattern[1024]; + + if (!state) { + list_index = 0; + snprintf(pattern, sizeof(pattern), "%s*", text); // Create a pattern for glob + glob(pattern, GLOB_NOSORT, NULL, &glob_result); + } + + if (list_index < glob_result.gl_pathc) { + return strdup(glob_result.gl_pathv[list_index++]); + } + + globfree(&glob_result); + return NULL; +} + char** line_command_completion(const char* text, int start, int end) { rl_attempted_completion_over = 1; + + // Check if the input is a file path + if (start > 0 && text[0] != ' ') { + return rl_completion_matches(text, line_file_generator); + } + return rl_completion_matches(text, line_command_generator); } @@ -61,4 +88,4 @@ char* line_read(char* prefix) { void line_add_history(char* data) { add_history(data); write_history(HISTORY_FILE); -} \ No newline at end of file +}