telnet: code shrink

function                                             old     new   delta
put_iac3_IAC_x_y_merged                                -      21     +21
put_iac4_msb_lsb                                       -      19     +19
put_iac2_msb_lsb                                       -      19     +19
put_iac                                               20      34     +14
iac_flush                                             32      36      +4
put_iac2_merged                                       46       -     -46
telnet_main                                         1492    1270    -222
------------------------------------------------------------------------------
(add/remove: 3/1 grow/shrink: 2/1 up/down: 77/-268)          Total: -191 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2019-01-06 18:45:38 +01:00
parent 5bfc4a32fd
commit 935afafcf3

View File

@ -152,9 +152,11 @@ static void subneg(byte c);
static void iac_flush(void) static void iac_flush(void)
{ {
if (G.iaclen != 0) {
full_write(netfd, G.iacbuf, G.iaclen); full_write(netfd, G.iacbuf, G.iaclen);
G.iaclen = 0; G.iaclen = 0;
} }
}
static void doexit(int ev) NORETURN; static void doexit(int ev) NORETURN;
static void doexit(int ev) static void doexit(int ev)
@ -338,88 +340,73 @@ static void handle_net_input(int len)
static void put_iac(int c) static void put_iac(int c)
{ {
G.iacbuf[G.iaclen++] = c; int iaclen = G.iaclen;
} if (iaclen >= IACBUFSIZE) {
static void put_iac2_merged(unsigned wwdd_and_c)
{
if (G.iaclen + 3 > IACBUFSIZE)
iac_flush(); iac_flush();
iaclen = 0;
put_iac(IAC);
put_iac(wwdd_and_c >> 8);
put_iac(wwdd_and_c & 0xff);
} }
#define put_iac2(wwdd,c) put_iac2_merged(((wwdd)<<8) + (c)) G.iacbuf[iaclen] = c; /* "... & 0xff" is implicit */
G.iaclen = iaclen + 1;
}
static void put_iac2_msb_lsb(unsigned x_y)
{
put_iac(x_y >> 8); /* "... & 0xff" is implicit */
put_iac(x_y); /* "... & 0xff" is implicit */
}
#define put_iac2_x_y(x,y) put_iac2_msb_lsb(((x)<<8) + (y))
static void put_iac4_msb_lsb(unsigned x_y_z_t)
{
put_iac2_msb_lsb(x_y_z_t >> 16);
put_iac2_msb_lsb(x_y_z_t); /* "... & 0xffff" is implicit */
}
#define put_iac4_x_y_z_t(x,y,z,t) put_iac4_msb_lsb(((x)<<24) + ((y)<<16) + ((z)<<8) + (t))
static void put_iac3_IAC_x_y_merged(unsigned wwdd_and_c)
{
put_iac(IAC);
put_iac2_msb_lsb(wwdd_and_c);
}
#define put_iac3_IAC_x_y(wwdd,c) put_iac3_IAC_x_y_merged(((wwdd)<<8) + (c))
#if ENABLE_FEATURE_TELNET_TTYPE #if ENABLE_FEATURE_TELNET_TTYPE
static void put_iac_subopt(byte c, char *str) static void put_iac_subopt(byte c, char *str)
{ {
int len = strlen(str) + 6; // ( 2 + 1 + 1 + strlen + 2 ) put_iac4_x_y_z_t(IAC, SB, c, 0);
if (G.iaclen + len > IACBUFSIZE)
iac_flush();
put_iac(IAC);
put_iac(SB);
put_iac(c);
put_iac(0);
while (*str) while (*str)
put_iac(*str++); put_iac(*str++);
put_iac(IAC); put_iac2_x_y(IAC, SE);
put_iac(SE);
} }
#endif #endif
#if ENABLE_FEATURE_TELNET_AUTOLOGIN #if ENABLE_FEATURE_TELNET_AUTOLOGIN
static void put_iac_subopt_autologin(void) static void put_iac_subopt_autologin(void)
{ {
int len = strlen(G.autologin) + 6; // (2 + 1 + 1 + strlen + 2) const char *p;
const char *p = "USER";
if (G.iaclen + len > IACBUFSIZE) put_iac4_x_y_z_t(IAC, SB, TELOPT_NEW_ENVIRON, TELQUAL_IS);
iac_flush(); put_iac4_x_y_z_t(NEW_ENV_VAR, 'U', 'S', 'E'); /* "USER" */
put_iac2_x_y('R', NEW_ENV_VALUE);
put_iac(IAC);
put_iac(SB);
put_iac(TELOPT_NEW_ENVIRON);
put_iac(TELQUAL_IS);
put_iac(NEW_ENV_VAR);
while (*p)
put_iac(*p++);
put_iac(NEW_ENV_VALUE);
p = G.autologin; p = G.autologin;
while (*p) while (*p)
put_iac(*p++); put_iac(*p++);
put_iac(IAC); put_iac2_x_y(IAC, SE);
put_iac(SE);
} }
#endif #endif
#if ENABLE_FEATURE_TELNET_WIDTH #if ENABLE_FEATURE_TELNET_WIDTH
static void put_iac_naws(byte c, int x, int y) static void put_iac_naws(byte c, int x, int y)
{ {
if (G.iaclen + 9 > IACBUFSIZE) put_iac3_IAC_x_y(SB, c);
iac_flush();
put_iac(IAC); put_iac4_msb_lsb((x << 16) + y);
put_iac(SB);
put_iac(c);
/* "... & 0xff" implicitly done below */ put_iac2_x_y(IAC, SE);
put_iac(x >> 8);
put_iac(x);
put_iac(y >> 8);
put_iac(y);
put_iac(IAC);
put_iac(SE);
} }
#endif #endif
@ -448,8 +435,8 @@ static void will_charmode(void)
G.telflags |= (UF_ECHO | UF_SGA); G.telflags |= (UF_ECHO | UF_SGA);
setConMode(); setConMode();
put_iac2(DO, TELOPT_ECHO); put_iac3_IAC_x_y(DO, TELOPT_ECHO);
put_iac2(DO, TELOPT_SGA); put_iac3_IAC_x_y(DO, TELOPT_SGA);
iac_flush(); iac_flush();
} }
@ -459,24 +446,24 @@ static void do_linemode(void)
G.telflags &= ~(UF_ECHO | UF_SGA); G.telflags &= ~(UF_ECHO | UF_SGA);
setConMode(); setConMode();
put_iac2(DONT, TELOPT_ECHO); put_iac3_IAC_x_y(DONT, TELOPT_ECHO);
put_iac2(DONT, TELOPT_SGA); put_iac3_IAC_x_y(DONT, TELOPT_SGA);
iac_flush(); iac_flush();
} }
static void to_notsup(char c) static void to_notsup(char c)
{ {
if (G.telwish == WILL) if (G.telwish == WILL)
put_iac2(DONT, c); put_iac3_IAC_x_y(DONT, c);
else if (G.telwish == DO) else if (G.telwish == DO)
put_iac2(WONT, c); put_iac3_IAC_x_y(WONT, c);
} }
static void to_echo(void) static void to_echo(void)
{ {
/* if server requests ECHO, don't agree */ /* if server requests ECHO, don't agree */
if (G.telwish == DO) { if (G.telwish == DO) {
put_iac2(WONT, TELOPT_ECHO); put_iac3_IAC_x_y(WONT, TELOPT_ECHO);
return; return;
} }
if (G.telwish == DONT) if (G.telwish == DONT)
@ -492,9 +479,9 @@ static void to_echo(void)
G.telflags ^= UF_ECHO; G.telflags ^= UF_ECHO;
if (G.telflags & UF_ECHO) if (G.telflags & UF_ECHO)
put_iac2(DO, TELOPT_ECHO); put_iac3_IAC_x_y(DO, TELOPT_ECHO);
else else
put_iac2(DONT, TELOPT_ECHO); put_iac3_IAC_x_y(DONT, TELOPT_ECHO);
setConMode(); setConMode();
full_write1_str("\r\n"); /* sudden modec */ full_write1_str("\r\n"); /* sudden modec */
@ -512,9 +499,9 @@ static void to_sga(void)
G.telflags ^= UF_SGA; /* toggle */ G.telflags ^= UF_SGA; /* toggle */
if (G.telflags & UF_SGA) if (G.telflags & UF_SGA)
put_iac2(DO, TELOPT_SGA); put_iac3_IAC_x_y(DO, TELOPT_SGA);
else else
put_iac2(DONT, TELOPT_SGA); put_iac3_IAC_x_y(DONT, TELOPT_SGA);
} }
#if ENABLE_FEATURE_TELNET_TTYPE #if ENABLE_FEATURE_TELNET_TTYPE
@ -522,9 +509,9 @@ static void to_ttype(void)
{ {
/* Tell server we will (or won't) do TTYPE */ /* Tell server we will (or won't) do TTYPE */
if (G.ttype) if (G.ttype)
put_iac2(WILL, TELOPT_TTYPE); put_iac3_IAC_x_y(WILL, TELOPT_TTYPE);
else else
put_iac2(WONT, TELOPT_TTYPE); put_iac3_IAC_x_y(WONT, TELOPT_TTYPE);
} }
#endif #endif
@ -533,9 +520,9 @@ static void to_new_environ(void)
{ {
/* Tell server we will (or will not) do AUTOLOGIN */ /* Tell server we will (or will not) do AUTOLOGIN */
if (G.autologin) if (G.autologin)
put_iac2(WILL, TELOPT_NEW_ENVIRON); put_iac3_IAC_x_y(WILL, TELOPT_NEW_ENVIRON);
else else
put_iac2(WONT, TELOPT_NEW_ENVIRON); put_iac3_IAC_x_y(WONT, TELOPT_NEW_ENVIRON);
} }
#endif #endif
@ -543,7 +530,7 @@ static void to_new_environ(void)
static void to_naws(void) static void to_naws(void)
{ {
/* Tell server we will do NAWS */ /* Tell server we will do NAWS */
put_iac2(WILL, TELOPT_NAWS); put_iac3_IAC_x_y(WILL, TELOPT_NAWS);
} }
#endif #endif