URI: 
       towards dynamic screen management - gramscii - A simple editor for ASCII box-and-arrow charts
   DIR Log
   DIR Files
   DIR Refs
   DIR Tags
   DIR README
   DIR LICENSE
       ---
   DIR commit 0adbc2a776c36b736bb5acb7184ba559d9428bc4
   DIR parent 8f25f7b9abb68e2efbc732a69f09d795ad79433c
  HTML Author: KatolaZ <katolaz@freaknet.org>
       Date:   Fri, 26 Jul 2019 22:13:33 +0100
       
       towards dynamic screen management
       
       Diffstat:
         M Makefile                            |       5 +++--
         M TODO                                |       3 +--
         M gramscii.c                          |      67 ++++++++++++++++++++-----------
       
       3 files changed, 48 insertions(+), 27 deletions(-)
       ---
   DIR diff --git a/Makefile b/Makefile
       @@ -17,8 +17,9 @@ options:
                @echo "-+-+-+-+-+-+-+-+-+-+-" 
                
        
       -gramscii: ${INC}
       -
       +gramscii: ${SRC} ${INC}
       +        $(CC) $(CFLAGS) -o gramscii ${SRC}
       +        
        clean:
                @echo cleaning
                @rm -f $(SRC:.c=)
   DIR diff --git a/TODO b/TODO
       @@ -1,5 +1,5 @@
        + optimize redraws (redraw only the modified rectangle)
       -- change screen management (i.e., dynamic array of lines)
       ++ change screen management (i.e., dynamic array of lines)
        - add screen geometry option (-g 25x80?)
        - read file at point
          - read output of command (!)
       @@ -48,4 +48,3 @@
        * set different line styles (done for hl, vl, corner)
        * add status bar
        * implement box
       - 
   DIR diff --git a/gramscii.c b/gramscii.c
       @@ -33,6 +33,13 @@
        
        #include "arg.h"
        
       +typedef struct{
       +        int sz;
       +        int lst;
       +        char *s;
       +} line_t;
       +
       +
        #define MOVE   0x00
        #define BOX    0x01
        #define ARROW  0x02
       @@ -71,9 +78,10 @@
        #define MIN(x,y)  (x) < (y) ? (x) : (y)
        #define MAX(x,y)  (x) > (y) ? (x) : (y)
        
       -/** #define DEBUG 1 **/
       +#define DEBUG 1 
        
       -char **screen;
       +line_t *screen;
       +int num_lines;
        int WIDTH, HEIGHT;
        
        int state;
       @@ -113,7 +121,7 @@ struct termios t1, t2, t3;
        void dump_lines(){
                int i;
                for (i=0; i<HEIGHT; i++){
       -                printf("%s\n", screen[i]);
       +                printf("%s\n", screen[i].s);
                }
        }
        
       @@ -179,7 +187,7 @@ void status_bar(){
                else
                        printf(" *%s*", fname );
        #ifdef DEBUG
       -        printf("  '%d'  ", screen[y][x]);
       +        printf("  '%d'  ", screen[y].s[x]);
        #endif
                printf("\033[0m");
                fflush(stdout);
       @@ -232,13 +240,24 @@ void show_cursor(){
                fflush(stdout);
        }
        
       -void set_cur(char c){
       -        screen[y][x] = c;
       -}
        
       -void set_xy(int x, int y, char c){
       +void set_xy(int _x, int _y, char c){
                /* FIXME: check if x and y are valid!!!! */
       -        screen[y][x] = c;
       +        if (screen[_y].sz < _x + 2){
       +                screen[_y].sz = (_x +2) * 2;
       +                screen[_y].s = realloc(screen[_y].s, screen[_y].sz * sizeof(char));
       +        }
       +        while (screen[_y].lst<_x){
       +                screen[_y].s[screen[_y].lst] = BG;
       +                screen[_y].lst += 1;
       +        }
       +        screen[_y].s[_x] = c;
       +        if (_x == screen[_y].lst)
       +                screen[_y].s[_x+1] = '\0';
       +}
       +
       +void set_cur(char c){
       +        set_xy(x, y, c);
        }
        
        void draw_xy(int x, int y, char c){
       @@ -254,7 +273,7 @@ void update_current(){
                if (silent)
                        return;
                printf("\033[%d'%df",y+1,x+1);
       -        putchar(screen[y][x]);
       +        putchar(screen[y].s[x]);
                fflush(stdout);
        }
        
       @@ -282,7 +301,7 @@ void erase_box(int x1, int y1, char c){
        void erase_screen(){
                int i;
                for(i=0;i<HEIGHT; i++)
       -                erase_line(screen[i]);
       +                erase_line(screen[i].s);
        }
        
        void check_bound(){
       @@ -311,7 +330,7 @@ void redraw(){
                        return;
                printf("\033[2J\033[1;1H");
                for (i=0;i<HEIGHT;i++){
       -                fprintf(stdout,"%s\n",screen[i]);
       +                fprintf(stdout,"%s\n",screen[i].s);
                }
                status_bar();
                show_cursor();
       @@ -774,7 +793,7 @@ void write_file(FILE *fc){
                        return;
                }
                for (i=0; i<HEIGHT; i++){
       -                fprintf(fout, "%s\n", screen[i]);
       +                fprintf(fout, "%s\n", screen[i].s);
                }
                fclose(fout);
                modified = 0;
       @@ -800,10 +819,10 @@ void load_file(FILE *fc){
                get_string(fc, "Load file: ", newfname, 255);
                if ((fin=fopen(newfname, "r")) != NULL){
                        i = 0;
       -                while((fgets(screen[i], WIDTH+2, fin)) != NULL && i<HEIGHT)
       -                        screen[i++][WIDTH-1]='\0';
       +                while((fgets(screen[i].s, WIDTH+2, fin)) != NULL && i<HEIGHT)
       +                        screen[i++].s[WIDTH-1]='\0';
                        for(;i<HEIGHT; i++){
       -                        erase_line(screen[i]);
       +                        erase_line(screen[i].s);
                        }
                        fclose(fin);
                }
       @@ -872,24 +891,26 @@ void init_screen(){
                        WIDTH=80;
                        HEIGHT=24;
                }
       -        screen = malloc(HEIGHT * sizeof(char *));
       +        screen = malloc(HEIGHT * sizeof(line_t));
       +        num_lines = HEIGHT;
                if (screen == NULL){
                        perror("allocating screen");
                        exit(1);
                }
                for (i=0; i<HEIGHT; i++){
       -                screen[i] = malloc((WIDTH+1) * sizeof(char));
       -                if (screen[i] == NULL){
       -                        perror("allocating screen[i]");
       +                screen[i].sz = WIDTH+1;
       +                screen[i].s = malloc((screen[i].sz) * sizeof(char));
       +                if (screen[i].s == NULL){
       +                        perror("allocating screen[i].s");
                                exit(1);
                        }
       -                memset(screen[i], ' ', WIDTH * sizeof(char));
       -                screen[i][WIDTH]='\0';
       +                memset(screen[i].s, BG, screen[i].sz);
       +                screen[i].lst = WIDTH;
       +                screen[i].s[screen[i].lst+1]='\0';
                }
                reset_styles();
        }
        
       -
        void init(){
        
                signal(SIGHUP, cleanup);