From da2748bfb3b852551459604b04eece3aa8feb4fa Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Thu, 14 Nov 2013 23:24:51 +0000 Subject: [PATCH] Eliminate lengthy switch/case blocks for baudrates. --- serialport.c | 167 +++++++++++++++------------------------------------ 1 file changed, 49 insertions(+), 118 deletions(-) diff --git a/serialport.c b/serialport.c index 98c1a77..4cf7f93 100644 --- a/serialport.c +++ b/serialport.c @@ -59,6 +59,42 @@ struct sp_port_data { #endif }; +/* Standard baud rates. */ +#ifdef _WIN32 +#define BAUD_TYPE DWORD +#define BAUD(n) {CBR_##n, n} +#else +#define BAUD_TYPE speed_t +#define BAUD(n) {B##n, n} +#endif + +struct std_baudrate { + BAUD_TYPE index; + int value; +}; + +const struct std_baudrate std_baudrates[] = { +#ifdef _WIN32 + /* + * The baudrates 50/75/134/150/200/1800/230400/460800 do not seem to + * have documented CBR_* macros. + */ + BAUD(110), BAUD(300), BAUD(600), BAUD(1200), BAUD(2400), BAUD(4800), + BAUD(9600), BAUD(14400), BAUD(19200), BAUD(38400), BAUD(57600), + BAUD(115200), BAUD(128000), BAUD(256000) +#else + BAUD(50), BAUD(75), BAUD(110), BAUD(134), BAUD(150), BAUD(200), BAUD(300), + BAUD(600), BAUD(1200), BAUD(1800), BAUD(2400), BAUD(4800), BAUD(9600), + BAUD(19200), BAUD(38400), BAUD(57600), BAUD(115200), BAUD(230400), +#if !defined(__APPLE__) && !defined(__OpenBSD__) + BAUD(460800) +#endif +#endif +}; + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) +#define NUM_STD_BAUDRATES ARRAY_SIZE(std_baudrates) + /* Helper functions for configuring ports. */ static int start_config(struct sp_port *port, struct sp_port_data *data); static int set_baudrate(struct sp_port_data *data, int baudrate); @@ -557,130 +593,25 @@ static int start_config(struct sp_port *port, struct sp_port_data *data) static int set_baudrate(struct sp_port_data *data, int baudrate) { + unsigned int i; + for (i = 0; i < NUM_STD_BAUDRATES; i++) { + if (baudrate == std_baudrates[i].value) { #ifdef _WIN32 - switch (baudrate) { - /* - * The baudrates 50/75/134/150/200/1800/230400/460800 do not seem to - * have documented CBR_* macros. - */ - case 110: - data->dcb.BaudRate = CBR_110; - break; - case 300: - data->dcb.BaudRate = CBR_300; - break; - case 600: - data->dcb.BaudRate = CBR_600; - break; - case 1200: - data->dcb.BaudRate = CBR_1200; - break; - case 2400: - data->dcb.BaudRate = CBR_2400; - break; - case 4800: - data->dcb.BaudRate = CBR_4800; - break; - case 9600: - data->dcb.BaudRate = CBR_9600; - break; - case 14400: - data->dcb.BaudRate = CBR_14400; /* Not available on Unix? */ - break; - case 19200: - data->dcb.BaudRate = CBR_19200; - break; - case 38400: - data->dcb.BaudRate = CBR_38400; - break; - case 57600: - data->dcb.BaudRate = CBR_57600; - break; - case 115200: - data->dcb.BaudRate = CBR_115200; - break; - case 128000: - data->dcb.BaudRate = CBR_128000; /* Not available on Unix? */ - break; - case 256000: - data->dcb.BaudRate = CBR_256000; /* Not available on Unix? */ - break; - default: - return SP_ERR_ARG; - } + data->dcb.BaudRate = std_baudrates[i].index; #else - speed_t baud; - switch (baudrate) { - case 50: - baud = B50; - break; - case 75: - baud = B75; - break; - case 110: - baud = B110; - break; - case 134: - baud = B134; - break; - case 150: - baud = B150; - break; - case 200: - baud = B200; - break; - case 300: - baud = B300; - break; - case 600: - baud = B600; - break; - case 1200: - baud = B1200; - break; - case 1800: - baud = B1800; - break; - case 2400: - baud = B2400; - break; - case 4800: - baud = B4800; - break; - case 9600: - baud = B9600; - break; - case 19200: - baud = B19200; - break; - case 38400: - baud = B38400; - break; - case 57600: - baud = B57600; - break; - case 115200: - baud = B115200; - break; - case 230400: - baud = B230400; - break; -#if !defined(__APPLE__) && !defined(__OpenBSD__) - case 460800: - baud = B460800; - break; + if (cfsetospeed(&data->term, std_baudrates[i].index) < 0) + return SP_ERR_FAIL; + + if (cfsetispeed(&data->term, std_baudrates[i].index) < 0) + return SP_ERR_FAIL; #endif - default: - return SP_ERR_ARG; + break; + } } - if (cfsetospeed(&data->term, baud) < 0) - return SP_ERR_FAIL; + if (i == NUM_STD_BAUDRATES) + return SP_ERR_ARG; - if (cfsetispeed(&data->term, baud) < 0) - return SP_ERR_FAIL; - -#endif return SP_OK; }