113920Sedward #ifndef lint 2*14407Sedward static char *sccsid = "@(#)main.c 2.1.1.1 83/08/09"; 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 11*14407Sedward /*ARGSUSED*/ 1214169Sedward main(argc, argv) 1314169Sedward char **argv; 1413920Sedward { 1513920Sedward register n; 1613920Sedward register char *p; 1714286Sedward char fast = 0; 1813920Sedward int imask; 19*14407Sedward struct timezone timezone; 2013920Sedward 2114286Sedward if (p = rindex(*argv, '/')) 2214286Sedward p++; 2314286Sedward else 2414286Sedward p = *argv; 2514286Sedward debug = strcmp(p, "a.out") == 0; 2614169Sedward while (*++argv) { 2714169Sedward if (**argv == '-') { 2814169Sedward switch (*++*argv) { 2914286Sedward case 'f': 3014286Sedward fast++; 3114286Sedward break; 3214169Sedward case 'e': 3314169Sedward setescape(next(argv)); 3414169Sedward break; 3514169Sedward case 't': 3614169Sedward terse++; 3714169Sedward break; 3814286Sedward case 'd': 3914286Sedward debug++; 4014286Sedward break; 4114169Sedward default: 42*14407Sedward (void) usage(); 4314169Sedward } 4414169Sedward } else 45*14407Sedward (void) usage(); 4614169Sedward } 4714286Sedward if ((shell = getenv("SHELL")) == 0) 4814286Sedward shell = "/bin/csh"; 4914286Sedward if (shellname = rindex(shell, '/')) 5014286Sedward shellname++; 5114286Sedward else 5214286Sedward shellname = shell; 53*14407Sedward (void) gettimeofday(&starttime, &timezone); 5413962Sedward if (wwinit() < 0) { 55*14407Sedward (void) fflush(stdout); 56*14407Sedward (void) fprintf(stderr, "Can't do windows on this terminal.\n"); 5713962Sedward exit(1); 5813962Sedward } 5914286Sedward if (debug) { 6014286Sedward wwnewtty.ww_tchars.t_quitc = wwoldtty.ww_tchars.t_quitc; 61*14407Sedward (void) wwsettty(0, &wwnewtty); 6214286Sedward } 63*14407Sedward 64*14407Sedward if ((cmdwin = wwopen(WWO_REVERSE, 1, wwncol, 0, 0, 0)) == 0) { 65*14407Sedward (void) wwflush(); 66*14407Sedward (void) fprintf(stderr, "Can't open command window.\r\n"); 6713962Sedward goto bad; 6813962Sedward } 69*14407Sedward if ((framewin = wwopen(WWO_GLASS, wwnrow, wwncol, 0, 0, 0)) == 0) { 70*14407Sedward (void) wwflush(); 71*14407Sedward (void) fprintf(stderr, "Can't open frame window.\r\n"); 72*14407Sedward goto bad; 73*14407Sedward } 74*14407Sedward wwadd(framewin, &wwhead); 75*14407Sedward 76*14407Sedward curwin = cmdwin; 77*14407Sedward wwupdate(); 7813969Sedward wwflush(); 7913920Sedward (void) signal(SIGCHLD, wwchild); 8014286Sedward if (!fast) { 81*14407Sedward if (!terse) 82*14407Sedward wwadd(cmdwin, &wwhead); 8314286Sedward if (doconfig() < 0) 8414286Sedward dodefault(); 8514294Sedward if (selwin != 0) { 86*14407Sedward curwin = selwin; 87*14407Sedward /* 8814294Sedward Woncursor(selwin->ww_win, 0); 89*14407Sedward */ 9014294Sedward } 91*14407Sedward if (!terse) { 92*14407Sedward wwdelete(cmdwin); 93*14407Sedward reframe(); 94*14407Sedward } 9514286Sedward } 9613969Sedward while (!quit) { 9713969Sedward if (curwin == cmdwin) { 9813969Sedward docmd(); 9913962Sedward continue; 10013969Sedward } 10113994Sedward /* 10213994Sedward * Loop until we get some keyboard input. 10313994Sedward */ 10413969Sedward while (ibufc == 0) { 105*14407Sedward wwcurtowin(curwin); 106*14407Sedward wwupdate(); 10713969Sedward wwflush(); 10813994Sedward imask = 1 << 0; 10913994Sedward while (wwforce(&imask) < 0) 11013994Sedward ; 11113994Sedward if ((imask & 1 << 0) == 0) 11213962Sedward continue; 11313994Sedward /* NOTE: ibufc == 0 */ 11413994Sedward ibufp = ibuf; 11514153Sedward if ((ibufc = read(0, ibuf, sizeof ibuf)) < 0) { 11613994Sedward ibufc = 0; 11714153Sedward nreade++; 11814153Sedward } else if (ibufc == 0) 11914153Sedward nreadz++; 12014153Sedward else 12114153Sedward nreadc += ibufc; 12214153Sedward nread++; 12313994Sedward } 12413994Sedward /* 125*14407Sedward * Weird loop. Copy the buffer to the pty 126*14407Sedward * and stopping on the escape character 127*14407Sedward * in a hopefully efficient way. 12813994Sedward * Probably a good thing to make ibufc == 1 a special 12913994Sedward * case. 13013994Sedward */ 13113994Sedward for (p = ibufp, n = ibufc;;) { 13213994Sedward if (--n < 0) { 133*14407Sedward (void) write(curwin->ww_pty, ibufp, ibufc); 13413969Sedward ibufp = ibuf; 13513994Sedward ibufc = 0; 13613994Sedward break; 13714169Sedward } else if (*p++ == escapec) { 13813994Sedward if ((n = p - ibufp) > 1) 139*14407Sedward (void) write(curwin->ww_pty, 140*14407Sedward ibufp, n - 1); 14113994Sedward ibufp = p; 14213994Sedward ibufc -= n; 143*14407Sedward curwin = cmdwin; 14413994Sedward break; 14513994Sedward } 14613920Sedward } 14713920Sedward } 148*14407Sedward wwupdate(); 149*14407Sedward wwflush(); 15013920Sedward bad: 15113920Sedward wwend(); 15213920Sedward return 0; 15313920Sedward } 15414169Sedward 15514169Sedward usage() 15614169Sedward { 157*14407Sedward (void) fprintf(stderr, "window: [-e escape] [-t] [-f]\n"); 158*14407Sedward return exit(1); /* for lint */ 15914169Sedward } 160