summaryrefslogtreecommitdiffstats
path: root/src/c_utils.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/c_utils.c155
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));
+}