113920Sedward #ifndef lint 2*14286Sedward static char *sccsid = "@(#)main.c 1.9 83/07/29"; 313920Sedward #endif 413920Sedward 513969Sedward #include "defs.h" 613920Sedward 7*14286Sedward char escapec = CTRL(p); 814169Sedward 9*14286Sedward #define next(a) (*++*(a) ? *(a) : (*++(a) ? *(a) : (char *)usage())) 1014169Sedward 1114169Sedward /*ARGUSED*/ 1214169Sedward main(argc, argv) 1314169Sedward char **argv; 1413920Sedward { 1513920Sedward register n; 1613920Sedward register char *p; 17*14286Sedward char fast = 0; 1813920Sedward int wwchild(); 1913920Sedward int imask; 20*14286Sedward char *rindex(); 21*14286Sedward char *getenv(); 2213920Sedward 23*14286Sedward if (p = rindex(*argv, '/')) 24*14286Sedward p++; 25*14286Sedward else 26*14286Sedward p = *argv; 27*14286Sedward debug = strcmp(p, "a.out") == 0; 2814169Sedward while (*++argv) { 2914169Sedward if (**argv == '-') { 3014169Sedward switch (*++*argv) { 31*14286Sedward case 'f': 32*14286Sedward fast++; 33*14286Sedward break; 3414169Sedward case 'e': 3514169Sedward setescape(next(argv)); 3614169Sedward break; 3714169Sedward case 't': 3814169Sedward terse++; 3914169Sedward break; 40*14286Sedward case 'd': 41*14286Sedward debug++; 42*14286Sedward break; 4314169Sedward default: 4414169Sedward usage(); 4514169Sedward } 4614169Sedward } else 4714169Sedward usage(); 4814169Sedward } 49*14286Sedward if ((shell = getenv("SHELL")) == 0) 50*14286Sedward shell = "/bin/csh"; 51*14286Sedward if (shellname = rindex(shell, '/')) 52*14286Sedward shellname++; 53*14286Sedward else 54*14286Sedward shellname = shell; 5513969Sedward gettimeofday(&starttime, &timezone); 5613962Sedward if (wwinit() < 0) { 5713962Sedward fflush(stdout); 5813962Sedward fprintf("Can't do windows on this terminal.\n"); 5913962Sedward exit(1); 6013962Sedward } 61*14286Sedward if (debug) { 62*14286Sedward wwnewtty.ww_tchars.t_quitc = wwoldtty.ww_tchars.t_quitc; 63*14286Sedward wwsettty(0, &wwnewtty); 64*14286Sedward } 6514065Sedward if ((cmdwin = wwopen(WW_NONE, 0, 1, wwncol, 0, 0)) == 0) { 6613962Sedward fflush(stdout); 6713969Sedward fprintf(stderr, "Can't open command window.\r\n"); 6813962Sedward goto bad; 6913962Sedward } 7014169Sedward if (terse) 7114169Sedward Whide(cmdwin->ww_win); 7214024Sedward wwsetcurwin(cmdwin); 7314065Sedward for (n = 0; n < wwncol; n++) /* XXX */ 7413969Sedward Waputc(0, WINVERSE|WBUF, cmdwin->ww_win); 7513969Sedward wwflush(); 7613920Sedward (void) signal(SIGCHLD, wwchild); 77*14286Sedward if (!fast) { 78*14286Sedward if (doconfig() < 0) 79*14286Sedward dodefault(); 80*14286Sedward if (selwin != 0) 81*14286Sedward wwsetcurwin(selwin); 82*14286Sedward } 8313969Sedward while (!quit) { 8413969Sedward if (curwin == cmdwin) { 8513969Sedward docmd(); 8613962Sedward continue; 8713969Sedward } 8813994Sedward /* 8913994Sedward * Loop until we get some keyboard input. 9013994Sedward */ 9113969Sedward while (ibufc == 0) { 9213969Sedward wwsetcursor(WCurRow(curwin->ww_win), 9313969Sedward WCurCol(curwin->ww_win)); 9413969Sedward wwflush(); 9513994Sedward imask = 1 << 0; 9613994Sedward while (wwforce(&imask) < 0) 9713994Sedward ; 9813994Sedward if ((imask & 1 << 0) == 0) 9913962Sedward continue; 10013994Sedward /* NOTE: ibufc == 0 */ 10113994Sedward ibufp = ibuf; 10214153Sedward if ((ibufc = read(0, ibuf, sizeof ibuf)) < 0) { 10313994Sedward ibufc = 0; 10414153Sedward nreade++; 10514153Sedward } else if (ibufc == 0) 10614153Sedward nreadz++; 10714153Sedward else 10814153Sedward nreadc += ibufc; 10914153Sedward nread++; 11013994Sedward } 11113994Sedward /* 11213994Sedward * Weird loop. Copy the buffer to the pty stopping 11313994Sedward * on the escape character in a hopefully efficient 11413994Sedward * way. 11513994Sedward * Probably a good thing to make ibufc == 1 a special 11613994Sedward * case. 11713994Sedward */ 11813994Sedward for (p = ibufp, n = ibufc;;) { 11913994Sedward if (--n < 0) { 12013994Sedward write(curwin->ww_pty, ibufp, ibufc); 12113969Sedward ibufp = ibuf; 12213994Sedward ibufc = 0; 12313994Sedward break; 12414169Sedward } else if (*p++ == escapec) { 12513994Sedward if ((n = p - ibufp) > 1) 12613994Sedward write(curwin->ww_pty, ibufp, n - 1); 12713994Sedward ibufp = p; 12813994Sedward ibufc -= n; 12914024Sedward wwsetcurwin(cmdwin); 13013994Sedward break; 13113994Sedward } 13213920Sedward } 13313920Sedward } 13413920Sedward bad: 13513920Sedward wwend(); 13613920Sedward return 0; 13713920Sedward } 13814169Sedward 13914169Sedward usage() 14014169Sedward { 14114169Sedward fprintf(stderr, "window: [-e escape] [-t]\n"); 14214169Sedward exit(1); 14314169Sedward } 144