1 /****************************************************************************
2 * Copyright (c) 1998 Free Software Foundation, Inc. *
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: *
12 * The above copyright notice and this permission notice shall be included *
13 * in all copies or substantial portions of the Software. *
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. *
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 *
27 ****************************************************************************/
29 /****************************************************************************
30 * Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
31 * and: Eric S. Raymond <esr@snark.thyrsus.com> *
32 ****************************************************************************/
43 #include <curses.priv.h>
45 #include <term.h> /* padding_baud_rate, xon_xoff */
46 #include <termcap.h> /* ospeed */
49 MODULE_ID("$Id: lib_tputs.c,v 1.41 1999/10/22 23:31:24 tom Exp $")
51 char PC; /* used by termcap library */
52 speed_t ospeed; /* used by termcap library */
54 int _nc_nulls_sent; /* used by 'tack' program */
56 static int (*my_outch)(int c) = _nc_outch;
58 int delay_output(int ms)
60 T((T_CALLED("delay_output(%d)"), ms));
65 register int nullcount;
67 nullcount = (ms * _nc_baudrate(ospeed)) / 10000;
68 for (_nc_nulls_sent += nullcount; nullcount > 0; nullcount--)
70 if (my_outch == _nc_outch)
87 * POSIX says write() is safe in a signal handler, but the
88 * buffered I/O is not.
90 write(fileno(NC_OUTPUT), &tmp, 1);
97 int putp(const char *string)
99 return tputs(string, 1, _nc_outch);
102 int tputs(const char *string, int affcnt, int (*outc)(int))
109 #endif /* BSD_TPUTS */
114 if (_nc_tracing & TRACE_TPUTS)
116 if (outc == _nc_outch)
117 (void) strcpy(addrbuf, "_nc_outch");
119 (void) sprintf(addrbuf, "%p", outc);
120 if (_nc_tputs_trace) {
121 TR(TRACE_MAXIMUM, ("tputs(%s = %s, %d, %s) called", _nc_tputs_trace, _nc_visbuf(string), affcnt, addrbuf));
124 TR(TRACE_MAXIMUM, ("tputs(%s, %d, %s) called", _nc_visbuf(string), affcnt, addrbuf));
126 _nc_tputs_trace = (char *)NULL;
130 if (!VALID_STRING(string))
134 always_delay = FALSE;
137 always_delay = (string == bell) || (string == flash_screen);
141 #ifdef NCURSES_NO_PADDING
142 && (SP == 0 || !(SP->_no_padding))
144 && (_nc_baudrate(ospeed) >= padding_baud_rate);
149 * This ugly kluge deals with the fact that some ancient BSD programs
150 * (like nethack) actually do the likes of tputs("50") to get delays.
153 if (isdigit(*string)) {
154 while (isdigit(*string)) {
155 trailpad = trailpad * 10 + (*string - '0');
159 if (*string == '.') {
161 if (isdigit(*string)) {
162 trailpad += (*string - '0');
165 while (isdigit(*string))
169 if (*string == '*') {
174 #endif /* BSD_TPUTS */
176 my_outch = outc; /* redirect delay_output() */
182 if (*string != '<') {
190 if ((!isdigit(*string) && *string != '.') || !strchr(string, '>')) {
197 while (isdigit(*string)) {
198 number = number * 10 + (*string - '0');
202 if (*string == '.') {
204 if (isdigit(*string)) {
205 number += (*string - '0');
208 while (isdigit(*string))
213 while (*string == '*' || *string == '/')
215 if (*string == '*') {
219 else /* if (*string == '/') */ {
229 delay_output(number/10);
231 } /* endelse (*string == '<') */
232 } /* endelse (*string == '$') */
242 * Emit any BSD-style prefix padding that we've accumulated now.
245 && (always_delay || normal_delay))
246 delay_output(trailpad/10);
247 #endif /* BSD_TPUTS */
249 my_outch = _nc_outch;