98 lines
3 KiB
C
98 lines
3 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* c_init.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: alao <alao@student.42.fr> +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* Created: 2017/01/09 11:21:16 by alao #+# #+# */
|
|
/* Updated: 2017/03/22 14:21:51 by gwojda ### ########.fr */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
#include "completion.h"
|
|
|
|
/*
|
|
** Trim if there's many commands in a raw separed with a semi colon.
|
|
** The cutpoint is saved and also between char **.
|
|
*/
|
|
|
|
static char *c_trimmer(char *cmd, int st, int nd)
|
|
{
|
|
char *rt;
|
|
char *tmp;
|
|
int len;
|
|
|
|
rt = NULL;
|
|
tmp = NULL;
|
|
len = ft_strlen(cmd);
|
|
if (st == len)
|
|
st--;
|
|
while (st && cmd[st] && cmd[st] != ';')
|
|
st--;
|
|
cmd[st] == ';' ? st++ : (0);
|
|
while (nd < len && cmd[nd] && cmd[nd] != ';' && cmd[nd] != ' ')
|
|
nd++;
|
|
rt = ft_strsub(cmd, st, nd - st);
|
|
data_singleton()->comp->cutpoint = st;
|
|
st = 0;
|
|
tmp = ft_strsub(rt, st, ft_strlen(rt) - st);
|
|
if (st)
|
|
data_singleton()->comp->between = ft_strsub(rt, 0, st);
|
|
rt ? ft_memdel((void *)&rt) : (0);
|
|
return (tmp);
|
|
}
|
|
|
|
/*
|
|
** Norme function for c_init().
|
|
*/
|
|
|
|
static void c_init_base(t_comp *c)
|
|
{
|
|
struct winsize win;
|
|
|
|
ioctl(0, TIOCGWINSZ, &win);
|
|
c->win_x = win.ws_col;
|
|
c->win_y = win.ws_row;
|
|
c->m_size = data_singleton()->line.prompt_size;
|
|
c->m_size += ft_strlen(data_singleton()->line.input);
|
|
c->m_size = (c->m_size / c->win_y);
|
|
c->m_size = c->win_y - c->m_size - 1;
|
|
c->pos_x = 1;
|
|
c->pos_y = 1;
|
|
c->cutpoint = 0;
|
|
c->between = NULL;
|
|
c->isfolder = 0;
|
|
c->isrematch = 0;
|
|
c->match = NULL;
|
|
c->cpath = NULL;
|
|
c->lst = NULL;
|
|
c->trail = NULL;
|
|
c->start = NULL;
|
|
}
|
|
|
|
/*
|
|
** Init the completion structure by populating the default value from the main
|
|
** structure data and call for the c_matching() function.
|
|
*/
|
|
|
|
void c_init(t_data *s, long int input)
|
|
{
|
|
int len_trail;
|
|
|
|
if (!(s->comp = (t_comp *)ft_malloc((sizeof(t_comp)))))
|
|
return ;
|
|
c_init_base(s->comp);
|
|
s->comp->rcmd = c_trimmer(s->line.input, s->line.pos, s->line.pos);
|
|
len_trail = ft_strlen(s->line.input) - s->line.pos;
|
|
if (s->comp->cutpoint)
|
|
s->comp->start = ft_strsub(s->line.input, 0, s->comp->cutpoint);
|
|
if (ft_strlen(s->line.input) > s->line.pos)
|
|
s->comp->trail = ft_strsub(s->line.input, s->line.pos, len_trail);
|
|
s->comp->ircmd = s->line.pos;
|
|
s->comp->key = input;
|
|
s->comp->prompt = s->line.prompt_size;
|
|
s->comp->home = ft_strdup(ft_getenv(s->env, "HOME"));
|
|
s->comp->pwd = ft_strdup(ft_getenv(s->env, "PWD"));
|
|
c_matching(s, s->comp);
|
|
}
|