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

📄 message.c

📁 该代码为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. */voidmsg_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. */voidmsg_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. */voidproc_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 voidprinter_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 + -