150276Speter/****************************************************************************
2184989Srafan * Copyright (c) 1998-2007,2008 Free Software Foundation, Inc.              *
350276Speter *                                                                          *
450276Speter * Permission is hereby granted, free of charge, to any person obtaining a  *
550276Speter * copy of this software and associated documentation files (the            *
650276Speter * "Software"), to deal in the Software without restriction, including      *
750276Speter * without limitation the rights to use, copy, modify, merge, publish,      *
850276Speter * distribute, distribute with modifications, sublicense, and/or sell       *
950276Speter * copies of the Software, and to permit persons to whom the Software is    *
1050276Speter * furnished to do so, subject to the following conditions:                 *
1150276Speter *                                                                          *
1250276Speter * The above copyright notice and this permission notice shall be included  *
1350276Speter * in all copies or substantial portions of the Software.                   *
1450276Speter *                                                                          *
1550276Speter * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
1650276Speter * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
1750276Speter * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
1850276Speter * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
1950276Speter * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
2050276Speter * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
2150276Speter * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
2250276Speter *                                                                          *
2350276Speter * Except as contained in this notice, the name(s) of the above copyright   *
2450276Speter * holders shall not be used in advertising or otherwise to promote the     *
2550276Speter * sale, use or other dealings in this Software without prior written       *
2650276Speter * authorization.                                                           *
2750276Speter ****************************************************************************/
2850276Speter
2950276Speter/****************************************************************************
3050276Speter *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
3150276Speter *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
32174998Srafan *     and: Thomas E. Dickey                        1996-on                 *
3350276Speter ****************************************************************************/
3450276Speter
3550276Speter/*
3650276Speter *	lib_baudrate.c
3750276Speter *
3850276Speter */
3950276Speter
4050276Speter#include <curses.priv.h>
4166963Speter#include <term.h>		/* cur_term, pad_char */
4266963Speter#include <termcap.h>		/* ospeed */
43174998Srafan#if defined(__FreeBSD__)
44174998Srafan#include <sys/param.h>
45174998Srafan#endif
4650276Speter
4789354Sache/*
4889354Sache * These systems use similar header files, which define B1200 as 1200, etc.,
4989354Sache * but can be overridden by defining USE_OLD_TTY so B1200 is 9, which makes all
5089354Sache * of the indices up to B115200 fit nicely in a 'short', allowing us to retain
5189354Sache * ospeed's type for compatibility.
5289354Sache */
53174998Srafan#if (defined(__FreeBSD__) && (__FreeBSD_version < 700000)) || defined(__NetBSD__) || defined(__OpenBSD__)
5489354Sache#undef B0
5589354Sache#undef B50
5689354Sache#undef B75
5789354Sache#undef B110
5889354Sache#undef B134
5989354Sache#undef B150
6089354Sache#undef B200
6189354Sache#undef B300
6289354Sache#undef B600
6389354Sache#undef B1200
6489354Sache#undef B1800
6589354Sache#undef B2400
6689354Sache#undef B4800
6789354Sache#undef B9600
6889354Sache#undef B19200
6989354Sache#undef EXTA
7089354Sache#undef B38400
7189354Sache#undef EXTB
7289354Sache#undef B57600
7389354Sache#undef B115200
7489354Sache#undef B230400
7589354Sache#undef B460800
7697049Speter#undef B921600
7789354Sache#define USE_OLD_TTY
7889354Sache#include <sys/ttydev.h>
7989354Sache#else
8089354Sache#undef USE_OLD_TTY
8189354Sache#endif /* USE_OLD_TTY */
8250276Speter
83184989SrafanMODULE_ID("$Id: lib_baudrate.c,v 1.27 2008/06/28 15:19:24 tom Exp $")
8489354Sache
8550276Speter/*
8650276Speter *	int
8750276Speter *	baudrate()
8850276Speter *
8950276Speter *	Returns the current terminal's baud rate.
9050276Speter *
9150276Speter */
9250276Speter
9350276Speterstruct speed {
9476726Speter    int s;			/* value for 'ospeed' is an index */
9576726Speter    int sp;			/* the actual speed */
9650276Speter};
9750276Speter
9866963Speterstatic struct speed const speeds[] =
9966963Speter{
10066963Speter    {B0, 0},
10166963Speter    {B50, 50},
10266963Speter    {B75, 75},
10366963Speter    {B110, 110},
10466963Speter    {B134, 134},
10566963Speter    {B150, 150},
10666963Speter    {B200, 200},
10766963Speter    {B300, 300},
10866963Speter    {B600, 600},
10966963Speter    {B1200, 1200},
11066963Speter    {B1800, 1800},
11166963Speter    {B2400, 2400},
11266963Speter    {B4800, 4800},
11366963Speter    {B9600, 9600},
11450276Speter#ifdef B19200
11566963Speter    {B19200, 19200},
11650276Speter#else
11750276Speter#ifdef EXTA
11866963Speter    {EXTA, 19200},
11950276Speter#endif
12050276Speter#endif
12150276Speter#ifdef B38400
12266963Speter    {B38400, 38400},
12350276Speter#else
12450276Speter#ifdef EXTB
12566963Speter    {EXTB, 38400},
12650276Speter#endif
12750276Speter#endif
12850276Speter#ifdef B57600
12966963Speter    {B57600, 57600},
13050276Speter#endif
13150276Speter#ifdef B115200
13266963Speter    {B115200, 115200},
13350276Speter#endif
13450276Speter#ifdef B230400
13566963Speter    {B230400, 230400},
13650276Speter#endif
13750276Speter#ifdef B460800
13866963Speter    {B460800, 460800},
13950276Speter#endif
14097049Speter#ifdef B921600
14197049Speter    {B921600, 921600},
14297049Speter#endif
14350276Speter};
14450276Speter
14576726SpeterNCURSES_EXPORT(int)
14666963Speter_nc_baudrate(int OSpeed)
14750276Speter{
148174998Srafan#if !USE_REENTRANT
14966963Speter    static int last_OSpeed;
15066963Speter    static int last_baudrate;
151174998Srafan#endif
15250276Speter
153174998Srafan    int result = ERR;
15466963Speter    unsigned i;
15550276Speter
156174998Srafan#if !USE_REENTRANT
15766963Speter    if (OSpeed == last_OSpeed) {
15866963Speter	result = last_baudrate;
159174998Srafan    }
160174998Srafan#endif
161174998Srafan    if (result == ERR) {
16266963Speter	if (OSpeed >= 0) {
16366963Speter	    for (i = 0; i < SIZEOF(speeds); i++) {
16466963Speter		if (speeds[i].s == OSpeed) {
16566963Speter		    result = speeds[i].sp;
16666963Speter		    break;
16750276Speter		}
16866963Speter	    }
16950276Speter	}
170174998Srafan#if !USE_REENTRANT
171174998Srafan	if (OSpeed == last_OSpeed) {
172174998Srafan	    last_OSpeed = OSpeed;
173174998Srafan	    last_baudrate = result;
174174998Srafan	}
175174998Srafan#endif
17666963Speter    }
17766963Speter    return (result);
17850276Speter}
17950276Speter
18076726SpeterNCURSES_EXPORT(int)
18166963Speter_nc_ospeed(int BaudRate)
18250276Speter{
18366963Speter    int result = 1;
18466963Speter    unsigned i;
18550276Speter
18666963Speter    if (BaudRate >= 0) {
18766963Speter	for (i = 0; i < SIZEOF(speeds); i++) {
18866963Speter	    if (speeds[i].sp == BaudRate) {
18966963Speter		result = speeds[i].s;
19066963Speter		break;
19166963Speter	    }
19250276Speter	}
19366963Speter    }
19466963Speter    return (result);
19550276Speter}
19650276Speter
19776726SpeterNCURSES_EXPORT(int)
19850276Speterbaudrate(void)
19950276Speter{
20066963Speter    int result;
20150276Speter
20266963Speter    T((T_CALLED("baudrate()")));
20350276Speter
20466963Speter    /*
20566963Speter     * In debugging, allow the environment symbol to override when we're
20666963Speter     * redirecting to a file, so we can construct repeatable test-cases
20766963Speter     * that take into account costs that depend on baudrate.
20866963Speter     */
20950276Speter#ifdef TRACE
210184989Srafan    if (!isatty(fileno(SP ? SP->_ofp : stdout))
21166963Speter	&& getenv("BAUDRATE") != 0) {
21266963Speter	int ret;
21366963Speter	if ((ret = _nc_getenv_num("BAUDRATE")) <= 0)
21466963Speter	    ret = 9600;
21566963Speter	ospeed = _nc_ospeed(ret);
21666963Speter	returnCode(ret);
21789354Sache    }
21850276Speter#endif
21950276Speter
220184989Srafan    if (cur_term != 0) {
22189354Sache#ifdef USE_OLD_TTY
222184989Srafan	result = cfgetospeed(&cur_term->Nttyb);
223184989Srafan	ospeed = _nc_ospeed(result);
22497049Speter#else /* !USE_OLD_TTY */
22550276Speter#ifdef TERMIOS
226184989Srafan	ospeed = cfgetospeed(&cur_term->Nttyb);
22750276Speter#else
228184989Srafan	ospeed = cur_term->Nttyb.sg_ospeed;
22950276Speter#endif
230184989Srafan	result = _nc_baudrate(ospeed);
23197049Speter#endif
23266963Speter	cur_term->_baudrate = result;
233184989Srafan    } else {
234184989Srafan	result = ERR;
235184989Srafan    }
23650276Speter
23766963Speter    returnCode(result);
23850276Speter}
239