113920Sedward #ifndef lint 2*14846Sedward static char *sccsid = "@(#)main.c 3.7 83/08/26"; 313920Sedward #endif 413920Sedward 513969Sedward #include "defs.h" 613920Sedward 714286Sedward char escapec = CTRL(p); 814841Sedward int nbufline = 48; /* compatible */ 914169Sedward 1014286Sedward #define next(a) (*++*(a) ? *(a) : (*++(a) ? *(a) : (char *)usage())) 1114169Sedward 1214407Sedward /*ARGSUSED*/ 1314169Sedward main(argc, argv) 1414169Sedward char **argv; 1513920Sedward { 1613920Sedward register n; 1713920Sedward register char *p; 1814677Sedward char fflag = 0; 1914677Sedward char dflag = 0; 20*14846Sedward char xflag = 0; 2113920Sedward int imask; 2214407Sedward struct timezone timezone; 2313920Sedward 2414286Sedward if (p = rindex(*argv, '/')) 2514286Sedward p++; 2614286Sedward else 2714286Sedward p = *argv; 2814286Sedward debug = strcmp(p, "a.out") == 0; 2914169Sedward while (*++argv) { 3014169Sedward if (**argv == '-') { 3114169Sedward switch (*++*argv) { 3214286Sedward case 'f': 3314677Sedward fflag++; 3414286Sedward break; 3514169Sedward case 'e': 3614169Sedward setescape(next(argv)); 3714169Sedward break; 3814169Sedward case 't': 3914169Sedward terse++; 4014169Sedward break; 4114286Sedward case 'd': 4214677Sedward dflag++; 4314677Sedward break; 4414677Sedward case 'D': 4514286Sedward debug++; 4614286Sedward break; 47*14846Sedward case 'x': 48*14846Sedward xflag++; 49*14846Sedward break; 5014169Sedward default: 5114407Sedward (void) usage(); 5214169Sedward } 5314169Sedward } else 5414407Sedward (void) usage(); 5514169Sedward } 5614286Sedward if ((shell = getenv("SHELL")) == 0) 5714286Sedward shell = "/bin/csh"; 5814286Sedward if (shellname = rindex(shell, '/')) 5914286Sedward shellname++; 6014286Sedward else 6114286Sedward shellname = shell; 6214407Sedward (void) gettimeofday(&starttime, &timezone); 6313962Sedward if (wwinit() < 0) { 6414407Sedward (void) fflush(stdout); 6514407Sedward (void) fprintf(stderr, "Can't do windows on this terminal.\n"); 6613962Sedward exit(1); 6713962Sedward } 68*14846Sedward if (debug) 6914286Sedward wwnewtty.ww_tchars.t_quitc = wwoldtty.ww_tchars.t_quitc; 70*14846Sedward if (xflag) { 71*14846Sedward wwnewtty.ww_tchars.t_stopc = wwoldtty.ww_tchars.t_stopc; 72*14846Sedward wwnewtty.ww_tchars.t_startc = wwoldtty.ww_tchars.t_startc; 73*14846Sedward } 74*14846Sedward if (debug || xflag) 7514407Sedward (void) wwsettty(0, &wwnewtty); 7614407Sedward 7714407Sedward if ((cmdwin = wwopen(WWO_REVERSE, 1, wwncol, 0, 0, 0)) == 0) { 7814407Sedward (void) wwflush(); 7914407Sedward (void) fprintf(stderr, "Can't open command window.\r\n"); 8013962Sedward goto bad; 8113962Sedward } 8214772Sedward if ((framewin = wwopen(WWO_GLASS|WWO_FRAME, wwnrow, wwncol, 0, 0, 0)) 8314772Sedward == 0) { 8414407Sedward (void) wwflush(); 8514407Sedward (void) fprintf(stderr, "Can't open frame window.\r\n"); 8614407Sedward goto bad; 8714407Sedward } 8814407Sedward wwadd(framewin, &wwhead); 8914720Sedward if ((boxwin = wwopen(WWO_GLASS, wwnrow, wwncol, 0, 0, 0)) == 0) { 9014720Sedward (void) wwflush(); 9114720Sedward (void) fprintf(stderr, "Can't open box window.\r\n"); 9214720Sedward goto bad; 9314720Sedward } 9414407Sedward 9514407Sedward curwin = cmdwin; 9614407Sedward wwupdate(); 9713969Sedward wwflush(); 9813920Sedward (void) signal(SIGCHLD, wwchild); 9914677Sedward if (!fflag) { 10014407Sedward if (!terse) 10114407Sedward wwadd(cmdwin, &wwhead); 10214677Sedward if (dflag || doconfig() < 0) 10314286Sedward dodefault(); 10414294Sedward if (selwin != 0) { 10514407Sedward curwin = selwin; 10614762Sedward wwcursor(selwin, 0); 10714294Sedward } 10814407Sedward if (!terse) { 10914407Sedward wwdelete(cmdwin); 11014407Sedward reframe(); 11114407Sedward } 11214286Sedward } 11313969Sedward while (!quit) { 11413969Sedward if (curwin == cmdwin) { 11513969Sedward docmd(); 11613962Sedward continue; 11713969Sedward } 11813994Sedward /* 11913994Sedward * Loop until we get some keyboard input. 12013994Sedward */ 12113969Sedward while (ibufc == 0) { 12214407Sedward wwcurtowin(curwin); 12314407Sedward wwupdate(); 12413969Sedward wwflush(); 12513994Sedward imask = 1 << 0; 12613994Sedward while (wwforce(&imask) < 0) 12713994Sedward ; 12813994Sedward if ((imask & 1 << 0) == 0) 12913962Sedward continue; 13013994Sedward /* NOTE: ibufc == 0 */ 13113994Sedward ibufp = ibuf; 13214153Sedward if ((ibufc = read(0, ibuf, sizeof ibuf)) < 0) { 13313994Sedward ibufc = 0; 13414153Sedward nreade++; 13514153Sedward } else if (ibufc == 0) 13614153Sedward nreadz++; 13714153Sedward else 13814153Sedward nreadc += ibufc; 13914153Sedward nread++; 14013994Sedward } 14113994Sedward /* 14214407Sedward * Weird loop. Copy the buffer to the pty 14314407Sedward * and stopping on the escape character 14414407Sedward * in a hopefully efficient way. 14513994Sedward * Probably a good thing to make ibufc == 1 a special 14613994Sedward * case. 14713994Sedward */ 14813994Sedward for (p = ibufp, n = ibufc;;) { 14913994Sedward if (--n < 0) { 15014407Sedward (void) write(curwin->ww_pty, ibufp, ibufc); 15113969Sedward ibufp = ibuf; 15213994Sedward ibufc = 0; 15313994Sedward break; 15414169Sedward } else if (*p++ == escapec) { 15513994Sedward if ((n = p - ibufp) > 1) 15614407Sedward (void) write(curwin->ww_pty, 15714407Sedward ibufp, n - 1); 15813994Sedward ibufp = p; 15913994Sedward ibufc -= n; 16014407Sedward curwin = cmdwin; 16113994Sedward break; 16213994Sedward } 16313920Sedward } 16413920Sedward } 16514407Sedward wwupdate(); 16614407Sedward wwflush(); 16713920Sedward bad: 16813920Sedward wwend(); 16913920Sedward return 0; 17013920Sedward } 17114169Sedward 17214169Sedward usage() 17314169Sedward { 17414677Sedward (void) fprintf(stderr, "window: [-e escape-char] [-t] [-f] [-d]\n"); 17514454Sedward exit(1); 17614454Sedward return 0; /* for lint */ 17714169Sedward } 178