summaryrefslogtreecommitdiff
path: root/examples/getbaud.cc
blob: e90c4f6b78cd0f8832334140fbf43194358849ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "getbaud.h"

speed_t getBaud(int speed)
{
	struct
	{
		int value;
		speed_t baud;
	}
	speeds[] =
		{
			{      0,      B0 },
			{     50,     B50 },
			{     75,     B75 },
			{    110,    B110 },
			{    134,    B134 },
			{    150,    B150 },
			{    200,    B200 },
			{    300,    B300 },
			{    600,    B600 },
			{   1200,   B1200 },
			{   1800,   B1800 },
			{   2400,   B2400 },
			{   4800,   B4800 },
			{   9600,   B9600 },
			{  19200,  B19200 },
			{  38400,  B38400 },
			{  57600,  B57600 },
			{ 115200, B115200 },
			{ 230400, B230400 },
		};

	if(speed < 0)
	{
		throw bad_speed();
	}

	for(const auto& s : speeds)
	{
		if(speed == s.value)
		{
			return s.baud;
		}

		if(speed < s.value)
		{
			return (*((&s)-1)).baud;
		}
	}

	return speeds[sizeof(speeds) / sizeof(*speeds) - 1].baud;
}