add read-at-point function - gramscii - A simple editor for ASCII box-and-arrow charts DIR Log DIR Files DIR Refs DIR Tags DIR README DIR LICENSE --- DIR commit 62267b8424170f9b136892248a77dbed3fdcbbba DIR parent 3ba178677800de55393f8ec80752ffe72660931a HTML Author: KatolaZ <katolaz@freaknet.org> Date: Fri, 9 Aug 2019 07:08:35 +0100 add read-at-point function Diffstat: M TODO | 7 ++++--- M draw.c | 2 ++ M files.c | 47 +++++++++++++++++++++++++++++++ M gramscii.c | 5 +++++ M gramscii.h | 8 ++++++++ M screen.c | 2 ++ 6 files changed, 68 insertions(+), 3 deletions(-) --- DIR diff --git a/TODO b/TODO @@ -1,8 +1,7 @@ + optimize redraws (redraw only the modified rectangle) -- fir bug in reading commands from files +- fix bug in visual crop +- fix bug in reading commands from files - add screen geometry option (-g 25x80?) -- read file at point - - read output of command (!) - maybe move "text" mode to "t" - implement ellipse - (?) filled box (B) @@ -17,6 +16,8 @@ - allow scrolling (both vertical and horizontal) - catch SIGWINCH and react appropriately (after scrolling is enabled) +* read file at point + * read output of command (!) * fix bug with 'g' commands in arrow mode * undo (by storing lines changed across insert/remove operations) * re-organise undo-ring management DIR diff --git a/draw.c b/draw.c @@ -1,3 +1,5 @@ +#define _POSIX_C_SOURCE 2 + #include <stdlib.h> #include <string.h> DIR diff --git a/files.c b/files.c @@ -1,3 +1,5 @@ +#define _POSIX_C_SOURCE 2 + #include <stdio.h> #include <string.h> #include "gramscii.h" @@ -37,6 +39,7 @@ void write_file(FILE *fc){ fclose(fout); modified = 0; get_key(fc, "File saved."); + redraw(); } void check_modified(FILE *fc){ @@ -83,3 +86,47 @@ void new_file(FILE *fc){ modified=0; } +void read_file_at(FILE *fc, int xl, int yl){ + + char nfname[512], tmp[512], *fptr, *tptr; + FILE *fin; + int i, j; + char ftype; + + get_string(fc, "Read file: ", nfname, 511); + fptr = nfname; + while(*fptr && _isblank(*fptr)) + fptr ++; + if (*fptr == '!'){ + fin = popen(++fptr, "r"); + ftype = FPIPE; + } + else { + fin = fopen(fptr, "r"); + ftype = FFILE; + } + if (fin != NULL){ + copy_lines_to_ring(0, HEIGHT-1, PRV_STATE); + i = yl; + while((fgets(tmp, WIDTH+1, fin)) != NULL && i<HEIGHT){ + j = xl; + tptr = tmp; + if (strlen(tmp)) + tmp[strlen(tmp) - 1] = '\0'; + ensure_line_length(& (screen.l[i]), xl + strlen(tmp) + 1); + while (*tptr && j < WIDTH){ + set_xy(j, i, *tptr); + j++; + tptr ++; + } + i++; + } + if (ftype == FFILE) + fclose(fin); + else + pclose(fin); + modified = 1; + redraw(); + copy_lines_to_ring(yl, i-1, NEW_STATE); + } +} DIR diff --git a/gramscii.c b/gramscii.c @@ -20,6 +20,8 @@ * */ +#define _POSIX_C_SOURCE 2 + #include <stdio.h> #include <stdlib.h> #include <signal.h> @@ -124,6 +126,9 @@ void commands(FILE *fc){ case 'U': redo_change(); break; + case 'r': + read_file_at(fc, x, y); + break; case 'q': check_modified(fc);/** FALLTHROUGH **/ case 'Q': DIR diff --git a/gramscii.h b/gramscii.h @@ -1,6 +1,8 @@ #ifndef __GRAMSCII_H__ #define __GRAMSCII_H__ +#define _POSIX_C_SOURCE 2 + #include <stdio.h> #include <termios.h> #include <unistd.h> @@ -58,6 +60,10 @@ #define NEW_STATE 0x02 /**/ +/* file types */ +#define FFILE 0x01 +#define FPIPE 0x02 + /** types **/ typedef struct{ @@ -157,6 +163,7 @@ void go_to(int where); void crop_to_nonblank(); void crop_to_rect(); void erase_blank_lines(int y1, int y2); +int _isblank(int c); /**/ /** drawing-related functions **/ @@ -176,6 +183,7 @@ void write_file(FILE *fc); void check_modified(FILE *fc); void load_file(FILE *fc); void new_file(FILE *fc); +void read_file_at(FILE *fc, int xl, int yl); /**/ /** line-related functions **/ DIR diff --git a/screen.c b/screen.c @@ -1,3 +1,5 @@ +#define _POSIX_C_SOURCE 2 + #include <stdio.h> #include <stdlib.h> #include <string.h>