From eebc645dee0d15871d6cc46f156d424cd916b191 Mon Sep 17 00:00:00 2001 From: KatolaZ Date: Tue, 30 Jul 2019 12:15:54 +0100 Subject: yank buffer and initial copy/cut/paste support --- lineset.c | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 lineset.c (limited to 'lineset.c') diff --git a/lineset.c b/lineset.c new file mode 100644 index 0000000..faabb30 --- /dev/null +++ b/lineset.c @@ -0,0 +1,117 @@ +#include +#include +#include +#include "gramscii.h" + +static int LONG_STEP; + +/* line_t and lineset_t management */ + +void ensure_line_length(line_t *l, int len){ + char *tmp; + + if (l->sz < len + 1){ + tmp = realloc(l->s, (len+1) * 2 * sizeof(char)); + if (!tmp){ + fprintf(stderr, "Unable to allocate string\n"); + exit(1); + } + l->s = tmp; + l->sz = (len + 1) * 2; + } +} + + +void alloc_line(line_t *l){ + char *tmp; + + l->sz = WIDTH+1; + tmp = malloc((l->sz) * sizeof(char)); + if (tmp == NULL){ + fprintf(stderr, "unable to allocate line\n"); + exit(1); + } + l->s = tmp; + memset(l->s, BG, l->sz); + l->lst = -1; + l->s[0]='\0'; +} + +void ensure_num_lines(lineset_t *ls, int n){ + line_t *tmp; + + if (n > ls->sz){ + if (ls->sz == 0) + ls->l=NULL; + tmp = realloc(ls->l, (n + LONG_STEP) * sizeof(line_t)); + if (tmp == NULL){ + fprintf(stderr, "Unable to allocate memory for more lines"); + exit(1); + } + else { + ls->l = tmp; + while ( ls->sz < n + LONG_STEP){ + alloc_line(&(ls->l[ls->sz])); + ls->sz ++; + } + } + } +} + +void dump_lines(lineset_t ls, FILE *f){ + int i; + for (i=0; i