diff options
author | JozanLeClerc <bousset.rudy@gmail.com> | 2020-11-02 15:08:38 +0100 |
---|---|---|
committer | JozanLeClerc <bousset.rudy@gmail.com> | 2020-11-02 15:08:38 +0100 |
commit | e0a74558be8d71054ae3c8e6afe8774fc1890b84 (patch) | |
tree | 57bc32451216e00fac58bd8f79eee12543badf56 /src/c_utils.c | |
parent | No more fixed int (diff) | |
download | 42-minishell-e0a74558be8d71054ae3c8e6afe8774fc1890b84.tar.gz 42-minishell-e0a74558be8d71054ae3c8e6afe8774fc1890b84.tar.bz2 42-minishell-e0a74558be8d71054ae3c8e6afe8774fc1890b84.tar.xz 42-minishell-e0a74558be8d71054ae3c8e6afe8774fc1890b84.tar.zst 42-minishell-e0a74558be8d71054ae3c8e6afe8774fc1890b84.zip |
Caps files
Diffstat (limited to 'src/c_utils.c')
-rw-r--r-- | src/c_utils.c | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/src/c_utils.c b/src/c_utils.c new file mode 100644 index 0000000..043bd27 --- /dev/null +++ b/src/c_utils.c @@ -0,0 +1,155 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* c_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/14 17:19:27 by rbousset #+# #+# */ +/* Updated: 2020/02/14 17:19:29 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include <libft.h> +#include <stdlib.h> +#include <term.h> +#include <unistd.h> + +#include "c_init.h" +#include "c_input.h" +#include "m_prompt.h" +#include "m_loop.h" +#include "s_struct.h" + +char + *c_new_line(char *line, t_caps *tcaps) +{ + char *ret; + size_t i; + + i = tcaps->lpos; + ret = NULL; + write(1, "\n", 1); + tputs(tgetstr("cr", NULL), 1, ft_putchar); + c_set_term_raw(0); + if (line != NULL) + { + ret = ft_strdup(line); + line[0] = '\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); + } + return (ret); +} + +char + *c_insert_char(char *str, char c, t_caps *tcaps) +{ + int32_t i; + size_t j; + size_t len; + char *dst; + + i = -1; + j = 0; + len = (ft_strlen(str) + 2); + if (!(dst = (char*)malloc((len) * sizeof(char)))) + return (NULL); + while (++i < (int32_t)len) + { + if (i == (int32_t)tcaps->cpos) + dst[i] = c; + else + { + dst[i] = str[j]; + 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); +} + +static int16_t + c_redraw_next(size_t plen, uint32_t len, t_caps *tcaps) +{ + uint32_t i; + uint32_t 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); +} + +int16_t + c_redraw_line(char *line, t_caps *tcaps, t_msh *msh) +{ + uint32_t i; + uint32_t j; + + tcaps->nlines = c_get_line_num(line, tcaps->cpos, + ft_strlen(msh->ps[tcaps->psx]), 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++ < ft_strlen(msh->ps[tcaps->psx])) + tputs(tgetstr("nd", NULL), 1, ft_putchar); + ft_printf("%s", line); + return ((tcaps->cpos != ft_strlen(line)) ? + c_redraw_next(ft_strlen(msh->ps[tcaps->psx]), ft_strlen(line), tcaps) : + ft_strlen(line)); +} |