- else
- switch (G.telstate)
- {
- case TS_0:
- if (c == IAC)
- G.telstate = TS_IAC;
- else
- G.buf[cstart++] = c;
- break;
-
- case TS_IAC:
- if (c == IAC) /* IAC IAC -> 0xFF */
- {
- G.buf[cstart++] = c;
- G.telstate = TS_0;
- break;
- }
- /* else */
- switch (c)
- {
- case SB:
- G.telstate = TS_SUB1;
- break;
- case DO:
- case DONT:
- case WILL:
- case WONT:
- G.telwish = c;
- G.telstate = TS_OPT;
- break;
- default:
- G.telstate = TS_0; /* DATA MARK must be added later */
- }
- break;
- case TS_OPT: /* WILL, WONT, DO, DONT */
- telopt(c);
- G.telstate = TS_0;
- break;
- case TS_SUB1: /* Subnegotiation */
- case TS_SUB2: /* Subnegotiation */
- if (subneg(c))
- G.telstate = TS_0;
- break;
- }
- }
- if (G.telstate)
- {
- if (G.iaclen) iacflush();
- if (G.telstate == TS_0) G.telstate = 0;