113920Sedward #ifndef lint 2*14677Sedward static char *sccsid = "@(#)main.c 3.2 83/08/17"; 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; 17*14677Sedward char fflag = 0; 18*14677Sedward char dflag = 0; 1913920Sedward int imask; 2014407Sedward struct timezone timezone; 2113920Sedward 2214286Sedward if (p = rindex(*argv, '/')) 2314286Sedward p++; 2414286Sedward else 2514286Sedward p = *argv; 2614286Sedward debug = strcmp(p, "a.out") == 0; 2714169Sedward while (*++argv) { 2814169Sedward if (**argv == '-') { 2914169Sedward switch (*++*argv) { 3014286Sedward case 'f': 31*14677Sedward fflag++; 3214286Sedward break; 3314169Sedward case 'e': 3414169Sedward setescape(next(argv)); 3514169Sedward break; 3614169Sedward case 't': 3714169Sedward terse++; 3814169Sedward break; 3914286Sedward case 'd': 40*14677Sedward dflag++; 41*14677Sedward break; 42*14677Sedward case 'D': 4314286Sedward debug++; 4414286Sedward break; 4514169Sedward default: 4614407Sedward (void) usage(); 4714169Sedward } 4814169Sedward } else 4914407Sedward (void) usage(); 5014169Sedward } 5114286Sedward if ((shell = getenv("SHELL")) == 0) 5214286Sedward shell = "/bin/csh"; 5314286Sedward if (shellname = rindex(shell, '/')) 5414286Sedward shellname++; 5514286Sedward else 5614286Sedward shellname = shell; 5714407Sedward (void) gettimeofday(&starttime, &timezone); 5813962Sedward if (wwinit() < 0) { 5914407Sedward (void) fflush(stdout); 6014407Sedward (void) fprintf(stderr, "Can't do windows on this terminal.\n"); 6113962Sedward exit(1); 6213962Sedward } 6314286Sedward if (debug) { 6414286Sedward wwnewtty.ww_tchars.t_quitc = wwoldtty.ww_tchars.t_quitc; 6514407Sedward (void) wwsettty(0, &wwnewtty); 6614286Sedward } 6714407Sedward 6814407Sedward if ((cmdwin = wwopen(WWO_REVERSE, 1, wwncol, 0, 0, 0)) == 0) { 6914407Sedward (void) wwflush(); 7014407Sedward (void) fprintf(stderr, "Can't open command window.\r\n"); 7113962Sedward goto bad; 7213962Sedward } 7314407Sedward if ((framewin = wwopen(WWO_GLASS, wwnrow, wwncol, 0, 0, 0)) == 0) { 7414407Sedward (void) wwflush(); 7514407Sedward (void) fprintf(stderr, "Can't open frame window.\r\n"); 7614407Sedward goto bad; 7714407Sedward } 7814407Sedward wwadd(framewin, &wwhead); 7914407Sedward 8014407Sedward curwin = cmdwin; 8114407Sedward wwupdate(); 8213969Sedward wwflush(); 8313920Sedward (void) signal(SIGCHLD, wwchild); 84*14677Sedward if (!fflag) { 8514407Sedward if (!terse) 8614407Sedward wwadd(cmdwin, &wwhead); 87*14677Sedward if (dflag || doconfig() < 0) 8814286Sedward dodefault(); 8914294Sedward if (selwin != 0) { 9014407Sedward curwin = selwin; 9114407Sedward /* 9214294Sedward Woncursor(selwin->ww_win, 0); 9314407Sedward */ 9414294Sedward } 9514407Sedward if (!terse) { 9614407Sedward wwdelete(cmdwin); 9714407Sedward reframe(); 9814407Sedward } 9914286Sedward } 10013969Sedward while (!quit) { 10113969Sedward if (curwin == cmdwin) { 10213969Sedward docmd(); 10313962Sedward continue; 10413969Sedward } 10513994Sedward /* 10613994Sedward * Loop until we get some keyboard input. 10713994Sedward */ 10813969Sedward while (ibufc == 0) { 10914407Sedward wwcurtowin(curwin); 11014407Sedward wwupdate(); 11113969Sedward wwflush(); 11213994Sedward imask = 1 << 0; 11313994Sedward while (wwforce(&imask) < 0) 11413994Sedward ; 11513994Sedward if ((imask & 1 << 0) == 0) 11613962Sedward continue; 11713994Sedward /* NOTE: ibufc == 0 */ 11813994Sedward ibufp = ibuf; 11914153Sedward if ((ibufc = read(0, ibuf, sizeof ibuf)) < 0) { 12013994Sedward ibufc = 0; 12114153Sedward nreade++; 12214153Sedward } else if (ibufc == 0) 12314153Sedward nreadz++; 12414153Sedward else 12514153Sedward nreadc += ibufc; 12614153Sedward nread++; 12713994Sedward } 12813994Sedward /* 12914407Sedward * Weird loop. Copy the buffer to the pty 13014407Sedward * and stopping on the escape character 13114407Sedward * in a hopefully efficient way. 13213994Sedward * Probably a good thing to make ibufc == 1 a special 13313994Sedward * case. 13413994Sedward */ 13513994Sedward for (p = ibufp, n = ibufc;;) { 13613994Sedward if (--n < 0) { 13714407Sedward (void) write(curwin->ww_pty, ibufp, ibufc); 13813969Sedward ibufp = ibuf; 13913994Sedward ibufc = 0; 14013994Sedward break; 14114169Sedward } else if (*p++ == escapec) { 14213994Sedward if ((n = p - ibufp) > 1) 14314407Sedward (void) write(curwin->ww_pty, 14414407Sedward ibufp, n - 1); 14513994Sedward ibufp = p; 14613994Sedward ibufc -= n; 14714407Sedward curwin = cmdwin; 14813994Sedward break; 14913994Sedward } 15013920Sedward } 15113920Sedward } 15214407Sedward wwupdate(); 15314407Sedward wwflush(); 15413920Sedward bad: 15513920Sedward wwend(); 15613920Sedward return 0; 15713920Sedward } 15814169Sedward 15914169Sedward usage() 16014169Sedward { 161*14677Sedward (void) fprintf(stderr, "window: [-e escape-char] [-t] [-f] [-d]\n"); 16214454Sedward exit(1); 16314454Sedward return 0; /* for lint */ 16414169Sedward } 165