113920Sedward #ifndef lint 2*14720Sedward static char *sccsid = "@(#)main.c 3.3 83/08/18"; 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; 1714677Sedward char fflag = 0; 1814677Sedward 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': 3114677Sedward fflag++; 3214286Sedward break; 3314169Sedward case 'e': 3414169Sedward setescape(next(argv)); 3514169Sedward break; 3614169Sedward case 't': 3714169Sedward terse++; 3814169Sedward break; 3914286Sedward case 'd': 4014677Sedward dflag++; 4114677Sedward break; 4214677Sedward 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); 79*14720Sedward if ((boxwin = wwopen(WWO_GLASS, wwnrow, wwncol, 0, 0, 0)) == 0) { 80*14720Sedward (void) wwflush(); 81*14720Sedward (void) fprintf(stderr, "Can't open box window.\r\n"); 82*14720Sedward goto bad; 83*14720Sedward } 8414407Sedward 8514407Sedward curwin = cmdwin; 8614407Sedward wwupdate(); 8713969Sedward wwflush(); 8813920Sedward (void) signal(SIGCHLD, wwchild); 8914677Sedward if (!fflag) { 9014407Sedward if (!terse) 9114407Sedward wwadd(cmdwin, &wwhead); 9214677Sedward if (dflag || doconfig() < 0) 9314286Sedward dodefault(); 9414294Sedward if (selwin != 0) { 9514407Sedward curwin = selwin; 9614407Sedward /* 9714294Sedward Woncursor(selwin->ww_win, 0); 9814407Sedward */ 9914294Sedward } 10014407Sedward if (!terse) { 10114407Sedward wwdelete(cmdwin); 10214407Sedward reframe(); 10314407Sedward } 10414286Sedward } 10513969Sedward while (!quit) { 10613969Sedward if (curwin == cmdwin) { 10713969Sedward docmd(); 10813962Sedward continue; 10913969Sedward } 11013994Sedward /* 11113994Sedward * Loop until we get some keyboard input. 11213994Sedward */ 11313969Sedward while (ibufc == 0) { 11414407Sedward wwcurtowin(curwin); 11514407Sedward wwupdate(); 11613969Sedward wwflush(); 11713994Sedward imask = 1 << 0; 11813994Sedward while (wwforce(&imask) < 0) 11913994Sedward ; 12013994Sedward if ((imask & 1 << 0) == 0) 12113962Sedward continue; 12213994Sedward /* NOTE: ibufc == 0 */ 12313994Sedward ibufp = ibuf; 12414153Sedward if ((ibufc = read(0, ibuf, sizeof ibuf)) < 0) { 12513994Sedward ibufc = 0; 12614153Sedward nreade++; 12714153Sedward } else if (ibufc == 0) 12814153Sedward nreadz++; 12914153Sedward else 13014153Sedward nreadc += ibufc; 13114153Sedward nread++; 13213994Sedward } 13313994Sedward /* 13414407Sedward * Weird loop. Copy the buffer to the pty 13514407Sedward * and stopping on the escape character 13614407Sedward * in a hopefully efficient way. 13713994Sedward * Probably a good thing to make ibufc == 1 a special 13813994Sedward * case. 13913994Sedward */ 14013994Sedward for (p = ibufp, n = ibufc;;) { 14113994Sedward if (--n < 0) { 14214407Sedward (void) write(curwin->ww_pty, ibufp, ibufc); 14313969Sedward ibufp = ibuf; 14413994Sedward ibufc = 0; 14513994Sedward break; 14614169Sedward } else if (*p++ == escapec) { 14713994Sedward if ((n = p - ibufp) > 1) 14814407Sedward (void) write(curwin->ww_pty, 14914407Sedward ibufp, n - 1); 15013994Sedward ibufp = p; 15113994Sedward ibufc -= n; 15214407Sedward curwin = cmdwin; 15313994Sedward break; 15413994Sedward } 15513920Sedward } 15613920Sedward } 15714407Sedward wwupdate(); 15814407Sedward wwflush(); 15913920Sedward bad: 16013920Sedward wwend(); 16113920Sedward return 0; 16213920Sedward } 16314169Sedward 16414169Sedward usage() 16514169Sedward { 16614677Sedward (void) fprintf(stderr, "window: [-e escape-char] [-t] [-f] [-d]\n"); 16714454Sedward exit(1); 16814454Sedward return 0; /* for lint */ 16914169Sedward } 170