lib_baudrate.c revision 76726
1/**************************************************************************** 2 * Copyright (c) 1998,2000 Free Software Foundation, Inc. * 3 * * 4 * Permission is hereby granted, free of charge, to any person obtaining a * 5 * copy of this software and associated documentation files (the * 6 * "Software"), to deal in the Software without restriction, including * 7 * without limitation the rights to use, copy, modify, merge, publish, * 8 * distribute, distribute with modifications, sublicense, and/or sell * 9 * copies of the Software, and to permit persons to whom the Software is * 10 * furnished to do so, subject to the following conditions: * 11 * * 12 * The above copyright notice and this permission notice shall be included * 13 * in all copies or substantial portions of the Software. * 14 * * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * 16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * 17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * 18 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * 19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * 20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * 21 * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * 22 * * 23 * Except as contained in this notice, the name(s) of the above copyright * 24 * holders shall not be used in advertising or otherwise to promote the * 25 * sale, use or other dealings in this Software without prior written * 26 * authorization. * 27 ****************************************************************************/ 28 29/**************************************************************************** 30 * Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 * 31 * and: Eric S. Raymond <esr@snark.thyrsus.com> * 32 ****************************************************************************/ 33 34/* 35 * lib_baudrate.c 36 * 37 */ 38 39#include <curses.priv.h> 40#include <term.h> /* cur_term, pad_char */ 41#include <termcap.h> /* ospeed */ 42 43MODULE_ID("$Id: lib_baudrate.c,v 1.19 2000/12/10 02:55:07 tom Exp $") 44 45/* 46 * int 47 * baudrate() 48 * 49 * Returns the current terminal's baud rate. 50 * 51 */ 52 53struct speed { 54 int s; /* value for 'ospeed' is an index */ 55 int sp; /* the actual speed */ 56}; 57 58static struct speed const speeds[] = 59{ 60 {B0, 0}, 61 {B50, 50}, 62 {B75, 75}, 63 {B110, 110}, 64 {B134, 134}, 65 {B150, 150}, 66 {B200, 200}, 67 {B300, 300}, 68 {B600, 600}, 69 {B1200, 1200}, 70 {B1800, 1800}, 71 {B2400, 2400}, 72 {B4800, 4800}, 73 {B9600, 9600}, 74#ifdef B19200 75 {B19200, 19200}, 76#else 77#ifdef EXTA 78 {EXTA, 19200}, 79#endif 80#endif 81#ifdef B38400 82 {B38400, 38400}, 83#else 84#ifdef EXTB 85 {EXTB, 38400}, 86#endif 87#endif 88#ifdef B57600 89 {B57600, 57600}, 90#endif 91#ifdef B115200 92 {B115200, 115200}, 93#endif 94#ifdef B230400 95 {B230400, 230400}, 96#endif 97#ifdef B460800 98 {B460800, 460800}, 99#endif 100}; 101 102NCURSES_EXPORT(int) 103_nc_baudrate(int OSpeed) 104{ 105 static int last_OSpeed; 106 static int last_baudrate; 107 108 int result; 109 unsigned i; 110 111 if (OSpeed == last_OSpeed) { 112 result = last_baudrate; 113 } else { 114 result = ERR; 115 if (OSpeed >= 0) { 116 for (i = 0; i < SIZEOF(speeds); i++) { 117 if (speeds[i].s == OSpeed) { 118 result = speeds[i].sp; 119 break; 120 } 121 } 122 } 123 last_baudrate = result; 124 } 125 return (result); 126} 127 128NCURSES_EXPORT(int) 129_nc_ospeed(int BaudRate) 130{ 131 int result = 1; 132 unsigned i; 133 134 if (BaudRate >= 0) { 135 for (i = 0; i < SIZEOF(speeds); i++) { 136 if (speeds[i].sp == BaudRate) { 137 result = speeds[i].s; 138 break; 139 } 140 } 141 } 142 return (result); 143} 144 145NCURSES_EXPORT(int) 146baudrate(void) 147{ 148 int result; 149 150 T((T_CALLED("baudrate()"))); 151 152 /* 153 * In debugging, allow the environment symbol to override when we're 154 * redirecting to a file, so we can construct repeatable test-cases 155 * that take into account costs that depend on baudrate. 156 */ 157#ifdef TRACE 158 if (SP && !isatty(fileno(SP->_ofp)) 159 && getenv("BAUDRATE") != 0) { 160 int ret; 161 if ((ret = _nc_getenv_num("BAUDRATE")) <= 0) 162 ret = 9600; 163 ospeed = _nc_ospeed(ret); 164 returnCode(ret); 165 } else 166#endif 167 168#ifdef TERMIOS 169 ospeed = cfgetospeed(&cur_term->Nttyb); 170#else 171 ospeed = cur_term->Nttyb.sg_ospeed; 172#endif 173 result = _nc_baudrate(ospeed); 174 if (cur_term != 0) 175 cur_term->_baudrate = result; 176 177 returnCode(result); 178} 179