iinitial commit - 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 478c03adcdc7d76595a311a0dba682917ab97d62 /scm/gramscii/commit/478c03adcdc7d76595a311a0dba682917ab97d62.gph bitreich.org 70 hAuthor: KatolaZ URL:mailto:katolaz@freaknet.org bitreich.org 70 iDate: Thu, 18 Jul 2019 17:45:38 +0100 Err bitreich.org 70 i Err bitreich.org 70 iinitial commit Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i A README | 2 ++ Err bitreich.org 70 i A TODO | 9 +++++++++ Err bitreich.org 70 i A gramscii.c | 353 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i3 files changed, 364 insertions(+), 0 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/README b/README /scm/gramscii/file/README.gph bitreich.org 70 i@@ -0,0 +1,2 @@ Err bitreich.org 70 i+Simple tool to draw ascii box plots from the terminal. Err bitreich.org 70 i+No need to use 1 million line of javascript code on a browser. Err bitreich.org 70 1diff --git a/TODO b/TODO /scm/gramscii/file/TODO.gph bitreich.org 70 i@@ -0,0 +1,9 @@ Err bitreich.org 70 i++ optimize redraws (i.e., avoid to redraw if possible) Err bitreich.org 70 i+- change cursor shape according to action Err bitreich.org 70 i++ implement box Err bitreich.org 70 i+- implement arrow Err bitreich.org 70 i+- set different box styles Err bitreich.org 70 i++ add status bar Err bitreich.org 70 i+- get screen geometry Err bitreich.org 70 i+- allow scrolling (both vertical and horizontal) 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@@ -0,0 +1,353 @@ Err bitreich.org 70 i+/* Err bitreich.org 70 i+* Err bitreich.org 70 i+* This is `gramscii`, a simple tool to create ascii box graphs 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+ 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+ Err bitreich.org 70 i+ 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+ Err bitreich.org 70 i+#define WIDTH 100 Err bitreich.org 70 i+#define HEIGHT 25 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 LINE_H '-' Err bitreich.org 70 i+#define LINE_V '|' Err bitreich.org 70 i+#define DBLINE_H '=' Err bitreich.org 70 i+#define DBLINE_V 'u' Err bitreich.org 70 i+#define BLDLINE '#' 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+ 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+char screen[HEIGHT][WIDTH+1]; 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+char cursor; Err bitreich.org 70 i+char corner; Err bitreich.org 70 i+char box_line_h; Err bitreich.org 70 i+char box_line_v; Err bitreich.org 70 i+char arrow_line_h; Err bitreich.org 70 i+char arrow_line_v; Err bitreich.org 70 i+ Err bitreich.org 70 i+struct termios t1, t2; 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+ printf("\033[;H\033[2J"); Err bitreich.org 70 i+ tcsetattr(0, TCSANOW, &t1); Err bitreich.org 70 i+ exit(0); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void show_cursor(){ Err bitreich.org 70 i+ printf("\033[%d;%df", y+1, x+1); Err bitreich.org 70 i+ //putchar(screen[y][x]); Err bitreich.org 70 i+ //printf("\033[%d;%df", y+1, x+2); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void set(char c){ Err bitreich.org 70 i+ screen[y][x] = c; 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+ /* FIXME: check if x and y are valid!!!! */ Err bitreich.org 70 i+ screen[y][x] = 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+ printf("\033[%d;%df",y+1,x+1); Err bitreich.org 70 i+ putchar(c); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void clear(){ Err bitreich.org 70 i+ screen[y][x] = BG; 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+ 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+ Err bitreich.org 70 i+void get_text(){ Err bitreich.org 70 i+ char c; Err bitreich.org 70 i+ int orig_x = x, orig_y = y; Err bitreich.org 70 i+ Err bitreich.org 70 i+ //cursor = UND; Err bitreich.org 70 i+ redraw(); Err bitreich.org 70 i+ while((c=getchar())!=EOF && c != 27){ Err bitreich.org 70 i+ if(c=='\n'){ Err bitreich.org 70 i+ set(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(c); Err bitreich.org 70 i+ update_current(); 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+ cursor = PTR; 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 fix_box(int x1, int y1){ 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+ 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+ Err bitreich.org 70 i+ for(i=xmin+1; i<=xmax; i++){ Err bitreich.org 70 i+ set_xy(i, ymin, box_line_h); Err bitreich.org 70 i+ set_xy(i, ymax, box_line_h); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ for(i=ymin+1; i<=ymax; i++){ Err bitreich.org 70 i+ set_xy(xmin, i, box_line_v); Err bitreich.org 70 i+ set_xy(xmax, i, box_line_v); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ set_xy(xmin, ymin, corner); Err bitreich.org 70 i+ set_xy(xmin, ymax, corner); Err bitreich.org 70 i+ set_xy(xmax, ymin, corner); Err bitreich.org 70 i+ set_xy(xmax, ymax, corner); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void draw_box(int x1, int y1){ 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+ 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+ Err bitreich.org 70 i+ for(i=xmin+1; i<=xmax; i++){ Err bitreich.org 70 i+ draw_xy(i, ymin, box_line_h); Err bitreich.org 70 i+ draw_xy(i, ymax, box_line_h); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ for(i=ymin+1; i<=ymax; i++){ Err bitreich.org 70 i+ draw_xy(xmin, i, box_line_v); Err bitreich.org 70 i+ draw_xy(xmax, i, box_line_v); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ draw_xy(xmin, ymin, corner); Err bitreich.org 70 i+ draw_xy(xmin, ymax, corner); Err bitreich.org 70 i+ draw_xy(xmax, ymin, corner); Err bitreich.org 70 i+ draw_xy(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+ Err bitreich.org 70 i+void get_box(){ Err bitreich.org 70 i+ char c; Err bitreich.org 70 i+ int orig_x=x, orig_y=y; Err bitreich.org 70 i+ Err bitreich.org 70 i+ set(PTR); Err bitreich.org 70 i+ redraw(); Err bitreich.org 70 i+ while((c=getchar())!=EOF && c != 27){ Err bitreich.org 70 i+ switch(c){ Err bitreich.org 70 i+ case 'H': step = 5; Err bitreich.org 70 i+ case 'h': Err bitreich.org 70 i+ x -= step; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'J': step = 5; Err bitreich.org 70 i+ case 'j': Err bitreich.org 70 i+ y += step; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'K': step = 5; Err bitreich.org 70 i+ case 'k': Err bitreich.org 70 i+ y -= step; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'L': step = 5; Err bitreich.org 70 i+ case 'l': Err bitreich.org 70 i+ x += step; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ check_bound(); Err bitreich.org 70 i+ redraw(); Err bitreich.org 70 i+ draw_box(orig_x, orig_y); Err bitreich.org 70 i+ status_bar(); Err bitreich.org 70 i+ show_cursor(); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ fix_box(orig_x, orig_y); 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+int commands(){ Err bitreich.org 70 i+ Err bitreich.org 70 i+ char c; Err bitreich.org 70 i+ while((c=getchar())!=EOF){ Err bitreich.org 70 i+ //screen[y][x]=BG; Err bitreich.org 70 i+ switch(c){ Err bitreich.org 70 i+ case 'H': Err bitreich.org 70 i+ step=5; Err bitreich.org 70 i+ case 'h': Err bitreich.org 70 i+ x-=step; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'J': Err bitreich.org 70 i+ step=5; Err bitreich.org 70 i+ case 'j': Err bitreich.org 70 i+ y+=step; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'K': Err bitreich.org 70 i+ step=5; Err bitreich.org 70 i+ case 'k': Err bitreich.org 70 i+ y-=step; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'L': Err bitreich.org 70 i+ step=5; Err bitreich.org 70 i+ case 'l': Err bitreich.org 70 i+ x+=step; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'i': Err bitreich.org 70 i+ state = TEXT; Err bitreich.org 70 i+ get_text(); 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+ get_box(); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'Q': Err bitreich.org 70 i+ case 'q': Err bitreich.org 70 i+ cleanup(0); Err bitreich.org 70 i+ exit(0); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ default:; Err bitreich.org 70 i+ //statu("got: %d\n", c); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ check_bound(); Err bitreich.org 70 i+ //update(); 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+ step = 1; 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+ Err bitreich.org 70 i+ Err bitreich.org 70 i+int main(int argc, char *argv[]){ Err bitreich.org 70 i+ Err bitreich.org 70 i+ init(); Err bitreich.org 70 i+ Err bitreich.org 70 i+ commands(); Err bitreich.org 70 i+ cleanup(0); Err bitreich.org 70 i+} Err bitreich.org 70 .