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 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 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; i0) { 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=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 Err bitreich.org 70 i+#include 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 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 . Err bitreich.org 70 i-* Err bitreich.org 70 i-*/ Err bitreich.org 70 i- Err bitreich.org 70 i-#include Err bitreich.org 70 i-#include Err bitreich.org 70 i-#include Err bitreich.org 70 i-#include Err bitreich.org 70 i-#include Err bitreich.org 70 i-#include Err bitreich.org 70 i-#include Err bitreich.org 70 i-#include 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'; 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=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': 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; i0) { 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=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 Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include 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 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 . Err bitreich.org 70 i+* Err bitreich.org 70 i+*/ Err bitreich.org 70 i+ Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include 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 Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include 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=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