iMerge branch 'devel' into master - 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 f678684b470f02d9fed4818eb92c2a925380c428 /scm/gramscii/commit/f678684b470f02d9fed4818eb92c2a925380c428.gph bitreich.org 70
1parent 8b67bd6c5f4e175721b44d4733d1a5a6fc1a2561 /scm/gramscii/commit/8b67bd6c5f4e175721b44d4733d1a5a6fc1a2561.gph bitreich.org 70
hAuthor: KatolaZ <katolaz@freaknet.org> URL:mailto:katolaz@freaknet.org bitreich.org 70
iDate: Sat, 27 Jul 2019 06:57:29 +0100 Err bitreich.org 70
i Err bitreich.org 70
iMerge branch 'devel' into master 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