ilineset.c - gramscii - A simple editor for ASCII box-and-arrow charts Err bitreich.org 70 1Log /scm/gramscii/log.gph bitreich.org 70 1Files /scm/gramscii/files.gph bitreich.org 70 1Refs /scm/gramscii/refs.gph bitreich.org 70 1Tags /scm/gramscii/tag bitreich.org 70 1README /scm/gramscii/file/README.md.gph bitreich.org 70 1LICENSE /scm/gramscii/file/COPYING.gph bitreich.org 70 i--- Err bitreich.org 70 ilineset.c (4125B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 #define _POSIX_C_SOURCE 200112L Err bitreich.org 70 i 2 Err bitreich.org 70 i 3 #include Err bitreich.org 70 i 4 #include Err bitreich.org 70 i 5 #include Err bitreich.org 70 i 6 #include "gramscii.h" Err bitreich.org 70 i 7 Err bitreich.org 70 i 8 /** extern declarations **/ Err bitreich.org 70 i 9 Err bitreich.org 70 i 10 extern lineset_t screen; /* what is visualised */ Err bitreich.org 70 i 11 extern lineset_t cutbuf; /* cut/paste buffer */ Err bitreich.org 70 i 12 extern lineset_t *undo; /* undo list */ Err bitreich.org 70 i 13 Err bitreich.org 70 i 14 extern int undo_sz;/* allocated size of undo list*/ Err bitreich.org 70 i 15 extern int undo_cur;/* undo position */ Err bitreich.org 70 i 16 extern int undo_lst;/* last valid undo position */ Err bitreich.org 70 i 17 Err bitreich.org 70 i 18 extern int WIDTH, HEIGHT; Err bitreich.org 70 i 19 Err bitreich.org 70 i 20 extern char modified; /* set to 1 if screen modified since last save */ Err bitreich.org 70 i 21 Err bitreich.org 70 i 22 /****/ Err bitreich.org 70 i 23 Err bitreich.org 70 i 24 static int LONG_STEP; Err bitreich.org 70 i 25 Err bitreich.org 70 i 26 /* line_t and lineset_t management */ Err bitreich.org 70 i 27 Err bitreich.org 70 i 28 void ensure_line_length(line_t *l, int len){ Err bitreich.org 70 i 29 char *tmp; Err bitreich.org 70 i 30 Err bitreich.org 70 i 31 if (l->sz < len + 1){ Err bitreich.org 70 i 32 tmp = realloc(l->s, (len+1) * 2 * sizeof(char)); Err bitreich.org 70 i 33 if (tmp == NULL){ Err bitreich.org 70 i 34 fprintf(stderr, "Unable to allocate string\n"); Err bitreich.org 70 i 35 cleanup(1); Err bitreich.org 70 i 36 } Err bitreich.org 70 i 37 l->s = tmp; Err bitreich.org 70 i 38 l->sz = (len + 1) * 2; Err bitreich.org 70 i 39 } Err bitreich.org 70 i 40 } Err bitreich.org 70 i 41 Err bitreich.org 70 i 42 Err bitreich.org 70 i 43 void alloc_line(line_t *l){ Err bitreich.org 70 i 44 char *tmp; Err bitreich.org 70 i 45 Err bitreich.org 70 i 46 l->sz = WIDTH+1; Err bitreich.org 70 i 47 tmp = malloc((l->sz) * sizeof(char)); Err bitreich.org 70 i 48 if (tmp == NULL){ Err bitreich.org 70 i 49 fprintf(stderr, "unable to allocate line\n"); Err bitreich.org 70 i 50 cleanup(1); Err bitreich.org 70 i 51 } Err bitreich.org 70 i 52 l->s = tmp; Err bitreich.org 70 i 53 memset(l->s, BG, l->sz); Err bitreich.org 70 i 54 l->lst = -1; Err bitreich.org 70 i 55 l->s[0]='\0'; Err bitreich.org 70 i 56 } Err bitreich.org 70 i 57 Err bitreich.org 70 i 58 void ensure_num_lines(lineset_t *ls, int n){ Err bitreich.org 70 i 59 line_t *tmp; Err bitreich.org 70 i 60 Err bitreich.org 70 i 61 if (n > ls->sz){ Err bitreich.org 70 i 62 if (ls->sz == 0) Err bitreich.org 70 i 63 ls->l=NULL; Err bitreich.org 70 i 64 tmp = realloc(ls->l, (n + LONG_STEP) * sizeof(line_t)); Err bitreich.org 70 i 65 if (tmp == NULL){ Err bitreich.org 70 i 66 fprintf(stderr, "Unable to allocate memory for more lines"); Err bitreich.org 70 i 67 cleanup(1); Err bitreich.org 70 i 68 } Err bitreich.org 70 i 69 else { Err bitreich.org 70 i 70 ls->l = tmp; Err bitreich.org 70 i 71 while ( ls->sz < n + LONG_STEP){ Err bitreich.org 70 i 72 alloc_line(&(ls->l[ls->sz])); Err bitreich.org 70 i 73 ls->sz ++; Err bitreich.org 70 i 74 } Err bitreich.org 70 i 75 } Err bitreich.org 70 i 76 } Err bitreich.org 70 i 77 } Err bitreich.org 70 i 78 Err bitreich.org 70 i 79 Err bitreich.org 70 i 80 void dump_lines(lineset_t ls, FILE *f){ Err bitreich.org 70 i 81 int i; Err bitreich.org 70 i 82 for (i=0; i y2){ Err bitreich.org 70 i 152 y1 ^= y2; Err bitreich.org 70 i 153 y2 ^= y1; Err bitreich.org 70 i 154 y1 ^= y2; Err bitreich.org 70 i 155 } Err bitreich.org 70 i 156 if (undo_cur > undo_lst) Err bitreich.org 70 i 157 undo_cur = undo_lst; Err bitreich.org 70 i 158 if (which == PRV_STATE){ /* adding a new previous state */ Err bitreich.org 70 i 159 undo_cur += 2; Err bitreich.org 70 i 160 idx = undo_cur; Err bitreich.org 70 i 161 } Err bitreich.org 70 i 162 else Err bitreich.org 70 i 163 idx = undo_cur + 1; Err bitreich.org 70 i 164 if (idx >= undo_sz - 1){ Err bitreich.org 70 i 165 tmp = realloc(undo, (undo_sz + 10) * sizeof(lineset_t)); Err bitreich.org 70 i 166 if (tmp == NULL){ Err bitreich.org 70 i 167 fprintf(stderr, "Error allocating undo buffer"); Err bitreich.org 70 i 168 cleanup(1); Err bitreich.org 70 i 169 } Err bitreich.org 70 i 170 undo = tmp; Err bitreich.org 70 i 171 for (i=0; i<10; i++){ Err bitreich.org 70 i 172 undo[undo_sz + i].sz = 0; Err bitreich.org 70 i 173 undo[undo_sz + i].l = NULL; Err bitreich.org 70 i 174 undo[undo_sz + i].num = 0; Err bitreich.org 70 i 175 } Err bitreich.org 70 i 176 undo_sz += 10; Err bitreich.org 70 i 177 } Err bitreich.org 70 i 178 ensure_num_lines(&(undo[idx]), y2 - y1 + 1); Err bitreich.org 70 i 179 for(i=y1; i<=y2; i++){ Err bitreich.org 70 i 180 len = strlen(screen.l[i].s); Err bitreich.org 70 i 181 ensure_line_length(&(undo[idx].l[i-y1]), len); Err bitreich.org 70 i 182 strcpy(undo[idx].l[i-y1].s, screen.l[i].s); Err bitreich.org 70 i 183 undo[idx].l[i-y1].n = i; Err bitreich.org 70 i 184 undo[idx].l[i-y1].lst = screen.l[i].lst; Err bitreich.org 70 i 185 } Err bitreich.org 70 i 186 undo[idx].num = y2 - y1 + 1; Err bitreich.org 70 i 187 if (which == PRV_STATE) Err bitreich.org 70 i 188 undo_lst = undo_cur; Err bitreich.org 70 i 189 #ifdef DEBUG Err bitreich.org 70 i 190 fprintf(stderr, "undo_ring: y1: %d y2: %d idx: %d\n", y1, y2, idx); Err bitreich.org 70 i 191 for(i=0; i undo_cur) Err bitreich.org 70 i 199 undo_lst = undo_cur; Err bitreich.org 70 i 200 } Err bitreich.org 70 .