remove trailing blank lines in write_file - change check_bound - gramscii - A simple editor for ASCII box-and-arrow charts DIR Log DIR Files DIR Refs DIR Tags DIR README DIR LICENSE --- DIR commit 82a7c12e8338288ccb40d213fcc9e15d102aa968 DIR parent 62713aaf65264950aecad9237d50e911d7dad893 HTML Author: KatolaZ <katolaz@freaknet.org> Date: Thu, 1 Aug 2019 16:42:36 +0100 remove trailing blank lines in write_file - change check_bound Diffstat: M draw.c | 33 ++++++++++++++++--------------- M files.c | 14 +++++++++++--- M gramscii.h | 6 ++++-- M lineset.c | 9 +++++++-- M main.c | 2 +- M screen.c | 14 +++++++------- 6 files changed, 47 insertions(+), 31 deletions(-) --- DIR diff --git a/draw.c b/draw.c @@ -94,7 +94,7 @@ void get_text(FILE *fc){ if (x >= WIDTH) x = orig_x; } - check_bound(); + check_bound(&x, &y); status_bar(); show_cursor(); } @@ -150,7 +150,7 @@ void get_box(FILE *fc){ goto update_box; if (!move_around(c, fc)) continue; - check_bound(); + check_bound(&x, &y); redraw(); step = 1; update_box: @@ -166,19 +166,19 @@ update_box: mode = MOVE; } -void draw_arrow(int x, int y, char *a, int a_len, int fix){ +void draw_arrow(int xl, int yl, char *a, int a_len, int fix){ int i, j, cur_dir; char line; void (*f)(int, int, char); - a_miny = a_maxy = y; + a_miny = a_maxy = yl; if (fix == FIX) f = set_xy; else f = draw_xy; - f(x,y,mark_st); + f(xl, yl, mark_st); if (!a_len){ show_cursor(); return; @@ -189,27 +189,28 @@ void draw_arrow(int x, int y, char *a, int a_len, int fix){ /* If we are switching between horizontal and vertical, put a "corner" */ if (((cur_dir & DIR_HOR) && (a[i] & DIR_VER)) || ((cur_dir & DIR_VER) && (a[i] & DIR_HOR))){ - f(x,y,corner); + f(xl, yl, corner); show_cursor(); } } for(j=0; j<a[i+1]; j++){ line = (a[i] & DIR_L) || (a[i] & DIR_R) ? line_h : line_v; - x += progr_x(a[i]); - y += progr_y(a[i]); - if (y < a_miny) a_miny = y; - if (y > a_maxy) a_maxy = y; - f(x, y, line); + xl += progr_x(a[i]); + yl += progr_y(a[i]); + check_bound(&xl, &yl); + if (yl < a_miny) a_miny = yl; + if (yl > a_maxy) a_maxy = yl; + f(xl, yl, line); } /* f(x,y,mark_end);*/ cur_dir = a[i]; } if (autoend){ if (cur_dir != DIR_N) - f(x,y, get_mark(cur_dir)); + f(xl,yl, get_mark(cur_dir)); } else - f(x,y,mark_end); + f(xl,yl,mark_end); show_cursor(); } @@ -235,7 +236,7 @@ void get_arrow(FILE *fc){ goto update_arrow; if (!move_around(c, fc)) continue; - check_bound(); + check_bound(&x, &y); /* FIXME: if we are out of bound, do nothing? */ if (arrow_len == arrow_sz){ arrow_sz *=2; @@ -289,7 +290,7 @@ void erase(FILE *fc){ show_cursor(); while((c=fgetc(fc))!=EOF && c!=27 && c!= 'x' && c != '\n'){ if (!move_around(c, fc)) continue; - check_bound(); + check_bound(&x, &y); if (first || (y != orig_y && ! opened) || (y == orig_y && x != orig_x && !opened) ){ @@ -354,7 +355,7 @@ void visual_box(FILE *fc){ goto vis_exit; break; } - check_bound(); + check_bound(&x, &y); set_video(VIDEO_NRM); redraw(); step = 1; DIR diff --git a/files.c b/files.c @@ -7,7 +7,7 @@ void write_file(FILE *fc){ FILE *fout; - int i; + int i, ne; if (!fname[0] || force_new){ get_string(fc, "Write to: ", fname, 255); @@ -23,8 +23,16 @@ void write_file(FILE *fc){ get_key(fc, "Error opening file."); return; } + ne = 0; for (i=0; i<HEIGHT; i++){ - fprintf(fout, "%s\n", screen.l[i].s); + if (strlen(screen.l[i].s)){/* remove trailing blank lines */ + /* put the empty lines preceeding the current non-empty one */ + while (ne--) + fprintf(fout, "\n"); + fprintf(fout, "%s\n", screen.l[i].s); + ne = 0; + } + else ne++; } fclose(fout); modified = 0; @@ -51,7 +59,7 @@ void load_file(FILE *fc){ if ((fin=fopen(newfname, "r")) != NULL){ i = 0; while((fgets(screen.l[i].s, WIDTH+1, fin)) != NULL && i<HEIGHT){ - screen.l[i].lst = strlen(screen.l[i].s) - 1; + screen.l[i].lst = strlen(screen.l[i].s) - 2; screen.l[i].n = i; screen.l[i].s[strlen(screen.l[i].s)-1]='\0'; i++; DIR diff --git a/gramscii.h b/gramscii.h @@ -82,7 +82,9 @@ typedef struct{ #define progr_x(d) ((d) == DIR_L ? -1 : (d) == DIR_R ? 1 : 0) #define progr_y(d) ((d) == DIR_U ? -1 : (d) == DIR_D ? 1 : 0) -#define DEBUG 1 +/* + * #define DEBUG 1 + */ /** global variables **/ @@ -139,7 +141,7 @@ struct termios t1, t2, t3; void reset_styles(); void redraw(); int move_around(char c, FILE *fc); -void check_bound(); +void check_bound(int *x, int *y); void status_bar(); void show_cursor(); void set_cur(char c); DIR diff --git a/lineset.c b/lineset.c @@ -144,13 +144,18 @@ void copy_lines_to_ring(int y1, int y2, int which){ else idx = undo_cur + 1; if (idx >= undo_sz - 1){ - undo_sz += 10; - tmp = realloc(undo, undo_sz * sizeof(lineset_t)); + tmp = realloc(undo, (undo_sz + 10) * sizeof(lineset_t)); if (tmp == NULL){ fprintf(stderr, "Error allocating undo buffer"); exit(1); } undo = tmp; + for (i=0; i<10; i++){ + undo[undo_sz + i].sz = 0; + undo[undo_sz + i].l = NULL; + undo[undo_sz + i].num = 0; + } + undo_sz += 10; } ensure_num_lines(&(undo[idx]), y2 - y1 + 1); for(i=y1; i<=y2; i++){ DIR diff --git a/main.c b/main.c @@ -135,7 +135,7 @@ void commands(FILE *fc){ break; } } - check_bound(); + check_bound(&x, &y); status_bar(); show_cursor(); step = 1; DIR diff --git a/screen.c b/screen.c @@ -196,11 +196,11 @@ void erase_screen(){ erase_line(i); } -void check_bound(){ - if (x<0) x=0; - else if (x>=WIDTH) x = WIDTH-1; - if (y<0) y=0; - else if (y>=HEIGHT) y = HEIGHT -1; +void check_bound(int *x, int *y){ + if (*x<0) *x=0; + else if (*x>=WIDTH) *x = WIDTH-1; + if (*y<0) *y=0; + else if (*y>=HEIGHT) *y = HEIGHT -1; } void reset_styles(){ @@ -242,7 +242,7 @@ void go_to(int where){ y = HEIGHT/2; break; } - check_bound(); + check_bound(&x, &y); show_cursor(); } @@ -279,7 +279,7 @@ void handle_goto(){ go_to(MIDDLE); break; } - check_bound(); + check_bound(&x, &y); show_cursor(); }