📄 input.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 + -