⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lp.c

📁 著名的AT&T UNIX v6 源码
💻 C
字号:
/* *  Line printer driver */#include "../h/param.h"#include "../h/dir.h"#include "../h/user.h"#include "../h/tty.h"#include "../h/uba.h"struct device *lp_addr[] = { (struct device *)(UBA0_DEV+0177514) };#define	LPPRI	PZERO+10#define	LPLOWAT	50#define	LPHIWAT	100#define LPMAX 2struct device {	short	lpcsr, lpbuf;};int lp_cnt = 1;struct lp {	struct	clist l_outq;	char	flag, ind;	short	ccc, mcc, mlc;	short	line, col;} lp_dt[LPMAX];#define	OPEN	010#define	CAP	020#define	NOCR	040#define	ASLP	0100#define	FORM	014lpopen(dev, flag){	register unit;	register struct lp *lp;	unit = dev&07;	if (unit >= lp_cnt || unit >= LPMAX ||	 (lp = &lp_dt[unit])->flag || lp_addr[unit]->lpcsr <0 ) {		u.u_error = EIO;		return;	}	lp->flag = (dev&077)|OPEN;	lp->ind = 4;	lp->col = 80;	lp->line = 66;	lp_addr[unit]->lpcsr |= IENABLE;	lpoutput(unit, FORM);}lpclose(dev){	register unit;	unit = dev&07;	lpoutput(unit, FORM);	lp_dt[unit].flag = 0;}lpwrite(dev){	register c;	while ((c=cpass())>=0)		lpoutput(dev&07, c);}lpoutput(dev, c)register dev, c;{	register struct lp *lp;	lp = &lp_dt[dev];	if(lp->flag&CAP) {		if(c>='a' && c<='z')			c += 'A'-'a'; else		switch(c) {		case '{':			c = '(';			goto esc;		case '}':			c = ')';			goto esc;		case '`':			c = '\'';			goto esc;		case '|':			c = '!';			goto esc;		case '~':			c = '^';		esc:			lpoutput(dev, c);			lp->ccc--;			c = '-';		}	}	switch(c) {	case '\t':		lp->ccc = ((lp->ccc+8-lp->ind) & ~7) + lp->ind;		return;	case '\n':		lp->mlc++;		if(lp->mlc >= lp->line )			c = FORM;	case FORM:		lp->mcc = 0;		if (lp->mlc) {			lpputc(dev, c);			if(c == FORM)				lp->mlc = 0;		}	case '\r':		lp->ccc = lp->ind;		return;	case 010:		if(lp->ccc > lp->ind)			lp->ccc--;		return;	case ' ':		lp->ccc++;		return;	default:		if(lp->ccc < lp->mcc) {			if (lp->flag&NOCR) {				lp->ccc++;				return;			}			lpputc(dev, '\r');			lp->mcc = 0;		}		if(lp->ccc < lp->col) {			while(lp->ccc > lp->mcc) {				lpputc(dev, ' ');				lp->mcc++;			}			lpputc(dev, c);			lp->mcc++;		}		lp->ccc++;	}}lpputc(dev, c)register dev, c;{	register struct lp *lp;	lp = &lp_dt[dev];	spl4();	while (lp->l_outq.c_cc > LPHIWAT) {		lp->flag |= ASLP;		sleep(lp, LPPRI);	}	putc(c, &lp->l_outq);	lpintr(dev);	spl0();}lpintr(dev)register dev;{	register struct lp *lp;	register c;	lp = &lp_dt[dev];	while (lp_addr[dev]->lpcsr&DONE && (c = getc(&lp->l_outq)) >= 0)		lp_addr[dev]->lpbuf = c;	if (lp->l_outq.c_cc <= LPLOWAT && lp->flag&ASLP) {		lp->flag &= ~ASLP;		wakeup(lp);	}}lpioctl(dev, cmd, addr, flag)register caddr_t addr;{register int m;struct lp *lp;struct {char lsg_flag, lsg_ind; short lsg_line, lsg_col;} lpios;	lp = &lp_dt[dev];	switch (cmd) {	case ('v'<<8)+0:		lpios.lsg_flag = lp->flag;		lpios.lsg_ind = lp->ind;		lpios.lsg_line = lp->line;		lpios.lsg_col = lp->col;		copyout(&lpios, addr, sizeof lpios);		return;	case ('v'<<8)+1:		m = copyin(addr, &lpios, sizeof lpios);		if (m == -1) {			u.u_error = EFAULT;			return;		}		lp->flag = lpios.lsg_flag;		lp->ind = lpios.lsg_ind;		lp->line = lpios.lsg_line;		lp->col = lpios.lsg_col;		return;	default:		u.u_error = ENOTTY;		return;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -