113920Sedward #ifndef lint 2*14294Sedward static char *sccsid = "@(#)main.c 1.10 83/07/29"; 313920Sedward #endif 413920Sedward 513969Sedward #include "defs.h" 613920Sedward 714286Sedward char escapec = CTRL(p); 814169Sedward 914286Sedward #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; 1714286Sedward char fast = 0; 1813920Sedward int wwchild(); 1913920Sedward int imask; 2014286Sedward char *rindex(); 2114286Sedward char *getenv(); 2213920Sedward 2314286Sedward if (p = rindex(*argv, '/')) 2414286Sedward p++; 2514286Sedward else 2614286Sedward p = *argv; 2714286Sedward debug = strcmp(p, "a.out") == 0; 2814169Sedward while (*++argv) { 2914169Sedward if (**argv == '-') { 3014169Sedward switch (*++*argv) { 3114286Sedward case 'f': 3214286Sedward fast++; 3314286Sedward break; 3414169Sedward case 'e': 3514169Sedward setescape(next(argv)); 3614169Sedward break; 3714169Sedward case 't': 3814169Sedward terse++; 3914169Sedward break; 4014286Sedward case 'd': 4114286Sedward debug++; 4214286Sedward break; 4314169Sedward default: 4414169Sedward usage(); 4514169Sedward } 4614169Sedward } else 4714169Sedward usage(); 4814169Sedward } 4914286Sedward if ((shell = getenv("SHELL")) == 0) 5014286Sedward shell = "/bin/csh"; 5114286Sedward if (shellname = rindex(shell, '/')) 5214286Sedward shellname++; 5314286Sedward else 5414286Sedward 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 } 6114286Sedward if (debug) { 6214286Sedward wwnewtty.ww_tchars.t_quitc = wwoldtty.ww_tchars.t_quitc; 6314286Sedward wwsettty(0, &wwnewtty); 6414286Sedward } 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); 7714286Sedward if (!fast) { 7814286Sedward if (doconfig() < 0) 7914286Sedward dodefault(); 80*14294Sedward if (selwin != 0) { 8114286Sedward wwsetcurwin(selwin); 82*14294Sedward Woncursor(selwin->ww_win, 0); 83*14294Sedward } 8414286Sedward } 8513969Sedward while (!quit) { 8613969Sedward if (curwin == cmdwin) { 8713969Sedward docmd(); 8813962Sedward continue; 8913969Sedward } 9013994Sedward /* 9113994Sedward * Loop until we get some keyboard input. 9213994Sedward */ 9313969Sedward while (ibufc == 0) { 9413969Sedward wwsetcursor(WCurRow(curwin->ww_win), 9513969Sedward WCurCol(curwin->ww_win)); 9613969Sedward wwflush(); 9713994Sedward imask = 1 << 0; 9813994Sedward while (wwforce(&imask) < 0) 9913994Sedward ; 10013994Sedward if ((imask & 1 << 0) == 0) 10113962Sedward continue; 10213994Sedward /* NOTE: ibufc == 0 */ 10313994Sedward ibufp = ibuf; 10414153Sedward if ((ibufc = read(0, ibuf, sizeof ibuf)) < 0) { 10513994Sedward ibufc = 0; 10614153Sedward nreade++; 10714153Sedward } else if (ibufc == 0) 10814153Sedward nreadz++; 10914153Sedward else 11014153Sedward nreadc += ibufc; 11114153Sedward nread++; 11213994Sedward } 11313994Sedward /* 11413994Sedward * Weird loop. Copy the buffer to the pty stopping 11513994Sedward * on the escape character in a hopefully efficient 11613994Sedward * way. 11713994Sedward * Probably a good thing to make ibufc == 1 a special 11813994Sedward * case. 11913994Sedward */ 12013994Sedward for (p = ibufp, n = ibufc;;) { 12113994Sedward if (--n < 0) { 12213994Sedward write(curwin->ww_pty, ibufp, ibufc); 12313969Sedward ibufp = ibuf; 12413994Sedward ibufc = 0; 12513994Sedward break; 12614169Sedward } else if (*p++ == escapec) { 12713994Sedward if ((n = p - ibufp) > 1) 12813994Sedward write(curwin->ww_pty, ibufp, n - 1); 12913994Sedward ibufp = p; 13013994Sedward ibufc -= n; 13114024Sedward wwsetcurwin(cmdwin); 13213994Sedward break; 13313994Sedward } 13413920Sedward } 13513920Sedward } 13613920Sedward bad: 13713920Sedward wwend(); 13813920Sedward return 0; 13913920Sedward } 14014169Sedward 14114169Sedward usage() 14214169Sedward { 14314169Sedward fprintf(stderr, "window: [-e escape] [-t]\n"); 14414169Sedward exit(1); 14514169Sedward } 146