annotate miscellany/less-177/edit.c @ 0:bce86c4163a3

Initial revision
author kono
date Mon, 18 Apr 2005 23:46:02 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 #include "less.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
3 #if __MSDOS__
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 #include <fcntl.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
5 #include <stdlib.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 #include <string.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 #include <io.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 #define ISPIPE(fd) ((fd)==0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 extern int ispipe;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 extern int new_file;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13 extern int errmsgs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 extern int quit_at_eof;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15 extern int file;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 extern int cbufs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 extern char *every_first_cmd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 extern int any_display;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 extern int force_open;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 extern int is_tty;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 extern IFILE curr_ifile;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 extern IFILE old_ifile;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 extern struct scrpos initial_scrpos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 #if LOGFILE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 extern int logfile;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 extern int force_logfile;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 extern char *namelogfile;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 * Edit a new file.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 * Filename == "-" means standard input.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 * Filename == NULL means just close the current file.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 public int
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 edit(filename, just_looking)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 register char *filename;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 int just_looking;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 register int f;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43 char *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 int answer;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 int no_display;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 struct scrpos scrpos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47 PARG parg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 if (filename == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 * Close the current file, but don't open a new one.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 f = -1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 } else if (strcmp(filename, "-") == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 * Use standard input.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 f = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 } else if ((parg.p_string = bad_file(filename)) != NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 error("%s", &parg);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 free(parg.p_string);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65 return (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 #if __MSDOS__
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 } else if ((f = open(filename, O_RDONLY|O_BINARY)) < 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 } else if ((f = open(filename, 0)) < 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 parg.p_string = errno_message(filename);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73 error("%s", &parg);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 free(parg.p_string);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 return (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 } else if (!force_open && !just_looking && bin_file(f))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 parg.p_string = filename;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 answer = query("\"%s\" may be a binary file. Continue? ",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 &parg);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81 if (answer != 'y' && answer != 'Y')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 close(f);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 return (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 if (f >= 0 && isatty(f))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 * Not really necessary to call this an error,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 * but if the control terminal (for commands)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 * and the input file (for data) are the same,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 * we get weird results at best.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 #if __MSDOS__
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 parg.p_string = "less -?";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 parg.p_string = "less -\\?";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 error("Cannot take input from a terminal (\"%s\" for help)",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 &parg);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103 if (!ISPIPE(f))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 close(f);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105 return (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 #if LOGFILE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 s = namelogfile;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 end_logfile();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 if (f >= 0 && ISPIPE(f) && s != NULL && is_tty)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112 use_logfile(s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 * We are now committed to using the new file.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 * Close the current input file and set up to use the new one.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 if (curr_ifile != NULL_IFILE)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 * Save the current position so that we can return to
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 * the same position if we edit this file again.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 get_scrpos(&scrpos);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 if (scrpos.pos != NULL_POSITION)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128 store_pos(curr_ifile, &scrpos);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 lastmark();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 * Close the current file, unless it is a pipe.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 if (!ISPIPE(file))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 close(file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 file = f;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 if (f < 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 return (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 * Get the new ifile.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145 * Get the saved position for that file.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147 old_ifile = curr_ifile;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 curr_ifile = get_ifile(filename, curr_ifile);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149 get_pos(curr_ifile, &initial_scrpos);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 ispipe = ISPIPE(f);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 if (ispipe)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 ch_pipe();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155 ch_nonpipe();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156 (void) ch_nbuf(cbufs);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 ch_flush();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 new_file = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 #if __MSDOS__
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162 top_filename();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165 if (every_first_cmd != NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166 ungetsc(every_first_cmd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 no_display = !any_display;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 flush();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 any_display = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172 if (is_tty)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175 * Output is to a real tty.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 * Indicate there is nothing displayed yet.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181 pos_clear();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 clr_linenum();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183 if (no_display && errmsgs > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 * We displayed some messages on error output
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187 * (file descriptor 2; see error() function).
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 * Before erasing the screen contents,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 * display the file name and wait for a keystroke.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191 parg.p_string = filename;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192 error("%s", &parg);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195 return (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199 * Edit a space-separated list of files.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200 * For each filename in the list, enter it into the ifile list.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201 * Then edit the first one.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203 public void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204 edit_list(list)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205 char *list;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 register char *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208 register char *es;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209 register char *filename;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210 char *good_filename;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211 IFILE save_curr_ifile;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214 * good_filename keeps track of the first valid filename.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 good_filename = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 s = list;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218 es = s + strlen(s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219 save_curr_ifile = curr_ifile;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220 while ((s = skipsp(s)) < es)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223 * Get the next filename and null terminate it.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 filename = s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226 while (*s != ' ' && *s != '\0')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227 s++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228 if (*s != '\0')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 *s++ = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
230 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
231 * Try to edit the file.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
232 * This enters it into the command line list (if it is good).
bce86c4163a3 Initial revision
kono
parents:
diff changeset
233 * If it is the first good file we've seen, remember it.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
234 * {{ A little weirdness here: if any of the filenames
bce86c4163a3 Initial revision
kono
parents:
diff changeset
235 * are already in the list, subsequent ones get
bce86c4163a3 Initial revision
kono
parents:
diff changeset
236 * entered after the position where that one already
bce86c4163a3 Initial revision
kono
parents:
diff changeset
237 * was, instead of at the end. }}
bce86c4163a3 Initial revision
kono
parents:
diff changeset
238 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
239 if (edit(filename, 1) == 0 && good_filename == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
240 good_filename = filename;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
241 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
242
bce86c4163a3 Initial revision
kono
parents:
diff changeset
243 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
244 * Edit the first valid filename in the list.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
245 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
246 if (good_filename != NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
247 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
248 curr_ifile = save_curr_ifile;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
249 (void) edit(good_filename, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
250 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
251 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
252
bce86c4163a3 Initial revision
kono
parents:
diff changeset
253 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
254 * Edit the first file in the command line (ifile) list.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
255 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
256 public int
bce86c4163a3 Initial revision
kono
parents:
diff changeset
257 edit_first()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
258 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
259 curr_ifile = NULL_IFILE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
260 return (edit_next(1));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
261 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
262
bce86c4163a3 Initial revision
kono
parents:
diff changeset
263 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
264 * Edit the last file in the command line (ifile) list.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
265 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
266 public int
bce86c4163a3 Initial revision
kono
parents:
diff changeset
267 edit_last()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
268 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
269 curr_ifile = NULL_IFILE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
270 return (edit_prev(1));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
271 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
272
bce86c4163a3 Initial revision
kono
parents:
diff changeset
273
bce86c4163a3 Initial revision
kono
parents:
diff changeset
274 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
275 * Edit the next file in the command line (ifile) list.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
276 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
277 public int
bce86c4163a3 Initial revision
kono
parents:
diff changeset
278 edit_next(n)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
279 int n;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
280 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
281 IFILE h;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
282
bce86c4163a3 Initial revision
kono
parents:
diff changeset
283 h = curr_ifile;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
284 while (--n >= 0 || edit(get_filename(h), 0))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
285 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
286 if ((h = next_ifile(h)) == NULL_IFILE)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
287 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
288 * Reached end of the ifile list.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
289 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
290 return (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
291 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
292 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
293 * Found a file that we can edit.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
294 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
295 return (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
296 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
297
bce86c4163a3 Initial revision
kono
parents:
diff changeset
298 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
299 * Edit the previous file in the command line list.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
300 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
301 public int
bce86c4163a3 Initial revision
kono
parents:
diff changeset
302 edit_prev(n)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
303 int n;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
304 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
305 IFILE h;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
306
bce86c4163a3 Initial revision
kono
parents:
diff changeset
307 h = curr_ifile;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
308 while (--n >= 0 || edit(get_filename(h), 0))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
309 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
310 if ((h = prev_ifile(h)) == NULL_IFILE)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
311 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
312 * Reached beginning of the ifile list.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
313 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
314 return (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
315 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
316 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
317 * Found a file that we can edit.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
318 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
319 return (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
320 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
321
bce86c4163a3 Initial revision
kono
parents:
diff changeset
322 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
323 * Edit a specific file in the command line (ifile) list.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
324 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
325 public int
bce86c4163a3 Initial revision
kono
parents:
diff changeset
326 edit_index(n)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
327 int n;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
328 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
329 IFILE h;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
330
bce86c4163a3 Initial revision
kono
parents:
diff changeset
331 h = NULL_IFILE;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
332 do
bce86c4163a3 Initial revision
kono
parents:
diff changeset
333 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
334 if ((h = next_ifile(h)) == NULL_IFILE)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
335 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
336 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
337 * Reached end of the list without finding it.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
338 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
339 return (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
340 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
341 } while (get_index(h) != n);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
342
bce86c4163a3 Initial revision
kono
parents:
diff changeset
343 return (edit(get_filename(h), 0));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
344 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
345
bce86c4163a3 Initial revision
kono
parents:
diff changeset
346 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
347 * Copy a file directly to standard output.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
348 * Used if standard output is not a tty.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
349 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
350 public void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
351 cat_file()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
352 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
353 register int c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
354
bce86c4163a3 Initial revision
kono
parents:
diff changeset
355 while ((c = ch_forw_get()) != EOI)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
356 putchr(c);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
357 flush();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
358 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
359
bce86c4163a3 Initial revision
kono
parents:
diff changeset
360 #if LOGFILE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
361
bce86c4163a3 Initial revision
kono
parents:
diff changeset
362 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
363 * If the user asked for a log file and our input file
bce86c4163a3 Initial revision
kono
parents:
diff changeset
364 * is standard input, create the log file.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
365 * We take care not to blindly overwrite an existing file.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
366 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
367 public void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
368 use_logfile(filename)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
369 char *filename;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
370 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
371 register int exists;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
372 register int answer;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
373 PARG parg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
374
bce86c4163a3 Initial revision
kono
parents:
diff changeset
375 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
376 * {{ We could use access() here. }}
bce86c4163a3 Initial revision
kono
parents:
diff changeset
377 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
378 exists = open(filename, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
379 close(exists);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
380 exists = (exists >= 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
381
bce86c4163a3 Initial revision
kono
parents:
diff changeset
382 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
383 * Decide whether to overwrite the log file or append to it.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
384 * (If it doesn't exist we "overwrite" it.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
385 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
386 if (!exists || force_logfile)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
387 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
388 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
389 * Overwrite (or create) the log file.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
390 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
391 answer = 'O';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
392 } else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
393 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
394 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
395 * Ask user what to do.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
396 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
397 parg.p_string = filename;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
398 answer = query("Warning: \"%s\" exists; Overwrite, Append or Don't log? ", &parg);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
399 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
400
bce86c4163a3 Initial revision
kono
parents:
diff changeset
401 loop:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
402 switch (answer)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
403 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
404 case 'O': case 'o':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
405 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
406 * Overwrite: create the file.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
407 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
408 logfile = creat(filename, 0644);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
409 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
410 case 'A': case 'a':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
411 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
412 * Append: open the file and seek to the end.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
413 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
414 #if __MSDOS__
bce86c4163a3 Initial revision
kono
parents:
diff changeset
415 logfile = open(filename, O_APPEND|O_WRONLY);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
416 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
417 logfile = open(filename, 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
418 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
419 if (lseek(logfile, (offset_t)0, 2) == BAD_LSEEK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
420 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
421 close(logfile);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
422 logfile = -1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
423 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
424 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
425 case 'D': case 'd':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
426 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
427 * Don't do anything.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
428 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
429 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
430 case 'q':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
431 quit(0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
432 /*NOTREACHED*/
bce86c4163a3 Initial revision
kono
parents:
diff changeset
433 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
434 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
435 * Eh?
bce86c4163a3 Initial revision
kono
parents:
diff changeset
436 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
437 answer = query("Overwrite, Append, or Don't log? ", NULL_PARG);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
438 goto loop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
439 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
440
bce86c4163a3 Initial revision
kono
parents:
diff changeset
441 if (logfile < 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
442 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
443 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
444 * Error in opening logfile.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
445 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
446 parg.p_string = filename;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
447 error("Cannot write to \"%s\"", &parg);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
448 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
449 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
450
bce86c4163a3 Initial revision
kono
parents:
diff changeset
451 #endif