SMOLNET PORTAL home about changes
iyank buffer and initial copy/cut/paste support - 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 eebc645dee0d15871d6cc46f156d424cd916b191	/scm/gramscii/commit/eebc645dee0d15871d6cc46f156d424cd916b191.gph	bitreich.org	70
1parent a99759398841d86928c7ad4d8248f907765cbeb2	/scm/gramscii/commit/a99759398841d86928c7ad4d8248f907765cbeb2.gph	bitreich.org	70
hAuthor: KatolaZ <katolaz@freaknet.org>	URL:mailto:katolaz@freaknet.org	bitreich.org	70
iDate:   Tue, 30 Jul 2019 12:15:54 +0100	Err	bitreich.org	70
i	Err	bitreich.org	70
iyank buffer and initial copy/cut/paste support	Err	bitreich.org	70
i	Err	bitreich.org	70
iDiffstat:	Err	bitreich.org	70
i  M Makefile                            |       2 +-	Err	bitreich.org	70
i  M TODO                                |      11 +++++++----	Err	bitreich.org	70
i  M draw.c                              |      11 +++++++++++	Err	bitreich.org	70
i  M files.c                             |       6 +++---	Err	bitreich.org	70
i  M gramscii.1                          |      20 ++++++++++++++++++--	Err	bitreich.org	70
i  M gramscii.h                          |      36 ++++++++++++++++++++++++-------	Err	bitreich.org	70
i  A lineset.c                           |     117 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  M main.c                              |      11 ++++-------	Err	bitreich.org	70
i  M screen.c                            |     117 ++++++++++---------------------	Err	bitreich.org	70
i	Err	bitreich.org	70
i9 files changed, 227 insertions(+), 104 deletions(-)	Err	bitreich.org	70
i---	Err	bitreich.org	70
1diff --git a/Makefile b/Makefile	/scm/gramscii/file/Makefile.gph	bitreich.org	70
i@@ -3,7 +3,7 @@	Err	bitreich.org	70
i 	Err	bitreich.org	70
i include config.mk	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-SRC = main.c draw.c screen.c files.c	Err	bitreich.org	70
i+SRC = main.c draw.c screen.c files.c lineset.c	Err	bitreich.org	70
i INC = config.h gramscii.h	Err	bitreich.org	70
i 	Err	bitreich.org	70
i all: options gramscii	Err	bitreich.org	70
1diff --git a/TODO b/TODO	/scm/gramscii/file/TODO.gph	bitreich.org	70
i@@ -6,8 +6,8 @@	Err	bitreich.org	70
i - use [ENTER] to exit from text insert	Err	bitreich.org	70
i - maybe move "text" mode to "t"	Err	bitreich.org	70
i - implement ellipse	Err	bitreich.org	70
i-- filled box (B)	Err	bitreich.org	70
i-- manage fill character (as for other styles)	Err	bitreich.org	70
i+- (?) filled box (B)	Err	bitreich.org	70
i+- (?) manage filled box character (as for other styles)	Err	bitreich.org	70
i - implement comment (#: ignore until the end of the line)	Err	bitreich.org	70
i + parse control characters 	Err	bitreich.org	70
i   + parse arrows (text-mode will allow movements as well)	Err	bitreich.org	70
i@@ -15,15 +15,18 @@	Err	bitreich.org	70
i - (?) remove extra blanks until EOL when saving to file	Err	bitreich.org	70
i + visual selection	Err	bitreich.org	70
i   - crop-to	Err	bitreich.org	70
i-  - yank/put	Err	bitreich.org	70
i+  * yank	Err	bitreich.org	70
i   * fill	Err	bitreich.org	70
i-  * delete	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
i - catch SIGWINCH and react appropriately (after scrolling is 	Err	bitreich.org	70
i   enabled)	Err	bitreich.org	70
i+* put yanked content (p)	Err	bitreich.org	70
i+* turn screen into a lineset	Err	bitreich.org	70
i+* change alloc/ensure functions to work on line_t* and lineset_t*	Err	bitreich.org	70
i * add crop command (C)	Err	bitreich.org	70
i * reorganise code	Err	bitreich.org	70
i * change screen management (i.e., dynamic array of lines)	Err	bitreich.org	70
1diff --git a/draw.c b/draw.c	/scm/gramscii/file/draw.c.gph	bitreich.org	70
i@@ -299,9 +299,15 @@ void visual_box(FILE *fc){	Err	bitreich.org	70
i         draw_box(x,y,NOFIX);	Err	bitreich.org	70
i         while((c=fgetc(fc))!=EOF && c != 27 && c!= 'v' && c != '\n'){	Err	bitreich.org	70
i                 if (!move_around(c, fc)) switch(c){	Err	bitreich.org	70
i+                        case 'y': /* yank (copy) */	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+                                goto vis_exit;	Err	bitreich.org	70
i+                                break;	Err	bitreich.org	70
i                         case 'f':/* fill */	Err	bitreich.org	70
i                                 f = get_key(fc, "fill char: "); /** FALLTHROUGH **/	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                                 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                                 modified = 1;	Err	bitreich.org	70
i@@ -323,3 +329,8 @@ vis_exit:	Err	bitreich.org	70
i         redraw();	Err	bitreich.org	70
i         mode = MOVE;	Err	bitreich.org	70
i }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void paste(){	Err	bitreich.org	70
i+        paste_region(x, y);	Err	bitreich.org	70
i+        redraw();	Err	bitreich.org	70
i+}	Err	bitreich.org	70
1diff --git a/files.c b/files.c	/scm/gramscii/file/files.c.gph	bitreich.org	70
i@@ -24,7 +24,7 @@ void write_file(FILE *fc){	Err	bitreich.org	70
i                 return;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i         for (i=0; i<HEIGHT; i++){	Err	bitreich.org	70
i-                fprintf(fout, "%s\n", screen[i].s);	Err	bitreich.org	70
i+                fprintf(fout, "%s\n", screen.l[i].s);	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i         fclose(fout);	Err	bitreich.org	70
i         modified = 0;	Err	bitreich.org	70
i@@ -50,8 +50,8 @@ void load_file(FILE *fc){	Err	bitreich.org	70
i         get_string(fc, "Load file: ", newfname, 255);	Err	bitreich.org	70
i         if ((fin=fopen(newfname, "r")) != NULL){	Err	bitreich.org	70
i                 i = 0;	Err	bitreich.org	70
i-                while((fgets(screen[i].s, WIDTH+2, fin)) != NULL && i<HEIGHT)	Err	bitreich.org	70
i-                        screen[i++].s[WIDTH-1]='\0';	Err	bitreich.org	70
i+                while((fgets(screen.l[i].s, WIDTH+2, fin)) != NULL && i<HEIGHT)	Err	bitreich.org	70
i+                        screen.l[i++].s[WIDTH-1]='\0';	Err	bitreich.org	70
i                 for(;i<HEIGHT; i++){	Err	bitreich.org	70
i                         erase_line(i);	Err	bitreich.org	70
i                 }	Err	bitreich.org	70
1diff --git a/gramscii.1 b/gramscii.1	/scm/gramscii/file/gramscii.1.gph	bitreich.org	70
i@@ -57,6 +57,12 @@ Crop chart to the largest non-blank region. The first line and the first	Err	bitreich.org	70
i column of the cropped chart will contain the first non-blank line and	Err	bitreich.org	70
i the first non-blank column of the original chart, respectively.	Err	bitreich.org	70
i .TP 5m	Err	bitreich.org	70
i+.BI p	Err	bitreich.org	70
i+Paste the content of the yank buffer at the cursor position. The yank	Err	bitreich.org	70
i+buffer contains the rectangle yanked/cut in	Err	bitreich.org	70
i+.B visual	Err	bitreich.org	70
i+mode. 	Err	bitreich.org	70
i+.TP 5m	Err	bitreich.org	70
i .BI q	Err	bitreich.org	70
i Quit gramscii, and prompt for a filename if the current screen contains	Err	bitreich.org	70
i unsaved changes.	Err	bitreich.org	70
i@@ -340,9 +346,19 @@ commands to highlight a rectangle. Then, you can use one of the	Err	bitreich.org	70
i following command on the highlighted region:	Err	bitreich.org	70
i .RS	Err	bitreich.org	70
i .TP 5m	Err	bitreich.org	70
i+.BI y	Err	bitreich.org	70
i+Yank (copy) the highlighted rectangle to the yank buffer. The content of	Err	bitreich.org	70
i+the yank buffer can be retrieved by using the	Err	bitreich.org	70
i+.B p	Err	bitreich.org	70
i+command while in 	Err	bitreich.org	70
i+.B move	Err	bitreich.org	70
i+mode. The yank buffer is overwritten by subsequent yank/cut commands.	Err	bitreich.org	70
i+.TP 5m	Err	bitreich.org	70
i .BI x	Err	bitreich.org	70
i-Erase region. All the characters in the region are set to the default	Err	bitreich.org	70
i-background character (space).	Err	bitreich.org	70
i+Cut region. The content of the highlighted rectangle will be put in the	Err	bitreich.org	70
i+yank buffer and all the characters in the region are set to the default	Err	bitreich.org	70
i+background character (space). The yank buffer is overwritten by	Err	bitreich.org	70
i+subsequent yank/cut commands.	Err	bitreich.org	70
i .TP 5m	Err	bitreich.org	70
i .BI f	Err	bitreich.org	70
i Fill region. gramscii will wait for a character on input and then will	Err	bitreich.org	70
1diff --git a/gramscii.h b/gramscii.h	/scm/gramscii/file/gramscii.h.gph	bitreich.org	70
i@@ -5,13 +5,7 @@	Err	bitreich.org	70
i #include <termios.h>	Err	bitreich.org	70
i #include <unistd.h>	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-        int sz;	Err	bitreich.org	70
i-        int lst;	Err	bitreich.org	70
i-        char *s;	Err	bitreich.org	70
i-} line_t;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i /** constants **/	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -50,6 +44,20 @@ typedef struct{	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+/** types **/	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+typedef struct{	Err	bitreich.org	70
i+        int sz;/* allocated size*/	Err	bitreich.org	70
i+        int n;/* line number */	Err	bitreich.org	70
i+        int lst;/* last visible char (before the first \0) */	Err	bitreich.org	70
i+        char *s;	Err	bitreich.org	70
i+} line_t;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+typedef struct{	Err	bitreich.org	70
i+        int sz;/* allocated size */	Err	bitreich.org	70
i+        int num;/* number of lines stored */	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 /** MACROS **/	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -63,8 +71,9 @@ typedef struct{	Err	bitreich.org	70
i 	Err	bitreich.org	70
i /** global variables **/ 	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-line_t *screen;	Err	bitreich.org	70
i-int num_lines;	Err	bitreich.org	70
i+lineset_t screen;	Err	bitreich.org	70
i+lineset_t cutbuf;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i int WIDTH, HEIGHT;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i int mode;	Err	bitreich.org	70
i@@ -96,6 +105,7 @@ char visual;	Err	bitreich.org	70
i char silent;	Err	bitreich.org	70
i char autoend;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i+	Err	bitreich.org	70
i struct termios t1, t2, t3;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i /** screen-related functions **/	Err	bitreich.org	70
i@@ -129,6 +139,7 @@ void get_box(FILE *fc);	Err	bitreich.org	70
i void get_arrow(FILE *fc);	Err	bitreich.org	70
i void erase(FILE *fc);	Err	bitreich.org	70
i void visual_box(FILE *fc);	Err	bitreich.org	70
i+void paste();	Err	bitreich.org	70
i 	Err	bitreich.org	70
i /** file-related functions **/	Err	bitreich.org	70
i void write_file(FILE *fc);	Err	bitreich.org	70
i@@ -136,5 +147,14 @@ void check_modified(FILE *fc);	Err	bitreich.org	70
i void load_file(FILE *fc);	Err	bitreich.org	70
i void new_file(FILE *fc);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i+/** line-related functions **/	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void dump_lines(lineset_t ls, FILE *f);	Err	bitreich.org	70
i+void alloc_line(line_t *l);	Err	bitreich.org	70
i+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 	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@@ -0,0 +1,117 @@	Err	bitreich.org	70
i+#include <stdio.h>	Err	bitreich.org	70
i+#include <stdlib.h>	Err	bitreich.org	70
i+#include <string.h>	Err	bitreich.org	70
i+#include "gramscii.h"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static int LONG_STEP;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/* line_t and lineset_t management */	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void ensure_line_length(line_t *l, int len){	Err	bitreich.org	70
i+        char *tmp;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (l->sz < len + 1){	Err	bitreich.org	70
i+                tmp = realloc(l->s, (len+1) * 2 * sizeof(char));	Err	bitreich.org	70
i+                if (!tmp){	Err	bitreich.org	70
i+                        fprintf(stderr, "Unable to allocate string\n");	Err	bitreich.org	70
i+                        exit(1);	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                l->s = tmp;	Err	bitreich.org	70
i+                l->sz = (len + 1) * 2;	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 alloc_line(line_t *l){	Err	bitreich.org	70
i+        char *tmp;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        l->sz = WIDTH+1;	Err	bitreich.org	70
i+        tmp = malloc((l->sz) * sizeof(char));	Err	bitreich.org	70
i+        if (tmp == NULL){	Err	bitreich.org	70
i+                fprintf(stderr, "unable to allocate line\n");	Err	bitreich.org	70
i+                exit(1);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        l->s = tmp;	Err	bitreich.org	70
i+        memset(l->s, BG, l->sz);	Err	bitreich.org	70
i+        l->lst = -1;	Err	bitreich.org	70
i+        l->s[0]='\0';	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void ensure_num_lines(lineset_t *ls, int n){	Err	bitreich.org	70
i+        line_t *tmp;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (n > ls->sz){	Err	bitreich.org	70
i+                if (ls->sz == 0)	Err	bitreich.org	70
i+                        ls->l=NULL;	Err	bitreich.org	70
i+                tmp = realloc(ls->l, (n + LONG_STEP) * sizeof(line_t));	Err	bitreich.org	70
i+                if (tmp == NULL){	Err	bitreich.org	70
i+                        fprintf(stderr, "Unable to allocate memory for more lines");	Err	bitreich.org	70
i+                        exit(1);	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                else {	Err	bitreich.org	70
i+                        ls->l = tmp;	Err	bitreich.org	70
i+                        while ( ls->sz < n + LONG_STEP){	Err	bitreich.org	70
i+                                alloc_line(&(ls->l[ls->sz]));	Err	bitreich.org	70
i+                                ls->sz ++;	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+	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+                fprintf(f, "%d:%s\n", i, ls.l[i].s);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        fflush(f);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void pad_line_to_length(char *s, int W){	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        int i;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (i=strlen(s); i<W; i++){	Err	bitreich.org	70
i+                s[i] = BG;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/* cut/yank/paste/undo management */	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void yank_region(int x1, int y1, int x2, int y2){	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        int N, W, i;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        N = y2 - y1 + 1;	Err	bitreich.org	70
i+        W = x2 - x1 + 1;	Err	bitreich.org	70
i+        ensure_num_lines(&cutbuf, N);	Err	bitreich.org	70
i+        	Err	bitreich.org	70
i+        for (i=y1; i<=y2; i++){	Err	bitreich.org	70
i+                ensure_line_length(&(cutbuf.l[i-y1]), W);	Err	bitreich.org	70
i+                memcpy(cutbuf.l[i-y1].s, screen.l[i].s + x1, x2-x1+1);	Err	bitreich.org	70
i+                if (strlen(cutbuf.l[i-y1].s) < W)	Err	bitreich.org	70
i+                        pad_line_to_length(cutbuf.l[i-y1].s, W);	Err	bitreich.org	70
i+                cutbuf.l[i-y1].s[W] = '\0';	Err	bitreich.org	70
i+                cutbuf.l[i-y1].n = i;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        cutbuf.num = N;	Err	bitreich.org	70
i+#ifdef DEBUG	Err	bitreich.org	70
i+        dump_lines(cutbuf, stderr);	Err	bitreich.org	70
i+#endif	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 paste_region(int x1, int y1){	Err	bitreich.org	70
i+        int i, curlen;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        i = y1;	Err	bitreich.org	70
i+        while( i < HEIGHT && i < y1 + cutbuf.num){	Err	bitreich.org	70
i+                memcpy(screen.l[i].s + x1, cutbuf.l[i-y1].s, strlen(cutbuf.l[i-y1].s));	Err	bitreich.org	70
i+                curlen = strlen(screen.l[i].s); 	Err	bitreich.org	70
i+                if (curlen <= x1)	Err	bitreich.org	70
i+                        /* double-check this line below */	Err	bitreich.org	70
i+                        pad_line_to_length(screen.l[i].s+curlen, x1 - curlen);	Err	bitreich.org	70
i+                i += 1;	Err	bitreich.org	70
i+                modified = 1;	Err	bitreich.org	70
i+        }	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@@ -30,19 +30,13 @@	Err	bitreich.org	70
i 	Err	bitreich.org	70
i char *argv0;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-void dump_lines(){	Err	bitreich.org	70
i-        int i;	Err	bitreich.org	70
i-        for (i=0; i<HEIGHT; i++){	Err	bitreich.org	70
i-                printf("%s\n", screen[i].s);	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i 	Err	bitreich.org	70
i void cleanup(int s){	Err	bitreich.org	70
i         	Err	bitreich.org	70
i         if (!silent)	Err	bitreich.org	70
i                 printf("\033[;H\033[2J");	Err	bitreich.org	70
i         else	Err	bitreich.org	70
i-                dump_lines();	Err	bitreich.org	70
i+                dump_lines(screen, stdout);	Err	bitreich.org	70
i         tcsetattr(0, TCSANOW, &t1);	Err	bitreich.org	70
i         fflush(stdout);	Err	bitreich.org	70
i         exit(0);	Err	bitreich.org	70
i@@ -125,6 +119,9 @@ void commands(FILE *fc){	Err	bitreich.org	70
i                                 case 'C':	Err	bitreich.org	70
i                                         crop_to_nonblank();	Err	bitreich.org	70
i                                         break;	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 '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@@ -1,9 +1,9 @@	Err	bitreich.org	70
i #include <stdio.h>	Err	bitreich.org	70
i #include <stdlib.h>	Err	bitreich.org	70
i #include <string.h>	Err	bitreich.org	70
i-#include <ctype.h>	Err	bitreich.org	70
i #include <termios.h>	Err	bitreich.org	70
i #include <sys/ioctl.h>	Err	bitreich.org	70
i+#include <ctype.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@@ -62,7 +62,7 @@ void status_bar(){	Err	bitreich.org	70
i         else	Err	bitreich.org	70
i                 printf(" *%s*", fname );	Err	bitreich.org	70
i #ifdef DEBUG	Err	bitreich.org	70
i-        printf("  '%d'  ", screen[y].s[x]);	Err	bitreich.org	70
i+        printf("  '%d'  ", screen.l[y].s[x]);	Err	bitreich.org	70
i #endif	Err	bitreich.org	70
i         printf("\033[0m");	Err	bitreich.org	70
i         fflush(stdout);	Err	bitreich.org	70
i@@ -109,52 +109,6 @@ int is_yes(char c){	Err	bitreich.org	70
i 	Err	bitreich.org	70
i /*** Screen management ***/	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-void ensure_line_length(int i, int len){	Err	bitreich.org	70
i-        char *tmp;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (screen[i].sz < len + 1){	Err	bitreich.org	70
i-                tmp = realloc(screen[i].s, (len+1) * 2 * sizeof(char));	Err	bitreich.org	70
i-                if (!tmp){	Err	bitreich.org	70
i-                        fprintf(stderr, "Unable to allocate string\n");	Err	bitreich.org	70
i-                        exit(1);	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-                screen[i].s = tmp;	Err	bitreich.org	70
i-                screen[i].sz = (len + 1) * 2;	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 alloc_line(int i){	Err	bitreich.org	70
i-        char *tmp;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        screen[i].sz = WIDTH+1;	Err	bitreich.org	70
i-        tmp = malloc((screen[i].sz) * sizeof(char));	Err	bitreich.org	70
i-        if (tmp == NULL){	Err	bitreich.org	70
i-                fprintf(stderr, "unable to allocate line %d\n", i+1);	Err	bitreich.org	70
i-                exit(1);	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        screen[i].s = tmp;	Err	bitreich.org	70
i-        memset(screen[i].s, BG, screen[i].sz);	Err	bitreich.org	70
i-        screen[i].lst = -1;	Err	bitreich.org	70
i-        screen[i].s[0]='\0';	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void ensure_num_lines(int n){	Err	bitreich.org	70
i-        line_t *tmp;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (n > num_lines){	Err	bitreich.org	70
i-                tmp = realloc(screen, (n + LONG_STEP) * sizeof(line_t));	Err	bitreich.org	70
i-                if (tmp == NULL){	Err	bitreich.org	70
i-                        fprintf(stderr, "Unable to allocate memory for more lines");	Err	bitreich.org	70
i-                        exit(1);	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-                else while ( num_lines < n + LONG_STEP){	Err	bitreich.org	70
i-                        alloc_line(num_lines);	Err	bitreich.org	70
i-                        num_lines ++;	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 	Err	bitreich.org	70
i void show_cursor(){	Err	bitreich.org	70
i         if (silent)	Err	bitreich.org	70
i@@ -165,15 +119,15 @@ void show_cursor(){	Err	bitreich.org	70
i 	Err	bitreich.org	70
i 	Err	bitreich.org	70
i void set_xy(int _x, int _y, char c){	Err	bitreich.org	70
i-        ensure_num_lines(_y + 1);	Err	bitreich.org	70
i-        ensure_line_length(_y, _x + 1);	Err	bitreich.org	70
i-        while (screen[_y].lst<_x){	Err	bitreich.org	70
i-                screen[_y].lst ++;	Err	bitreich.org	70
i-                screen[_y].s[screen[_y].lst] = BG;	Err	bitreich.org	70
i+        ensure_num_lines(&screen, _y + 1);	Err	bitreich.org	70
i+        ensure_line_length(&(screen.l[_y]), _x + 1);	Err	bitreich.org	70
i+        while (screen.l[_y].lst<_x){	Err	bitreich.org	70
i+                screen.l[_y].lst ++;	Err	bitreich.org	70
i+                screen.l[_y].s[screen.l[_y].lst] = BG;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i-        screen[_y].s[_x] = c;	Err	bitreich.org	70
i-        if (_x == screen[_y].lst)	Err	bitreich.org	70
i-                screen[_y].s[_x+1] = '\0';	Err	bitreich.org	70
i+        screen.l[_y].s[_x] = c;	Err	bitreich.org	70
i+        if (_x == screen.l[_y].lst)	Err	bitreich.org	70
i+                screen.l[_y].s[_x+1] = '\0';	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i void set_cur(char c){	Err	bitreich.org	70
i@@ -193,7 +147,7 @@ void update_current(){	Err	bitreich.org	70
i         if (silent)	Err	bitreich.org	70
i                 return;	Err	bitreich.org	70
i         printf("\033[%d'%df",y+1,x+1);	Err	bitreich.org	70
i-        putchar(screen[y].s[x]);	Err	bitreich.org	70
i+        putchar(screen.l[y].s[x]);	Err	bitreich.org	70
i         fflush(stdout);	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -206,20 +160,20 @@ void erase_blank_lines(int y1, int y2){	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i         	Err	bitreich.org	70
i         for (; y1 <= y2; y1++){	Err	bitreich.org	70
i-                j = screen[y1].lst; 	Err	bitreich.org	70
i-                while (j>=0 && isblank(screen[y1].s[j]))	Err	bitreich.org	70
i+                j = screen.l[y1].lst; 	Err	bitreich.org	70
i+                while (j>=0 && isblank(screen.l[y1].s[j]))	Err	bitreich.org	70
i                         j--;	Err	bitreich.org	70
i                 if (j<0){	Err	bitreich.org	70
i-                        screen[y1].lst = -1;	Err	bitreich.org	70
i-                        screen[y1].s[0] = '\0';	Err	bitreich.org	70
i+                        screen.l[y1].lst = -1;	Err	bitreich.org	70
i+                        screen.l[y1].s[0] = '\0';	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 	Err	bitreich.org	70
i void erase_line(int i){	Err	bitreich.org	70
i-        screen[i].lst = -1;	Err	bitreich.org	70
i-        screen[i].s[0] = '\0';	Err	bitreich.org	70
i+        screen.l[i].lst = -1;	Err	bitreich.org	70
i+        screen.l[i].s[0] = '\0';	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i void erase_box(int x1, int y1, char c){	Err	bitreich.org	70
i@@ -268,7 +222,7 @@ void redraw(){	Err	bitreich.org	70
i                 return;	Err	bitreich.org	70
i         printf("\033[2J\033[1;1H");	Err	bitreich.org	70
i         for (i=0;i<HEIGHT;i++){	Err	bitreich.org	70
i-                fprintf(stdout,"%s\n",screen[i].s);	Err	bitreich.org	70
i+                fprintf(stdout,"%s\n",screen.l[i].s);	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i         status_bar();	Err	bitreich.org	70
i         show_cursor();	Err	bitreich.org	70
i@@ -435,14 +389,15 @@ void init_screen(){	Err	bitreich.org	70
i                 WIDTH=80;	Err	bitreich.org	70
i                 HEIGHT=24;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i-        screen = malloc(HEIGHT * sizeof(line_t));	Err	bitreich.org	70
i-        num_lines = HEIGHT;	Err	bitreich.org	70
i-        if (screen == NULL){	Err	bitreich.org	70
i+        screen.l = malloc(HEIGHT * sizeof(line_t));	Err	bitreich.org	70
i+        screen.sz = HEIGHT;	Err	bitreich.org	70
i+        screen.num = HEIGHT;	Err	bitreich.org	70
i+        if (screen.l == NULL){	Err	bitreich.org	70
i                 perror("allocating screen");	Err	bitreich.org	70
i                 exit(1);	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i         for (i=0; i<HEIGHT; i++){	Err	bitreich.org	70
i-                alloc_line(i);	Err	bitreich.org	70
i+                alloc_line(&(screen.l[i]));	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i         hlines_sz= sizeof(hlines) -1;	Err	bitreich.org	70
i         vlines_sz= sizeof(vlines) -1;	Err	bitreich.org	70
i@@ -450,6 +405,9 @@ void init_screen(){	Err	bitreich.org	70
i         stmarks_sz = sizeof(st_marks) - 1;	Err	bitreich.org	70
i         endmarks_sz = sizeof(st_marks) - 1;	Err	bitreich.org	70
i         reset_styles();	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 	Err	bitreich.org	70
i void find_nonblank_rect(int *x1, int *y1, int *x2, int *y2){	Err	bitreich.org	70
i@@ -457,22 +415,22 @@ void find_nonblank_rect(int *x1, int *y1, int *x2, int *y2){	Err	bitreich.org	70
i         int i, j;	Err	bitreich.org	70
i         int first;	Err	bitreich.org	70
i         *x1= WIDTH; /** FIXME: replace with num_cols **/	Err	bitreich.org	70
i-        *y1 = num_lines;	Err	bitreich.org	70
i+        *y1 = screen.num;	Err	bitreich.org	70
i         *x2 = *y2 = 0; 	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        for (i=0; i<num_lines; i++){	Err	bitreich.org	70
i-                if (screen[i].lst < 0)	Err	bitreich.org	70
i+        for (i=0; i<screen.num; i++){	Err	bitreich.org	70
i+                if (screen.l[i].lst < 0)	Err	bitreich.org	70
i                         continue;	Err	bitreich.org	70
i                 *y2 = i;	Err	bitreich.org	70
i                 if (i < *y1)	Err	bitreich.org	70
i                         *y1 = i;	Err	bitreich.org	70
i                 j = 0;	Err	bitreich.org	70
i-                while((j <= screen[i].lst)  && isblank(first=screen[i].s[j]))	Err	bitreich.org	70
i+                while((j <= screen.l[i].lst)  && isblank(first=screen.l[i].s[j]))	Err	bitreich.org	70
i                         j++;	Err	bitreich.org	70
i                 if (j < *x1)	Err	bitreich.org	70
i                         *x1 = j;	Err	bitreich.org	70
i-                j = screen[i].lst;	Err	bitreich.org	70
i-                while(isblank(screen[i].s[j]))	Err	bitreich.org	70
i+                j = screen.l[i].lst;	Err	bitreich.org	70
i+                while(isblank(screen.l[i].s[j]))	Err	bitreich.org	70
i                         j--;	Err	bitreich.org	70
i                 if (j > *x2)	Err	bitreich.org	70
i                         *x2 = j;	Err	bitreich.org	70
i@@ -483,13 +441,13 @@ void crop_to_rect(int x1, int y1, int x2, int y2){	Err	bitreich.org	70
i         int i;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         for (i=0; i<= y2-y1; i ++){	Err	bitreich.org	70
i-                ensure_line_length(i, screen[i+y1].lst);	Err	bitreich.org	70
i-                sprintf(screen[i].s, "%s", screen[i+y1].s + x1);	Err	bitreich.org	70
i-                screen[i].lst = screen[i+y1].lst - x1;	Err	bitreich.org	70
i+                ensure_line_length(&(screen.l[i]), screen.l[i+y1].lst);	Err	bitreich.org	70
i+                sprintf(screen.l[i].s, "%s", screen.l[i+y1].s + x1);	Err	bitreich.org	70
i+                screen.l[i].lst = screen.l[i+y1].lst - x1;	Err	bitreich.org	70
i         } 	Err	bitreich.org	70
i         while (i<=y2){	Err	bitreich.org	70
i-                screen[i].lst = -1;	Err	bitreich.org	70
i-                screen[i].s[0]= '\0';	Err	bitreich.org	70
i+                screen.l[i].lst = -1;	Err	bitreich.org	70
i+                screen.l[i].s[0]= '\0';	Err	bitreich.org	70
i                 i ++;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i }	Err	bitreich.org	70
i@@ -505,3 +463,4 @@ void crop_to_nonblank(){	Err	bitreich.org	70
i         redraw();	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i+	Err	bitreich.org	70
.
Response: text/plain
Original URLgopher://bitreich.org/0/scm/gramscii/commit/eebc645dee0d1...
Content-Typetext/plain; charset=utf-8