ipreliminary support for undo - 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
1commit 526ce3a130732d4a2374a6e36a689d9e0cf5cc34 /scm/gramscii/commit/526ce3a130732d4a2374a6e36a689d9e0cf5cc34.gph bitreich.org 70
1parent 6da2f3f89afda08eeba385da1c36414154113d47 /scm/gramscii/commit/6da2f3f89afda08eeba385da1c36414154113d47.gph bitreich.org 70
hAuthor: KatolaZ <katolaz@freaknet.org> URL:mailto:katolaz@freaknet.org bitreich.org 70
iDate: Wed, 31 Jul 2019 00:10:35 +0100 Err bitreich.org 70
i Err bitreich.org 70
ipreliminary support for undo Err bitreich.org 70
i Err bitreich.org 70
iDiffstat: Err bitreich.org 70
i M TODO | 2 +- Err bitreich.org 70
i M draw.c | 55 ++++++++++++++++++++++++++++--- Err bitreich.org 70
i M gramscii.h | 13 ++++++++++++- Err bitreich.org 70
i M lineset.c | 43 ++++++++++++++++++++++++++++++ Err bitreich.org 70
i M main.c | 6 ++++++ Err bitreich.org 70
i M screen.c | 4 ++++ Err bitreich.org 70
i Err bitreich.org 70
i6 files changed, 117 insertions(+), 6 deletions(-) Err bitreich.org 70
i--- Err bitreich.org 70
1diff --git a/TODO b/TODO /scm/gramscii/file/TODO.gph bitreich.org 70
i@@ -1,4 +1,5 @@ Err bitreich.org 70
i + optimize redraws (redraw only the modified rectangle) Err bitreich.org 70
i++ undo (by storing lines changed across insert/remove operations) Err bitreich.org 70
i - fix bug with 'g' commands in arrow mode Err bitreich.org 70
i - add screen geometry option (-g 25x80?) Err bitreich.org 70
i - read file at point Err bitreich.org 70
i@@ -18,7 +19,6 @@ Err bitreich.org 70
i * yank Err bitreich.org 70
i * fill Err bitreich.org 70
i * cut Err bitreich.org 70
i-- undo (by storing lines changed across insert/remove operations) Err bitreich.org 70
i - manage special chars (DEL/CANC) during text insert Err bitreich.org 70
i (also do not print unmanaged chars!) Err bitreich.org 70
i - allow scrolling (both vertical and horizontal) Err bitreich.org 70
1diff --git a/draw.c b/draw.c /scm/gramscii/file/draw.c.gph bitreich.org 70
i@@ -1,4 +1,5 @@ Err bitreich.org 70
i #include <stdlib.h> Err bitreich.org 70
i+#include <string.h> Err bitreich.org 70
i Err bitreich.org 70
i #include "gramscii.h" Err bitreich.org 70
i #include "config.h" Err bitreich.org 70
i@@ -103,16 +104,19 @@ void draw_box(int x1, int y1, int fix){ Err bitreich.org 70
i int i; Err bitreich.org 70
i void (*f)(int, int, char); Err bitreich.org 70
i Err bitreich.org 70
i- if (fix == FIX) Err bitreich.org 70
i- f = set_xy; Err bitreich.org 70
i- else Err bitreich.org 70
i- f = draw_xy; Err bitreich.org 70
i Err bitreich.org 70
i xmin = MIN(x, x1); Err bitreich.org 70
i xmax = MAX(x, x1); Err bitreich.org 70
i ymin = MIN(y, y1); Err bitreich.org 70
i ymax = MAX(y, y1); Err bitreich.org 70
i Err bitreich.org 70
i+ if (fix == FIX){ Err bitreich.org 70
i+ f = set_xy; Err bitreich.org 70
i+ copy_lines_to_ring(ymin, ymax, CUR); Err bitreich.org 70
i+ } Err bitreich.org 70
i+ else Err bitreich.org 70
i+ f = draw_xy; Err bitreich.org 70
i+ Err bitreich.org 70
i for(i=xmin+1; i<=xmax; i++){ Err bitreich.org 70
i f(i, ymin, line_h); Err bitreich.org 70
i f(i, ymax, line_h); Err bitreich.org 70
i@@ -125,6 +129,8 @@ void draw_box(int x1, int y1, int fix){ Err bitreich.org 70
i f(xmin, ymax, corner); Err bitreich.org 70
i f(xmax, ymin, corner); Err bitreich.org 70
i f(xmax, ymax, corner); Err bitreich.org 70
i+ if (fix == FIX) Err bitreich.org 70
i+ copy_lines_to_ring(ymin, ymax, LST); Err bitreich.org 70
i show_cursor(); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i@@ -157,6 +163,7 @@ update_box: Err bitreich.org 70
i Err bitreich.org 70
i void draw_arrow(int x, int y, char *a, int a_len, int fix){ Err bitreich.org 70
i Err bitreich.org 70
i+ /* FIXME: copy affected lines to undo */ Err bitreich.org 70
i int i, j, cur_dir; Err bitreich.org 70
i char line; Err bitreich.org 70
i void (*f)(int, int, char); Err bitreich.org 70
i@@ -266,6 +273,7 @@ void do_erase(int x1, int y1){ Err bitreich.org 70
i Err bitreich.org 70
i Err bitreich.org 70
i void erase(FILE *fc){ Err bitreich.org 70
i+ /*FIXME: add affected lines to undo */ Err bitreich.org 70
i char c; Err bitreich.org 70
i int orig_x = x, orig_y = y; Err bitreich.org 70
i status_bar(); Err bitreich.org 70
i@@ -308,8 +316,11 @@ void visual_box(FILE *fc){ Err bitreich.org 70
i case 'x':/* erase */ Err bitreich.org 70
i if (c == 'x') Err bitreich.org 70
i yank_region(MIN(orig_x,x), MIN(orig_y,y), MAX(orig_x, x), MAX(orig_y, y)); Err bitreich.org 70
i+ copy_lines_to_ring(MIN(orig_y, y), MAX(orig_y, y), CUR); Err bitreich.org 70
i erase_box(orig_x, orig_y, f); Err bitreich.org 70
i erase_blank_lines(MIN(y,orig_y), MAX(y, orig_y)); Err bitreich.org 70
i+ copy_lines_to_ring(MIN(orig_y, y), MAX(orig_y, y), LST); Err bitreich.org 70
i+ Err bitreich.org 70
i modified = 1; Err bitreich.org 70
i goto vis_exit; Err bitreich.org 70
i break; Err bitreich.org 70
i@@ -331,6 +342,42 @@ vis_exit: Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i void paste(){ Err bitreich.org 70
i+ int y2; Err bitreich.org 70
i+ Err bitreich.org 70
i+ y2 = y + cutbuf.num - 1; Err bitreich.org 70
i+ copy_lines_to_ring(y, y2, CUR); Err bitreich.org 70
i paste_region(x, y); Err bitreich.org 70
i+ copy_lines_to_ring(y, y2, LST); Err bitreich.org 70
i+ redraw(); Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+void put_lines(lineset_t *u){ Err bitreich.org 70
i+ int i, n; Err bitreich.org 70
i+ Err bitreich.org 70
i+ for (i=0; i< u->num; i++){ Err bitreich.org 70
i+ n = u->l[i].n; Err bitreich.org 70
i+ ensure_line_length(&(screen.l[i]), u->l[i].lst); Err bitreich.org 70
i+ strcpy(screen.l[n].s, u->l[i].s); Err bitreich.org 70
i+ screen.l[n].lst = u->l[i].lst; Err bitreich.org 70
i+ } Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+ Err bitreich.org 70
i+void undo_change(){ Err bitreich.org 70
i+ if (undo_cur >= 0){ Err bitreich.org 70
i+ put_lines(& (undo[undo_cur])); Err bitreich.org 70
i+ undo_cur --; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ redraw(); Err bitreich.org 70
i+ modified = 1; Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+void redo_change(){ Err bitreich.org 70
i+ if (undo_cur < undo_lst){ Err bitreich.org 70
i+ undo_cur ++; Err bitreich.org 70
i+ put_lines(& (undo[undo_cur])); Err bitreich.org 70
i+ } Err bitreich.org 70
i redraw(); Err bitreich.org 70
i+ modified = 1; Err bitreich.org 70
i } Err bitreich.org 70
i+ Err bitreich.org 70
1diff --git a/gramscii.h b/gramscii.h /scm/gramscii/file/gramscii.h.gph bitreich.org 70
i@@ -44,6 +44,9 @@ Err bitreich.org 70
i #define VIDEO_NRM 0 Err bitreich.org 70
i #define VIDEO_REV 7 Err bitreich.org 70
i Err bitreich.org 70
i+#define CUR 0x01 Err bitreich.org 70
i+#define LST 0x02 Err bitreich.org 70
i+ Err bitreich.org 70
i /** types **/ Err bitreich.org 70
i Err bitreich.org 70
i typedef struct{ Err bitreich.org 70
i@@ -59,6 +62,7 @@ typedef struct{ Err bitreich.org 70
i line_t *l; Err bitreich.org 70
i } lineset_t; Err bitreich.org 70
i Err bitreich.org 70
i+ Err bitreich.org 70
i /** MACROS **/ Err bitreich.org 70
i Err bitreich.org 70
i #define MIN(x,y) (x) < (y) ? (x) : (y) Err bitreich.org 70
i@@ -73,6 +77,11 @@ typedef struct{ Err bitreich.org 70
i Err bitreich.org 70
i lineset_t screen; Err bitreich.org 70
i lineset_t cutbuf; Err bitreich.org 70
i+lineset_t *undo; Err bitreich.org 70
i+ Err bitreich.org 70
i+int undo_sz; Err bitreich.org 70
i+int undo_cur; Err bitreich.org 70
i+int undo_lst; Err bitreich.org 70
i Err bitreich.org 70
i int WIDTH, HEIGHT; Err bitreich.org 70
i Err bitreich.org 70
i@@ -155,6 +164,8 @@ void ensure_line_length(line_t *l, int len); Err bitreich.org 70
i void ensure_num_lines(lineset_t *ls, int n); Err bitreich.org 70
i void yank_region(int x1, int y1, int x2, int y2); Err bitreich.org 70
i void paste_region(int x1, int y1); Err bitreich.org 70
i- Err bitreich.org 70
i+void copy_lines_to_ring(int y1, int y2, int which); Err bitreich.org 70
i+void undo_change(); Err bitreich.org 70
i+void redo_change(); Err bitreich.org 70
i Err bitreich.org 70
i #endif Err bitreich.org 70
1diff --git a/lineset.c b/lineset.c /scm/gramscii/file/lineset.c.gph bitreich.org 70
i@@ -58,6 +58,7 @@ void ensure_num_lines(lineset_t *ls, int n){ Err bitreich.org 70
i } Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i+ Err bitreich.org 70
i void dump_lines(lineset_t ls, FILE *f){ Err bitreich.org 70
i int i; Err bitreich.org 70
i for (i=0; i<ls.num ;i++){ Err bitreich.org 70
i@@ -124,3 +125,45 @@ void paste_region(int x1, int y1){ Err bitreich.org 70
i } Err bitreich.org 70
i redraw(); Err bitreich.org 70
i } Err bitreich.org 70
i+ Err bitreich.org 70
i+void copy_lines_to_ring(int y1, int y2, int which){ Err bitreich.org 70
i+ lineset_t *tmp; Err bitreich.org 70
i+ int i, len, *idx; Err bitreich.org 70
i+ Err bitreich.org 70
i+ if (y1 > y2){ Err bitreich.org 70
i+ y1 ^= y2; Err bitreich.org 70
i+ y2 ^= y1; Err bitreich.org 70
i+ y1 ^= y2; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ if (which == CUR) Err bitreich.org 70
i+ idx = &undo_cur; Err bitreich.org 70
i+ else Err bitreich.org 70
i+ idx = &undo_lst; Err bitreich.org 70
i+ if (*idx == undo_sz - 1){ Err bitreich.org 70
i+ undo_sz += 10; Err bitreich.org 70
i+ tmp = realloc(undo, undo_sz * sizeof(lineset_t)); Err bitreich.org 70
i+ if (tmp == NULL){ Err bitreich.org 70
i+ fprintf(stderr, "Error allocating undo buffer"); Err bitreich.org 70
i+ exit(1); Err bitreich.org 70
i+ } Err bitreich.org 70
i+ undo = tmp; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ (*idx) ++; Err bitreich.org 70
i+ ensure_num_lines(&(undo[*idx]), y2 - y1 + 1); Err bitreich.org 70
i+ for(i=y1; i<=y2; i++){ Err bitreich.org 70
i+ len = strlen(screen.l[i].s); Err bitreich.org 70
i+ ensure_line_length(&(undo[*idx].l[i-y1]), len); Err bitreich.org 70
i+ strcpy(undo[*idx].l[i-y1].s, screen.l[i].s); Err bitreich.org 70
i+ undo[*idx].l[i-y1].n = i; Err bitreich.org 70
i+ undo[*idx].l[i-y1].lst = screen.l[i].lst; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ undo[*idx].num = y2 - y1 + 1; Err bitreich.org 70
i+ if (which == CUR) Err bitreich.org 70
i+ undo_lst = undo_cur; Err bitreich.org 70
i+#ifdef DEBUG Err bitreich.org 70
i+ fprintf(stderr, "undo_ring: y1: %d y2: %d idx: %d\n", y1, y2, *idx); Err bitreich.org 70
i+ for(i=0; i<undo[undo_cur].num; i++){ Err bitreich.org 70
i+ fprintf(stderr, "UU: %d| %s\n", undo[*idx].l[i].n, undo[*idx].l[i].s); Err bitreich.org 70
i+ } Err bitreich.org 70
i+#endif Err bitreich.org 70
i+} Err bitreich.org 70
1diff --git a/main.c b/main.c /scm/gramscii/file/main.c.gph bitreich.org 70
i@@ -122,6 +122,12 @@ void commands(FILE *fc){ Err bitreich.org 70
i case 'p': Err bitreich.org 70
i paste(); Err bitreich.org 70
i break; Err bitreich.org 70
i+ case 'u': Err bitreich.org 70
i+ undo_change(); Err bitreich.org 70
i+ break; Err bitreich.org 70
i+ case 'U': Err bitreich.org 70
i+ redo_change(); Err bitreich.org 70
i+ break; Err bitreich.org 70
i case 'q': Err bitreich.org 70
i check_modified(fc);/** FALLTHROUGH **/ Err bitreich.org 70
i case 'Q': Err bitreich.org 70
1diff --git a/screen.c b/screen.c /scm/gramscii/file/screen.c.gph bitreich.org 70
i@@ -408,6 +408,10 @@ void init_screen(){ Err bitreich.org 70
i cutbuf.sz = 0; Err bitreich.org 70
i cutbuf.l = NULL; Err bitreich.org 70
i cutbuf.num = 0; Err bitreich.org 70
i+ Err bitreich.org 70
i+ undo_sz = 0; Err bitreich.org 70
i+ undo_cur = -1; Err bitreich.org 70
i+ undo_lst = -1; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i void find_nonblank_rect(int *x1, int *y1, int *x2, int *y2){ Err bitreich.org 70
.
Response:
text/plain