Advanced research update early version. Fix a few bugs.

This commit is contained in:
M600 2017-02-16 12:22:24 +01:00
parent fbecb59a14
commit 2abdf8c925
10 changed files with 143 additions and 84 deletions

View file

@ -6,7 +6,7 @@
/* By: alao <alao@student.42.fr> +#+ +:+ +#+ */ /* By: alao <alao@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/02/18 11:13:04 by alao #+# #+# */ /* Created: 2016/02/18 11:13:04 by alao #+# #+# */
/* Updated: 2017/02/15 20:00:32 by alao ### ########.fr */ /* Updated: 2017/02/16 01:19:17 by alao ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -103,6 +103,7 @@ int c_rematch(t_comp *c, long int keypress);
void c_term_mv_down(t_comp *c); void c_term_mv_down(t_comp *c);
void c_term_mv_back(t_comp *c); void c_term_mv_back(t_comp *c);
void c_term_clear(t_comp *c);
void c_printer(t_comp *c); void c_printer(t_comp *c);
/* /*
@ -110,6 +111,7 @@ void c_printer(t_comp *c);
*/ */
int c_clear(t_data *s); int c_clear(t_data *s);
int c_clear_lst(t_comp *c);
char *path_solver(t_comp *c, char *cmd, char *cwd); char *path_solver(t_comp *c, char *cmd, char *cwd);
int test(t_comp *c); int test(t_comp *c);

View file

@ -6,15 +6,16 @@
/* By: alao <alao@student.42.fr> +#+ +:+ +#+ */ /* By: alao <alao@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/01/09 13:30:57 by alao #+# #+# */ /* Created: 2017/01/09 13:30:57 by alao #+# #+# */
/* Updated: 2017/02/03 17:31:46 by jhalford ### ########.fr */ /* Updated: 2017/02/16 12:02:41 by alao ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "completion.h" #include "completion.h"
/* /*
** Retrieve the path from the env and cycle through it to find the matching ** Retrieve the path from the env and create a char ** from the PATH pattern.
** element with the c_parser() function ** The function will cycle through it to find the matching element using the
** c_parser() function
*/ */
int c_seek_binary(t_data *s, t_comp *c) int c_seek_binary(t_data *s, t_comp *c)

View file

