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