stty: code shrink
function old new delta set_mode 759 725 -34 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
		@@ -246,10 +246,21 @@ enum speed_setting {
 | 
			
		||||
 | 
			
		||||
/* Which member(s) of 'struct termios' a mode uses */
 | 
			
		||||
enum {
 | 
			
		||||
	/* Do NOT change the order or values, as mode_type_flag()
 | 
			
		||||
	 * depends on them */
 | 
			
		||||
	control, input, output, local, combination
 | 
			
		||||
};
 | 
			
		||||
static tcflag_t *get_ptr_to_tcflag(unsigned type, const struct termios *mode)
 | 
			
		||||
{
 | 
			
		||||
	static const uint8_t tcflag_offsets[] ALIGN1 = {
 | 
			
		||||
		offsetof(struct termios, c_cflag), /* control */
 | 
			
		||||
		offsetof(struct termios, c_iflag), /* input */
 | 
			
		||||
		offsetof(struct termios, c_oflag), /* output */
 | 
			
		||||
		offsetof(struct termios, c_lflag)  /* local */
 | 
			
		||||
	};
 | 
			
		||||
	if (type <= local) {
 | 
			
		||||
		return (tcflag_t*) (((char*)mode) + tcflag_offsets[type]);
 | 
			
		||||
	}
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Flags for 'struct mode_info' */
 | 
			
		||||
#define SANE_SET 1              /* Set in 'sane' mode                  */
 | 
			
		||||
@@ -800,21 +811,6 @@ static const char *visible(unsigned ch)
 | 
			
		||||
	return G.buf;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static tcflag_t *mode_type_flag(unsigned type, const struct termios *mode)
 | 
			
		||||
{
 | 
			
		||||
	static const uint8_t tcflag_offsets[] ALIGN1 = {
 | 
			
		||||
		offsetof(struct termios, c_cflag), /* control */
 | 
			
		||||
		offsetof(struct termios, c_iflag), /* input */
 | 
			
		||||
		offsetof(struct termios, c_oflag), /* output */
 | 
			
		||||
		offsetof(struct termios, c_lflag)  /* local */
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	if (type <= local) {
 | 
			
		||||
		return (tcflag_t*) (((char*)mode) + tcflag_offsets[type]);
 | 
			
		||||
	}
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void set_speed_or_die(enum speed_setting type, const char *arg,
 | 
			
		||||
					struct termios *mode)
 | 
			
		||||
{
 | 
			
		||||
@@ -1072,7 +1068,7 @@ static void do_display(const struct termios *mode, int all)
 | 
			
		||||
			prev_type = mode_info[i].type;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		bitsp = mode_type_flag(mode_info[i].type, mode);
 | 
			
		||||
		bitsp = get_ptr_to_tcflag(mode_info[i].type, mode);
 | 
			
		||||
		mask = mode_info[i].mask ? mode_info[i].mask : mode_info[i].bits;
 | 
			
		||||
		if ((*bitsp & mask) == mode_info[i].bits) {
 | 
			
		||||
			if (all || (mode_info[i].flags & SANE_UNSET))
 | 
			
		||||
@@ -1091,7 +1087,6 @@ static void do_display(const struct termios *mode, int all)
 | 
			
		||||
static void sane_mode(struct termios *mode)
 | 
			
		||||
{
 | 
			
		||||
	int i;
 | 
			
		||||
	tcflag_t *bitsp;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < NUM_control_info; ++i) {
 | 
			
		||||
#if VMIN == VEOF
 | 
			
		||||
@@ -1102,14 +1097,17 @@ static void sane_mode(struct termios *mode)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < NUM_mode_info; ++i) {
 | 
			
		||||
		tcflag_t val;
 | 
			
		||||
		tcflag_t *bitsp = get_ptr_to_tcflag(mode_info[i].type, mode);
 | 
			
		||||
 | 
			
		||||
		if (!bitsp)
 | 
			
		||||
			continue;
 | 
			
		||||
		val = *bitsp & ~((unsigned long)mode_info[i].mask);
 | 
			
		||||
		if (mode_info[i].flags & SANE_SET) {
 | 
			
		||||
			bitsp = mode_type_flag(mode_info[i].type, mode);
 | 
			
		||||
			*bitsp = (*bitsp & ~((unsigned long)mode_info[i].mask))
 | 
			
		||||
				| mode_info[i].bits;
 | 
			
		||||
		} else if (mode_info[i].flags & SANE_UNSET) {
 | 
			
		||||
			bitsp = mode_type_flag(mode_info[i].type, mode);
 | 
			
		||||
			*bitsp = *bitsp & ~((unsigned long)mode_info[i].mask)
 | 
			
		||||
				& ~mode_info[i].bits;
 | 
			
		||||
			*bitsp = val | mode_info[i].bits;
 | 
			
		||||
		} else
 | 
			
		||||
		if (mode_info[i].flags & SANE_UNSET) {
 | 
			
		||||
			*bitsp = val & ~mode_info[i].bits;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -1119,17 +1117,18 @@ static void set_mode(const struct mode_info *info, int reversed,
 | 
			
		||||
{
 | 
			
		||||
	tcflag_t *bitsp;
 | 
			
		||||
 | 
			
		||||
	bitsp = mode_type_flag(info->type, mode);
 | 
			
		||||
	bitsp = get_ptr_to_tcflag(info->type, mode);
 | 
			
		||||
 | 
			
		||||
	if (bitsp) {
 | 
			
		||||
		tcflag_t val = *bitsp & ~info->mask;
 | 
			
		||||
		if (reversed)
 | 
			
		||||
			*bitsp = *bitsp & ~info->mask & ~info->bits;
 | 
			
		||||
			*bitsp = val & ~info->bits;
 | 
			
		||||
		else
 | 
			
		||||
			*bitsp = (*bitsp & ~info->mask) | info->bits;
 | 
			
		||||
			*bitsp = val | info->bits;
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Combination mode */
 | 
			
		||||
	/* !bitsp - it's a "combination" mode */
 | 
			
		||||
	if (info == &mode_info[IDX_evenp] || info == &mode_info[IDX_parity]) {
 | 
			
		||||
		if (reversed)
 | 
			
		||||
			mode->c_cflag = (mode->c_cflag & ~PARENB & ~CSIZE) | CS8;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user