113920Sedward #ifndef lint 2*13994Sedward static char *sccsid = "@(#)main.c 1.4 83/07/19"; 313920Sedward #endif 413920Sedward 513969Sedward #include "defs.h" 613920Sedward 713920Sedward main() 813920Sedward { 913920Sedward register n; 1013920Sedward register char *p; 1113920Sedward int wwchild(); 1213920Sedward int imask; 1313920Sedward 1413969Sedward gettimeofday(&starttime, &timezone); 1513962Sedward if (wwinit() < 0) { 1613962Sedward fflush(stdout); 1713962Sedward fprintf("Can't do windows on this terminal.\n"); 1813962Sedward exit(1); 1913962Sedward } 2013969Sedward if ((cmdwin = wwopen(1, 0, 1, WCols, 0, 0)) == 0) { 2113962Sedward fflush(stdout); 2213969Sedward fprintf(stderr, "Can't open command window.\r\n"); 2313962Sedward goto bad; 2413962Sedward } 2513969Sedward wwsetcurrent(cmdwin); 2613969Sedward for (n = 0; n < WCols; n++) 2713969Sedward Waputc(0, WINVERSE|WBUF, cmdwin->ww_win); 2813969Sedward wwflush(); 2913920Sedward (void) signal(SIGCHLD, wwchild); 3013969Sedward while (!quit) { 3113969Sedward if (curwin == cmdwin) { 3213969Sedward docmd(); 3313962Sedward continue; 3413969Sedward } 35*13994Sedward /* 36*13994Sedward * Loop until we get some keyboard input. 37*13994Sedward */ 3813969Sedward while (ibufc == 0) { 3913969Sedward wwsetcursor(WCurRow(curwin->ww_win), 4013969Sedward WCurCol(curwin->ww_win)); 4113969Sedward wwflush(); 42*13994Sedward imask = 1 << 0; 43*13994Sedward while (wwforce(&imask) < 0) 44*13994Sedward ; 45*13994Sedward if ((imask & 1 << 0) == 0) 4613962Sedward continue; 47*13994Sedward /* NOTE: ibufc == 0 */ 48*13994Sedward ibufp = ibuf; 49*13994Sedward if ((ibufc = read(0, ibuf, sizeof ibuf)) < 0) 50*13994Sedward ibufc = 0; 51*13994Sedward } 52*13994Sedward /* 53*13994Sedward * Weird loop. Copy the buffer to the pty stopping 54*13994Sedward * on the escape character in a hopefully efficient 55*13994Sedward * way. 56*13994Sedward * Probably a good thing to make ibufc == 1 a special 57*13994Sedward * case. 58*13994Sedward */ 59*13994Sedward for (p = ibufp, n = ibufc;;) { 60*13994Sedward if (--n < 0) { 61*13994Sedward write(curwin->ww_pty, ibufp, ibufc); 6213969Sedward ibufp = ibuf; 63*13994Sedward ibufc = 0; 64*13994Sedward break; 65*13994Sedward } else if (*p++ == ESCAPE) { 66*13994Sedward if ((n = p - ibufp) > 1) 67*13994Sedward write(curwin->ww_pty, ibufp, n - 1); 68*13994Sedward ibufp = p; 69*13994Sedward ibufc -= n; 70*13994Sedward wwsetcurrent(cmdwin); 71*13994Sedward break; 72*13994Sedward } 7313920Sedward } 7413920Sedward } 7513920Sedward bad: 7613920Sedward wwend(); 7713920Sedward return 0; 7813920Sedward } 79