added user setable buffer size.
[unix-history] / usr / src / usr.bin / window / main.c
CommitLineData
fc38b21b 1#ifndef lint
4cbe417d 2static char *sccsid = "@(#)main.c 3.6 83/08/25";
fc38b21b
EW
3#endif
4
2b44d852 5#include "defs.h"
fc38b21b 6
db4a5bb1 7char escapec = CTRL(p);
4cbe417d 8int nbufline = 48; /* compatible */
a9353152 9
db4a5bb1 10#define next(a) (*++*(a) ? *(a) : (*++(a) ? *(a) : (char *)usage()))
a9353152 11
bb05dfb5 12/*ARGSUSED*/
a9353152
EW
13main(argc, argv)
14char **argv;
fc38b21b
EW
15{
16 register n;
17 register char *p;
c8ec0306
EW
18 char fflag = 0;
19 char dflag = 0;
fc38b21b 20 int imask;
bb05dfb5 21 struct timezone timezone;
fc38b21b 22
db4a5bb1
EW
23 if (p = rindex(*argv, '/'))
24 p++;
25 else
26 p = *argv;
27 debug = strcmp(p, "a.out") == 0;
a9353152
EW
28 while (*++argv) {
29 if (**argv == '-') {
30 switch (*++*argv) {
db4a5bb1 31 case 'f':
c8ec0306 32 fflag++;
db4a5bb1 33 break;
a9353152
EW
34 case 'e':
35 setescape(next(argv));
36 break;
37 case 't':
38 terse++;
39 break;
db4a5bb1 40 case 'd':
c8ec0306
EW
41 dflag++;
42 break;
43 case 'D':
db4a5bb1
EW
44 debug++;
45 break;
a9353152 46 default:
bb05dfb5 47 (void) usage();
a9353152
EW
48 }
49 } else
bb05dfb5 50 (void) usage();
a9353152 51 }
db4a5bb1
EW
52 if ((shell = getenv("SHELL")) == 0)
53 shell = "/bin/csh";
54 if (shellname = rindex(shell, '/'))
55 shellname++;
56 else
57 shellname = shell;
bb05dfb5 58 (void) gettimeofday(&starttime, &timezone);
4711df8b 59 if (wwinit() < 0) {
bb05dfb5
EW
60 (void) fflush(stdout);
61 (void) fprintf(stderr, "Can't do windows on this terminal.\n");
4711df8b
EW
62 exit(1);
63 }
db4a5bb1
EW
64 if (debug) {
65 wwnewtty.ww_tchars.t_quitc = wwoldtty.ww_tchars.t_quitc;
bb05dfb5 66 (void) wwsettty(0, &wwnewtty);
db4a5bb1 67 }
bb05dfb5
EW
68
69 if ((cmdwin = wwopen(WWO_REVERSE, 1, wwncol, 0, 0, 0)) == 0) {
70 (void) wwflush();
71 (void) fprintf(stderr, "Can't open command window.\r\n");
72 goto bad;
73 }
2357b64e
EW
74 if ((framewin = wwopen(WWO_GLASS|WWO_FRAME, wwnrow, wwncol, 0, 0, 0))
75 == 0) {
bb05dfb5
EW
76 (void) wwflush();
77 (void) fprintf(stderr, "Can't open frame window.\r\n");
4711df8b
EW
78 goto bad;
79 }
bb05dfb5 80 wwadd(framewin, &wwhead);
43c1dd56
EW
81 if ((boxwin = wwopen(WWO_GLASS, wwnrow, wwncol, 0, 0, 0)) == 0) {
82 (void) wwflush();
83 (void) fprintf(stderr, "Can't open box window.\r\n");
84 goto bad;
85 }
bb05dfb5
EW
86
87 curwin = cmdwin;
88 wwupdate();
2b44d852 89 wwflush();
fc38b21b 90 (void) signal(SIGCHLD, wwchild);
c8ec0306 91 if (!fflag) {
bb05dfb5
EW
92 if (!terse)
93 wwadd(cmdwin, &wwhead);
c8ec0306 94 if (dflag || doconfig() < 0)
db4a5bb1 95 dodefault();
0201d1be 96 if (selwin != 0) {
bb05dfb5 97 curwin = selwin;
73218728 98 wwcursor(selwin, 0);
bb05dfb5
EW
99 }
100 if (!terse) {
101 wwdelete(cmdwin);
102 reframe();
0201d1be 103 }
db4a5bb1 104 }
2b44d852
EW
105 while (!quit) {
106 if (curwin == cmdwin) {
107 docmd();
4711df8b 108 continue;
2b44d852 109 }
b4be6cd6
EW
110 /*
111 * Loop until we get some keyboard input.
112 */
2b44d852 113 while (ibufc == 0) {
bb05dfb5
EW
114 wwcurtowin(curwin);
115 wwupdate();
2b44d852 116 wwflush();
b4be6cd6
EW
117 imask = 1 << 0;
118 while (wwforce(&imask) < 0)
119 ;
120 if ((imask & 1 << 0) == 0)
4711df8b 121 continue;
b4be6cd6
EW
122 /* NOTE: ibufc == 0 */
123 ibufp = ibuf;
39b49130 124 if ((ibufc = read(0, ibuf, sizeof ibuf)) < 0) {
b4be6cd6 125 ibufc = 0;
39b49130
EW
126 nreade++;
127 } else if (ibufc == 0)
128 nreadz++;
129 else
130 nreadc += ibufc;
131 nread++;
2b44d852 132 }
b4be6cd6 133 /*
bb05dfb5
EW
134 * Weird loop. Copy the buffer to the pty
135 * and stopping on the escape character
136 * in a hopefully efficient way.
b4be6cd6
EW
137 * Probably a good thing to make ibufc == 1 a special
138 * case.
139 */
140 for (p = ibufp, n = ibufc;;) {
141 if (--n < 0) {
bb05dfb5 142 (void) write(curwin->ww_pty, ibufp, ibufc);
b4be6cd6
EW
143 ibufp = ibuf;
144 ibufc = 0;
145 break;
a9353152 146 } else if (*p++ == escapec) {
b4be6cd6 147 if ((n = p - ibufp) > 1)
bb05dfb5
EW
148 (void) write(curwin->ww_pty,
149 ibufp, n - 1);
b4be6cd6
EW
150 ibufp = p;
151 ibufc -= n;
bb05dfb5 152 curwin = cmdwin;
b4be6cd6
EW
153 break;
154 }
fc38b21b
EW
155 }
156 }
bb05dfb5
EW
157 wwupdate();
158 wwflush();
fc38b21b 159bad:
fc38b21b
EW
160 wwend();
161 return 0;
162}
a9353152
EW
163
164usage()
165{
c8ec0306 166 (void) fprintf(stderr, "window: [-e escape-char] [-t] [-f] [-d]\n");
30647f51
EW
167 exit(1);
168 return 0; /* for lint */
a9353152 169}