1: /*
2: * Entry point, initialization, miscellaneous routines.
3: */
4:
5: #include "less.h"
6: #include "position.h"
7: #include <setjmp.h>
8:
9: public int ispipe;
10: public jmp_buf main_loop;
11: public char * first_cmd;
12: public char * every_first_cmd;
13: public int new_file;
14: public int is_tty;
15: public char current_file[128];
16: public int ac;
17: public char **av;
18: public int curr_ac;
19: #if EDITOR
20: public char * editor;
21: #endif
22:
23: extern int file;
24: extern int nbufs;
25: extern int sigs;
26: extern int quit_at_eof;
27: extern int p_nbufs, f_nbufs;
28: extern int back_scroll;
29: extern int top_scroll;
30: extern int sc_height;
31:
32:
33: /*
34: * Edit a new file.
35: * Filename "-" means standard input.
36: * No filename means the "current" file, from the command line.
37: */
38: public void
39: edit(filename)
40: char *filename;
41: {
42: register int f;
43: char message[100];
44: static int any_edited = 0;
45: static int hold_scroll = 0;
46:
47: if (filename == NULL || *filename == '\0')
48: {
49: if (curr_ac >= ac)
50: {
51: error("No current file");
52: return;
53: }
54: filename = av[curr_ac];
55: }
56: if (strcmp(filename, "-") == 0)
57: f = 0; /* Standard input */
58: else if ((f = open(filename, 0)) < 0)
59: {
60: sprintf(message, "Cannot open %.*s",
61: error_width()-13, filename);
62: if (any_edited)
63: error(message);
64: else
65: {
66: puts(message);
67: hold_scroll = 1;
68: }
69: return;
70: }
71:
72: if (isatty(f))
73: {
74: /*
75: * Not really necessary to call this an error,
76: * but if the control terminal (for commands)
77: * and the input file (for data) are the same,
78: * we get weird results at best.
79: */
80: error("Can't take input from a terminal");
81: if (f > 0)
82: close(f);
83: return;
84: }
85:
86: /*
87: * Close the current input file and set up to use the new one.
88: */
89: if (file > 0)
90: close(file);
91: new_file = 1;
92: strcpy(current_file, filename);
93: ispipe = (f == 0);
94: file = f;
95: ch_init( (ispipe) ? p_nbufs : f_nbufs );
96: init_mark();
97: if (every_first_cmd != NULL)
98: first_cmd = every_first_cmd;
99: if (is_tty)
100: {
101: any_edited = 1;
102: if (hold_scroll)
103: {
104: /*
105: * Before erasing the screen contents,
106: * display the file name and ask for a keystroke.
107: */
108: error(filename);
109: hold_scroll = 0;
110: }
111: if (first_cmd == NULL || *first_cmd == '\0')
112: {
113: /*
114: * Display the first screen.
115: */
116: jump_back(1);
117: } else
118: {
119: /*
120: * The first_cmd will hopefully redisplay the
121: * screen, so we need not display anything yet.
122: * Indicate there is nothing yet on the screen.
123: */
124: pos_clear();
125: }
126: }
127: }
128:
129: /*
130: * Edit the next file in the command line list.
131: */
132: public void
133: next_file(n)
134: int n;
135: {
136: if (curr_ac + n >= ac)
137: {
138: if (quit_at_eof)
139: quit();
140: error("No (N-th) next file");
141: } else
142: edit(av[curr_ac += n]);
143: }
144:
145: /*
146: * Edit the previous file in the command line list.
147: */
148: public void
149: prev_file(n)
150: int n;
151: {
152: if (curr_ac - n < 0)
153: error("No (N-th) previous file");
154: else
155: edit(av[curr_ac -= n]);
156: }
157:
158: /*
159: * Copy a file directly to standard output.
160: * Used if standard output is not a tty.
161: */
162: static void
163: cat_file()
164: {
165: register int c;
166:
167: while ((c = ch_forw_get()) != EOF)
168: putc(c);
169: flush();
170: }
171:
172: /*
173: * Entry point.
174: */
175: main(argc, argv)
176: int argc;
177: char *argv[];
178: {
179: char *getenv();
180:
181:
182: /*
183: * Process command line arguments and LESS environment arguments.
184: * Command line arguments override environment arguments.
185: */
186: init_option();
187: scan_option(getenv("LESS"));
188: argv++;
189: while ( (--argc > 0) &&
190: (argv[0][0] == '-' || argv[0][0] == '+') &&
191: argv[0][1] != '\0')
192: scan_option(*argv++);
193:
194: #if EDITOR
195: editor = getenv("EDITOR");
196: if (editor == NULL || *editor == '\0')
197: editor = EDIT_PGM;
198: #endif
199:
200: /*
201: * Set up list of files to be examined.
202: */
203: ac = argc;
204: av = argv;
205: curr_ac = 0;
206:
207: /*
208: * Set up terminal, etc.
209: */
210: is_tty = isatty(1);
211: if (!is_tty)
212: {
213: /*
214: * Output is not a tty.
215: * Just copy the input file(s) to output.
216: */
217: if (ac < 1)
218: {
219: edit("-");
220: cat_file();
221: } else
222: {
223: do
224: {
225: edit((char *)NULL);
226: if (file >= 0)
227: cat_file();
228: } while (++curr_ac < ac);
229: }
230: exit(0);
231: }
232:
233: raw_mode(1);
234: get_term();
235: open_getc();
236: init();
237:
238: if (back_scroll < 0)
239: {
240: /* {{ KLUDGE }} */
241: back_scroll = sc_height-1;
242: if (top_scroll)
243: back_scroll--;
244: }
245:
246: if (setjmp(main_loop))
247: quit();
248: init_signals();
249:
250: /*
251: * Select the first file to examine.
252: */
253: if (ac < 1)
254: edit("-"); /* Standard input */
255: else
256: {
257: /*
258: * Try all the files named as command arguments.
259: * We are simply looking for one which can be
260: * opened without error.
261: */
262: do
263: {
264: edit((char *)NULL);
265: if (file >= 0)
266: /* We can open this file. */
267: break;
268: putc('\n'); flush();
269: } while (++curr_ac < ac);
270: }
271:
272: if (file >= 0)
273: commands();
274: quit();
275: }
276:
277: /*
278: * Exit the program.
279: */
280: public void
281: quit()
282: {
283: /*
284: * Put cursor at bottom left corner, clear the line,
285: * reset the terminal modes, and exit.
286: */
287: lower_left();
288: clear_eol();
289: deinit();
290: flush();
291: raw_mode(0);
292: exit(0);
293: }
Defined functions
edit
defined in line
38; used 8 times
main
defined in line
175;
never used
quit
defined in line
280; used 8 times
Defined variables
ac
defined in line
16; used 10 times
av
defined in line
17; used 5 times
ispipe
defined in line
9; used 9 times