/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* 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 #include "c_init.h" #include "c_input.h" #include "m_prompt.h" #include "m_loop.h" #include "s_struct.h" /* ** TODO: ** delchar MOVE ** END MONGARS ** NORME ** FLECHES UP DOWN ** C-c globul pid */ uint16_t c_get_win_size(struct winsize *ws) { if (!(ioctl(STDOUT_FILENO, TIOCGWINSZ, ws))) return (-1); if (!ws->ws_col) ws->ws_col = 80; if (!ws->ws_row) ws->ws_row = 80; return (1); } int16_t c_new_line(char *line, t_msh *msh, t_caps *tcaps) { write(1, "\n", 1); tputs(tgetstr("cr", NULL), 1, ft_putchar); c_set_term_raw(0); if (line != NULL) { m_parse_and_run_line(line, msh); line = NULL; free(line); } tcaps->cpos = 0; tputs(tgetstr("cr", NULL), 1, ft_putchar); c_set_term_raw(1); m_prompt_psx(1, msh); return (1); } char *c_insert_char(char *str, char c, t_caps *tcaps) { size_t i; size_t j; size_t len; char *dst; i = 0; j = 0; len = (ft_strlen(str) + 2); if (!(dst = (char*)malloc((len) * sizeof(char)))) return (NULL); while (i < len) { if (i == tcaps->cpos) { dst[i] = c; i++; } else { dst[i] = str[j]; i++; j++; } } ft_memdel((void**)&str); return (dst); } char *c_delchar(char *str, uint16_t cpos) { char *dst; uint16_t i; uint16_t j; 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); } int16_t c_redraw_line(char *line, t_caps *tcaps, t_msh *msh) { uint32_t i; uint32_t len; uint32_t mod; int16_t ret; i = 0; tcaps->nlines = c_get_line_num(line, tcaps->cpos, ft_strlen(msh->ps[0]), tcaps); len = ft_strlen(line); mod = (tcaps->ws.ws_col); tputs(tgetstr("cr", NULL), 1, ft_putchar); if (((tcaps->cpos + ft_strlen(msh->ps[0])) % mod) == 0) { tputs(tgetstr("sf", NULL), 1, ft_putchar); return (1); } while (--tcaps->lpos > 0) { tputs(tgetstr("sf", NULL), 1, ft_putchar); tputs(tgetstr("up", NULL), 1, ft_putchar); tputs(tgetstr("up", NULL), 1, ft_putchar); } while (i < ft_strlen(msh->ps[0])) { tputs(tgetstr("nd", NULL), 1, ft_putchar); i++; } tcaps->nlines = c_get_line_num(line, tcaps->cpos, ft_strlen(msh->ps[0]), tcaps); ret = ft_printf("%s", line); i = (tcaps->nlines == (tcaps->lpos)) ? 0 : tcaps->ws.ws_col * (tcaps->lpos - 1); if (tcaps->cpos != len) { if (tcaps->nlines != tcaps->lpos) { while (--tcaps->nlines > tcaps->lpos) tputs(tgetstr("up", NULL), 1, ft_putchar); tputs(tgetstr("up", NULL), 1, ft_putchar); tputs(tgetstr("cr", NULL), 1, ft_putchar); /* cr, cpos mauvaise col, bonne ligne */ while (i <= (tcaps->cpos + ft_strlen(msh->ps[0]))) { tputs(tgetstr("nd", NULL), 1, ft_putchar); /* cr, cpos mauvaise col, bonne ligne */ i++; } } else while (--len > tcaps->cpos) tputs(tgetstr("le", NULL), 1, ft_putchar); } tcaps->nlines = c_get_line_num(line, tcaps->cpos, ft_strlen(msh->ps[0]), tcaps); return (ret); }