113920Sedward #ifndef lint 2*14454Sedward static char *sccsid = "@(#)main.c 3.1 83/08/11"; 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 1114407Sedward /*ARGSUSED*/ 1214169Sedward main(argc, argv) 1314169Sedward char **argv; 1413920Sedward { 1513920Sedward register n; 1613920Sedward register char *p; 1714286Sedward char fast = 0; 1813920Sedward int imask; 1914407Sedward 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: 4214407Sedward (void) usage(); 4314169Sedward } 4414169Sedward } else 4514407Sedward (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; 5314407Sedward (void) gettimeofday(&starttime, &timezone); 5413962Sedward if (wwinit() < 0) { 5514407Sedward (void) fflush(stdout); 5614407Sedward (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; 6114407Sedward (void) wwsettty(0, &wwnewtty); 6214286Sedward } 6314407Sedward 6414407Sedward if ((cmdwin = wwopen(WWO_REVERSE, 1, wwncol, 0, 0, 0)) == 0) { 6514407Sedward (void) wwflush(); 6614407Sedward (void) fprintf(stderr, "Can't open command window.\r\n"); 6713962Sedward goto bad; 6813962Sedward } 6914407Sedward if ((framewin = wwopen(WWO_GLASS, wwnrow, wwncol, 0, 0, 0)) == 0) { 7014407Sedward (void) wwflush(); 7114407Sedward (void) fprintf(stderr, "Can't open frame window.\r\n"); 7214407Sedward goto bad; 7314407Sedward } 7414407Sedward wwadd(framewin, &wwhead); 7514407Sedward 7614407Sedward curwin = cmdwin; 7714407Sedward wwupdate(); 7813969Sedward wwflush(); 7913920Sedward (void) signal(SIGCHLD, wwchild); 8014286Sedward if (!fast) { 8114407Sedward if (!terse) 8214407Sedward wwadd(cmdwin, &wwhead); 8314286Sedward if (doconfig() < 0) 8414286Sedward dodefault(); 8514294Sedward if (selwin != 0) { 8614407Sedward curwin = selwin; 8714407Sedward /* 8814294Sedward Woncursor(selwin->ww_win, 0); 8914407Sedward */ 9014294Sedward } 9114407Sedward if (!terse) { 9214407Sedward wwdelete(cmdwin); 9314407Sedward reframe(); 9414407Sedward } 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) { 10514407Sedward wwcurtowin(curwin); 10614407Sedward 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 /* 12514407Sedward * Weird loop. Copy the buffer to the pty 12614407Sedward * and stopping on the escape character 12714407Sedward * 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) { 13314407Sedward (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) 13914407Sedward (void) write(curwin->ww_pty, 14014407Sedward ibufp, n - 1); 14113994Sedward ibufp = p; 14213994Sedward ibufc -= n; 14314407Sedward curwin = cmdwin; 14413994Sedward break; 14513994Sedward } 14613920Sedward } 14713920Sedward } 14814407Sedward wwupdate(); 14914407Sedward wwflush(); 15013920Sedward bad: 15113920Sedward wwend(); 15213920Sedward return 0; 15313920Sedward } 15414169Sedward 15514169Sedward usage() 15614169Sedward { 15714407Sedward (void) fprintf(stderr, "window: [-e escape] [-t] [-f]\n"); 158*14454Sedward exit(1); 159*14454Sedward return 0; /* for lint */ 16014169Sedward } 161