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

📄 input.c

📁 unix高级编程源代码.<<unix高级编程>>
💻 C
字号:
#include	"lprps.h"

static int	eof_count;
static int	ignore_input;
static enum parse_state {	/* state of parsing input from printer */
	NORMAL,
	HAD_ONE_PERCENT,
	HAD_TWO_PERCENT,
	IN_MESSAGE,
	HAD_RIGHT_BRACKET,
	HAD_RIGHT_BRACKET_AND_PERCENT
} parse_state;

/* Initialize our input machine. */

void
init_input(int job)
{
	in_job = job;		/* only true when send_file() calls us */
	parse_state = NORMAL;
	ignore_input = 0;
}

/* Read from the printer until we encounter an EOF.
 * Whether or not the input is processed depends on "ignore". */

void
proc_upto_eof(int ignore)
{
	int		ec;

	ignore_input = ignore;
	ec = eof_count;		/* proc_input_char() increments eof_count */
	while (ec == eof_count)
		proc_some_input();
}

/* Wait for some data then read it.
 * Call proc_input_char() for every character read. */

void
proc_some_input(void)
{
	char	ibuf[IBSIZE];
	char	*ptr;
	int		nread;
	fd_set	rfds;

	FD_ZERO(&rfds);
	FD_SET(psfd, &rfds);
	set_nonblock();
	if (intr_flag)
		handle_intr();
	if (alrm_flag)
		handle_alrm();
	while (select(psfd + 1, &rfds, NULL, NULL, NULL) < 0) {
		if (errno == EINTR) {
			if (alrm_flag)
				handle_alrm();		/* doesn't return */
			else if (intr_flag)
				handle_intr();		/* doesn't return */
		} else
			log_sys("proc_some_input: select error");
	}
	if ( (nread = read(psfd, ibuf, IBSIZE)) < 0)
		log_sys("proc_some_input: read error");
	else if (nread == 0)
		log_sys("proc_some_input: read returned 0");

	ptr = ibuf;
	while (--nread >= 0)
		proc_input_char(*ptr++);	/* process each character */
}

/* Called by proc_some_input() above after some input has been read.
 * Also called by out_buf() whenever asynchronous input appears. */

void
proc_input_char(int c)
{
	if (c == '\004') {
		eof_count++;	/* just count the EOFs */
		return;
	} else if (ignore_input)
		return;			/* ignore everything except EOFs */

	switch (parse_state) {		/* parse the input */
	case NORMAL:
		if (c == '%')
			parse_state = HAD_ONE_PERCENT;
		else
			mail_char(c);
		break;
	case HAD_ONE_PERCENT:
		if (c == '%')
			parse_state = HAD_TWO_PERCENT;
		else {
			mail_char('%'); mail_char(c);
			parse_state = NORMAL;
		}
		break;
	case HAD_TWO_PERCENT:
		if (c == '[') {
			msg_init();		/* message starting; init buffer */
			parse_state = IN_MESSAGE;
		} else {
			mail_char('%'); mail_char('%'); mail_char(c);
			parse_state = NORMAL;
		}
		break;
	case IN_MESSAGE:
		if (c == ']')
			parse_state = HAD_RIGHT_BRACKET;
		else
			msg_char(c);
		break;
	case HAD_RIGHT_BRACKET:
		if (c == '%')
			parse_state = HAD_RIGHT_BRACKET_AND_PERCENT;
		else {
			msg_char(']'); msg_char(c);
			parse_state = IN_MESSAGE;
		}
		break;
	case HAD_RIGHT_BRACKET_AND_PERCENT:
		if (c == '%') {
			parse_state = NORMAL;
			proc_msg();		/* we have a message; process it */
		} else {
			msg_char(']'); msg_char('%'); msg_char(c);
			parse_state = IN_MESSAGE;
		}
		break;
	default:
		abort();
	}
}

⌨️ 快捷键说明

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