SMOLNET PORTAL home about changes
ireorganise code - 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 8e3d23b921d9bbcb7c53017bacff8a3050a34b55	/scm/gramscii/commit/8e3d23b921d9bbcb7c53017bacff8a3050a34b55.gph	bitreich.org	70
1parent 3d53fcefe3ca3e6f25d1731c2caa0c1c0e676453	/scm/gramscii/commit/3d53fcefe3ca3e6f25d1731c2caa0c1c0e676453.gph	bitreich.org	70
hAuthor: KatolaZ <katolaz@freaknet.org>	URL:mailto:katolaz@freaknet.org	bitreich.org	70
iDate:   Sat, 27 Jul 2019 06:57:12 +0100	Err	bitreich.org	70
i	Err	bitreich.org	70
ireorganise code	Err	bitreich.org	70
i	Err	bitreich.org	70
iDiffstat:	Err	bitreich.org	70
i  M Makefile                            |       6 +++---	Err	bitreich.org	70
i  M TODO                                |       6 +++++-	Err	bitreich.org	70
i  A arg.h                               |      37 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  M config.h                            |      14 +++++++++-----	Err	bitreich.org	70
i  A draw.c                              |     324 ++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A files.c                             |      73 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  D gramscii.c                          |    1057 -------------------------------	Err	bitreich.org	70
i  A gramscii.h                          |     138 ++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A main.c                              |     175 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A screen.c                            |     419 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i	Err	bitreich.org	70
i10 files changed, 1183 insertions(+), 1066 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,8 +3,8 @@	Err	bitreich.org	70
i 	Err	bitreich.org	70
i include config.mk	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-SRC = gramscii.c	Err	bitreich.org	70
i-INC = config.h	Err	bitreich.org	70
i+SRC = main.c draw.c screen.c files.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
i 	Err	bitreich.org	70
i@@ -22,7 +22,7 @@ gramscii: ${SRC} ${INC}	Err	bitreich.org	70
i         	Err	bitreich.org	70
i clean:	Err	bitreich.org	70
i         @echo cleaning	Err	bitreich.org	70
i-        @rm -f $(SRC:.c=)	Err	bitreich.org	70
i+        @rm -f $(SRC:.c=) gramscii	Err	bitreich.org	70
i 	Err	bitreich.org	70
i install: all	Err	bitreich.org	70
i         @echo installing executable to ${DESTDIR}${BINDIR}	Err	bitreich.org	70
1diff --git a/TODO b/TODO	/scm/gramscii/file/TODO.gph	bitreich.org	70
i@@ -5,10 +5,13 @@	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+- 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 - (?) implement CTRL+G as abort (aside ESC)	Err	bitreich.org	70
i-- add crop command (c)	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
i@@ -21,6 +24,7 @@	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+* reorganise code	Err	bitreich.org	70
i * change screen management (i.e., dynamic array of lines)	Err	bitreich.org	70
i * add action multiplier (e.g., "7h" moves left by 7 cols)	Err	bitreich.org	70
i * add scripting mode option ("-s"?)	Err	bitreich.org	70
1diff --git a/arg.h b/arg.h	/scm/gramscii/file/arg.h.gph	bitreich.org	70
i@@ -0,0 +1,37 @@	Err	bitreich.org	70
i+#ifndef ARG_H	Err	bitreich.org	70
i+#define ARG_H	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#define USED(x) ((void)(x))	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+extern char *argv0;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#define ARGBEGIN        for(argv0 = *argv, argv++, argc--;\	Err	bitreich.org	70
i+                                        argv[0] && argv[0][0] == '-'\	Err	bitreich.org	70
i+                                        && argv[0][1];\	Err	bitreich.org	70
i+                                        argc--, argv++) {\	Err	bitreich.org	70
i+                                char _argc;\	Err	bitreich.org	70
i+                                char **_argv;\	Err	bitreich.org	70
i+                                if(argv[0][1] == '-' && argv[0][2] == '\0') {\	Err	bitreich.org	70
i+                                        argv++;\	Err	bitreich.org	70
i+                                        argc--;\	Err	bitreich.org	70
i+                                        break;\	Err	bitreich.org	70
i+                                }\	Err	bitreich.org	70
i+                                int i_;\	Err	bitreich.org	70
i+                                for(i_ = 1, _argv = argv; argv[0][i_];\	Err	bitreich.org	70
i+                                                i_++) {\	Err	bitreich.org	70
i+                                        if(_argv != argv)\	Err	bitreich.org	70
i+                                                break;\	Err	bitreich.org	70
i+                                        _argc = argv[0][i_];\	Err	bitreich.org	70
i+                                        switch(_argc)	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#define ARGEND                        }\	Err	bitreich.org	70
i+                                USED(_argc);\	Err	bitreich.org	70
i+                        }\	Err	bitreich.org	70
i+                        USED(argv);\	Err	bitreich.org	70
i+                        USED(argc);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#define        EARGF(x)        ((argv[1] == NULL)? ((x), abort(), (char *)0) :\	Err	bitreich.org	70
i+                        (argc--, argv++, argv[0]))	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#endif	Err	bitreich.org	70
i+	Err	bitreich.org	70
1diff --git a/config.h b/config.h	/scm/gramscii/file/config.h.gph	bitreich.org	70
i@@ -1,18 +1,22 @@	Err	bitreich.org	70
i /* This is part of `gramscii`` -- see COPYING for details */	Err	bitreich.org	70
i+#ifndef __LOCAL_CONFIG_H__	Err	bitreich.org	70
i+#define __LOCAL_CONFIG_H__	Err	bitreich.org	70
i 	Err	bitreich.org	70
i /* Config options */	Err	bitreich.org	70
i 	Err	bitreich.org	70
i /** MARKERS -- the first character is the default one **/	Err	bitreich.org	70
i /* markers for horizontal lines */	Err	bitreich.org	70
i-char hlines[]  = {"-~=#*@._ "};	Err	bitreich.org	70
i+static char hlines[]  = {"-~=#*@._ "};	Err	bitreich.org	70
i /* markers for vertical lines */	Err	bitreich.org	70
i-char vlines[]  = {"|H#*@:;i "};	Err	bitreich.org	70
i+static char vlines[]  = {"|H#*@:;i "};	Err	bitreich.org	70
i /* markers for corners */	Err	bitreich.org	70
i-char corners[] = {"+'H#*@.\"`"};	Err	bitreich.org	70
i+static char corners[] = {"+'H#*@.\"`"};	Err	bitreich.org	70
i /* markers for arrow start points */	Err	bitreich.org	70
i-char st_marks[] = {"+o-|<>^v*"};	Err	bitreich.org	70
i+static char st_marks[] = {"+o-|<>^v*"};	Err	bitreich.org	70
i /* markers for arrow endpoints */	Err	bitreich.org	70
i-char end_marks[] = {">+o-|<^v*"};	Err	bitreich.org	70
i+static char end_marks[] = {">+o-|<^v*"};	Err	bitreich.org	70
i 	Err	bitreich.org	70
i /** LONG_STEP (movements through uppercase HJKL) **/	Err	bitreich.org	70
i #define LONG_STEP 5	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#endif	Err	bitreich.org	70
1diff --git a/draw.c b/draw.c	/scm/gramscii/file/draw.c.gph	bitreich.org	70
i@@ -0,0 +1,324 @@	Err	bitreich.org	70
i+#include <stdlib.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+	Err	bitreich.org	70
i+/*** drawing-related functions ***/	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*** Lines and markers ***/	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void toggle_hline(){	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        cur_hl = (cur_hl + 1) % hlines_sz;	Err	bitreich.org	70
i+        line_h = hlines[cur_hl];	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void toggle_corner(){	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        cur_corn = (cur_corn + 1 ) % corners_sz;	Err	bitreich.org	70
i+        corner = corners[cur_corn];	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void toggle_vline(){	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        cur_vl = (cur_vl + 1) % vlines_sz;	Err	bitreich.org	70
i+        line_v = vlines[cur_vl];	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void toggle_st_mark(){	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        cur_start = (cur_start + 1 ) % stmarks_sz;	Err	bitreich.org	70
i+        mark_st = st_marks[cur_start];	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void toggle_end_mark(){	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        cur_end = (cur_end+ 1 ) % endmarks_sz;	Err	bitreich.org	70
i+        mark_end = end_marks[cur_end];	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+int change_style(char c){	Err	bitreich.org	70
i+        switch(c){	Err	bitreich.org	70
i+                case '-':	Err	bitreich.org	70
i+                        toggle_hline();	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case '|':	Err	bitreich.org	70
i+                        toggle_vline();	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case '+':	Err	bitreich.org	70
i+                        toggle_corner();	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case '<':	Err	bitreich.org	70
i+                        toggle_st_mark();	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case '>':	Err	bitreich.org	70
i+                        toggle_end_mark();	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case '.':	Err	bitreich.org	70
i+                        reset_styles();	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                default: 	Err	bitreich.org	70
i+                        return 0;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        return c;	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+/*****  text, box, arrows  *****/	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void get_text(FILE *fc){	Err	bitreich.org	70
i+        char c;	Err	bitreich.org	70
i+        int orig_x = x;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        redraw();	Err	bitreich.org	70
i+        while((c=fgetc(fc))!=EOF && c != 27){	Err	bitreich.org	70
i+                if(c=='\n'){	Err	bitreich.org	70
i+                        set_cur(BG);	Err	bitreich.org	70
i+                        y += 1;	Err	bitreich.org	70
i+                        x = orig_x;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                else {	Err	bitreich.org	70
i+                        set_cur(c);	Err	bitreich.org	70
i+                        update_current();	Err	bitreich.org	70
i+                        modified = 1;	Err	bitreich.org	70
i+                        x += 1;	Err	bitreich.org	70
i+                        if (x >= WIDTH)	Err	bitreich.org	70
i+                                x = orig_x;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                check_bound();	Err	bitreich.org	70
i+                status_bar();	Err	bitreich.org	70
i+                show_cursor();	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        mode=MOVE;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void draw_box(int x1, int y1, int fix){	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        int xmin, ymin, xmax, ymax;	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+        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+        }	Err	bitreich.org	70
i+        for(i=ymin+1; i<=ymax; i++){	Err	bitreich.org	70
i+                f(xmin, i, line_v);	Err	bitreich.org	70
i+                f(xmax, i, line_v);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        f(xmin, ymin, corner);	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+        show_cursor();	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void get_box(FILE *fc){	Err	bitreich.org	70
i+        char c;	Err	bitreich.org	70
i+        int orig_x=x, orig_y=y;	Err	bitreich.org	70
i+        redraw();	Err	bitreich.org	70
i+        step = 1;	Err	bitreich.org	70
i+        draw_box(x,y,NOFIX);	Err	bitreich.org	70
i+        while((c=fgetc(fc))!=EOF && c != 27 && c!= 'b' && c != '\n'){	Err	bitreich.org	70
i+                if (change_style(c))	Err	bitreich.org	70
i+                        goto update_box;	Err	bitreich.org	70
i+                if (!move_around(c, fc)) 	Err	bitreich.org	70
i+                        continue;	Err	bitreich.org	70
i+                check_bound();	Err	bitreich.org	70
i+                redraw();	Err	bitreich.org	70
i+                step = 1;	Err	bitreich.org	70
i+update_box:	Err	bitreich.org	70
i+                draw_box(orig_x, orig_y, NOFIX);	Err	bitreich.org	70
i+                status_bar();	Err	bitreich.org	70
i+                show_cursor();	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        if (c == 'b' || c == '\n'){	Err	bitreich.org	70
i+                draw_box(orig_x, orig_y, FIX);	Err	bitreich.org	70
i+                modified = 1;	Err	bitreich.org	70
i+        }	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 draw_arrow(int x, int y, char *a, int a_len, int fix){	Err	bitreich.org	70
i+	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+	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+        f(x,y,mark_st);	Err	bitreich.org	70
i+        if (!a_len){	Err	bitreich.org	70
i+                show_cursor();	Err	bitreich.org	70
i+                return;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        cur_dir=DIR_N;	Err	bitreich.org	70
i+        for (i=0; i<a_len; i+=2){	Err	bitreich.org	70
i+                if (i>0) {	Err	bitreich.org	70
i+                        /* If we are switching between horizontal and vertical, put a "corner" */	Err	bitreich.org	70
i+                        if (((cur_dir & DIR_HOR) && (a[i] & DIR_VER)) ||	Err	bitreich.org	70
i+                            ((cur_dir & DIR_VER) && (a[i] & DIR_HOR))){	Err	bitreich.org	70
i+                                f(x,y,corner);	Err	bitreich.org	70
i+                                show_cursor();	Err	bitreich.org	70
i+                        }	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                for(j=0; j<a[i+1]; j++){	Err	bitreich.org	70
i+                        line = (a[i] & DIR_L) || (a[i] & DIR_R) ? line_h : line_v;	Err	bitreich.org	70
i+                        x += progr_x(a[i]);	Err	bitreich.org	70
i+                        y += progr_y(a[i]);	Err	bitreich.org	70
i+                        f(x, y, line);	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                /* f(x,y,mark_end);*/	Err	bitreich.org	70
i+                cur_dir = a[i];	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        if (autoend){	Err	bitreich.org	70
i+                if (cur_dir != DIR_N)	Err	bitreich.org	70
i+                        f(x,y, get_mark(cur_dir));	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        else 	Err	bitreich.org	70
i+                f(x,y,mark_end);	Err	bitreich.org	70
i+        show_cursor();	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void get_arrow(FILE *fc){	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        char c;	Err	bitreich.org	70
i+        int orig_x=x, orig_y=y, arrow_len;	Err	bitreich.org	70
i+        static char *arrow = NULL;	Err	bitreich.org	70
i+        static int arrow_sz;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (!arrow){	Err	bitreich.org	70
i+                arrow_sz = 100;	Err	bitreich.org	70
i+                arrow = malloc(arrow_sz * sizeof(char));	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        arrow_len = 0;	Err	bitreich.org	70
i+        dir = DIR_N;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        redraw();	Err	bitreich.org	70
i+        step = 1;	Err	bitreich.org	70
i+        draw_arrow(x,y, arrow, 0, NOFIX);	Err	bitreich.org	70
i+        while((c=fgetc(fc))!=EOF && c != 27 && c!= 'a' && c != '\n'){	Err	bitreich.org	70
i+                if (change_style(c))	Err	bitreich.org	70
i+                        goto update_arrow;	Err	bitreich.org	70
i+                if (!move_around(c, fc))	Err	bitreich.org	70
i+                        continue;	Err	bitreich.org	70
i+                check_bound();	Err	bitreich.org	70
i+                /* FIXME: if we are out of bound, do nothing? */	Err	bitreich.org	70
i+                if (arrow_len == arrow_sz){	Err	bitreich.org	70
i+                        arrow_sz *=2;	Err	bitreich.org	70
i+                        arrow = realloc(arrow, arrow_sz * sizeof(char));	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                arrow[arrow_len++] = dir;	Err	bitreich.org	70
i+                arrow[arrow_len++] = step;	Err	bitreich.org	70
i+                redraw();	Err	bitreich.org	70
i+                step = 1;	Err	bitreich.org	70
i+update_arrow:	Err	bitreich.org	70
i+                draw_arrow(orig_x, orig_y, arrow, arrow_len, NOFIX);	Err	bitreich.org	70
i+                status_bar();	Err	bitreich.org	70
i+                show_cursor();	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        if (c == 'a' || c == '\n'){	Err	bitreich.org	70
i+                draw_arrow(orig_x, orig_y, arrow, arrow_len, FIX);	Err	bitreich.org	70
i+                modified = 1;	Err	bitreich.org	70
i+        }	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+	Err	bitreich.org	70
i+void do_erase(int x1, int y1){	Err	bitreich.org	70
i+        int i;	Err	bitreich.org	70
i+        switch(dir){	Err	bitreich.org	70
i+                case DIR_R:	Err	bitreich.org	70
i+                        for(i=x1; i<=x; i++) set_xy(i,y,BG);	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case DIR_L:	Err	bitreich.org	70
i+                        for(i=x1; i>=x; i--) set_xy(i,y,BG);	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case DIR_U:	Err	bitreich.org	70
i+                        for(i=y1; i>=y; i--) set_xy(x,i,BG);	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case DIR_D:	Err	bitreich.org	70
i+                        for(i=y1; i<=y; i++) set_xy(x,i,BG);	Err	bitreich.org	70
i+                        break;	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(FILE *fc){	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+        show_cursor();	Err	bitreich.org	70
i+        while((c=fgetc(fc))!=EOF && c!=27 && c!= 'x' && c != '\n'){	Err	bitreich.org	70
i+                if (!move_around(c, fc)) continue;	Err	bitreich.org	70
i+                check_bound();	Err	bitreich.org	70
i+                do_erase(orig_x, orig_y);	Err	bitreich.org	70
i+                step = 1;	Err	bitreich.org	70
i+                modified = 1;	Err	bitreich.org	70
i+                orig_x = x;	Err	bitreich.org	70
i+                orig_y = y;	Err	bitreich.org	70
i+                redraw();	Err	bitreich.org	70
i+                status_bar();	Err	bitreich.org	70
i+                show_cursor();	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        mode = MOVE;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*** Visual ***/	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void visual_box(FILE *fc){	Err	bitreich.org	70
i+        int orig_x =x, orig_y = y;	Err	bitreich.org	70
i+        char c, f = BG;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        redraw();	Err	bitreich.org	70
i+        step = 1;	Err	bitreich.org	70
i+        set_video(VIDEO_REV);	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 '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+                                erase_box(orig_x, orig_y, f);	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+                } 	Err	bitreich.org	70
i+                check_bound();	Err	bitreich.org	70
i+                set_video(VIDEO_NRM);	Err	bitreich.org	70
i+                redraw();	Err	bitreich.org	70
i+                step = 1;	Err	bitreich.org	70
i+                f = BG;	Err	bitreich.org	70
i+                set_video(VIDEO_REV);	Err	bitreich.org	70
i+                draw_box(orig_x, orig_y, NOFIX);	Err	bitreich.org	70
i+                status_bar();	Err	bitreich.org	70
i+                show_cursor();	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+vis_exit:	Err	bitreich.org	70
i+        set_video(VIDEO_NRM);	Err	bitreich.org	70
i+        redraw();	Err	bitreich.org	70
i+        mode = MOVE;	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@@ -0,0 +1,73 @@	Err	bitreich.org	70
i+#include <stdio.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+	Err	bitreich.org	70
i+/*** File management ***/	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void write_file(FILE *fc){	Err	bitreich.org	70
i+        FILE *fout;	Err	bitreich.org	70
i+        int i;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (!fname[0] || force_new){	Err	bitreich.org	70
i+                get_string(fc, "Write to: ", fname, 255);	Err	bitreich.org	70
i+                if ((fout=fopen(fname, "r"))!=NULL){	Err	bitreich.org	70
i+                        if (!is_yes(get_key(fc,"File exists. Overwrite [y/n]?")) ){	Err	bitreich.org	70
i+                                fclose(fout);	Err	bitreich.org	70
i+                                return;	Err	bitreich.org	70
i+                        }	Err	bitreich.org	70
i+                        fclose(fout);	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        if((fout=fopen(fname, "w"))==NULL){	Err	bitreich.org	70
i+                get_key(fc, "Error opening file.");	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+        }	Err	bitreich.org	70
i+        fclose(fout);	Err	bitreich.org	70
i+        modified = 0;	Err	bitreich.org	70
i+        get_key(fc, "File saved.");	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void check_modified(FILE *fc){	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (modified){	Err	bitreich.org	70
i+                if (!is_yes(get_key(fc, "Unsaved changes. Write to file [y/n]?")) ){	Err	bitreich.org	70
i+                        return;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                write_file(fc);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void load_file(FILE *fc){	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        char newfname[256];	Err	bitreich.org	70
i+        FILE *fin;	Err	bitreich.org	70
i+        int i;	Err	bitreich.org	70
i+	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+                for(;i<HEIGHT; i++){	Err	bitreich.org	70
i+                        erase_line(screen[i].s);	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                fclose(fin);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        strcpy(fname, newfname);	Err	bitreich.org	70
i+        modified=0;	Err	bitreich.org	70
i+        redraw();	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void new_file(FILE *fc){	Err	bitreich.org	70
i+        check_modified(fc);	Err	bitreich.org	70
i+        erase_screen();	Err	bitreich.org	70
i+        go_to(HOME);	Err	bitreich.org	70
i+        redraw();	Err	bitreich.org	70
i+        fname[0] = '\0';	Err	bitreich.org	70
i+        modified=0;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
1diff --git a/gramscii.c b/gramscii.c	/scm/gramscii/file/gramscii.c.gph	bitreich.org	70
i@@ -1,1057 +0,0 @@	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i-*	Err	bitreich.org	70
i-* gramscii: a simple editor for ASCII box-and-arrow charts	Err	bitreich.org	70
i-*	Err	bitreich.org	70
i-* Copyright (c) 2019 Vincenzo "KatolaZ" Nicosia <katolaz@freaknet.org>	Err	bitreich.org	70
i-*	Err	bitreich.org	70
i-* This program is free software: you can redistribute it and/or modify	Err	bitreich.org	70
i-* it under the terms of the GNU General Public License as published by	Err	bitreich.org	70
i-* the Free Software Foundation, either version 3 of the License, or	Err	bitreich.org	70
i-* (at your option) any later version.	Err	bitreich.org	70
i-*	Err	bitreich.org	70
i-* This program is distributed in the hope that it will be useful,	Err	bitreich.org	70
i-* but WITHOUT ANY WARRANTY; without even the implied warranty of	Err	bitreich.org	70
i-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the	Err	bitreich.org	70
i-* GNU General Public License for more details.	Err	bitreich.org	70
i-*	Err	bitreich.org	70
i-* You should have received a copy of the GNU General Public License	Err	bitreich.org	70
i-* along with this program. Please see the attached file COPYING. 	Err	bitreich.org	70
i-* Otherwise, please visit <https://www.gnu.org/licenses/>;.	Err	bitreich.org	70
i-*	Err	bitreich.org	70
i-*/	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <stdio.h>	Err	bitreich.org	70
i-#include <stdlib.h>	Err	bitreich.org	70
i-#include <termios.h>	Err	bitreich.org	70
i-#include <unistd.h>	Err	bitreich.org	70
i-#include <signal.h>	Err	bitreich.org	70
i-#include <string.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 "config.h"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include "arg.h"	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-	Err	bitreich.org	70
i-#define MOVE   0x00	Err	bitreich.org	70
i-#define BOX    0x01	Err	bitreich.org	70
i-#define ARROW  0x02	Err	bitreich.org	70
i-#define TEXT   0x04	Err	bitreich.org	70
i-#define DEL    0x08	Err	bitreich.org	70
i-#define VIS    0x10	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#define DIR_N  0x00	Err	bitreich.org	70
i-#define DIR_R  0x01	Err	bitreich.org	70
i-#define DIR_U  0x02	Err	bitreich.org	70
i-#define DIR_D  0x04	Err	bitreich.org	70
i-#define DIR_L  0x08	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#define DIR_HOR (DIR_R | DIR_L)	Err	bitreich.org	70
i-#define DIR_VER (DIR_D | DIR_U)	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#define NOFIX 0x0	Err	bitreich.org	70
i-#define FIX   0x1	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#define BG        ' '	Err	bitreich.org	70
i-#define PTR       '+'	Err	bitreich.org	70
i-#define UND       '_'	Err	bitreich.org	70
i-#define ARR_L     '<'	Err	bitreich.org	70
i-#define ARR_R     '>'	Err	bitreich.org	70
i-#define ARR_U     '^'	Err	bitreich.org	70
i-#define ARR_D     'v'	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#define HOME   0x01	Err	bitreich.org	70
i-#define END    0x02	Err	bitreich.org	70
i-#define MIDDLE 0x04	Err	bitreich.org	70
i-	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 MIN(x,y)  (x) < (y) ? (x) : (y)	Err	bitreich.org	70
i-#define MAX(x,y)  (x) > (y) ? (x) : (y)	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#define DEBUG 1 	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-int WIDTH, HEIGHT;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-int state;	Err	bitreich.org	70
i-int dir;	Err	bitreich.org	70
i-int x;	Err	bitreich.org	70
i-int y;	Err	bitreich.org	70
i-int step;	Err	bitreich.org	70
i-int mult;	Err	bitreich.org	70
i-int force_new;	Err	bitreich.org	70
i-char cursor;	Err	bitreich.org	70
i-char corner;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-int hlines_sz= sizeof(hlines) -1;	Err	bitreich.org	70
i-int vlines_sz= sizeof(vlines) -1;	Err	bitreich.org	70
i-int corners_sz = sizeof(corners) -1;	Err	bitreich.org	70
i-int stmarks_sz = sizeof(st_marks) - 1;	Err	bitreich.org	70
i-int endmarks_sz = sizeof(st_marks) - 1;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-int cur_hl, cur_vl, cur_corn, cur_start, cur_end;	Err	bitreich.org	70
i-char line_h;	Err	bitreich.org	70
i-char line_v;	Err	bitreich.org	70
i-char mark_st;	Err	bitreich.org	70
i-char mark_end;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-char modified;	Err	bitreich.org	70
i-char fname[256];	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-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-char *argv0;	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-	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-        if (silent)	Err	bitreich.org	70
i-                dump_lines();	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-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void exit_cleanup(void){	Err	bitreich.org	70
i-        cleanup(0);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*** Status bar ***/	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-char* state_str(){	Err	bitreich.org	70
i-        switch(state){	Err	bitreich.org	70
i-                case MOVE:	Err	bitreich.org	70
i-                        return "mov";	Err	bitreich.org	70
i-                case TEXT:	Err	bitreich.org	70
i-                        return "txt";	Err	bitreich.org	70
i-                case BOX:	Err	bitreich.org	70
i-                        return "box";	Err	bitreich.org	70
i-                case ARROW:	Err	bitreich.org	70
i-                        return "arr";	Err	bitreich.org	70
i-                case DEL:	Err	bitreich.org	70
i-                        return "del";	Err	bitreich.org	70
i-                case VIS:	Err	bitreich.org	70
i-                        return "vis";	Err	bitreich.org	70
i-                default:	Err	bitreich.org	70
i-                        return "ERR";	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        return "ERR";	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-char get_mark(char dir){	Err	bitreich.org	70
i-        switch(dir){	Err	bitreich.org	70
i-                case DIR_U:	Err	bitreich.org	70
i-                        return '^';	Err	bitreich.org	70
i-                case DIR_D:	Err	bitreich.org	70
i-                        return 'v';	Err	bitreich.org	70
i-                case DIR_L:	Err	bitreich.org	70
i-                        return '<';	Err	bitreich.org	70
i-                case DIR_R:	Err	bitreich.org	70
i-                        return '>';	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        return '>';	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void status_bar(){	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (silent)	Err	bitreich.org	70
i-                return;	Err	bitreich.org	70
i-        printf("\033[%d;1f\033[7m", HEIGHT+1);	Err	bitreich.org	70
i-        printf("%*s", WIDTH-1, "");	Err	bitreich.org	70
i-        printf("\033[%d;1f\033[7m", HEIGHT+1);	Err	bitreich.org	70
i-        printf(" x:%3d y:%3d -- MODE:%4s HL:%c VL:%c CN:%c SP:%c EP:%c %10s",	Err	bitreich.org	70
i-                x, y, state_str(), line_h, line_v, corner, mark_st, mark_end, "");	Err	bitreich.org	70
i-        if (!modified)	Err	bitreich.org	70
i-                printf(" [%s]", fname );	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-#endif	Err	bitreich.org	70
i-        printf("\033[0m");	Err	bitreich.org	70
i-        fflush(stdout);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-char get_key(FILE *fc, char *msg){	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (silent)	Err	bitreich.org	70
i-                return 0;	Err	bitreich.org	70
i-        printf("\033[%d;1f\033[7m", HEIGHT+1);	Err	bitreich.org	70
i-        printf("%*s", WIDTH, "");	Err	bitreich.org	70
i-        printf("\033[%d;1f\033[7m", HEIGHT+1);	Err	bitreich.org	70
i-        printf("%s", msg);	Err	bitreich.org	70
i-        fflush(stdout);	Err	bitreich.org	70
i-        printf("\033[0m");	Err	bitreich.org	70
i-        fflush(stdout);	Err	bitreich.org	70
i-        return fgetc(fc);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void get_string(FILE *fc, char *msg, char *s, int sz){	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (!silent){	Err	bitreich.org	70
i-                printf("\033[%d;1f\033[7m", HEIGHT+1);	Err	bitreich.org	70
i-                printf("%*s", WIDTH, "");	Err	bitreich.org	70
i-                printf("\033[%d;1f\033[7m", HEIGHT+1);	Err	bitreich.org	70
i-        	Err	bitreich.org	70
i-                /* We must activate echo now */	Err	bitreich.org	70
i-                t3 = t2;	Err	bitreich.org	70
i-                t3.c_lflag |= (ECHO | ICANON);	Err	bitreich.org	70
i-                tcsetattr(0, TCSANOW, &t3);	Err	bitreich.org	70
i-                printf("%s", msg);	Err	bitreich.org	70
i-                printf("\033[0m");	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        fgets(s, sz, fc);	Err	bitreich.org	70
i-        s[strlen(s)-1] = '\0';	Err	bitreich.org	70
i-        tcsetattr(0, TCSANOW, &t2);	Err	bitreich.org	70
i-        if (!silent)	Err	bitreich.org	70
i-                fflush(stdout);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-int is_yes(char c){	Err	bitreich.org	70
i-        return c=='y' ? 1 : c == 'Y'? 1 : 0;	Err	bitreich.org	70
i-}	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-}	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-        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-                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-                        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-        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-        }	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-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void set_cur(char c){	Err	bitreich.org	70
i-        set_xy(x, y, c);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void draw_xy(int x, int y, char c){	Err	bitreich.org	70
i-        /* FIXME: check if x and y are valid!!!! */	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(c);	Err	bitreich.org	70
i-        fflush(stdout);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-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-        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-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void erase_box(int x1, int y1, char c){	Err	bitreich.org	70
i-        int x_incr, y_incr, i; 	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        x_incr = x1 < x? +1: -1;	Err	bitreich.org	70
i-        y_incr = y1 < y? +1: -1;	Err	bitreich.org	70
i-        do{	Err	bitreich.org	70
i-                i = y1;	Err	bitreich.org	70
i-                do{	Err	bitreich.org	70
i-                        set_xy(x1, i, c);	Err	bitreich.org	70
i-                } while(i != y && (1 | (i += y_incr)));	Err	bitreich.org	70
i-        } while(x1 != x && (1 | (x1 += x_incr)));	Err	bitreich.org	70
i-        	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	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-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void check_bound(){	Err	bitreich.org	70
i-        if (x<0) x=0;	Err	bitreich.org	70
i-        else if (x>=WIDTH) x = WIDTH-1;	Err	bitreich.org	70
i-        if (y<0) y=0;	Err	bitreich.org	70
i-        else if (y>=HEIGHT) y = HEIGHT -1;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void reset_styles(){	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        cur_corn = 0;	Err	bitreich.org	70
i-        corner = corners[0];	Err	bitreich.org	70
i-        cur_hl = cur_vl = 0;	Err	bitreich.org	70
i-        cur_start = cur_end = 0;	Err	bitreich.org	70
i-        line_h = hlines[cur_hl];	Err	bitreich.org	70
i-        line_v = vlines[cur_vl];	Err	bitreich.org	70
i-        mark_st = st_marks[cur_start];	Err	bitreich.org	70
i-        mark_end = end_marks[cur_end];	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void redraw(){	Err	bitreich.org	70
i-        int i;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (silent)	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-        }	Err	bitreich.org	70
i-        status_bar();	Err	bitreich.org	70
i-        show_cursor();	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void go_to(int where){	Err	bitreich.org	70
i-        switch(where){	Err	bitreich.org	70
i-                case HOME:	Err	bitreich.org	70
i-                        x = y = 0;	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case END:	Err	bitreich.org	70
i-                        x = WIDTH-1;	Err	bitreich.org	70
i-                        y = HEIGHT-1;	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case MIDDLE:	Err	bitreich.org	70
i-                        x = WIDTH/2;	Err	bitreich.org	70
i-                        y = HEIGHT/2;	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        check_bound();	Err	bitreich.org	70
i-        show_cursor();	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void handle_goto(){	Err	bitreich.org	70
i-        char c;        	Err	bitreich.org	70
i-        c=getchar();	Err	bitreich.org	70
i-        switch(c){	Err	bitreich.org	70
i-                case 'h':	Err	bitreich.org	70
i-                        dir = DIR_L;	Err	bitreich.org	70
i-                        x = 0;	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case 'l':	Err	bitreich.org	70
i-                        dir = DIR_R;	Err	bitreich.org	70
i-                        x = WIDTH - 1;	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case 'j':	Err	bitreich.org	70
i-                        dir = DIR_D;	Err	bitreich.org	70
i-                        y = HEIGHT - 1;	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case 'k':	Err	bitreich.org	70
i-                        dir = DIR_U;	Err	bitreich.org	70
i-                        y = 0;	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case 'g':	Err	bitreich.org	70
i-                        dir = DIR_N;	Err	bitreich.org	70
i-                        go_to(HOME);	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case 'G':	Err	bitreich.org	70
i-                        dir = DIR_N;	Err	bitreich.org	70
i-                        go_to(END);	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case 'm':	Err	bitreich.org	70
i-                        dir = DIR_N;	Err	bitreich.org	70
i-                        go_to(MIDDLE);	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        check_bound();	Err	bitreich.org	70
i-        show_cursor();	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-int get_escape(FILE *fc){	Err	bitreich.org	70
i-        char c[4];	Err	bitreich.org	70
i-        	Err	bitreich.org	70
i-        c[0] = fgetc(fc);	Err	bitreich.org	70
i-        if (c[0] == '['){	Err	bitreich.org	70
i-                c[1] = fgetc(fc);	Err	bitreich.org	70
i-                switch(c[1]){	Err	bitreich.org	70
i-                        case 'D':	Err	bitreich.org	70
i-                                dir = DIR_L;	Err	bitreich.org	70
i-                                x -= step;	Err	bitreich.org	70
i-                                break;	Err	bitreich.org	70
i-                        case 'B':	Err	bitreich.org	70
i-                                dir = DIR_D;	Err	bitreich.org	70
i-                                y += step;	Err	bitreich.org	70
i-                                break;	Err	bitreich.org	70
i-                        case 'A':	Err	bitreich.org	70
i-                                dir = DIR_U;	Err	bitreich.org	70
i-                                y -= step;	Err	bitreich.org	70
i-                                break;	Err	bitreich.org	70
i-                        case 'C':	Err	bitreich.org	70
i-                                dir = DIR_R;	Err	bitreich.org	70
i-                                x += step;	Err	bitreich.org	70
i-                                break;	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-                return 1;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        else{	Err	bitreich.org	70
i-                ungetc(c[0], fc);	Err	bitreich.org	70
i-                return 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-int move_around(char c, FILE *fc){	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (isdigit(c)){	Err	bitreich.org	70
i-                if (mult)	Err	bitreich.org	70
i-                        mult *=10;	Err	bitreich.org	70
i-                mult += c - '0';	Err	bitreich.org	70
i-                return 0;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        switch(c){	Err	bitreich.org	70
i-                case 27: /* control sequence? */	Err	bitreich.org	70
i-                        c = get_escape(fc);	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case 'H': step = LONG_STEP;/** FALLTHROUGH **/	Err	bitreich.org	70
i-                case 'h':	Err	bitreich.org	70
i-                        dir = DIR_L;	Err	bitreich.org	70
i-                        if (mult) 	Err	bitreich.org	70
i-                                step *= mult;	Err	bitreich.org	70
i-                        x -= step;	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case 'J': step = LONG_STEP;/** FALLTHROUGH **/	Err	bitreich.org	70
i-                case 'j':	Err	bitreich.org	70
i-                        if (mult) 	Err	bitreich.org	70
i-                                step *= mult;	Err	bitreich.org	70
i-                        dir = DIR_D;	Err	bitreich.org	70
i-                        y += step;	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case 'K': step = LONG_STEP;/** FALLTHROUGH **/	Err	bitreich.org	70
i-                case 'k':	Err	bitreich.org	70
i-                        if (mult) 	Err	bitreich.org	70
i-                                step *= mult;	Err	bitreich.org	70
i-                        dir = DIR_U;	Err	bitreich.org	70
i-                        y -= step;	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case 'L': step = LONG_STEP;/** FALLTHROUGH **/	Err	bitreich.org	70
i-                case 'l':	Err	bitreich.org	70
i-                        if (mult) 	Err	bitreich.org	70
i-                                step *= mult;	Err	bitreich.org	70
i-                        dir = DIR_R;	Err	bitreich.org	70
i-                        x += step;	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case 'g':	Err	bitreich.org	70
i-                        handle_goto();	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                default:	Err	bitreich.org	70
i-                        return 0;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        mult = 0;	Err	bitreich.org	70
i-        return c;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-int progr_x(int dir){	Err	bitreich.org	70
i-        return dir == DIR_L ? -1 : dir == DIR_R ? 1: 0;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-int progr_y(int dir){	Err	bitreich.org	70
i-        return dir == DIR_U ? -1 : dir == DIR_D ? 1: 0;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void set_video(int v){	Err	bitreich.org	70
i-        if (silent)	Err	bitreich.org	70
i-                return;	Err	bitreich.org	70
i-        printf("\033[%dm", v);	Err	bitreich.org	70
i-        fflush(stdout);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*** Lines and markers ***/	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void toggle_hline(){	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        cur_hl = (cur_hl + 1) % hlines_sz;	Err	bitreich.org	70
i-        line_h = hlines[cur_hl];	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void toggle_corner(){	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        cur_corn = (cur_corn + 1 ) % corners_sz;	Err	bitreich.org	70
i-        corner = corners[cur_corn];	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void toggle_vline(){	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        cur_vl = (cur_vl + 1) % vlines_sz;	Err	bitreich.org	70
i-        line_v = vlines[cur_vl];	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void toggle_st_mark(){	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        cur_start = (cur_start + 1 ) % stmarks_sz;	Err	bitreich.org	70
i-        mark_st = st_marks[cur_start];	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void toggle_end_mark(){	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        cur_end = (cur_end+ 1 ) % endmarks_sz;	Err	bitreich.org	70
i-        mark_end = end_marks[cur_end];	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-int change_style(char c){	Err	bitreich.org	70
i-        switch(c){	Err	bitreich.org	70
i-                case '-':	Err	bitreich.org	70
i-                        toggle_hline();	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case '|':	Err	bitreich.org	70
i-                        toggle_vline();	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case '+':	Err	bitreich.org	70
i-                        toggle_corner();	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case '<':	Err	bitreich.org	70
i-                        toggle_st_mark();	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case '>':	Err	bitreich.org	70
i-                        toggle_end_mark();	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case '.':	Err	bitreich.org	70
i-                        reset_styles();	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                default: 	Err	bitreich.org	70
i-                        return 0;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        return c;	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-/*****  text, box, arrows  *****/	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void get_text(FILE *fc){	Err	bitreich.org	70
i-        char c;	Err	bitreich.org	70
i-        int orig_x = x;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        redraw();	Err	bitreich.org	70
i-        while((c=fgetc(fc))!=EOF && c != 27){	Err	bitreich.org	70
i-                if(c=='\n'){	Err	bitreich.org	70
i-                        set_cur(BG);	Err	bitreich.org	70
i-                        y += 1;	Err	bitreich.org	70
i-                        x = orig_x;	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-                else {	Err	bitreich.org	70
i-                        set_cur(c);	Err	bitreich.org	70
i-                        update_current();	Err	bitreich.org	70
i-                        modified = 1;	Err	bitreich.org	70
i-                        x += 1;	Err	bitreich.org	70
i-                        if (x >= WIDTH)	Err	bitreich.org	70
i-                                x = orig_x;	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-                check_bound();	Err	bitreich.org	70
i-                status_bar();	Err	bitreich.org	70
i-                show_cursor();	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        state=MOVE;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void draw_box(int x1, int y1, int fix){	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        int xmin, ymin, xmax, ymax;	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-        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-        }	Err	bitreich.org	70
i-        for(i=ymin+1; i<=ymax; i++){	Err	bitreich.org	70
i-                f(xmin, i, line_v);	Err	bitreich.org	70
i-                f(xmax, i, line_v);	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        f(xmin, ymin, corner);	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-        show_cursor();	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void get_box(FILE *fc){	Err	bitreich.org	70
i-        char c;	Err	bitreich.org	70
i-        int orig_x=x, orig_y=y;	Err	bitreich.org	70
i-        redraw();	Err	bitreich.org	70
i-        step = 1;	Err	bitreich.org	70
i-        draw_box(x,y,NOFIX);	Err	bitreich.org	70
i-        while((c=fgetc(fc))!=EOF && c != 27 && c!= 'b' && c != '\n'){	Err	bitreich.org	70
i-                if (change_style(c))	Err	bitreich.org	70
i-                        goto update_box;	Err	bitreich.org	70
i-                if (!move_around(c, fc)) 	Err	bitreich.org	70
i-                        continue;	Err	bitreich.org	70
i-                check_bound();	Err	bitreich.org	70
i-                redraw();	Err	bitreich.org	70
i-                step = 1;	Err	bitreich.org	70
i-update_box:	Err	bitreich.org	70
i-                draw_box(orig_x, orig_y, NOFIX);	Err	bitreich.org	70
i-                status_bar();	Err	bitreich.org	70
i-                show_cursor();	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        if (c == 'b' || c == '\n'){	Err	bitreich.org	70
i-                draw_box(orig_x, orig_y, FIX);	Err	bitreich.org	70
i-                modified = 1;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        redraw();	Err	bitreich.org	70
i-        state = MOVE;	Err	bitreich.org	70
i-}	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-        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-	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-        f(x,y,mark_st);	Err	bitreich.org	70
i-        if (!a_len){	Err	bitreich.org	70
i-                show_cursor();	Err	bitreich.org	70
i-                return;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        cur_dir=DIR_N;	Err	bitreich.org	70
i-        for (i=0; i<a_len; i+=2){	Err	bitreich.org	70
i-                if (i>0) {	Err	bitreich.org	70
i-                        /* If we are switching between horizontal and vertical, put a "corner" */	Err	bitreich.org	70
i-                        if (((cur_dir & DIR_HOR) && (a[i] & DIR_VER)) ||	Err	bitreich.org	70
i-                            ((cur_dir & DIR_VER) && (a[i] & DIR_HOR))){	Err	bitreich.org	70
i-                                f(x,y,corner);	Err	bitreich.org	70
i-                                show_cursor();	Err	bitreich.org	70
i-                        }	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-                for(j=0; j<a[i+1]; j++){	Err	bitreich.org	70
i-                        line = (a[i] & DIR_L) || (a[i] & DIR_R) ? line_h : line_v;	Err	bitreich.org	70
i-                        x += progr_x(a[i]);	Err	bitreich.org	70
i-                        y += progr_y(a[i]);	Err	bitreich.org	70
i-                        f(x, y, line);	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-                /* f(x,y,mark_end);*/	Err	bitreich.org	70
i-                cur_dir = a[i];	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        if (autoend){	Err	bitreich.org	70
i-                if (cur_dir != DIR_N)	Err	bitreich.org	70
i-                        f(x,y, get_mark(cur_dir));	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        else 	Err	bitreich.org	70
i-                f(x,y,mark_end);	Err	bitreich.org	70
i-        show_cursor();	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void get_arrow(FILE *fc){	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        char c;	Err	bitreich.org	70
i-        int orig_x=x, orig_y=y, arrow_len;	Err	bitreich.org	70
i-        static char *arrow = NULL;	Err	bitreich.org	70
i-        static int arrow_sz;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (!arrow){	Err	bitreich.org	70
i-                arrow_sz = 100;	Err	bitreich.org	70
i-                arrow = malloc(arrow_sz * sizeof(char));	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        arrow_len = 0;	Err	bitreich.org	70
i-        dir = DIR_N;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        redraw();	Err	bitreich.org	70
i-        step = 1;	Err	bitreich.org	70
i-        draw_arrow(x,y, arrow, 0, NOFIX);	Err	bitreich.org	70
i-        while((c=fgetc(fc))!=EOF && c != 27 && c!= 'a' && c != '\n'){	Err	bitreich.org	70
i-                if (change_style(c))	Err	bitreich.org	70
i-                        goto update_arrow;	Err	bitreich.org	70
i-                if (!move_around(c, fc))	Err	bitreich.org	70
i-                        continue;	Err	bitreich.org	70
i-                check_bound();	Err	bitreich.org	70
i-                /* FIXME: if we are out of bound, do nothing? */	Err	bitreich.org	70
i-                if (arrow_len == arrow_sz){	Err	bitreich.org	70
i-                        arrow_sz *=2;	Err	bitreich.org	70
i-                        arrow = realloc(arrow, arrow_sz * sizeof(char));	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-                arrow[arrow_len++] = dir;	Err	bitreich.org	70
i-                arrow[arrow_len++] = step;	Err	bitreich.org	70
i-                redraw();	Err	bitreich.org	70
i-                step = 1;	Err	bitreich.org	70
i-update_arrow:	Err	bitreich.org	70
i-                draw_arrow(orig_x, orig_y, arrow, arrow_len, NOFIX);	Err	bitreich.org	70
i-                status_bar();	Err	bitreich.org	70
i-                show_cursor();	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        if (c == 'a' || c == '\n'){	Err	bitreich.org	70
i-                draw_arrow(orig_x, orig_y, arrow, arrow_len, FIX);	Err	bitreich.org	70
i-                modified = 1;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        redraw();	Err	bitreich.org	70
i-        state = MOVE;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void do_delete(int x1, int y1){	Err	bitreich.org	70
i-        int i;	Err	bitreich.org	70
i-        switch(dir){	Err	bitreich.org	70
i-                case DIR_R:	Err	bitreich.org	70
i-                        for(i=x1; i<=x; i++) set_xy(i,y,BG);	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case DIR_L:	Err	bitreich.org	70
i-                        for(i=x1; i>=x; i--) set_xy(i,y,BG);	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case DIR_U:	Err	bitreich.org	70
i-                        for(i=y1; i>=y; i--) set_xy(x,i,BG);	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case DIR_D:	Err	bitreich.org	70
i-                        for(i=y1; i<=y; i++) set_xy(x,i,BG);	Err	bitreich.org	70
i-                        break;	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 delete(FILE *fc){	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-        show_cursor();	Err	bitreich.org	70
i-        while((c=fgetc(fc))!=EOF && c!=27 && c!= 'x' && c != '\n'){	Err	bitreich.org	70
i-                if (!move_around(c, fc)) continue;	Err	bitreich.org	70
i-                check_bound();	Err	bitreich.org	70
i-                do_delete(orig_x, orig_y);	Err	bitreich.org	70
i-                step = 1;	Err	bitreich.org	70
i-                modified = 1;	Err	bitreich.org	70
i-                orig_x = x;	Err	bitreich.org	70
i-                orig_y = y;	Err	bitreich.org	70
i-                redraw();	Err	bitreich.org	70
i-                status_bar();	Err	bitreich.org	70
i-                show_cursor();	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        state = MOVE;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*** File management ***/	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void write_file(FILE *fc){	Err	bitreich.org	70
i-        FILE *fout;	Err	bitreich.org	70
i-        int i;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (!fname[0] || force_new){	Err	bitreich.org	70
i-                get_string(fc, "Write to: ", fname, 255);	Err	bitreich.org	70
i-                if ((fout=fopen(fname, "r"))!=NULL){	Err	bitreich.org	70
i-                        if (!is_yes(get_key(fc,"File exists. Overwrite [y/n]?")) ){	Err	bitreich.org	70
i-                                fclose(fout);	Err	bitreich.org	70
i-                                return;	Err	bitreich.org	70
i-                        }	Err	bitreich.org	70
i-                        fclose(fout);	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        if((fout=fopen(fname, "w"))==NULL){	Err	bitreich.org	70
i-                get_key(fc, "Error opening file.");	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-        }	Err	bitreich.org	70
i-        fclose(fout);	Err	bitreich.org	70
i-        modified = 0;	Err	bitreich.org	70
i-        get_key(fc, "File saved.");	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void check_modified(FILE *fc){	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (modified){	Err	bitreich.org	70
i-                if (!is_yes(get_key(fc, "Unsaved changes. Write to file [y/n]?")) ){	Err	bitreich.org	70
i-                        return;	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-                write_file(fc);	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void load_file(FILE *fc){	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        char newfname[256];	Err	bitreich.org	70
i-        FILE *fin;	Err	bitreich.org	70
i-        int i;	Err	bitreich.org	70
i-	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-                for(;i<HEIGHT; i++){	Err	bitreich.org	70
i-                        erase_line(screen[i].s);	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-                fclose(fin);	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        strcpy(fname, newfname);	Err	bitreich.org	70
i-        modified=0;	Err	bitreich.org	70
i-        redraw();	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void new_file(FILE *fc){	Err	bitreich.org	70
i-        check_modified(fc);	Err	bitreich.org	70
i-        erase_screen();	Err	bitreich.org	70
i-        go_to(HOME);	Err	bitreich.org	70
i-        redraw();	Err	bitreich.org	70
i-        fname[0] = '\0';	Err	bitreich.org	70
i-        modified=0;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*** Visual ***/	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void visual_box(FILE *fc){	Err	bitreich.org	70
i-        int orig_x =x, orig_y = y;	Err	bitreich.org	70
i-        char c, f = BG;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        redraw();	Err	bitreich.org	70
i-        step = 1;	Err	bitreich.org	70
i-        set_video(VIDEO_REV);	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 '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-                                erase_box(orig_x, orig_y, f);	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-                } 	Err	bitreich.org	70
i-                check_bound();	Err	bitreich.org	70
i-                set_video(VIDEO_NRM);	Err	bitreich.org	70
i-                redraw();	Err	bitreich.org	70
i-                step = 1;	Err	bitreich.org	70
i-                f = BG;	Err	bitreich.org	70
i-                set_video(VIDEO_REV);	Err	bitreich.org	70
i-                draw_box(orig_x, orig_y, NOFIX);	Err	bitreich.org	70
i-                status_bar();	Err	bitreich.org	70
i-                show_cursor();	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-vis_exit:	Err	bitreich.org	70
i-        set_video(VIDEO_NRM);	Err	bitreich.org	70
i-        redraw();	Err	bitreich.org	70
i-        state = MOVE;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*** Initialisation ***/	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void init_screen(){	Err	bitreich.org	70
i-        int i;	Err	bitreich.org	70
i-        struct winsize wsz;	Err	bitreich.org	70
i-        	Err	bitreich.org	70
i-        if (!ioctl(STDIN_FILENO, TIOCGWINSZ, &wsz)){	Err	bitreich.org	70
i-                WIDTH=wsz.ws_col - 2;	Err	bitreich.org	70
i-                HEIGHT=wsz.ws_row - 1;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        else {	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-                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-                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-        }	Err	bitreich.org	70
i-        reset_styles();	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void init(){	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        signal(SIGHUP, cleanup);	Err	bitreich.org	70
i-        signal(SIGINT, cleanup);	Err	bitreich.org	70
i-        signal(SIGTERM, cleanup);	Err	bitreich.org	70
i-        signal(SIGQUIT, cleanup);	Err	bitreich.org	70
i-        atexit(exit_cleanup);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        tcgetattr(0, &t1);	Err	bitreich.org	70
i-        t2 = t1;	Err	bitreich.org	70
i-        t2.c_lflag &= ~(ICANON | ECHO);	Err	bitreich.org	70
i-        tcsetattr(0, TCSANOW, &t2);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        init_screen();	Err	bitreich.org	70
i-        x = 0;	Err	bitreich.org	70
i-        y = 0;	Err	bitreich.org	70
i-        modified = 0;	Err	bitreich.org	70
i-        fname[0] = '\0';	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
i-/*** Commands ***/	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-void commands(FILE *fc){	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        char c;	Err	bitreich.org	70
i-        while((c=fgetc(fc))!=EOF){	Err	bitreich.org	70
i-                if (!change_style(c) && !move_around(c, fc)){	Err	bitreich.org	70
i-                        switch(c){	Err	bitreich.org	70
i-                                case 'i':	Err	bitreich.org	70
i-                                        state = TEXT;	Err	bitreich.org	70
i-                                        get_text(fc);	Err	bitreich.org	70
i-                                        break;	Err	bitreich.org	70
i-                                case 'R':	Err	bitreich.org	70
i-                                        redraw();	Err	bitreich.org	70
i-                                        break;	Err	bitreich.org	70
i-                                case 'b':	Err	bitreich.org	70
i-                                        state = BOX;	Err	bitreich.org	70
i-                                        get_box(fc);	Err	bitreich.org	70
i-                                        break;	Err	bitreich.org	70
i-                                case 'A': autoend=1;	Err	bitreich.org	70
i-                                case 'a':	Err	bitreich.org	70
i-                                        state = ARROW;	Err	bitreich.org	70
i-                                        get_arrow(fc);	Err	bitreich.org	70
i-                                        autoend = 0;	Err	bitreich.org	70
i-                                        break;	Err	bitreich.org	70
i-                                case 'W':	Err	bitreich.org	70
i-                                        force_new = 1;/** FALLTHROUGH **/	Err	bitreich.org	70
i-                                case 'w':	Err	bitreich.org	70
i-                                        write_file(fc);	Err	bitreich.org	70
i-                                        break;	Err	bitreich.org	70
i-                                case 'e':	Err	bitreich.org	70
i-                                        check_modified(fc);/** FALLTHROUGH **/	Err	bitreich.org	70
i-                                case 'E':	Err	bitreich.org	70
i-                                        load_file(fc);	Err	bitreich.org	70
i-                                        break;	Err	bitreich.org	70
i-                                case 'N':	Err	bitreich.org	70
i-                                        new_file(fc);	Err	bitreich.org	70
i-                                        break;	Err	bitreich.org	70
i-                                case 'x':	Err	bitreich.org	70
i-                                        state = DEL;	Err	bitreich.org	70
i-                                        delete(fc);	Err	bitreich.org	70
i-                                        break;	Err	bitreich.org	70
i-                                case 'v':	Err	bitreich.org	70
i-                                        state = VIS;	Err	bitreich.org	70
i-                                        visual_box(fc);	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
i-                                        exit(0);	Err	bitreich.org	70
i-                                        break;	Err	bitreich.org	70
i-                        }	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-                check_bound();	Err	bitreich.org	70
i-                status_bar();	Err	bitreich.org	70
i-                show_cursor();	Err	bitreich.org	70
i-                step = 1;	Err	bitreich.org	70
i-                force_new = 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-void usage(){	Err	bitreich.org	70
i-        fprintf(stderr, "Usage: %s [-s] [-h] [file ...]\n", argv0);	Err	bitreich.org	70
i-        exit(1);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-int main(int argc, char *argv[]){	Err	bitreich.org	70
i-        FILE *fc;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        ARGBEGIN {	Err	bitreich.org	70
i-                case 's':	Err	bitreich.org	70
i-                        silent = 1;	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                case 'h': /* FALLTHROUGH */	Err	bitreich.org	70
i-                default:	Err	bitreich.org	70
i-                        usage();	Err	bitreich.org	70
i-        } ARGEND;        	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        init();	Err	bitreich.org	70
i-        while (argc){	Err	bitreich.org	70
i-                fc = fopen(argv[0], "r");	Err	bitreich.org	70
i-                if (fc == NULL){	Err	bitreich.org	70
i-                        fprintf(stderr, "Error opening file %s\n", argv[0]);	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-                else {	Err	bitreich.org	70
i-                        commands(fc);	Err	bitreich.org	70
i-                        fclose(fc);	Err	bitreich.org	70
i-                        redraw();	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-                argv++;	Err	bitreich.org	70
i-                argc--;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        commands(stdin);	Err	bitreich.org	70
i-        return 0;	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@@ -0,0 +1,138 @@	Err	bitreich.org	70
i+#ifndef __GRAMSCII_H__	Err	bitreich.org	70
i+#define __GRAMSCII_H__	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#include <stdio.h>	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+#define MOVE   0x00	Err	bitreich.org	70
i+#define BOX    0x01	Err	bitreich.org	70
i+#define ARROW  0x02	Err	bitreich.org	70
i+#define TEXT   0x04	Err	bitreich.org	70
i+#define DEL    0x08	Err	bitreich.org	70
i+#define VIS    0x10	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#define DIR_N  0x00	Err	bitreich.org	70
i+#define DIR_R  0x01	Err	bitreich.org	70
i+#define DIR_U  0x02	Err	bitreich.org	70
i+#define DIR_D  0x04	Err	bitreich.org	70
i+#define DIR_L  0x08	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#define DIR_HOR (DIR_R | DIR_L)	Err	bitreich.org	70
i+#define DIR_VER (DIR_D | DIR_U)	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#define NOFIX 0x0	Err	bitreich.org	70
i+#define FIX   0x1	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#define BG        ' '	Err	bitreich.org	70
i+#define PTR       '+'	Err	bitreich.org	70
i+#define UND       '_'	Err	bitreich.org	70
i+#define ARR_L     '<'	Err	bitreich.org	70
i+#define ARR_R     '>'	Err	bitreich.org	70
i+#define ARR_U     '^'	Err	bitreich.org	70
i+#define ARR_D     'v'	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#define HOME   0x01	Err	bitreich.org	70
i+#define END    0x02	Err	bitreich.org	70
i+#define MIDDLE 0x04	Err	bitreich.org	70
i+	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+	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+#define MAX(x,y)  (x) > (y) ? (x) : (y)	Err	bitreich.org	70
i+	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+	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+int WIDTH, HEIGHT;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+int mode;	Err	bitreich.org	70
i+int dir;	Err	bitreich.org	70
i+int x;	Err	bitreich.org	70
i+int y;	Err	bitreich.org	70
i+int step;	Err	bitreich.org	70
i+int mult;	Err	bitreich.org	70
i+int force_new;	Err	bitreich.org	70
i+char cursor;	Err	bitreich.org	70
i+char corner;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+int hlines_sz;	Err	bitreich.org	70
i+int vlines_sz;	Err	bitreich.org	70
i+int corners_sz;	Err	bitreich.org	70
i+int stmarks_sz;	Err	bitreich.org	70
i+int endmarks_sz;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+int cur_hl, cur_vl, cur_corn, cur_start, cur_end;	Err	bitreich.org	70
i+char line_h;	Err	bitreich.org	70
i+char line_v;	Err	bitreich.org	70
i+char mark_st;	Err	bitreich.org	70
i+char mark_end;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+char modified;	Err	bitreich.org	70
i+char fname[256];	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+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+struct termios t1, t2, t3;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/** screen-related functions **/	Err	bitreich.org	70
i+void reset_styles();	Err	bitreich.org	70
i+void redraw();	Err	bitreich.org	70
i+int move_around(char c, FILE *fc);	Err	bitreich.org	70
i+void check_bound();	Err	bitreich.org	70
i+void status_bar();	Err	bitreich.org	70
i+void show_cursor();	Err	bitreich.org	70
i+void set_cur(char c);	Err	bitreich.org	70
i+void update_current();	Err	bitreich.org	70
i+void set_xy(int _x, int _y, char c);	Err	bitreich.org	70
i+void draw_xy(int x, int y, char c);	Err	bitreich.org	70
i+char get_mark(char dir);	Err	bitreich.org	70
i+void set_video(int v);	Err	bitreich.org	70
i+char get_key(FILE *fc, char *msg);	Err	bitreich.org	70
i+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_screen();	Err	bitreich.org	70
i+void go_to(int where);	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
i+void get_text(FILE *fc);	Err	bitreich.org	70
i+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+	Err	bitreich.org	70
i+/** file-related functions **/	Err	bitreich.org	70
i+void write_file(FILE *fc);	Err	bitreich.org	70
i+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+	Err	bitreich.org	70
i+#endif	Err	bitreich.org	70
1diff --git a/main.c b/main.c	/scm/gramscii/file/main.c.gph	bitreich.org	70
i@@ -0,0 +1,175 @@	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+*	Err	bitreich.org	70
i+* gramscii: a simple editor for ASCII box-and-arrow charts	Err	bitreich.org	70
i+*	Err	bitreich.org	70
i+* Copyright (c) 2019 Vincenzo "KatolaZ" Nicosia <katolaz@freaknet.org>	Err	bitreich.org	70
i+*	Err	bitreich.org	70
i+* This program is free software: you can redistribute it and/or modify	Err	bitreich.org	70
i+* it under the terms of the GNU General Public License as published by	Err	bitreich.org	70
i+* the Free Software Foundation, either version 3 of the License, or	Err	bitreich.org	70
i+* (at your option) any later version.	Err	bitreich.org	70
i+*	Err	bitreich.org	70
i+* This program is distributed in the hope that it will be useful,	Err	bitreich.org	70
i+* but WITHOUT ANY WARRANTY; without even the implied warranty of	Err	bitreich.org	70
i+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the	Err	bitreich.org	70
i+* GNU General Public License for more details.	Err	bitreich.org	70
i+*	Err	bitreich.org	70
i+* You should have received a copy of the GNU General Public License	Err	bitreich.org	70
i+* along with this program. Please see the attached file COPYING. 	Err	bitreich.org	70
i+* Otherwise, please visit <https://www.gnu.org/licenses/>;.	Err	bitreich.org	70
i+*	Err	bitreich.org	70
i+*/	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#include <stdio.h>	Err	bitreich.org	70
i+#include <stdlib.h>	Err	bitreich.org	70
i+#include <signal.h>	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#include "arg.h"	Err	bitreich.org	70
i+#include "gramscii.h"	Err	bitreich.org	70
i+	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+        tcsetattr(0, TCSANOW, &t1);	Err	bitreich.org	70
i+        fflush(stdout);	Err	bitreich.org	70
i+        exit(0);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void exit_cleanup(void){	Err	bitreich.org	70
i+        cleanup(0);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*** Initialisation ***/	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void init(){	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        signal(SIGHUP, cleanup);	Err	bitreich.org	70
i+        signal(SIGINT, cleanup);	Err	bitreich.org	70
i+        signal(SIGTERM, cleanup);	Err	bitreich.org	70
i+        signal(SIGQUIT, cleanup);	Err	bitreich.org	70
i+        atexit(exit_cleanup);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        tcgetattr(0, &t1);	Err	bitreich.org	70
i+        t2 = t1;	Err	bitreich.org	70
i+        t2.c_lflag &= ~(ICANON | ECHO);	Err	bitreich.org	70
i+        tcsetattr(0, TCSANOW, &t2);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        init_screen();	Err	bitreich.org	70
i+        x = 0;	Err	bitreich.org	70
i+        y = 0;	Err	bitreich.org	70
i+        modified = 0;	Err	bitreich.org	70
i+        fname[0] = '\0';	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
i+/*** Commands ***/	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void commands(FILE *fc){	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        char c;	Err	bitreich.org	70
i+        while((c=fgetc(fc))!=EOF){	Err	bitreich.org	70
i+                if (!change_style(c) && !move_around(c, fc)){	Err	bitreich.org	70
i+                        switch(c){	Err	bitreich.org	70
i+                                case 'i':	Err	bitreich.org	70
i+                                        mode = TEXT;	Err	bitreich.org	70
i+                                        get_text(fc);	Err	bitreich.org	70
i+                                        break;	Err	bitreich.org	70
i+                                case 'R':	Err	bitreich.org	70
i+                                        redraw();	Err	bitreich.org	70
i+                                        break;	Err	bitreich.org	70
i+                                case 'b':	Err	bitreich.org	70
i+                                        mode = BOX;	Err	bitreich.org	70
i+                                        get_box(fc);	Err	bitreich.org	70
i+                                        break;	Err	bitreich.org	70
i+                                case 'A': autoend=1;	Err	bitreich.org	70
i+                                case 'a':	Err	bitreich.org	70
i+                                        mode = ARROW;	Err	bitreich.org	70
i+                                        get_arrow(fc);	Err	bitreich.org	70
i+                                        autoend = 0;	Err	bitreich.org	70
i+                                        break;	Err	bitreich.org	70
i+                                case 'W':	Err	bitreich.org	70
i+                                        force_new = 1;/** FALLTHROUGH **/	Err	bitreich.org	70
i+                                case 'w':	Err	bitreich.org	70
i+                                        write_file(fc);	Err	bitreich.org	70
i+                                        break;	Err	bitreich.org	70
i+                                case 'e':	Err	bitreich.org	70
i+                                        check_modified(fc);/** FALLTHROUGH **/	Err	bitreich.org	70
i+                                case 'E':	Err	bitreich.org	70
i+                                        load_file(fc);	Err	bitreich.org	70
i+                                        break;	Err	bitreich.org	70
i+                                case 'N':	Err	bitreich.org	70
i+                                        new_file(fc);	Err	bitreich.org	70
i+                                        break;	Err	bitreich.org	70
i+                                case 'x':	Err	bitreich.org	70
i+                                        mode = DEL;	Err	bitreich.org	70
i+                                        erase(fc);	Err	bitreich.org	70
i+                                        break;	Err	bitreich.org	70
i+                                case 'v':	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 'q':	Err	bitreich.org	70
i+                                        check_modified(fc);/** FALLTHROUGH **/	Err	bitreich.org	70
i+                                case 'Q':	Err	bitreich.org	70
i+                                        exit(0);	Err	bitreich.org	70
i+                                        break;	Err	bitreich.org	70
i+                        }	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                check_bound();	Err	bitreich.org	70
i+                status_bar();	Err	bitreich.org	70
i+                show_cursor();	Err	bitreich.org	70
i+                step = 1;	Err	bitreich.org	70
i+                force_new = 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+void usage(){	Err	bitreich.org	70
i+        fprintf(stderr, "Usage: %s [-s] [-h] [file ...]\n", argv0);	Err	bitreich.org	70
i+        exit(1);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+int main(int argc, char *argv[]){	Err	bitreich.org	70
i+        FILE *fc;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        ARGBEGIN {	Err	bitreich.org	70
i+                case 's':	Err	bitreich.org	70
i+                        silent = 1;	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case 'h': /* FALLTHROUGH */	Err	bitreich.org	70
i+                default:	Err	bitreich.org	70
i+                        usage();	Err	bitreich.org	70
i+        } ARGEND;        	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        init();	Err	bitreich.org	70
i+        while (argc){	Err	bitreich.org	70
i+                fc = fopen(argv[0], "r");	Err	bitreich.org	70
i+                if (fc == NULL){	Err	bitreich.org	70
i+                        fprintf(stderr, "Error opening file %s\n", argv[0]);	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                else {	Err	bitreich.org	70
i+                        commands(fc);	Err	bitreich.org	70
i+                        fclose(fc);	Err	bitreich.org	70
i+                        redraw();	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                argv++;	Err	bitreich.org	70
i+                argc--;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        commands(stdin);	Err	bitreich.org	70
i+        return 0;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
1diff --git a/screen.c b/screen.c	/scm/gramscii/file/screen.c.gph	bitreich.org	70
i@@ -0,0 +1,419 @@	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+	Err	bitreich.org	70
i+#include "gramscii.h"	Err	bitreich.org	70
i+#include "config.h"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*** screen management functions ***/	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*** Status bar ***/	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+char* mode_str(){	Err	bitreich.org	70
i+        switch(mode){	Err	bitreich.org	70
i+                case MOVE:	Err	bitreich.org	70
i+                        return "mov";	Err	bitreich.org	70
i+                case TEXT:	Err	bitreich.org	70
i+                        return "txt";	Err	bitreich.org	70
i+                case BOX:	Err	bitreich.org	70
i+                        return "box";	Err	bitreich.org	70
i+                case ARROW:	Err	bitreich.org	70
i+                        return "arr";	Err	bitreich.org	70
i+                case DEL:	Err	bitreich.org	70
i+                        return "del";	Err	bitreich.org	70
i+                case VIS:	Err	bitreich.org	70
i+                        return "vis";	Err	bitreich.org	70
i+                default:	Err	bitreich.org	70
i+                        return "ERR";	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        return "ERR";	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+char get_mark(char dir){	Err	bitreich.org	70
i+        switch(dir){	Err	bitreich.org	70
i+                case DIR_U:	Err	bitreich.org	70
i+                        return '^';	Err	bitreich.org	70
i+                case DIR_D:	Err	bitreich.org	70
i+                        return 'v';	Err	bitreich.org	70
i+                case DIR_L:	Err	bitreich.org	70
i+                        return '<';	Err	bitreich.org	70
i+                case DIR_R:	Err	bitreich.org	70
i+                        return '>';	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        return '>';	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void status_bar(){	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (silent)	Err	bitreich.org	70
i+                return;	Err	bitreich.org	70
i+        printf("\033[%d;1f\033[7m", HEIGHT+1);	Err	bitreich.org	70
i+        printf("%*s", WIDTH-1, "");	Err	bitreich.org	70
i+        printf("\033[%d;1f\033[7m", HEIGHT+1);	Err	bitreich.org	70
i+        printf(" x:%3d y:%3d -- MODE:%4s HL:%c VL:%c CN:%c SP:%c EP:%c %10s",	Err	bitreich.org	70
i+                x, y, mode_str(), line_h, line_v, corner, mark_st, mark_end, "");	Err	bitreich.org	70
i+        if (!modified)	Err	bitreich.org	70
i+                printf(" [%s]", fname );	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+#endif	Err	bitreich.org	70
i+        printf("\033[0m");	Err	bitreich.org	70
i+        fflush(stdout);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+char get_key(FILE *fc, char *msg){	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (silent)	Err	bitreich.org	70
i+                return 0;	Err	bitreich.org	70
i+        printf("\033[%d;1f\033[7m", HEIGHT+1);	Err	bitreich.org	70
i+        printf("%*s", WIDTH, "");	Err	bitreich.org	70
i+        printf("\033[%d;1f\033[7m", HEIGHT+1);	Err	bitreich.org	70
i+        printf("%s", msg);	Err	bitreich.org	70
i+        fflush(stdout);	Err	bitreich.org	70
i+        printf("\033[0m");	Err	bitreich.org	70
i+        fflush(stdout);	Err	bitreich.org	70
i+        return fgetc(fc);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void get_string(FILE *fc, char *msg, char *s, int sz){	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (!silent){	Err	bitreich.org	70
i+                printf("\033[%d;1f\033[7m", HEIGHT+1);	Err	bitreich.org	70
i+                printf("%*s", WIDTH, "");	Err	bitreich.org	70
i+                printf("\033[%d;1f\033[7m", HEIGHT+1);	Err	bitreich.org	70
i+        	Err	bitreich.org	70
i+                /* We must activate echo now */	Err	bitreich.org	70
i+                t3 = t2;	Err	bitreich.org	70
i+                t3.c_lflag |= (ECHO | ICANON);	Err	bitreich.org	70
i+                tcsetattr(0, TCSANOW, &t3);	Err	bitreich.org	70
i+                printf("%s", msg);	Err	bitreich.org	70
i+                printf("\033[0m");	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        fgets(s, sz, fc);	Err	bitreich.org	70
i+        s[strlen(s)-1] = '\0';	Err	bitreich.org	70
i+        tcsetattr(0, TCSANOW, &t2);	Err	bitreich.org	70
i+        if (!silent)	Err	bitreich.org	70
i+                fflush(stdout);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+int is_yes(char c){	Err	bitreich.org	70
i+        return c=='y' ? 1 : c == 'Y'? 1 : 0;	Err	bitreich.org	70
i+}	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+}	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+        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+                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+                        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+        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+        }	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+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void set_cur(char c){	Err	bitreich.org	70
i+        set_xy(x, y, c);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void draw_xy(int x, int y, char c){	Err	bitreich.org	70
i+        /* FIXME: check if x and y are valid!!!! */	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(c);	Err	bitreich.org	70
i+        fflush(stdout);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+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+        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+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void erase_box(int x1, int y1, char c){	Err	bitreich.org	70
i+        int x_incr, y_incr, i; 	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        x_incr = x1 < x? +1: -1;	Err	bitreich.org	70
i+        y_incr = y1 < y? +1: -1;	Err	bitreich.org	70
i+        do{	Err	bitreich.org	70
i+                i = y1;	Err	bitreich.org	70
i+                do{	Err	bitreich.org	70
i+                        set_xy(x1, i, c);	Err	bitreich.org	70
i+                } while(i != y && (1 | (i += y_incr)));	Err	bitreich.org	70
i+        } while(x1 != x && (1 | (x1 += x_incr)));	Err	bitreich.org	70
i+        	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	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+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void check_bound(){	Err	bitreich.org	70
i+        if (x<0) x=0;	Err	bitreich.org	70
i+        else if (x>=WIDTH) x = WIDTH-1;	Err	bitreich.org	70
i+        if (y<0) y=0;	Err	bitreich.org	70
i+        else if (y>=HEIGHT) y = HEIGHT -1;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void reset_styles(){	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        cur_corn = 0;	Err	bitreich.org	70
i+        corner = corners[0];	Err	bitreich.org	70
i+        cur_hl = cur_vl = 0;	Err	bitreich.org	70
i+        cur_start = cur_end = 0;	Err	bitreich.org	70
i+        line_h = hlines[cur_hl];	Err	bitreich.org	70
i+        line_v = vlines[cur_vl];	Err	bitreich.org	70
i+        mark_st = st_marks[cur_start];	Err	bitreich.org	70
i+        mark_end = end_marks[cur_end];	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void redraw(){	Err	bitreich.org	70
i+        int i;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (silent)	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+        }	Err	bitreich.org	70
i+        status_bar();	Err	bitreich.org	70
i+        show_cursor();	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void go_to(int where){	Err	bitreich.org	70
i+        switch(where){	Err	bitreich.org	70
i+                case HOME:	Err	bitreich.org	70
i+                        x = y = 0;	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case END:	Err	bitreich.org	70
i+                        x = WIDTH-1;	Err	bitreich.org	70
i+                        y = HEIGHT-1;	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case MIDDLE:	Err	bitreich.org	70
i+                        x = WIDTH/2;	Err	bitreich.org	70
i+                        y = HEIGHT/2;	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        check_bound();	Err	bitreich.org	70
i+        show_cursor();	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void handle_goto(){	Err	bitreich.org	70
i+        char c;        	Err	bitreich.org	70
i+        c=getchar();	Err	bitreich.org	70
i+        switch(c){	Err	bitreich.org	70
i+                case 'h':	Err	bitreich.org	70
i+                        dir = DIR_L;	Err	bitreich.org	70
i+                        x = 0;	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case 'l':	Err	bitreich.org	70
i+                        dir = DIR_R;	Err	bitreich.org	70
i+                        x = WIDTH - 1;	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case 'j':	Err	bitreich.org	70
i+                        dir = DIR_D;	Err	bitreich.org	70
i+                        y = HEIGHT - 1;	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case 'k':	Err	bitreich.org	70
i+                        dir = DIR_U;	Err	bitreich.org	70
i+                        y = 0;	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case 'g':	Err	bitreich.org	70
i+                        dir = DIR_N;	Err	bitreich.org	70
i+                        go_to(HOME);	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case 'G':	Err	bitreich.org	70
i+                        dir = DIR_N;	Err	bitreich.org	70
i+                        go_to(END);	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case 'm':	Err	bitreich.org	70
i+                        dir = DIR_N;	Err	bitreich.org	70
i+                        go_to(MIDDLE);	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        check_bound();	Err	bitreich.org	70
i+        show_cursor();	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+int get_escape(FILE *fc){	Err	bitreich.org	70
i+        char c[4];	Err	bitreich.org	70
i+        	Err	bitreich.org	70
i+        c[0] = fgetc(fc);	Err	bitreich.org	70
i+        if (c[0] == '['){	Err	bitreich.org	70
i+                c[1] = fgetc(fc);	Err	bitreich.org	70
i+                switch(c[1]){	Err	bitreich.org	70
i+                        case 'D':	Err	bitreich.org	70
i+                                dir = DIR_L;	Err	bitreich.org	70
i+                                x -= step;	Err	bitreich.org	70
i+                                break;	Err	bitreich.org	70
i+                        case 'B':	Err	bitreich.org	70
i+                                dir = DIR_D;	Err	bitreich.org	70
i+                                y += step;	Err	bitreich.org	70
i+                                break;	Err	bitreich.org	70
i+                        case 'A':	Err	bitreich.org	70
i+                                dir = DIR_U;	Err	bitreich.org	70
i+                                y -= step;	Err	bitreich.org	70
i+                                break;	Err	bitreich.org	70
i+                        case 'C':	Err	bitreich.org	70
i+                                dir = DIR_R;	Err	bitreich.org	70
i+                                x += step;	Err	bitreich.org	70
i+                                break;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                return 1;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        else{	Err	bitreich.org	70
i+                ungetc(c[0], fc);	Err	bitreich.org	70
i+                return 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+int move_around(char c, FILE *fc){	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (isdigit(c)){	Err	bitreich.org	70
i+                if (mult)	Err	bitreich.org	70
i+                        mult *=10;	Err	bitreich.org	70
i+                mult += c - '0';	Err	bitreich.org	70
i+                return 0;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        switch(c){	Err	bitreich.org	70
i+                case 27: /* control sequence? */	Err	bitreich.org	70
i+                        c = get_escape(fc);	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case 'H': step = LONG_STEP;/** FALLTHROUGH **/	Err	bitreich.org	70
i+                case 'h':	Err	bitreich.org	70
i+                        dir = DIR_L;	Err	bitreich.org	70
i+                        if (mult) 	Err	bitreich.org	70
i+                                step *= mult;	Err	bitreich.org	70
i+                        x -= step;	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case 'J': step = LONG_STEP;/** FALLTHROUGH **/	Err	bitreich.org	70
i+                case 'j':	Err	bitreich.org	70
i+                        if (mult) 	Err	bitreich.org	70
i+                                step *= mult;	Err	bitreich.org	70
i+                        dir = DIR_D;	Err	bitreich.org	70
i+                        y += step;	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case 'K': step = LONG_STEP;/** FALLTHROUGH **/	Err	bitreich.org	70
i+                case 'k':	Err	bitreich.org	70
i+                        if (mult) 	Err	bitreich.org	70
i+                                step *= mult;	Err	bitreich.org	70
i+                        dir = DIR_U;	Err	bitreich.org	70
i+                        y -= step;	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case 'L': step = LONG_STEP;/** FALLTHROUGH **/	Err	bitreich.org	70
i+                case 'l':	Err	bitreich.org	70
i+                        if (mult) 	Err	bitreich.org	70
i+                                step *= mult;	Err	bitreich.org	70
i+                        dir = DIR_R;	Err	bitreich.org	70
i+                        x += step;	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                case 'g':	Err	bitreich.org	70
i+                        handle_goto();	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                default:	Err	bitreich.org	70
i+                        return 0;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        mult = 0;	Err	bitreich.org	70
i+        return c;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void set_video(int v){	Err	bitreich.org	70
i+        if (silent)	Err	bitreich.org	70
i+                return;	Err	bitreich.org	70
i+        printf("\033[%dm", v);	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 init_screen(){	Err	bitreich.org	70
i+        int i;	Err	bitreich.org	70
i+        struct winsize wsz;	Err	bitreich.org	70
i+        	Err	bitreich.org	70
i+        if (!ioctl(STDIN_FILENO, TIOCGWINSZ, &wsz)){	Err	bitreich.org	70
i+                WIDTH=wsz.ws_col - 2;	Err	bitreich.org	70
i+                HEIGHT=wsz.ws_row - 1;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        else {	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+                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+                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+        }	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+        corners_sz = sizeof(corners) -1;	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+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
.
Response: text/plain
Original URLgopher://bitreich.org/0/scm/gramscii/commit/8e3d23b921d9b...
Content-Typetext/plain; charset=utf-8