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 [… | |
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 line… | |
41 /* put the empty lines preceeding the current no… | |
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 … | |
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<… | |
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(… | |
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 } |