files.c - gramscii - A simple editor for ASCII box-and-arrow charts
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Tags
(DIR) README
(DIR) LICENSE
---
files.c (2694B)
---
1 #define _POSIX_C_SOURCE 200112L
2
3 #include <stdio.h>
4 #include <string.h>
5 #include "gramscii.h"
6
7
8 /** extern declarations **/
9
10 extern lineset_t screen; /* what is visualised */
11
12 extern int WIDTH, HEIGHT;
13
14 extern int force_new;
15 extern char modified; /* set to 1 if screen modified since last save */
16 extern char fname[256];
17
18 /*** File management ***/
19
20 void write_file(FILE *fc){
21 FILE *fout;
22 int i, ne;
23
24 if (!fname[0] || force_new){
25 get_string(fc, "Write to: ", fname, 255);
26 if ((fout=fopen(fname, "r"))!=NULL){
27 if (!is_yes(get_key(fc,"File exists. Overwrite [y/n]?")) ){
28 fclose(fout);
29 return;
30 }
31 fclose(fout);
32 }
33 }
34 if((fout=fopen(fname, "w"))==NULL){
35 get_key(fc, "Error opening file.");
36 return;
37 }
38 ne = 0;
39 for (i=0; i<HEIGHT; i++){
40 if (strlen(screen.l[i].s)){/* remove trailing blank lines */
41 /* put the empty lines preceeding the current non-empty one */
42 while (ne--)
43 fprintf(fout, "\n");
44 fprintf(fout, "%s\n", screen.l[i].s);
45 ne = 0;
46 }
47 else ne++;
48 }
49 fclose(fout);
50 modified = 0;
51 get_key(fc, "File saved.");
52 redraw();
53 }
54
55 void check_modified(FILE *fc){
56
57 if (modified){
58 if (!is_yes(get_key(fc, "Unsaved changes. Write to file [y/n]?")) ){
59 return;
60 }
61 write_file(fc);
62 }
63 }
64
65 void load_file(FILE *fc){
66
67 char newfname[256];
68 FILE *fin;
69 int i;
70
71 get_string(fc, "Load file: ", newfname, 255);
72 if ((fin=fopen(newfname, "r")) != NULL){
73 i = 0;
74 while((fgets(screen.l[i].s, WIDTH+1, fin)) != NULL && i<HEIGHT){
75 screen.l[i].lst = strlen(screen.l[i].s) - 2;
76 screen.l[i].n = i;
77 screen.l[i].s[strlen(screen.l[i].s)-1]='\0';
78 i++;
79 }
80 for(;i<HEIGHT; i++){
81 erase_line(i);
82 }
83 fclose(fin);
84 }
85 strcpy(fname, newfname);
86 modified=0;
87 redraw();
88 }
89
90 void new_file(FILE *fc){
91 check_modified(fc);
92 erase_screen();
93 go_to(HOME);
94 redraw();
95 fname[0] = '\0';
96 modified=0;
97 }
98
99 void read_file_at(FILE *fc, int xl, int yl){
100
101 char nfname[512], tmp[512], *fptr, *tptr;
102 FILE *fin;
103 int i, j;
104 char ftype;
105
106 get_string(fc, "Read file: ", nfname, 511);
107 fptr = nfname;
108 while(*fptr && _isblank(*fptr))
109 fptr ++;
110 if (*fptr == '!'){
111 fin = popen(++fptr, "r");
112 ftype = FPIPE;
113 }
114 else {
115 fin = fopen(fptr, "r");
116 ftype = FFILE;
117 }
118 if (fin != NULL){
119 copy_lines_to_ring(0, HEIGHT-1, PRV_STATE);
120 i = yl;
121 while((fgets(tmp, WIDTH+1, fin)) != NULL && i<HEIGHT){
122 j = xl;
123 tptr = tmp;
124 if (strlen(tmp))
125 tmp[strlen(tmp) - 1] = '\0';
126 ensure_line_length(& (screen.l[i]), xl + strlen(tmp) + 1);
127 while (*tptr && j < WIDTH){
128 set_xy(j, i, *tptr);
129 j++;
130 tptr ++;
131 }
132 i++;
133 }
134 if (ftype == FFILE)
135 fclose(fin);
136 else
137 pclose(fin);
138 modified = 1;
139 redraw();
140 copy_lines_to_ring(yl, i-1, NEW_STATE);
141 }
142 }