ifirst steps towards script-mode - 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 a74b46c7a4d1ccad6934aeb00915a2fd383f072c /scm/gramscii/commit/a74b46c7a4d1ccad6934aeb00915a2fd383f072c.gph bitreich.org 70
1parent 1aa7efdd7a8dcfd1a55f30c2754d1e473f0bb59b /scm/gramscii/commit/1aa7efdd7a8dcfd1a55f30c2754d1e473f0bb59b.gph bitreich.org 70
hAuthor: KatolaZ <katolaz@freaknet.org> URL:mailto:katolaz@freaknet.org bitreich.org 70
iDate: Wed, 24 Jul 2019 17:00:05 +0100 Err bitreich.org 70
i Err bitreich.org 70
ifirst steps towards script-mode Err bitreich.org 70
i Err bitreich.org 70
iDiffstat: Err bitreich.org 70
i M gramscii.c | 163 +++++++++++++++++++------------ Err bitreich.org 70
i Err bitreich.org 70
i1 file changed, 101 insertions(+), 62 deletions(-) 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@@ -30,6 +30,8 @@ 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 #define MOVE 0x00 Err bitreich.org 70
i #define BOX 0x01 Err bitreich.org 70
i #define ARROW 0x02 Err bitreich.org 70
i@@ -98,13 +100,26 @@ 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+ 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 cleanup(int s){ 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]); Err bitreich.org 70
i+ } Err bitreich.org 70
i+} Err bitreich.org 70
i Err bitreich.org 70
i- printf("\033[;H\033[2J"); 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@@ -135,6 +150,8 @@ char* state_str(){ 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@@ -151,32 +168,38 @@ void status_bar(){ 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(char *msg){ 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 printf("\033[0m"); Err bitreich.org 70
i fflush(stdout); Err bitreich.org 70
i- return getchar(); 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(char *msg, char *s, int sz){ 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- 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- /* 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- fgets(s, sz, stdin); 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- fflush(stdout); 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@@ -186,6 +209,8 @@ int is_yes(char c){ 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@@ -201,12 +226,16 @@ void set_xy(int x, int y, char c){ 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][x]); Err bitreich.org 70
i fflush(stdout); Err bitreich.org 70
i@@ -261,6 +290,8 @@ void reset_styles(){ 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]); Err bitreich.org 70
i@@ -366,6 +397,8 @@ int progr_y(int dir){ 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@@ -436,12 +469,12 @@ int change_style(char c){ 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(){ 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=getchar())!=EOF && c != 27){ 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@@ -493,13 +526,13 @@ void draw_box(int x1, int y1, int fix){ 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(){ 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=getchar())!=EOF && c != 27 && c!= 'b' && c != '\n'){ 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@@ -560,7 +593,7 @@ void draw_arrow(int x, int y, char *a, int a_len, int fix){ 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(){ 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@@ -577,7 +610,7 @@ void get_arrow(){ 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=getchar())!=EOF && c != 27 && c!= 'a' && c != '\n'){ 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@@ -625,12 +658,12 @@ void do_delete(int x1, int y1){ Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i Err bitreich.org 70
i-void delete(){ 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=getchar())!=EOF && c!=27 && c!= 'x' && c != '\n'){ 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 check_bound(); Err bitreich.org 70
i do_delete(orig_x, orig_y); Err bitreich.org 70
i@@ -647,65 +680,65 @@ void delete(){ 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(){ Err bitreich.org 70
i- FILE *f; 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("Write to: ", fname, 255); Err bitreich.org 70
i- if ((f=fopen(fname, "r"))!=NULL){ Err bitreich.org 70
i- if (!is_yes(get_key("File exists. Overwrite [y/n]?")) ){ Err bitreich.org 70
i- fclose(f); 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(f); Err bitreich.org 70
i+ fclose(fout); Err bitreich.org 70
i } Err bitreich.org 70
i } Err bitreich.org 70
i- if((f=fopen(fname, "w"))==NULL){ Err bitreich.org 70
i- get_key("Error opening file."); 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(f, "%s\n", screen[i]); Err bitreich.org 70
i+ fprintf(fout, "%s\n", screen[i]); Err bitreich.org 70
i } Err bitreich.org 70
i- fclose(f); Err bitreich.org 70
i+ fclose(fout); Err bitreich.org 70
i modified = 0; Err bitreich.org 70
i- get_key("File saved."); 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(){ 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("Unsaved changes. Write to file [y/n]?")) ){ 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(0); Err bitreich.org 70
i } Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i-void load_file(){ 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 *f; 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("Load file: ", newfname, 255); Err bitreich.org 70
i- if ((f=fopen(newfname, "r")) != NULL){ 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], WIDTH+2, f)) != NULL && i<HEIGHT) Err bitreich.org 70
i+ while((fgets(screen[i], WIDTH+2, fin)) != NULL && i<HEIGHT) Err bitreich.org 70
i screen[i++][WIDTH-1]='\0'; Err bitreich.org 70
i for(;i<HEIGHT; i++){ Err bitreich.org 70
i erase_line(screen[i]); Err bitreich.org 70
i } Err bitreich.org 70
i- fclose(f); 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(){ Err bitreich.org 70
i- check_modified(); 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@@ -716,7 +749,7 @@ void new_file(){ Err bitreich.org 70
i /*** Visual ***/ Err bitreich.org 70
i Err bitreich.org 70
i Err bitreich.org 70
i-void visual_box(){ 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@@ -724,10 +757,10 @@ void visual_box(){ 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=getchar())!=EOF && c != 27 && c!= 'v' && c != '\n'){ 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 case 'f':/* fill */ Err bitreich.org 70
i- f = get_key("fill char: "); /** FALLTHROUGH **/ 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@@ -805,50 +838,50 @@ void init(){ Err bitreich.org 70
i Err bitreich.org 70
i /*** Commands ***/ Err bitreich.org 70
i Err bitreich.org 70
i-void commands(){ 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=getchar())!=EOF){ 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 switch(c){ 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+ 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(); Err bitreich.org 70
i+ get_box(fc); Err bitreich.org 70
i break; Err bitreich.org 70
i case 'a': Err bitreich.org 70
i state = ARROW; Err bitreich.org 70
i- get_arrow(); Err bitreich.org 70
i+ get_arrow(fc); 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(); 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();/** FALLTHROUGH **/ Err bitreich.org 70
i+ check_modified(fc);/** FALLTHROUGH **/ Err bitreich.org 70
i case 'E': Err bitreich.org 70
i- load_file(); 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(); 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(); 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(); 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();/** FALLTHROUGH **/ Err bitreich.org 70
i+ check_modified(fc);/** FALLTHROUGH **/ 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@@ -867,9 +900,15 @@ void commands(){ 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+ 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+ } ARGEND; 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+ commands(stdin); Err bitreich.org 70
i cleanup(0); Err bitreich.org 70
i return 0; Err bitreich.org 70
i } Err bitreich.org 70
.
Response:
text/plain