Annotation of 41BSD/sys/newdev/lp.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *  Line printer driver
                      3:  */
                      4: 
                      5: #include "../h/param.h"
                      6: #include "../h/dir.h"
                      7: #include "../h/user.h"
                      8: #include "../h/tty.h"
                      9: #include "../h/uba.h"
                     10: 
                     11: struct device *lp_addr[] = { (struct device *)(UBA0_DEV+0177514) };
                     12: 
                     13: #define        LPPRI   PZERO+10
                     14: #define        LPLOWAT 50
                     15: #define        LPHIWAT 100
                     16: #define LPMAX 2
                     17: 
                     18: struct device {
                     19:        short   lpcsr, lpbuf;
                     20: };
                     21: int lp_cnt = 1;
                     22: 
                     23: struct lp {
                     24:        struct  clist l_outq;
                     25:        char    flag, ind;
                     26:        short   ccc, mcc, mlc;
                     27:        short   line, col;
                     28: } lp_dt[LPMAX];
                     29: 
                     30: #define        OPEN    010
                     31: #define        CAP     020
                     32: #define        NOCR    040
                     33: #define        ASLP    0100
                     34: 
                     35: #define        FORM    014
                     36: 
                     37: lpopen(dev, flag)
                     38: {
                     39:        register unit;
                     40:        register struct lp *lp;
                     41: 
                     42:        unit = dev&07;
                     43:        if (unit >= lp_cnt || unit >= LPMAX ||
                     44:         (lp = &lp_dt[unit])->flag || lp_addr[unit]->lpcsr <0 ) {
                     45:                u.u_error = EIO;
                     46:                return;
                     47:        }
                     48:        lp->flag = (dev&077)|OPEN;
                     49:        lp->ind = 4;
                     50:        lp->col = 80;
                     51:        lp->line = 66;
                     52:        lp_addr[unit]->lpcsr |= IENABLE;
                     53:        lpoutput(unit, FORM);
                     54: }
                     55: 
                     56: lpclose(dev)
                     57: {
                     58:        register unit;
                     59: 
                     60:        unit = dev&07;
                     61:        lpoutput(unit, FORM);
                     62:        lp_dt[unit].flag = 0;
                     63: }
                     64: 
                     65: lpwrite(dev)
                     66: {
                     67:        register c;
                     68: 
                     69:        while ((c=cpass())>=0)
                     70:                lpoutput(dev&07, c);
                     71: }
                     72: 
                     73: lpoutput(dev, c)
                     74: register dev, c;
                     75: {
                     76:        register struct lp *lp;
                     77: 
                     78:        lp = &lp_dt[dev];
                     79:        if(lp->flag&CAP) {
                     80:                if(c>='a' && c<='z')
                     81:                        c += 'A'-'a'; else
                     82:                switch(c) {
                     83:                case '{':
                     84:                        c = '(';
                     85:                        goto esc;
                     86:                case '}':
                     87:                        c = ')';
                     88:                        goto esc;
                     89:                case '`':
                     90:                        c = '\'';
                     91:                        goto esc;
                     92:                case '|':
                     93:                        c = '!';
                     94:                        goto esc;
                     95:                case '~':
                     96:                        c = '^';
                     97:                esc:
                     98:                        lpoutput(dev, c);
                     99:                        lp->ccc--;
                    100:                        c = '-';
                    101:                }
                    102:        }
                    103:        switch(c) {
                    104:        case '\t':
                    105:                lp->ccc = ((lp->ccc+8-lp->ind) & ~7) + lp->ind;
                    106:                return;
                    107:        case '\n':
                    108:                lp->mlc++;
                    109:                if(lp->mlc >= lp->line )
                    110:                        c = FORM;
                    111:        case FORM:
                    112:                lp->mcc = 0;
                    113:                if (lp->mlc) {
                    114:                        lpputc(dev, c);
                    115:                        if(c == FORM)
                    116:                                lp->mlc = 0;
                    117:                }
                    118:        case '\r':
                    119:                lp->ccc = lp->ind;
                    120:                return;
                    121:        case 010:
                    122:                if(lp->ccc > lp->ind)
                    123:                        lp->ccc--;
                    124:                return;
                    125:        case ' ':
                    126:                lp->ccc++;
                    127:                return;
                    128:        default:
                    129:                if(lp->ccc < lp->mcc) {
                    130:                        if (lp->flag&NOCR) {
                    131:                                lp->ccc++;
                    132:                                return;
                    133:                        }
                    134:                        lpputc(dev, '\r');
                    135:                        lp->mcc = 0;
                    136:                }
                    137:                if(lp->ccc < lp->col) {
                    138:                        while(lp->ccc > lp->mcc) {
                    139:                                lpputc(dev, ' ');
                    140:                                lp->mcc++;
                    141:                        }
                    142:                        lpputc(dev, c);
                    143:                        lp->mcc++;
                    144:                }
                    145:                lp->ccc++;
                    146:        }
                    147: }
                    148: 
                    149: lpputc(dev, c)
                    150: register dev, c;
                    151: {
                    152:        register struct lp *lp;
                    153: 
                    154:        lp = &lp_dt[dev];
                    155:        spl4();
                    156:        while (lp->l_outq.c_cc > LPHIWAT) {
                    157:                lp->flag |= ASLP;
                    158:                sleep(lp, LPPRI);
                    159:        }
                    160:        putc(c, &lp->l_outq);
                    161:        lpintr(dev);
                    162:        spl0();
                    163: }
                    164: 
                    165: lpintr(dev)
                    166: register dev;
                    167: {
                    168:        register struct lp *lp;
                    169:        register c;
                    170: 
                    171:        lp = &lp_dt[dev];
                    172:        while (lp_addr[dev]->lpcsr&DONE && (c = getc(&lp->l_outq)) >= 0)
                    173:                lp_addr[dev]->lpbuf = c;
                    174:        if (lp->l_outq.c_cc <= LPLOWAT && lp->flag&ASLP) {
                    175:                lp->flag &= ~ASLP;
                    176:                wakeup(lp);
                    177:        }
                    178: }
                    179: 
                    180: lpioctl(dev, cmd, addr, flag)
                    181: register caddr_t addr;
                    182: {
                    183: register int m;
                    184: struct lp *lp;
                    185: struct {char lsg_flag, lsg_ind; short lsg_line, lsg_col;} lpios;
                    186: 
                    187:        lp = &lp_dt[dev];
                    188:        switch (cmd) {
                    189: 
                    190:        case ('v'<<8)+0:
                    191:                lpios.lsg_flag = lp->flag;
                    192:                lpios.lsg_ind = lp->ind;
                    193:                lpios.lsg_line = lp->line;
                    194:                lpios.lsg_col = lp->col;
                    195:                copyout(&lpios, addr, sizeof lpios);
                    196:                return;
                    197: 
                    198:        case ('v'<<8)+1:
                    199:                m = copyin(addr, &lpios, sizeof lpios);
                    200:                if (m == -1) {
                    201:                        u.u_error = EFAULT;
                    202:                        return;
                    203:                }
                    204:                lp->flag = lpios.lsg_flag;
                    205:                lp->ind = lpios.lsg_ind;
                    206:                lp->line = lpios.lsg_line;
                    207:                lp->col = lpios.lsg_col;
                    208:                return;
                    209: 
                    210:        default:
                    211:                u.u_error = ENOTTY;
                    212:                return;
                    213:        }
                    214: }

unix.superglobalmegacorp.com

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