first steps towards script-mode - gramscii - A simple editor for ASCII box-and-arrow charts
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit a74b46c7a4d1ccad6934aeb00915a2fd383f072c
 (DIR) parent 1aa7efdd7a8dcfd1a55f30c2754d1e473f0bb59b
 (HTM) Author: KatolaZ <katolaz@freaknet.org>
       Date:   Wed, 24 Jul 2019 17:00:05 +0100
       
       first steps towards script-mode
       
       Diffstat:
         M gramscii.c                          |     163 +++++++++++++++++++------------
       
       1 file changed, 101 insertions(+), 62 deletions(-)
       ---
 (DIR) diff --git a/gramscii.c b/gramscii.c
       @@ -30,6 +30,8 @@
        
        #include "config.h"
        
       +#include "arg.h"
       +
        #define MOVE   0x00
        #define BOX    0x01
        #define ARROW  0x02
       @@ -98,13 +100,26 @@ char modified;
        char fname[256];
        
        char visual;
       +char silent;
       +
       +char *argv0;
        
        struct termios t1, t2, t3;
        
        
       -void cleanup(int s){
       +void dump_lines(){
       +        int i;
       +        for (i=0; i<HEIGHT; i++){
       +                printf("%s\n", screen[i]);
       +        }
       +}
        
       -        printf("\033[;H\033[2J");
       +void cleanup(int s){
       +        
       +        if (!silent)
       +                printf("\033[;H\033[2J");
       +        if (silent)
       +                dump_lines();
                tcsetattr(0, TCSANOW, &t1);
                fflush(stdout);
                exit(0);
       @@ -135,6 +150,8 @@ char* state_str(){
        
        void status_bar(){
        
       +        if (silent)
       +                return;
                printf("\033[%d;1f\033[7m", HEIGHT+1);
                printf("%*s", WIDTH-1, "");
                printf("\033[%d;1f\033[7m", HEIGHT+1);
       @@ -151,32 +168,38 @@ void status_bar(){
                fflush(stdout);
        }
        
       -char get_key(char *msg){
       +char get_key(FILE *fc, char *msg){
        
       +        if (silent)
       +                return 0;
                printf("\033[%d;1f\033[7m", HEIGHT+1);
                printf("%*s", WIDTH, "");
                printf("\033[%d;1f\033[7m", HEIGHT+1);
                printf("%s", msg);
                printf("\033[0m");
                fflush(stdout);
       -        return getchar();
       +        return fgetc(fc);
        }
        
       -void get_string(char *msg, char *s, int sz){
       +void get_string(FILE *fc, char *msg, char *s, int sz){
        
       -        printf("\033[%d;1f\033[7m", HEIGHT+1);
       -        printf("%*s", WIDTH, "");
       -        printf("\033[%d;1f\033[7m", HEIGHT+1);
       -        /* We must activate echo now */
       -        t3 = t2;
       -        t3.c_lflag |= (ECHO | ICANON);
       -        tcsetattr(0, TCSANOW, &t3);
       -        printf("%s", msg);
       -        printf("\033[0m");
       -        fgets(s, sz, stdin);
       +        if (!silent){
       +                printf("\033[%d;1f\033[7m", HEIGHT+1);
       +                printf("%*s", WIDTH, "");
       +                printf("\033[%d;1f\033[7m", HEIGHT+1);
       +        
       +                /* We must activate echo now */
       +                t3 = t2;
       +                t3.c_lflag |= (ECHO | ICANON);
       +                tcsetattr(0, TCSANOW, &t3);
       +                printf("%s", msg);
       +                printf("\033[0m");
       +        }
       +        fgets(s, sz, fc);
                s[strlen(s)-1] = '\0';
                tcsetattr(0, TCSANOW, &t2);
       -        fflush(stdout);
       +        if (!silent)
       +                fflush(stdout);
        }
        
        int is_yes(char c){
       @@ -186,6 +209,8 @@ int is_yes(char c){
        /*** Screen management ***/
        
        void show_cursor(){
       +        if (silent)
       +                return;
                printf("\033[%d;%df", y+1, x+1);
                fflush(stdout);
        }
       @@ -201,12 +226,16 @@ void set_xy(int x, int y, char c){
        
        void draw_xy(int x, int y, char c){
                /* FIXME: check if x and y are valid!!!! */
       +        if (silent)
       +                return;
                printf("\033[%d;%df",y+1,x+1);
                putchar(c);
                fflush(stdout);
        }
        
        void update_current(){
       +        if (silent)
       +                return;
                printf("\033[%d'%df",y+1,x+1);
                putchar(screen[y][x]);
                fflush(stdout);
       @@ -261,6 +290,8 @@ void reset_styles(){
        void redraw(){
                int i;
        
       +        if (silent)
       +                return;
                printf("\033[2J\033[1;1H");
                for (i=0;i<HEIGHT;i++){
                        fprintf(stdout,"%s\n",screen[i]);
       @@ -366,6 +397,8 @@ int progr_y(int dir){
        }
        
        void set_video(int v){
       +        if (silent)
       +                return;
                printf("\033[%dm", v);
                fflush(stdout);
        }
       @@ -436,12 +469,12 @@ int change_style(char c){
        
        /*****  text, box, arrows  *****/
        
       -void get_text(){
       +void get_text(FILE *fc){
                char c;
                int orig_x = x;
        
                redraw();
       -        while((c=getchar())!=EOF && c != 27){
       +        while((c=fgetc(fc))!=EOF && c != 27){
                        if(c=='\n'){
                                set_cur(BG);
                                y += 1;
       @@ -493,13 +526,13 @@ void draw_box(int x1, int y1, int fix){
                show_cursor();
        }
        
       -void get_box(){
       +void get_box(FILE *fc){
                char c;
                int orig_x=x, orig_y=y;
                redraw();
                step = 1;
                draw_box(x,y,NOFIX);
       -        while((c=getchar())!=EOF && c != 27 && c!= 'b' && c != '\n'){
       +        while((c=fgetc(fc))!=EOF && c != 27 && c!= 'b' && c != '\n'){
                        if (change_style(c))
                                goto update_box;
                        if (!move_around(c)) 
       @@ -560,7 +593,7 @@ void draw_arrow(int x, int y, char *a, int a_len, int fix){
                show_cursor();
        }
        
       -void get_arrow(){
       +void get_arrow(FILE *fc){
        
                char c;
                int orig_x=x, orig_y=y, arrow_len;
       @@ -577,7 +610,7 @@ void get_arrow(){
                redraw();
                step = 1;
                draw_arrow(x,y, arrow, 0, NOFIX);
       -        while((c=getchar())!=EOF && c != 27 && c!= 'a' && c != '\n'){
       +        while((c=fgetc(fc))!=EOF && c != 27 && c!= 'a' && c != '\n'){
                        if (change_style(c))
                                goto update_arrow;
                        if (!move_around(c))
       @@ -625,12 +658,12 @@ void do_delete(int x1, int y1){
        }
        
        
       -void delete(){
       +void delete(FILE *fc){
                char c;
                int orig_x = x, orig_y = y;
                status_bar();
                show_cursor();
       -        while((c=getchar())!=EOF && c!=27 && c!= 'x' && c != '\n'){
       +        while((c=fgetc(fc))!=EOF && c!=27 && c!= 'x' && c != '\n'){
                        if (!move_around(c)) continue;
                        check_bound();
                        do_delete(orig_x, orig_y);
       @@ -647,65 +680,65 @@ void delete(){
        
        /*** File management ***/
        
       -void write_file(){
       -        FILE *f;
       +void write_file(FILE *fc){
       +        FILE *fout;
                int i;
        
                if (!fname[0] || force_new){
       -                get_string("Write to: ", fname, 255);
       -                if ((f=fopen(fname, "r"))!=NULL){
       -                        if (!is_yes(get_key("File exists. Overwrite [y/n]?")) ){
       -                                fclose(f);
       +                get_string(fc, "Write to: ", fname, 255);
       +                if ((fout=fopen(fname, "r"))!=NULL){
       +                        if (!is_yes(get_key(fc,"File exists. Overwrite [y/n]?")) ){
       +                                fclose(fout);
                                        return;
                                }
       -                        fclose(f);
       +                        fclose(fout);
                        }
                }
       -        if((f=fopen(fname, "w"))==NULL){
       -                get_key("Error opening file.");
       +        if((fout=fopen(fname, "w"))==NULL){
       +                get_key(fc, "Error opening file.");
                        return;
                }
                for (i=0; i<HEIGHT; i++){
       -                fprintf(f, "%s\n", screen[i]);
       +                fprintf(fout, "%s\n", screen[i]);
                }
       -        fclose(f);
       +        fclose(fout);
                modified = 0;
       -        get_key("File saved.");
       +        get_key(fc, "File saved.");
        }
        
       -void check_modified(){
       +void check_modified(FILE *fc){
        
                if (modified){
       -                if (!is_yes(get_key("Unsaved changes. Write to file [y/n]?")) ){
       +                if (!is_yes(get_key(fc, "Unsaved changes. Write to file [y/n]?")) ){
                                return;
                        }
                        write_file(0);
                }
        }
        
       -void load_file(){
       +void load_file(FILE *fc){
        
                char newfname[256];
       -        FILE *f;
       +        FILE *fin;
                int i;
        
       -        get_string("Load file: ", newfname, 255);
       -        if ((f=fopen(newfname, "r")) != NULL){
       +        get_string(fc, "Load file: ", newfname, 255);
       +        if ((fin=fopen(newfname, "r")) != NULL){
                        i = 0;
       -                while((fgets(screen[i], WIDTH+2, f)) != NULL && i<HEIGHT)
       +                while((fgets(screen[i], WIDTH+2, fin)) != NULL && i<HEIGHT)
                                screen[i++][WIDTH-1]='\0';
                        for(;i<HEIGHT; i++){
                                erase_line(screen[i]);
                        }
       -                fclose(f);
       +                fclose(fin);
                }
                strcpy(fname, newfname);
                modified=0;
                redraw();
        }
        
       -void new_file(){
       -        check_modified();
       +void new_file(FILE *fc){
       +        check_modified(fc);
                erase_screen();
                go_to(HOME);
                redraw();
       @@ -716,7 +749,7 @@ void new_file(){
        /*** Visual ***/
        
        
       -void visual_box(){
       +void visual_box(FILE *fc){
                int orig_x =x, orig_y = y;
                char c, f = BG;
        
       @@ -724,10 +757,10 @@ void visual_box(){
                step = 1;
                set_video(VIDEO_REV);
                draw_box(x,y,NOFIX);
       -        while((c=getchar())!=EOF && c != 27 && c!= 'v' && c != '\n'){
       +        while((c=fgetc(fc))!=EOF && c != 27 && c!= 'v' && c != '\n'){
                        if (!move_around(c)) switch(c){
                                case 'f':/* fill */
       -                                f = get_key("fill char: "); /** FALLTHROUGH **/
       +                                f = get_key(fc, "fill char: "); /** FALLTHROUGH **/
                                case 'x':/* erase */
                                        erase_box(orig_x, orig_y, f);
                                        modified = 1;
       @@ -805,50 +838,50 @@ void init(){
        
        /*** Commands ***/
        
       -void commands(){
       +void commands(FILE *fc){
        
                char c;
       -        while((c=getchar())!=EOF){
       +        while((c=fgetc(fc))!=EOF){
                        if (!change_style(c) && !move_around(c)){
                                switch(c){
                                        case 'i':
                                                state = TEXT;
       -                                        get_text();
       +                                        get_text(fc);
                                                break;
                                        case 'R':
                                                redraw();
                                                break;
                                        case 'b':
                                                state = BOX;
       -                                        get_box();
       +                                        get_box(fc);
                                                break;
                                        case 'a':
                                                state = ARROW;
       -                                        get_arrow();
       +                                        get_arrow(fc);
                                                break;
                                        case 'W':
                                                force_new = 1;/** FALLTHROUGH **/
                                        case 'w':
       -                                        write_file();
       +                                        write_file(fc);
                                                break;
                                        case 'e':
       -                                        check_modified();/** FALLTHROUGH **/
       +                                        check_modified(fc);/** FALLTHROUGH **/
                                        case 'E':
       -                                        load_file();
       +                                        load_file(fc);
                                                break;
                                        case 'N':
       -                                        new_file();
       +                                        new_file(fc);
                                                break;
                                        case 'x':
                                                state = DEL;
       -                                        delete();
       +                                        delete(fc);
                                                break;
                                        case 'v':
                                                state = VIS;
       -                                        visual_box();
       +                                        visual_box(fc);
                                                break;
                                        case 'q':
       -                                        check_modified();/** FALLTHROUGH **/
       +                                        check_modified(fc);/** FALLTHROUGH **/
                                        case 'Q':
                                                cleanup(0);
                                                exit(0);
       @@ -867,9 +900,15 @@ void commands(){
        
        int main(int argc, char *argv[]){
        
       +        ARGBEGIN {
       +                case 's':
       +                        silent = 1;
       +                        break;
       +        } ARGEND;        
       +
                init();
        
       -        commands();
       +        commands(stdin);
                cleanup(0);
                return 0;
        }