SMOLNET PORTAL home about changes
ifirst step towards crop + some fixes to erase - 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 b38ed132a7df231fc08ce384d8559e6648fdd0cc	/scm/gramscii/commit/b38ed132a7df231fc08ce384d8559e6648fdd0cc.gph	bitreich.org	70
1parent f678684b470f02d9fed4818eb92c2a925380c428	/scm/gramscii/commit/f678684b470f02d9fed4818eb92c2a925380c428.gph	bitreich.org	70
hAuthor: KatolaZ <katolaz@freaknet.org>	URL:mailto:katolaz@freaknet.org	bitreich.org	70
iDate:   Sat, 27 Jul 2019 08:06:27 +0100	Err	bitreich.org	70
i	Err	bitreich.org	70
ifirst step towards crop + some fixes to erase	Err	bitreich.org	70
i	Err	bitreich.org	70
iDiffstat:	Err	bitreich.org	70
i  M TODO                                |       3 ++-	Err	bitreich.org	70
i  M files.c                             |       2 +-	Err	bitreich.org	70
i  M gramscii.h                          |       5 +++--	Err	bitreich.org	70
i  M main.c                              |       3 +++	Err	bitreich.org	70
i  M screen.c                            |     138 ++++++++++++++++++++++---------	Err	bitreich.org	70
i	Err	bitreich.org	70
i5 files changed, 110 insertions(+), 41 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,6 @@	Err	bitreich.org	70
i + optimize redraws (redraw only the modified rectangle)	Err	bitreich.org	70
i++ add crop command (C)	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   - read output of command (!)	Err	bitreich.org	70
i@@ -11,7 +13,6 @@	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 - (?) implement CTRL+G as abort (aside ESC)	Err	bitreich.org	70
i-- add crop command (C)	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
1diff --git a/files.c b/files.c	/scm/gramscii/file/files.c.gph	bitreich.org	70
i@@ -53,7 +53,7 @@ void load_file(FILE *fc){	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                 for(;i<HEIGHT; i++){	Err	bitreich.org	70
i-                        erase_line(screen[i].s);	Err	bitreich.org	70
i+                        erase_line(i);	Err	bitreich.org	70
i                 }	Err	bitreich.org	70
i                 fclose(fin);	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@@ -59,7 +59,7 @@ typedef struct{	Err	bitreich.org	70
i #define progr_x(d) ((d) == DIR_L ? -1 : (d) == DIR_R ? 1 : 0)	Err	bitreich.org	70
i #define progr_y(d) ((d) == DIR_U ? -1 : (d) == DIR_D ? 1 : 0)	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-/* #define DEBUG 1 */	Err	bitreich.org	70
i+#define DEBUG 1	Err	bitreich.org	70
i 	Err	bitreich.org	70
i /** global variables **/ 	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -116,9 +116,10 @@ void get_string(FILE *fc, char *msg, char *s, int sz);	Err	bitreich.org	70
i void erase_box(int x1, int y1, char c);	Err	bitreich.org	70
i int is_yes(char c);	Err	bitreich.org	70
i void init_screen();	Err	bitreich.org	70
i-void erase_line(char *s);	Err	bitreich.org	70
i+void erase_line(int i);	Err	bitreich.org	70
i void erase_screen();	Err	bitreich.org	70
i void go_to(int where);	Err	bitreich.org	70
i+void crop_to_nonblank();	Err	bitreich.org	70
i 	Err	bitreich.org	70
i /** drawing-related functions **/	Err	bitreich.org	70
i int change_style(char c);	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,9 @@ void commands(FILE *fc){	Err	bitreich.org	70
i                                         mode = VIS;	Err	bitreich.org	70
i                                         visual_box(fc);	Err	bitreich.org	70
i                                         break;	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 '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@@ -109,39 +109,64 @@ 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 show_cursor(){	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-        fflush(stdout);	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 set_xy(int _x, int _y, char c){	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-        if (_y >= num_lines){	Err	bitreich.org	70
i-                tmp = realloc(screen, (_y + LONG_STEP)* sizeof(line_t));	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 < _y + LONG_STEP){	Err	bitreich.org	70
i-                        screen[num_lines].sz = WIDTH+1;	Err	bitreich.org	70
i-                        screen[num_lines].s = malloc((screen[num_lines].sz) * sizeof(char));	Err	bitreich.org	70
i-                        if (screen[num_lines].s == NULL){	Err	bitreich.org	70
i-                                perror("allocating screen[num_lines].s");	Err	bitreich.org	70
i-                                exit(1);	Err	bitreich.org	70
i-                        }	Err	bitreich.org	70
i-                        memset(screen[num_lines].s, BG, screen[num_lines].sz);	Err	bitreich.org	70
i-                        screen[num_lines].lst = 0;	Err	bitreich.org	70
i-                        screen[num_lines].s[screen[num_lines].lst+1]='\0';	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-        if (screen[_y].sz < _x + 2){	Err	bitreich.org	70
i-                screen[_y].sz = (_x +2) * 2;	Err	bitreich.org	70
i-                screen[_y].s = realloc(screen[_y].s, screen[_y].sz * sizeof(char));	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+                return;	Err	bitreich.org	70
i+        printf("\033[%d;%df", y+1, x+1);	Err	bitreich.org	70
i+        fflush(stdout);	Err	bitreich.org	70
i+}	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@@ -172,11 +197,9 @@ void update_current(){	Err	bitreich.org	70
i         fflush(stdout);	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-void erase_line(char *s){	Err	bitreich.org	70
i-        while(*s){	Err	bitreich.org	70
i-                *s = BG;	Err	bitreich.org	70
i-                s++;	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 }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i void erase_box(int x1, int y1, char c){	Err	bitreich.org	70
i@@ -196,7 +219,7 @@ void erase_box(int x1, int y1, char c){	Err	bitreich.org	70
i void erase_screen(){	Err	bitreich.org	70
i         int i;	Err	bitreich.org	70
i         for(i=0;i<HEIGHT; i++)	Err	bitreich.org	70
i-                erase_line(screen[i].s);	Err	bitreich.org	70
i+                erase_line(i);	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i void check_bound(){	Err	bitreich.org	70
i@@ -399,15 +422,7 @@ void init_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-                screen[i].sz = WIDTH+1;	Err	bitreich.org	70
i-                screen[i].s = malloc((screen[i].sz) * sizeof(char));	Err	bitreich.org	70
i-                if (screen[i].s == NULL){	Err	bitreich.org	70
i-                        perror("allocating screen[i].s");	Err	bitreich.org	70
i-                        exit(1);	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-                memset(screen[i].s, BG, screen[i].sz);	Err	bitreich.org	70
i-                screen[i].lst = 0;	Err	bitreich.org	70
i-                screen[i].s[screen[i].lst+1]='\0';	Err	bitreich.org	70
i+                alloc_line(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@@ -417,3 +432,52 @@ void init_screen(){	Err	bitreich.org	70
i         reset_styles();	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+	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+        *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+                        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+                if (screen[i].lst > *x2)	Err	bitreich.org	70
i+                        *x2 = screen[i].lst;	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+                        j++;	Err	bitreich.org	70
i+                if (j < *x1)	Err	bitreich.org	70
i+                        *x1 = j;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+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+        } 	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+                i ++;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void crop_to_nonblank(){	Err	bitreich.org	70
i+        int x1, x2, y1, y2;	Err	bitreich.org	70
i+        find_nonblank_rect(&x1, &y1, &x2, &y2);	Err	bitreich.org	70
i+#ifdef DEBUG	Err	bitreich.org	70
i+        fprintf(stderr, "crop rectangle: (%d, %d)-(%d, %d)\n", x1, y1, x2, y2);	Err	bitreich.org	70
i+#endif	Err	bitreich.org	70
i+        crop_to_rect(x1, y1, x2, y2);	Err	bitreich.org	70
i+        redraw();	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/b38ed132a7df2...
Content-Typetext/plain; charset=utf-8