minishell/prompt/tab_get_word.c
2025-06-04 14:58:04 +02:00

89 lines
2.8 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* tab_get_word.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: vvobis <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/08/02 17:00:19 by vvobis #+# #+# */
/* Updated: 2024/08/26 18:22:17 by vvobis ### ########.fr */
/* */
/* ************************************************************************** */
#include "../minishell.h"
static char *find_next_match( char *current_word, \
uint32_t current_word_length, \
DIR *directory_current, \
bool *is_directory)
{
struct dirent *directory_entry;
char *next_word_match;
*is_directory = false;
next_word_match = NULL;
if (!current_word || !directory_current || !*current_word)
return (NULL);
while (1)
{
directory_entry = readdir(directory_current);
if (directory_entry == NULL)
break ;
if (ft_strncmp(current_word, \
directory_entry->d_name, \
current_word_length) == 0)
{
next_word_match = directory_entry->d_name;
if (directory_entry->d_type == DT_DIR)
*is_directory = true;
}
}
return (next_word_match);
}
uint32_t get_current_word_length(char *word)
{
char *word_end;
if (!word)
return (0);
else if (*word == ' ')
return (1);
word_end = ft_strchr(word, ' ');
if (word_end)
return (word_end - word);
return (ft_strlen(word));
}
void get_next_word_match( char **input, \
t_prompt *prompt, \
char *input_path, \
bool *is_directory)
{
DIR *directory_current;
uint32_t current_word_length;
char *next_word_match;
char *current_word;
current_word = determine_word(*input, &input_path, \
prompt->cursor_position[1]);
current_word_length = get_current_word_length(current_word);
if (input_path)
directory_current = opendir(input_path);
else
directory_current = opendir("./");
next_word_match = find_next_match(current_word, current_word_length, \
directory_current, is_directory);
if (!next_word_match)
handle_tab_no_match(input_path, env_static(NULL), \
prompt->cursor_position, prompt);
else
handle_tab_yes_match(prompt, next_word_match, input, \
ft_strlen(current_word));
if (*is_directory)
handle_new_character_to_input(input, '/', prompt->cursor_position, \
ft_strlen(*input));
closedir(directory_current);
ft_free(&input_path);
}