@ -6,7 +6,7 @@
/* By: alao <alao@student.42.fr> +#+ +:+ +#+ */ /* By: alao <alao@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/01/10 11:37:43 by alao #+# #+# */ /* Created: 2017/01/10 11:37:43 by alao #+# #+# */
/* Updated: 2017/02/03 17:32:05 by jhalford ### ########.fr */ /* Updated: 2017/02/16 11:37:43 by alao ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -16,7 +16,7 @@
** Clear the list from the memory ** Clear the list from the memory
*/ */
static void c_clear_lst(t_comp *c) int c_clear_lst(t_comp *c)
{ {
t_clst *c_lst; t_clst *c_lst;
t_clst *p_lst; t_clst *p_lst;
@ -35,6 +35,7 @@ static void c_clear_lst(t_comp *c)
} }
c_lst->name ? ft_memdel((void *)&c_lst->name) : (0); c_lst->name ? ft_memdel((void *)&c_lst->name) : (0);
c_lst ? ft_memdel((void *)&c_lst) : (0); c_lst ? ft_memdel((void *)&c_lst) : (0);
return (0);
} }
/* /*
@ -55,6 +56,7 @@ int c_clear(t_data *s)
ptr->trail ? ft_memdel((void *)&ptr->trail) : (0); ptr->trail ? ft_memdel((void *)&ptr->trail) : (0);
if (ptr->lst && ptr->lst->name) if (ptr->lst && ptr->lst->name)
c_clear_lst(ptr); c_clear_lst(ptr);
s->comp ? ft_memdel((void *)&s->comp) : (0);
s->comp = NULL; s->comp = NULL;
return (0); return (0);
} }

View file

@ -6,7 +6,7 @@
/* By: alao <alao@student.42.fr> +#+ +:+ +#+ */ /* By: alao <alao@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/01/09 13:31:21 by alao #+# #+# */ /* Created: 2017/01/09 13:31:21 by alao #+# #+# */
/* Updated: 2017/02/15 19:33:11 by alao ### ########.fr */ /* Updated: 2017/02/16 12:04:10 by alao ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -16,6 +16,7 @@
** If the parsing for local file fail. The function is called to check if the ** If the parsing for local file fail. The function is called to check if the
** match is actually a folder. If so, the command is updated with a trailing ** match is actually a folder. If so, the command is updated with a trailing
** slash (/). ** slash (/).
** Exemple: cd folder[tab] to cd folder/
*/ */
static int c_exclusion_folder(t_comp *c) static int c_exclusion_folder(t_comp *c)
@ -62,7 +63,7 @@ static char *c_slicer(t_comp *c)
while (i > 0 && tmp[i] && tmp[i] != '/') while (i > 0 && tmp[i] && tmp[i] != '/')
i--; i--;
tmp[i] == '/' ? i++ : (0); tmp[i] == '/' ? i++ : (0);
rt = ft_strsub(tmp, 0, i); rt = (i == (int)ft_strlen(tmp) - 1) ? NULL : ft_strsub(tmp, 0, i);
if (i <= (int)ft_strlen(tmp) - i + 1) if (i <= (int)ft_strlen(tmp) - i + 1)
c->match = ft_strsub(tmp, i, ft_strlen(tmp) - i); c->match = ft_strsub(tmp, i, ft_strlen(tmp) - i);
tmp ? ft_memdel((void *)&tmp) : (0); tmp ? ft_memdel((void *)&tmp) : (0);
@ -78,9 +79,12 @@ int c_seek_files(t_data *s, t_comp *c)
char *path; char *path;
(void)s; (void)s;
if (c->cpath == NULL)
{
path = c_slicer(c); path = c_slicer(c);
c->cpath = path_solver(c, path, NULL); c->cpath = path_solver(c, path, NULL);
path ? ft_memdel((void *)&path) : (0); path ? ft_memdel((void *)&path) : (0);
}
c_parser(c, c->cpath, c->match); c_parser(c, c->cpath, c->match);
if (c->lst == NULL) if (c->lst == NULL)
c_exclusion_folder(c); c_exclusion_folder(c);

View file

@ -6,7 +6,7 @@
/* By: alao <alao@student.42.fr> +#+ +:+ +#+ */ /* By: alao <alao@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/03 13:10:38 by alao #+# #+# */ /* Created: 2017/02/03 13:10:38 by alao #+# #+# */
/* Updated: 2017/02/15 21:00:22 by alao ### ########.fr */ /* Updated: 2017/02/16 12:10:24 by alao ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -17,48 +17,76 @@
** position of the cursor in data->line.pos. If the autocompletion occur in ** position of the cursor in data->line.pos. If the autocompletion occur in
** the middle of the command, it will join the trailing part of it. Therefor ** the middle of the command, it will join the trailing part of it. Therefor
** recreating the commands completed. ** recreating the commands completed.
** Once that done, it will clear all the memory related and return zero. ** Once that done, it will clear all the memory related and return one for the
** line edition module which will then trigger an update on the command line.
*/ */
int c_updater(t_comp *c, char *select) int c_updater(t_comp *c, char *select)
{ {
char *tmp; char *tmp;
char *rt; char *rt;
int new_pos;
tmp = NULL; tmp = NULL;
rt = NULL; rt = NULL;
new_pos = c->ircmd + (ft_strlen(select) - ft_strlen(c->match)) + 1; if (c->match)
tmp = ft_strsub(c->rcmd, 0, ft_strlen(c->rcmd) - ft_strlen(c->match)); tmp = ft_strsub(c->rcmd, 0, ft_strlen(c->rcmd) - ft_strlen(c->match));
else
tmp = ft_strdup(c->rcmd);
rt = ft_strjoin(tmp, select); rt = ft_strjoin(tmp, select);
tmp ? ft_memdel((void *)&tmp) : (0); tmp ? ft_memdel((void *)&tmp) : (0);
if (c->trail) if (c->trail)
data_singleton()->line.input = ft_strjoin(rt, c->trail); data_singleton()->line.input = ft_strjoin(rt, c->trail);
else else
data_singleton()->line.input = ft_strdup(rt); data_singleton()->line.input = ft_strdup(rt);
data_singleton()->line.pos = new_pos; data_singleton()->line.pos = ft_strlen(c->rcmd) + ft_strlen(select);
rt ? ft_memdel((void *)&rt) : (0); rt ? ft_memdel((void *)&rt) : (0);
c_clear(data_singleton()); c_clear(data_singleton());
return (1); return (1);
} }
/* /*
** Placeholder to clear the memory if an other key than tab is pressed to know ** Keypress handling function.
** if the command should be updated or not before clearing the memory. **
** The function will determine the right behavior depending on the key pressed
** If a delete key is called, the function will clear all the line and delete
** the module memory.
** if a validation key is called, the function will search for the selected
** node and call c_updater().
** If none of the above behavior is right, the function will call for
** c_rematch() which will recreate the list by adding the keypressed to the
** c->match variable.
**
** RETURN VALUE:
** If the function doesn't require an update of the command line, it will
** return 0. Else it will return 1.
**
** Keypress values that cancel the module:
** 27: Escape
** 127: Backspace
** 2117294875: Delete
**
** Keypress values that validate the choice:
** 10: Enter
** 32: Space
*/ */
int c_gtfo(t_comp *c, long int keypress) int c_gtfo(t_comp *c, long int keypress)
{ {
t_clst *ptr; t_clst *ptr;
if (keypress != 10) if (keypress == 27 || keypress == 127 || keypress == 2117294875)
{ {
// c_rematch(c, keypress); c_term_clear(c);
c_clear(data_singleton()); c_clear(data_singleton());
return (1); return (0);
} }
if (keypress == 10 || keypress == 32)
{
ptr = c->lst; ptr = c->lst;
while (!ptr->cursor) while (!ptr->cursor)
ptr = ptr->next; ptr = ptr->next;
return (c_updater(c, ptr->name)); c_updater(c, ptr->name);
return (1);
}
return ((c_rematch(c, keypress)) ? (0) : (1));
} }

