Annotation of xinu/sys/vcuiin.c, revision 1.1.1.1

1.1       root        1: /* vcuiin.c --  vcuiin, verase1, veputc, vechoch */
                      2: 
                      3: #include <conf.h>
                      4: #include <kernel.h>
                      5: #include <tty.h>
                      6: #include <io.h>
                      7: #include <vcu.h>
                      8: #include <procreg.h>
                      9: 
                     10: /*------------------------------------------------------------------------
                     11:  *  vcuiin  --  lower-half vcu device driver for input interrupts
                     12:  *------------------------------------------------------------------------
                     13:  */
                     14: INTPROC        vcuiin(iptr)
                     15:        register struct tty     *iptr;  /* pointer to tty block         */
                     16: {
                     17:        register int    ch, ct;
                     18: 
                     19:        ch = mfpr(RXDB) & VCUICHMASK;           /* read char from device*/
                     20:        if (ch & VCURERMASK)
                     21:                return;                         /* discard if error     */
                     22:        if (iptr->imode == IMRAW) {
                     23:                if (scount(iptr->isem) >= IBUFLEN) {
                     24:                        return;                 /* discard if no space  */
                     25:                }
                     26:                iptr->ibuff[iptr->ihead++] = ch;
                     27:                if (iptr->ihead >= IBUFLEN)     /* wrap buffer pointer  */
                     28:                        iptr->ihead = 0;
                     29:                signal(iptr->isem);
                     30:        } else {                                /* cbreak | cooked mode */
                     31:                if ( ch == RETURN && iptr->icrlf )
                     32:                        ch = NEWLINE;
                     33:                if (iptr->iintr && ch == iptr->iintrc) {
                     34:                        send(iptr->iintpid, INTRMSG);
                     35:                        veputc(ch, iptr);
                     36:                        return;
                     37:                }
                     38:                if (iptr->oflow) {
                     39:                        if (ch == iptr->ostart) {
                     40:                                iptr->oheld = FALSE;
                     41:                                mtpr(VCUTXCSENBL, TXCS);
                     42:                                return;
                     43:                        }
                     44:                        if (ch == iptr->ostop) {
                     45:                                iptr->oheld = TRUE;
                     46:                                return;
                     47:                        }
                     48:                }
                     49:                iptr->oheld = FALSE;
                     50:                if (iptr->imode == IMCBREAK) {          /* cbreak mode  */
                     51:                        if (scount(iptr->isem) >= IBUFLEN) {
                     52:                                veputc(iptr->ifullc,iptr);
                     53:                                return;
                     54:                        }
                     55:                        iptr->ibuff[iptr->ihead++] = ch;
                     56:                        if (iptr->ihead >= IBUFLEN)
                     57:                                iptr->ihead = 0;
                     58:                        if (iptr->iecho)
                     59:                                vechoch(ch,iptr);
                     60:                        if (scount(iptr->isem) < IBUFLEN)
                     61:                                signal(iptr->isem);
                     62:                } else {                                /* cooked mode  */
                     63:                        if (ch == iptr->ikillc && iptr->ikill) {
                     64:                                iptr->ihead -= iptr->icursor;
                     65:                                if (iptr->ihead < 0)
                     66:                                        iptr->ihead += IBUFLEN;
                     67:                                iptr->icursor = 0;
                     68:                                veputc(RETURN,iptr);
                     69:                                veputc(NEWLINE,iptr);
                     70:                                return;
                     71:                        }
                     72:                        if (ch == iptr->ierasec && iptr->ierase) {
                     73:                                if (iptr->icursor > 0) {
                     74:                                        iptr->icursor--;
                     75:                                        verase1(iptr);
                     76:                                }
                     77:                                return;
                     78:                        }
                     79:                        if (ch == NEWLINE || ch == RETURN ||
                     80:                                (iptr->ieof && ch == iptr->ieofc)) {
                     81:                                if (iptr->iecho) {
                     82:                                        vechoch(ch,iptr);
                     83:                                        if (ch == iptr->ieofc)
                     84:                                        vechoch(NEWLINE,iptr);
                     85:                                }
                     86:                                iptr->ibuff[iptr->ihead++] = ch;
                     87:                                if (iptr->ihead >= IBUFLEN)
                     88:                                        iptr->ihead = 0;
                     89:                                ct = iptr->icursor+1; /* +1 for \n or \r*/
                     90:                                iptr->icursor = 0;
                     91:                                signaln(iptr->isem,ct);
                     92:                                return;
                     93:                        }
                     94:                        ct = scount(iptr->isem);
                     95:                        ct = ct < 0 ? 0 : ct;
                     96:                        if ((ct + iptr->icursor) >= IBUFLEN-1) {
                     97:                                veputc(iptr->ifullc,iptr);
                     98:                                return;
                     99:                        }
                    100:                        if (iptr->iecho)
                    101:                                vechoch(ch,iptr);
                    102:                        iptr->icursor++;
                    103:                        iptr->ibuff[iptr->ihead++] = ch;
                    104:                        if (iptr->ihead >= IBUFLEN)
                    105:                                iptr->ihead = 0;
                    106:                }
                    107:        }
                    108: }
                    109: 
                    110: /*------------------------------------------------------------------------
                    111:  *  verase1  --  erase one character honoring erasing backspace
                    112:  *------------------------------------------------------------------------
                    113:  */
                    114: LOCAL verase1(iptr)
                    115:        struct  tty     *iptr;
                    116: {
                    117:        char    ch;
                    118: 
                    119:        if (--(iptr->ihead) < 0)
                    120:                iptr->ihead += IBUFLEN;
                    121:        ch = iptr->ibuff[iptr->ihead];
                    122:        if (iptr->iecho) {
                    123:                if (ch < BLANK || ch == 0177) {
                    124:                        if (iptr->evis) {
                    125:                                veputc(BACKSP,iptr);
                    126:                                if (iptr->ieback) {
                    127:                                        veputc(BLANK,iptr);
                    128:                                        veputc(BACKSP,iptr);
                    129:                                }
                    130:                        }
                    131:                        veputc(BACKSP,iptr);
                    132:                        if (iptr->ieback) {
                    133:                                veputc(BLANK,iptr);
                    134:                                veputc(BACKSP,iptr);
                    135:                        }
                    136:                } else {
                    137:                        veputc(BACKSP,iptr);
                    138:                        if (iptr->ieback) {
                    139:                                veputc(BLANK,iptr);
                    140:                                veputc(BACKSP,iptr);
                    141:                        }
                    142:                }
                    143:        } else
                    144:                mtpr (VCUTXCSENBL, TXCS);
                    145: }
                    146: 
                    147: /*------------------------------------------------------------------------
                    148:  *  vechoch  --  echo a character with visual and ocrlf options
                    149:  *------------------------------------------------------------------------
                    150:  */
                    151: LOCAL vechoch(ch, iptr)
                    152:        char    ch;                     /* character to echo            */
                    153:        register struct tty     *iptr;  /* ptr to I/O block for this dev*/
                    154: {
                    155:        if ((ch==NEWLINE||ch==RETURN)&&iptr->ecrlf) {
                    156:                veputc(RETURN,iptr);
                    157:                veputc(NEWLINE,iptr);
                    158:        } else if ((ch<BLANK||ch==0177) && iptr->evis) {
                    159:                veputc(UPARROW,iptr);
                    160:                veputc(ch+0100,iptr);/* make it printable       */
                    161:        } else {
                    162:                veputc(ch,iptr);
                    163:        }
                    164: }
                    165: 
                    166: /*------------------------------------------------------------------------
                    167:  *  veputc - put one character in the echo queue
                    168:  *------------------------------------------------------------------------
                    169:  */
                    170: LOCAL veputc(ch,iptr)
                    171:        char    ch;
                    172:        register struct tty     *iptr;
                    173: {
                    174:        iptr->ebuff[iptr->ehead++] = ch;
                    175:        if (iptr->ehead >= EBUFLEN)
                    176:                iptr->ehead = 0;
                    177:        mtpr(VCUTXCSENBL, TXCS);
                    178: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.