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

📄 output.c

📁 该代码为unix环境高级编程的源代码
💻 C
字号:
#include	"lprps.h"static char	outbuf[OBSIZE];static int	outcnt = OBSIZE;	/* #bytes remaining */static char	*outptr = outbuf;static void	out_buf(void);/* Output a single character. * Called by main loop in send_file(). */voidout_char(int c){	if (c == EOF) {		out_buf();		/* flag that we're all done */		return;	}	if (outcnt <= 0)		out_buf();		/* buffer is full, write it first */	*outptr++ = c;		/* just store in buffer */	outcnt--;}/* Output the buffer that out_char() has been storing into. * We have our own output function, so that we never block on a write * to the printer.  Each time we output our buffer to the printer, * we also see if the printer has something to send us.  If so, * we call proc_input_char() to process each character. */static voidout_buf(void){	char	*wptr, *rptr, ibuf[IBSIZE];	int		wcnt, nread, nwritten;	fd_set	rfds, wfds;	FD_ZERO(&wfds);	FD_ZERO(&rfds);	set_nonblock();			/* don't want the write() to block */	wptr = outbuf;			/* ptr to first char to output */	wcnt = outptr - wptr;	/* #bytes to output */	while (wcnt > 0) {		FD_SET(psfd, &wfds);		FD_SET(psfd, &rfds);		if (intr_flag)			handle_intr();		while (select(psfd + 1, &rfds, &wfds, NULL, NULL) < 0) {			if (errno == EINTR) {				if (intr_flag)					handle_intr();		/* no return */			} else				log_sys("out_buf: select error");		}		if (FD_ISSET(psfd, &rfds)) {		/* printer is readable */			if ( (nread = read(psfd, ibuf, IBSIZE)) < 0)				log_sys("out_buf: read error");			rptr = ibuf;			while (--nread >= 0)				proc_input_char(*rptr++);		}		if (FD_ISSET(psfd, &wfds)) {		/* printer is writeable */			if ( (nwritten = write(psfd, wptr, wcnt)) < 0)				log_sys("out_buf: write error");			wcnt -= nwritten;			wptr += nwritten;		}	}	outptr = outbuf;	/* reset buffer pointer and count */	outcnt = OBSIZE;}

⌨️ 快捷键说明

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