View file

@ -6,7 +6,7 @@
/* By: alao <alao@student.42.fr> +#+ +:+ +#+ */ /* By: alao <alao@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/10/25 18:21:54 by alao #+# #+# */ /* Created: 2016/10/25 18:21:54 by alao #+# #+# */
/* Updated: 2017/02/03 17:32:50 by jhalford ### ########.fr */ /* Updated: 2017/02/16 12:18:45 by alao ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -55,6 +55,10 @@ char *ft_sstrtostr(char **s, char *sep)
return (tmp); return (tmp);
} }
/*
** Solve the tilde pattern in the path
*/
static char *tilde(t_comp *c, char *cmd) static char *tilde(t_comp *c, char *cmd)
{ {
char *t_home; char *t_home;
@ -75,8 +79,8 @@ static char *tilde(t_comp *c, char *cmd)
} }
/* /*
** BUILTINS: Advanced dots purge if the first is not enough. Remove a /path/ ** Advanced dots purge if the first is not enough. Remove a /path/ from
** from the raw command if .. is found. Delete the . . ** the raw command if .. is found. Delete the . .
*/ */
static char *dots_purge(char **scwd, char **scmd, int i) static char *dots_purge(char **scwd, char **scmd, int i)
@ -109,7 +113,7 @@ static char *dots_purge(char **scwd, char **scmd, int i)
} }
/* /*
** BUILTINS: Solve the dots pattern in the path ** Solve the dots pattern in the path
*/ */
static char *dots(char *cmd, char *cwd, int i) static char *dots(char *cmd, char *cwd, int i)
@ -141,7 +145,7 @@ static char *dots(char *cmd, char *cwd, int i)
} }
/* /*
** BUILTINS: Determine the type of commands and redistribute it ** Path solving function. Turn any abstract path to the full version.
*/ */
char *path_solver(t_comp *c, char *cmd, char *cwd) char *path_solver(t_comp *c, char *cmd, char *cwd)
@ -152,7 +156,7 @@ char *path_solver(t_comp *c, char *cmd, char *cwd)
dir = NULL; dir = NULL;
tmp = NULL; tmp = NULL;
ncmd = cmd ? ft_strtrim(cmd) : NULL; ncmd = (cmd != NULL) ? ft_strtrim(cmd) : NULL;
cwd = getcwd(cwd, 512); cwd = getcwd(cwd, 512);
!cwd ? cwd = ft_strdup(c->pwd) : (0); !cwd ? cwd = ft_strdup(c->pwd) : (0);
if (!ncmd || (*ncmd != '.' && *ncmd != '~' && *ncmd != '/')) if (!ncmd || (*ncmd != '.' && *ncmd != '~' && *ncmd != '/'))

View file

@ -6,17 +6,18 @@
/* By: alao <alao@student.42.fr> +#+ +:+ +#+ */ /* By: alao <alao@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/01/10 12:55:39 by alao #+# #+# */ /* Created: 2017/01/10 12:55:39 by alao #+# #+# */
/* Updated: 2017/02/15 19:28:43 by alao ### ########.fr */ /* Updated: 2017/02/16 12:20:20 by alao ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "completion.h" #include "completion.h"
/* /*
** AUTOCOMPLETION: Print the name with or without an underline and colored upon ** Print the name with or without an underline and colored upon file type
** file type as follow: ** as follow:
** - (4) Folder: Red "\e[1;31m" ** - (4) Folder: Red "\e[1;31m"
** - (10) Symlink: Cyan "\e[96m" ** - (10) Symlink: Cyan "\e[96m"
** If the element is under selection, the video mode is inverted instead.
*/ */
static void c_printer_node(t_clst *lst, int c_sx) static void c_printer_node(t_clst *lst, int c_sx)
@ -45,9 +46,9 @@ static void c_printer_node(t_clst *lst, int c_sx)
} }
/* /*
** AUTOCOMPLETION: Cycle through the line to print on the same line the ** Cycle through the line to print on the same line the number of time to
** number of time to fill it PER LINE and add 2 space after the print to ** fill it PER LINE and add 2 space after the print to accomodate the
** accomodate the trailing / for folder and a space in between. ** trailing / for folder and a space in between.
*/ */
static int c_printer_line(t_comp *c, t_clst *lst, int loop, int i) static int c_printer_line(t_comp *c, t_clst *lst, int loop, int i)
@ -78,7 +79,7 @@ static int c_printer_line(t_comp *c, t_clst *lst, int loop, int i)
} }
/* /*
** AUTOCOMPLETION: Control the number of time it cycle for LINE ** Control the number of time it cycle for LINE
*/ */
void c_printer(t_comp *c) void c_printer(t_comp *c)

View file

@ -6,15 +6,18 @@
/* By: alao <alao@student.42.fr> +#+ +:+ +#+ */ /* By: alao <alao@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/15 12:03:30 by alao #+# #+# */ /* Created: 2017/02/15 12:03:30 by alao #+# #+# */
/* Updated: 2017/02/15 20:17:55 by alao ### ########.fr */ /* Updated: 2017/02/16 12:15:28 by alao ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "completion.h" #include "completion.h"
/*
** Recreate a c->match value by adding the new key pressed to it.
*/
static int c_refresh_match(t_comp *c, long int keypress) static int c_refresh_match(t_comp *c, long int keypress)
{ {
DG("Refresh match");
char *tmp; char *tmp;
char kpconv[2]; char kpconv[2];
@ -28,44 +31,31 @@ static int c_refresh_match(t_comp *c, long int keypress)
return (0); return (0);
} }
static int c_refresh_list(t_comp *c) /*
{ ** The function is called when the module already exist and a foreign key is
DG("Refresh list"); ** pressed (like a new letter). If the input key is on the ascii table, the
t_clst *ptr; ** previous display of the list is cleared and a new c->match values is
t_clst *ptr_bk; ** created. The previous list is then cleared followed by a call to
** c_seek_files() function which will try to recreate a list. If so, the sizing
ptr = c->lst; ** is updated and the function return 1. If the research for a new listing fail
c->lst->prev->next = NULL; ** the function return 0 which will tell the next function to cancel the update
c->lst->prev = NULL; ** and clear the module memory.
while (ptr->next) */
{
DG("Refresh list loop on [%s]", ptr->name);
if (ft_strncmp(c->match, ptr->name, ft_strlen(c->match)) != 0)
{
if (ptr == c->lst)
{
c->lst = ptr->next;
c->lst->prev = NULL;
}
ptr->prev->next = ptr->next;
ptr->next->prev = ptr->prev;
ptr_bk = ptr->next;
ptr->name ? ft_memdel((void *)&ptr->name) : (0);
ptr ? ft_memdel((void *)&ptr) : (0);
ptr = ptr_bk;
}
ptr = ptr->next;
}
DG("Refresh list end");
return (0);
}
int c_rematch(t_comp *c, long int keypress) int c_rematch(t_comp *c, long int keypress)
{ {
if (ft_isascii(keypress)) if (ft_isascii(keypress))
{ {
c_term_clear(c);
c_refresh_match(c, keypress); c_refresh_match(c, keypress);
c_refresh_list(c); c_clear_lst(c);
c->lst = NULL;
c_seek_files(data_singleton(), c);
if (c->lst)
{
c_sizing(c);
return (1);
}
} }
return (0); return (0);
} }

