Introduction
Introduction Statistics Contact Development Disclaimer Help
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 }
You are viewing proxied material from bitreich.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.