/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* c_utils.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: rbousset +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/14 17:19:27 by rbousset #+# #+# */ /* Updated: 2020/02/14 17:19:29 by rbousset ### ########lyon.fr */ /* */ /* ************************************************************************** */ #include #include #include #include #include "c_init.h" #include "c_input.h" #include "m_prompt.h" #include "m_loop.h" #include "s_struct.h" static unsigned int c_redraw_next(size_t plen, unsigned int len, t_caps *tcaps) { unsigned int i; unsigned int j; i = (tcaps->nlines == tcaps->lpos) ? 0 : tcaps->ws.ws_col * (tcaps->lpos - 1); j = tcaps->nlines; if (tcaps->nlines != tcaps->lpos) { while (--j > tcaps->lpos) tputs(tgetstr("up", NULL), 1, ft_putchar); tputs(tgetstr("up", NULL), 1, ft_putchar); tputs(tgetstr("cr", NULL), 1, ft_putchar); while (i < (tcaps->cpos + plen)) { tputs(tgetstr("nd", NULL), 1, ft_putchar); i++; } } else while (len > tcaps->cpos) { tputs(tgetstr("le", NULL), 1, ft_putchar); len--; } return (len); } unsigned int c_redraw_line(char *line, t_caps *tcaps) { unsigned int i; unsigned int j; tcaps->nlines = c_get_line_num(line, tcaps->cpos, tcaps->plen, tcaps); i = 0; j = tcaps->lpos; tputs(tgetstr("cr", NULL), 1, ft_putchar); while (--j > 0) { tputs(tgetstr("sf", NULL), 1, ft_putchar); tputs(tgetstr("up", NULL), 1, ft_putchar); tputs(tgetstr("up", NULL), 1, ft_putchar); } while (i++ < tcaps->plen) tputs(tgetstr("nd", NULL), 1, ft_putchar); ft_printf("%s", line); return ((tcaps->cpos != ft_strlen(line)) ? c_redraw_next(tcaps->plen, ft_strlen(line), tcaps) : ft_strlen(line)); } void c_add_char(char **line, char *buf, t_caps *tcaps) { int i; size_t j; size_t len; char *dst; i = -1; j = 0; len = (ft_strlen(*line) + 2); if (!(dst = (char*)ft_calloc(sizeof(char), len))) return ; while (++i < (int)len) if (i == (int)tcaps->cpos) dst[i] = buf[0]; else dst[i] = line[0][j++]; ft_memdel((void**)&line[0]); *line = ft_strdup(dst); ft_memdel((void**)&dst); tcaps->cpos++; if ((((tcaps->cpos) + tcaps->plen) % tcaps->ws.ws_col) == 0) { write(STDOUT_FILENO, "\n\r", 2); return ; } c_redraw_line(*line, tcaps); } char *c_delchar(char *str, unsigned short cpos) { unsigned short i; unsigned short j; char *dst; j = 0; i = 0; if (!(dst = malloc((ft_strlen(str)) * sizeof(char)))) return (NULL); cpos -= 1; while (j < (ft_strlen(str) - 1)) { if (i == cpos) i++; dst[j] = str[i]; i++; j++; } ft_memdel((void**)&str); dst[j] = '\0'; return (dst); } void c_new_line(t_caps *tcaps) { size_t i; i = tcaps->lpos; write(1, "\n", 1); tputs(tgetstr("cr", NULL), 1, ft_putchar); c_set_term_raw(0); tcaps->cpos = 0; tputs(tgetstr("cr", NULL), 1, ft_putchar); if (i < tcaps->nlines && tcaps->nlines != 1) while (i++ < tcaps->nlines) { write(1, "\n", 1); } }