View file

@ -6,15 +6,37 @@
/* By: alao <alao@student.42.fr> +#+ +:+ +#+ */ /* By: alao <alao@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/10/11 10:44:40 by alao #+# #+# */ /* Created: 2016/10/11 10:44:40 by alao #+# #+# */
/* Updated: 2017/02/03 17:33:08 by jhalford ### ########.fr */ /* Updated: 2017/02/16 12:16:30 by alao ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "completion.h" #include "completion.h"
/* /*
** AUTOCOMPLETION: Move the terminal up by the number of line needed and ** Clear the previous list from the screen and restore the same position.
** move it back up to the original position */
void c_term_clear(t_comp *c)
{
int i;
int lcmd;
ft_putstr(tgetstr("do", NULL));
ft_putstr(tgetstr("cd", NULL));
ft_putstr(tgetstr("up", NULL));
i = 0;
lcmd = 0;
c->rcmd ? lcmd += (int)ft_strlen(c->rcmd) + c->prompt + 1 : 0;
while (i < lcmd)
{
ft_putstr(tgetstr("nd", NULL));
i++;
}
}
/*
** Move the terminal up by the number of line needed and move it back up to
** the original position.
*/ */
void c_term_mv_back(t_comp *c) void c_term_mv_back(t_comp *c)
@ -40,8 +62,8 @@ void c_term_mv_back(t_comp *c)
} }
/* /*
** AUTOCOMPLETION: Move the terminal down by the number of line needed and ** Move the terminal down by the number of line needed and move it back up to
** move it back up to the first line under the prompt ** the first line under the prompt
*/ */
void c_term_mv_down(t_comp *c) void c_term_mv_down(t_comp *c)
@ -52,6 +74,7 @@ void c_term_mv_down(t_comp *c)
while (i < c->c_line) while (i < c->c_line)
{ {
ft_putstr(tgetstr("do", NULL)); ft_putstr(tgetstr("do", NULL));
ft_putstr(tgetstr("cd", NULL));
i++; i++;
} }
i = 0; i = 0;

View file

@ -6,7 +6,7 @@
/* By: alao <alao@student.42.fr> +#+ +:+ +#+ */ /* By: alao <alao@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/09/20 14:50:33 by alao #+# #+# */ /* Created: 2016/09/20 14:50:33 by alao #+# #+# */
/* Updated: 2017/02/15 19:30:18 by alao ### ########.fr */ /* Updated: 2017/02/16 11:47:59 by alao ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -41,11 +41,12 @@ static int c_dispatcher(t_data *s)
if (s->comp && s->comp->lst == NULL && s->comp->isfolder) if (s->comp && s->comp->lst == NULL && s->comp->isfolder)
{ {
c_clear(s); c_clear(s);
return(1); return (1);
} }
if (s->comp && s->comp->lst == NULL) if (s->comp && s->comp->lst == NULL)
{ {
c_clear(s); c_clear(s);
return (1);
} }
else if (s->comp && s->comp->lst == s->comp->lst->next) else if (s->comp && s->comp->lst == s->comp->lst->next)
return (c_updater(s->comp, s->comp->lst->name)); return (c_updater(s->comp, s->comp->lst->name));
@ -96,7 +97,10 @@ int completion(long int keypress)
if (keypress == TOUCHE_TAB) if (keypress == TOUCHE_TAB)
c_next_item(s->comp); c_next_item(s->comp);
else else
return (c_gtfo(s->comp, keypress)); {
if (c_gtfo(s->comp, keypress))
return (1);
}
} }
return (c_dispatcher(s)); return (c_dispatcher(s));
} }