|
|
files.c - gramscii - A simple editor for ASCII box-and-arrow charts |
|
|
 |
Log |
|
|
 |
Files |
|
|
 |
Refs |
|
|
 |
Tags |
|
|
 |
README |
|
|
 |
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 } |
|