iadd auto-arrow, multipliers, -s, -h - 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 f0200b8cc94cd6859ee91b7b47d1d89b41b195ed /scm/gramscii/commit/f0200b8cc94cd6859ee91b7b47d1d89b41b195ed.gph bitreich.org 70 1parent cbfdf55b79d29e94b1f3d263dc74ee55140bbc66 /scm/gramscii/commit/cbfdf55b79d29e94b1f3d263dc74ee55140bbc66.gph bitreich.org 70 hAuthor: KatolaZ URL:mailto:katolaz@freaknet.org bitreich.org 70 iDate: Fri, 26 Jul 2019 10:26:40 +0100 Err bitreich.org 70 i Err bitreich.org 70 iadd auto-arrow, multipliers, -s, -h Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M README.md | 13 +++++++++++++ Err bitreich.org 70 i M TODO | 11 ++++++----- Err bitreich.org 70 i M config.mk | 2 +- Err bitreich.org 70 i M gramscii.1 | 56 +++++++++++++++++++++++++++++-- Err bitreich.org 70 i M gramscii.c | 114 ++++++++++++++++++++++++++++--- Err bitreich.org 70 i Err bitreich.org 70 i5 files changed, 180 insertions(+), 16 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/README.md b/README.md /scm/gramscii/file/README.md.gph bitreich.org 70 i@@ -74,3 +74,16 @@ intellectual, a philosopher, and an artist, and maintained that societal Err bitreich.org 70 i changes are only possible when a class exerts intellectual and moral Err bitreich.org 70 i leadership over its contemporaries. So just get rid of all your shiny Err bitreich.org 70 i iPointless things and come back to reality. Err bitreich.org 70 i+ Err bitreich.org 70 i+COPYING Err bitreich.org 70 i+======= Err bitreich.org 70 i+ Err bitreich.org 70 i+`gramscii` is written and maintained by Vincenzo 'KatolaZ' Nicosia Err bitreich.org 70 i+. You can use, modify and/or redistribute it under Err bitreich.org 70 i+the terms of the GNU General Public Licence, either version 3 of the Err bitreich.org 70 i+License or, 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, but Err bitreich.org 70 i+WITHOUT ANY WARRANTY; without even the implied warranty of Err bitreich.org 70 i+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Err bitreich.org 70 i+General Public License for more details. Err bitreich.org 70 1diff --git a/TODO b/TODO /scm/gramscii/file/TODO.gph bitreich.org 70 i@@ -1,14 +1,13 @@ Err bitreich.org 70 i + optimize redraws (redraw only the modified rectangle) 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 i - add screen geometry option (-g 25x80?) Err bitreich.org 70 i - read file at point Err bitreich.org 70 i+ - read output of command (!) Err bitreich.org 70 i - 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-- parse control characters Err bitreich.org 70 i- - parse arrows (text-mode will allow movements as well) Err bitreich.org 70 i++ parse control characters Err bitreich.org 70 i+ + parse arrows (text-mode will allow movements as well) Err bitreich.org 70 i - (?) implement CTRL+G as abort (aside ESC) Err bitreich.org 70 i - add crop command (c) Err bitreich.org 70 i - remove extra blanks until EOL when saving to file Err bitreich.org 70 i@@ -23,7 +22,9 @@ Err bitreich.org 70 i - allow scrolling (both vertical and horizontal) Err bitreich.org 70 i - catch SIGWINCH and react appropriately (after scroll is Err bitreich.org 70 i enabled) Err bitreich.org 70 i-- auto-arrow 'A' (automatic end-char) 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 i+* auto-arrow 'A' (automatic end-char) Err bitreich.org 70 i * move configs in config.h Err bitreich.org 70 i * get screen geometry Err bitreich.org 70 i * allow the use of [ENTER] to confirm arrow, boxes (useful Err bitreich.org 70 1diff --git a/config.mk b/config.mk /scm/gramscii/file/config.mk.gph bitreich.org 70 i@@ -3,4 +3,4 @@ BINDIR = ${PREFIX}/bin Err bitreich.org 70 i MANDIR = ${PREFIX}/share/man Err bitreich.org 70 i Err bitreich.org 70 i CFLAGS = -O3 -std=c90 -pedantic -Wall Err bitreich.org 70 i-##CC = cc Err bitreich.org 70 i+CC = cc Err bitreich.org 70 1diff --git a/gramscii.1 b/gramscii.1 /scm/gramscii/file/gramscii.1.gph bitreich.org 70 i@@ -4,6 +4,9 @@ gramscii \- simple editor for ASCII box diagrams Err bitreich.org 70 i .SH SYNOPSIS Err bitreich.org 70 i .PP Err bitreich.org 70 i gramscii Err bitreich.org 70 i+.RI [-s] Err bitreich.org 70 i+.RI [-h] Err bitreich.org 70 i+.RI [file ...] Err bitreich.org 70 i .PP Err bitreich.org 70 i .SH DESCRIPTION Err bitreich.org 70 i .PP Err bitreich.org 70 i@@ -11,6 +14,18 @@ gramscii is a simple interactive editor to create ASCII box-and-arrows Err bitreich.org 70 i diagrams. It uses vi-like keybindings for drawing and editing boxes, Err bitreich.org 70 i arrows, and text. Err bitreich.org 70 i .PP Err bitreich.org 70 i+.SH OPTIONS Err bitreich.org 70 i+.TP 5m Err bitreich.org 70 i+.BI -s Err bitreich.org 70 i+Start gramscii in script-mode. In this mode the screen is set to 25 rows Err bitreich.org 70 i+by 80 columns, no status bar is present, drawings and cursor movements Err bitreich.org 70 i+are not shown, and the state of the screen is dumped to stdout when the Err bitreich.org 70 i+program ends. With this flag, gramscii can be used in a pipeline, Err bitreich.org 70 i+getting commands from stdin (or from a file) and making its output Err bitreich.org 70 i+available for further processing. Err bitreich.org 70 i+.TP Err bitreich.org 70 i+.BI -h Err bitreich.org 70 i+Print short usage unstructions and exit. Err bitreich.org 70 i .SH COMMANDS Err bitreich.org 70 i gramscii is a visual modal editor. Commands are associated to Err bitreich.org 70 i keystrokes, and keystrokes have different meaning in different modes. Err bitreich.org 70 i@@ -97,7 +112,9 @@ move the cursor right by 1 column Err bitreich.org 70 i .PP Err bitreich.org 70 i gramscii accepts also the uppercase commands Err bitreich.org 70 i .B H, J, K, L, Err bitreich.org 70 i-which will move in the corresponding direction by 5 units at a time. Err bitreich.org 70 i+which will move in the corresponding direction by a LONG_STEP number of Err bitreich.org 70 i+units at a time (defaults to 5, change LONG_STEP in config.h as you Err bitreich.org 70 i+wish). Err bitreich.org 70 i .TP 5m Err bitreich.org 70 i .BI g Err bitreich.org 70 i Initiate a global positioning command (go). These are two-letter Err bitreich.org 70 i@@ -152,8 +169,35 @@ Typing Err bitreich.org 70 i .BI g Err bitreich.org 70 i followed by any character that is not listed above has no effect on the Err bitreich.org 70 i cursor. Err bitreich.org 70 i+.SS MULTIPLIERS Err bitreich.org 70 i+Simple cursor movement commands (hjklHJKL) can be preceded by a number Err bitreich.org 70 i+that acts as a multiplier. For instance, the command: Err bitreich.org 70 i+.PP Err bitreich.org 70 i+.RS Err bitreich.org 70 i+14h Err bitreich.org 70 i+.PP Err bitreich.org 70 i .RE Err bitreich.org 70 i- Err bitreich.org 70 i+will move the cursor by 14 steps to the left. Similarily, the command: Err bitreich.org 70 i+.PP Err bitreich.org 70 i+.RS Err bitreich.org 70 i+7J Err bitreich.org 70 i+.PP Err bitreich.org 70 i+.RE Err bitreich.org 70 i+will move the cursor by 7 LONG_STEPs rows down (with the default Err bitreich.org 70 i+LONG_STEP equal to 5, this will correspond to 35 rows down). Err bitreich.org 70 i+.PP Err bitreich.org 70 i+Multipliers can be used whenever a movement command is legal, i.e. in Err bitreich.org 70 i+move, box, arrox, visual, and erase mode. So for instance the sequence: Err bitreich.org 70 i+.RS Err bitreich.org 70 i+ggb13l18jb Err bitreich.org 70 i+.PP Err bitreich.org 70 i+.RE Err bitreich.org 70 i+will draw a 18x13 box whose top-left corner coincides with the top-left Err bitreich.org 70 i+corner of the screen. Err bitreich.org 70 i+.PP Err bitreich.org 70 i+Multipliers are ignored by global positioning commands (i.e., those Err bitreich.org 70 i+starting with Err bitreich.org 70 i+.B g) Err bitreich.org 70 i .SS MODES Err bitreich.org 70 i The currently supported modes are: Err bitreich.org 70 i .B move, Err bitreich.org 70 i@@ -233,6 +277,14 @@ styles. See Err bitreich.org 70 i .B STYLES Err bitreich.org 70 i below for more information. Err bitreich.org 70 i .TP 7m Err bitreich.org 70 i+.BI A Err bitreich.org 70 i+Exactly as Err bitreich.org 70 i+.BI a Err bitreich.org 70 i+toggles Err bitreich.org 70 i+.B arrow Err bitreich.org 70 i+mode, but the end point marker is automatically set according to the Err bitreich.org 70 i+direction of the arrow. Err bitreich.org 70 i+.TP 7m Err bitreich.org 70 i .BI x Err bitreich.org 70 i Toggle Err bitreich.org 70 i .B erase Err bitreich.org 70 1diff --git a/gramscii.c b/gramscii.c /scm/gramscii/file/gramscii.c.gph bitreich.org 70 i@@ -27,6 +27,7 @@ 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@@ -80,6 +81,7 @@ 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@@ -101,6 +103,7 @@ 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@@ -147,6 +150,20 @@ char* state_str(){ 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@@ -355,26 +372,78 @@ void handle_goto(){ Err bitreich.org 70 i show_cursor(); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-int move_around(char c){ 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@@ -384,6 +453,7 @@ int move_around(char c){ 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@@ -535,7 +605,7 @@ void get_box(FILE *fc){ 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)) 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@@ -589,7 +659,12 @@ void draw_arrow(int x, int y, char *a, int a_len, int fix){ 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- f(x,y,mark_end); 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@@ -613,7 +688,7 @@ void get_arrow(FILE *fc){ 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)) 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@@ -664,7 +739,7 @@ void delete(FILE *fc){ 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)) continue; 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@@ -758,7 +833,7 @@ void visual_box(FILE *fc){ 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)) switch(c){ 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@@ -842,7 +917,7 @@ 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)){ 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@@ -855,9 +930,11 @@ void commands(FILE *fc){ 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@@ -897,17 +974,38 @@ void commands(FILE *fc){ 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- 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 cleanup(0); Err bitreich.org 70 i return 0; Err bitreich.org 70 .