From 792fc686581a9412364d06be2e05dfe4d4014ed1 Mon Sep 17 00:00:00 2001 From: Bert Vermeulen Date: Sun, 2 Sep 2012 15:02:24 +0200 Subject: [PATCH] serial: add serial_set_paramstr() --- hardware/common/serial.c | 45 ++++++++++++++++++++++++++++++++++++++++ libsigrok-internal.h | 1 + 2 files changed, 46 insertions(+) diff --git a/hardware/common/serial.c b/hardware/common/serial.c index ca79b9bb..51934ed8 100644 --- a/hardware/common/serial.c +++ b/hardware/common/serial.c @@ -322,3 +322,48 @@ SR_PRIV int serial_set_params(int fd, int baudrate, int bits, int parity, return SR_OK; } + +#define SERIAL_COMM_SPEC "^(\\d+)/([78])([neo])([12])$" +SR_PRIV int serial_set_paramstr(int fd, const char *paramstr) +{ + GRegex *reg; + GMatchInfo *match; + int speed, databits, parity, stopbits; + char *mstr; + + speed = databits = parity = stopbits = 0; + reg = g_regex_new(SERIAL_COMM_SPEC, 0, 0, NULL); + if (g_regex_match(reg, paramstr, 0, &match)) { + if ((mstr = g_match_info_fetch(match, 1))) + speed = strtoul(mstr, NULL, 10); + g_free(mstr); + if ((mstr = g_match_info_fetch(match, 2))) + databits = strtoul(mstr, NULL, 10); + g_free(mstr); + if ((mstr = g_match_info_fetch(match, 3))) { + switch (mstr[0]) { + case 'n': + parity = SERIAL_PARITY_NONE; + break; + case 'e': + parity = SERIAL_PARITY_EVEN; + break; + case 'o': + parity = SERIAL_PARITY_ODD; + break; + } + } + g_free(mstr); + if ((mstr = g_match_info_fetch(match, 4))) + stopbits = strtoul(mstr, NULL, 10); + g_free(mstr); + } + g_match_info_unref(match); + g_regex_unref(reg); + + if (speed) + return serial_set_params(fd, speed, databits, parity, stopbits, 0); + else + return SR_ERR_ARG; +} + diff --git a/libsigrok-internal.h b/libsigrok-internal.h index b45b0786..8bbae93b 100644 --- a/libsigrok-internal.h +++ b/libsigrok-internal.h @@ -112,6 +112,7 @@ SR_PRIV void *serial_backup_params(int fd); SR_PRIV void serial_restore_params(int fd, void *backup); SR_PRIV int serial_set_params(int fd, int baudrate, int bits, int parity, int stopbits, int flowcontrol); +SR_PRIV int serial_set_paramstr(int fd, const char *paramstr); /*--- hardware/common/ezusb.c -----------------------------------------------*/