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

📄 message.c

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

static char	msgbuf[MBSIZE];
static int	msgcnt;
static void	printer_flushing(void);

/* Called by proc_input_char() after it's seen the "%%[" that
 * starts a message. */

void
msg_init(void)
{
	msgcnt = 0;		/* count of chars in message buffer */
}

/* All characters received from the printer between the starting
 * %%[ and the terminating ]%% are placed into the message buffer
 * by proc_some_input().  This message will be examined by
 * proc_msg() below. */

void
msg_char(int c)
{
	if (c != '\0' && msgcnt < MBSIZE - 1)
		msgbuf[msgcnt++] = c;
}

/* This function is called by proc_input_char() only after the final
 * percent in a "%%[ <message> ]%%" has been seen.  It parses the
 * <message>, which consists of one or more "key: val" pairs.
 * If there are multiple pairs, "val" can end in a semicolon. */

void
proc_msg(void)
{
	char	*ptr, *key, *val;
	int		n;

	msgbuf[msgcnt] = 0;		/* null terminate message */
	for (ptr = strtok(msgbuf, ";"); ptr != NULL;
										ptr = strtok(NULL, ";")) {
		while (isspace(*ptr))
			ptr++;			/* skip leading spaces in key */
		key = ptr;

		if ( (ptr = strchr(ptr, ':')) == NULL)
			continue;	/* missing colon, something wrong, ignore */
		*ptr++ = '\0';	/* null terminate key (overwrite colon) */

		while (isspace(*ptr))
			ptr++;		/* skip leading spaces in val */
		val = ptr;
						/* remove trailing spaces in val */
		ptr = strchr(val, '\0');
		while (ptr > val && isspace(ptr[-1]))
			--ptr;
		*ptr = '\0';

		if (strcmp(key, "Flushing") == 0) {
			printer_flushing();		/* never returns */

		} else if (strcmp(key, "PrinterError") == 0) {
			log_msg("proc_msg: printer error: %s", val);

		} else if (strcmp(key, "Error") == 0) {
		  	mail_line("Your PostScript printer job "
					  "produced the error `%s'.\n", val);

		} else if (strcmp(key, "status") == 0) {
			if (strcmp(val, "idle") == 0)
				status = IDLE;
			else if (strcmp(val, "busy") == 0)
				status = BUSY;
			else if (strcmp(val, "waiting") == 0)
				status = WAITING;
			else
				status = UNKNOWN;	/* "printing", "PrinterError",
					   "initializing", or "printing test page". */

		} else if (strcmp(key, "OffendingCommand") == 0) {
		  	mail_line("The offending command was `%s'.\n", val);

		} else if (strcmp(key, "pagecount") == 0) {
			if (sscanf(val, "%d", &n) == 1 && n >= 0) {
		  		if (start_page < 0)
					start_page = n;
		  		else
					end_page = n;
			}
		}
	}
}

/* Called only by proc_msg() when the "Flushing" message
 * is received from the printer.  We exit. */

static void
printer_flushing(void)
{
	clear_intr();			/* don't catch SIGINT */

	tty_flush();			/* empty tty input and output queues */
	block_write(&eofc, 1);	/* send an EOF to the printer */

	proc_upto_eof(1);		/* this call won't be recursive,
							   since we specify to ignore input */
	get_page(&end_page);
	do_acct();
	exit(EXIT_SUCCESS);
}

⌨️ 快捷键说明

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