-/* end of locals */
- default:
- return(0);
- }
- return(1);
-}
-
-/*
- * Wait for output to drain, then flush input waiting.
- */
-wflushtty(tp)
-register struct tty *tp;
-{
-
- (void) spl5();
- while (tp->t_outq.c_cc && tp->t_state&CARR_ON) {
- (*tp->t_oproc)(tp);
- tp->t_state |= ASLEEP;
- sleep((caddr_t)&tp->t_outq, TTOPRI);
- }
- flushtty(tp, FREAD|FWRITE);
- (void) spl0();
-}
-
-/*
- * flush all TTY queues
- */
-flushtty(tp, rw)
-register struct tty *tp;
-{
- register s;
-
- if (tp->t_line == NETLDISC)
- return;
- s = spl6();
- if (rw & FREAD) {
- while (getc(&tp->t_canq) >= 0)
- ;
- wakeup((caddr_t)&tp->t_rawq);
- }
- if (rw & FWRITE) {
- wakeup((caddr_t)&tp->t_outq);
- tp->t_state &= ~TTSTOP;
- (*cdevsw[major(tp->t_dev)].d_stop)(tp);
- while (getc(&tp->t_outq) >= 0)
- ;
- }
- if (rw & FREAD) {
- while (getc(&tp->t_rawq) >= 0)
- ;
- tp->t_delct = 0;
- tp->t_rocount = 0; /* local */
- tp->t_rocol = 0;
- tp->t_lstate = 0;
- }
- splx(s);
-}
-
-
-
-/*
- * transfer raw input list to canonical list,
- * doing erase-kill processing and handling escapes.
- * It waits until a full line has been typed in cooked mode,
- * or until any character has been typed in raw mode.
- */
-canon(tp)
-register struct tty *tp;
-{
- register char *bp;
- char *bp1;
- register int c;
- int mc;
- int s;
-
- if ((tp->t_flags&(RAW|CBREAK))==0 && tp->t_delct==0
- || (tp->t_flags&(RAW|CBREAK))!=0 && tp->t_rawq.c_cc==0) {
- return(-1);
- }
- s = spl0();
-loop:
- bp = &canonb[2];
- while ((c=getc(&tp->t_rawq)) >= 0) {
- if ((tp->t_flags&(RAW|CBREAK))==0) {
- if (c==0377) {
- tp->t_delct--;
- break;
- }
- if (bp[-1]!='\\') {
- if (c==tp->t_erase) {
- if (bp > &canonb[2])
- bp--;
- continue;
- }
- if (c==tp->t_kill)
- goto loop;
- if (c==tun.t_eofc)
- continue;
- } else {
- mc = maptab[c];
- if (c==tp->t_erase || c==tp->t_kill)
- mc = c;
- if (mc && (mc==c || (tp->t_flags&LCASE))) {
- if (bp[-2] != '\\')
- c = mc;
- bp--;
- }
- }
- }
- *bp++ = c;
- if (bp>=canonb+CANBSIZ)
- break;
- }
- bp1 = &canonb[2];
- (void) b_to_q(bp1, bp-bp1, &tp->t_canq);
-
- if (tp->t_state&TBLOCK && tp->t_rawq.c_cc < TTYHOG/5) {
- if (putc(tun.t_startc, &tp->t_outq)==0) {
- tp->t_state &= ~TBLOCK;
- ttstart(tp);
- }
- tp->t_char = 0;
- }
-
- splx(s);
- return(0);
-}
-
-
-/*
- * block transfer input handler.
- */
-ttyrend(tp, pb, pe)
-register struct tty *tp;
-register char *pb, *pe;
-{
- int tandem;
-
- tandem = tp->t_flags&TANDEM;
- if (tp->t_flags&RAW) {
- (void) b_to_q(pb, pe-pb, &tp->t_rawq);
- if (tp->t_chan)
- (void) sdata(tp->t_chan); else
- wakeup((caddr_t)&tp->t_rawq);
- } else {
- tp->t_flags &= ~TANDEM;
- while (pb < pe)
- ttyinput(*pb++, tp);
- tp->t_flags |= tandem;
- }
- if (tandem)
- ttyblock(tp);
-}
-
-/*
- * Place a character on raw TTY input queue, putting in delimiters
- * and waking up top half as needed.
- * Also echo if required.
- * The arguments are the character and the appropriate
- * tty structure.
- */
-ttyinput(c, tp)
-register c;
-register struct tty *tp;
-{
- register int t_flags;
- register struct chan *cp;
-
- tk_nin += 1;
- c &= 0377;
- t_flags = tp->t_flags;
- if (t_flags&TANDEM)
- ttyblock(tp);
- if ((t_flags&RAW)==0) {
- c &= 0177;
- if (tp->t_state&TTSTOP) {
- if (c==tun.t_startc) {
- tp->t_state &= ~TTSTOP;
- ttstart(tp);
- return;
- }
- if (c==tun.t_stopc)
- return;
- tp->t_state &= ~TTSTOP;
- ttstart(tp);
- } else {
- if (c==tun.t_stopc) {
- tp->t_state |= TTSTOP;
- (*cdevsw[major(tp->t_dev)].d_stop)(tp);
- return;
- }
- if (c==tun.t_startc)
- return;
- }
- if (c==tun.t_quitc || c==tun.t_intrc) {
- flushtty(tp, FREAD|FWRITE);
- c = (c==tun.t_intrc) ? SIGINT:SIGQUIT;
- if (tp->t_chan)
- scontrol(tp->t_chan, M_SIG, c);
- else
- gsignal(tp->t_pgrp, c);
- return;
- }
- if (c=='\r' && t_flags&CRMOD)
- c = '\n';
- }
- if (tp->t_rawq.c_cc>TTYHOG) {
- flushtty(tp, FREAD|FWRITE);
- return;
- }
- if (t_flags&LCASE && c>='A' && c<='Z')
- c += 'a'-'A';
- (void) putc(c, &tp->t_rawq);
- if (t_flags&(RAW|CBREAK)||(c=='\n'||c==tun.t_eofc||c==tun.t_brkc)) {
- if ((t_flags&(RAW|CBREAK))==0 && putc(0377, &tp->t_rawq)==0)
- tp->t_delct++;
- if ((cp=tp->t_chan)!=NULL)
- (void) sdata(cp); else
- wakeup((caddr_t)&tp->t_rawq);
- }
- if (t_flags&ECHO) {
- ttyoutput(c, tp);
- if (c==tp->t_kill && (t_flags&(RAW|CBREAK))==0)
- ttyoutput('\n', tp);
- ttstart(tp);
- }
-}
-
-
-/*
- * Send stop character on input overflow.
- */
-ttyblock(tp)
-register struct tty *tp;
-{
- register x;
- x = q1.c_cc + q2.c_cc;
- if (q1.c_cc > TTYHOG) {
- flushtty(tp, FREAD|FWRITE);
- tp->t_state &= ~TBLOCK;
- }
- if (x >= TTYHOG/2) {
- if (putc(tun.t_stopc, &tp->t_outq)==0) {
- tp->t_state |= TBLOCK;
- tp->t_char++;
- ttstart(tp);
- }
- }
-}
-
-/*
- * put character on TTY output queue, adding delays,
- * expanding tabs, and handling the CR/NL bit.
- * It is called both from the top half for output, and from
- * interrupt level for echoing.
- * The arguments are the character and the tty structure.
- */
-ttyoutput(c, tp)
-register c;
-register struct tty *tp;
-{
- register char *colp;
- register ctype;
-
- /*
- * Ignore EOT in normal mode to avoid hanging up
- * certain terminals.
- * In raw mode dump the char unchanged.
- */
- if ((tp->t_flags&RAW)==0) {
- c &= 0177;
- if ((tp->t_flags&CBREAK)==0 && c==CEOT)
- return;
- } else {
- tk_nout++;
- (void) putc(c, &tp->t_outq);
- return;
- }
-
- /*
- * Turn tabs to spaces as required
- */
- if (c=='\t' && (tp->t_flags&TBDELAY)==XTABS) {
- c = 8 - (tp->t_col & 7);
- (void) b_to_q(" ", c, &tp->t_outq);
- tp->t_col += c;
- tk_nout += c;
- return;
- }
- tk_nout++;
- /*
- * for upper-case-only terminals,
- * generate escapes.
- */
- if (tp->t_flags&LCASE) {
- colp = "({)}!|^~'`";
- while(*colp++)
- if(c == *colp++) {
- ttyoutput('\\', tp);
- c = colp[-2];
- break;
- }
- if ('a'<=c && c<='z')
- c += 'A' - 'a';
- }