X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Flib_tputs.c;h=e5b4a6bcaa14e4389df1d93e8de18866e7a49fd4;hp=65fa4d797e6a03d57c488c4e56fe8a876a5eb943;hb=661078ddbde3ce0f3b06e95642fbb9b5fef7dca1;hpb=3a9b6a3bf0269231bef7de74757a910dedd04e0c diff --git a/ncurses/lib_tputs.c b/ncurses/lib_tputs.c index 65fa4d79..e5b4a6bc 100644 --- a/ncurses/lib_tputs.c +++ b/ncurses/lib_tputs.c @@ -1,23 +1,35 @@ - -/*************************************************************************** -* COPYRIGHT NOTICE * -**************************************************************************** -* ncurses is copyright (C) 1992-1995 * -* Zeyd M. Ben-Halim * -* zmbenhal@netcom.com * -* Eric S. Raymond * -* esr@snark.thyrsus.com * -* * -* Permission is hereby granted to reproduce and distribute ncurses * -* by any means and for any fee, whether alone or as part of a * -* larger distribution, in source or in binary form, PROVIDED * -* this notice is included with any such distribution, and is not * -* removed from any of its header files. Mention of ncurses in any * -* applications linked with it is highly appreciated. * -* * -* ncurses comes AS IS with no warranty, implied or expressed. * -* * -***************************************************************************/ +/**************************************************************************** + * Copyright (c) 1998 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ /* @@ -33,14 +45,22 @@ #include /* padding_baud_rate, xon_xoff */ #include -MODULE_ID("$Id: lib_tputs.c,v 1.18 1997/02/02 01:52:39 tom Exp $") +MODULE_ID("$Id: lib_tputs.c,v 1.30 1998/02/11 12:14:00 tom Exp $") + +#define OUTPUT ((SP != 0) ? SP->_ofp : stdout) + +int _nc_nulls_sent; /* used by 'tack' program */ + +static int (*my_outch)(int c) = _nc_outch; int delay_output(int ms) { T((T_CALLED("delay_output(%d)"), ms)); - if (SP == 0 || SP->_baudrate <= 0) - returnCode(ERR); + if (cur_term == 0 || cur_term->_baudrate <= 0) { + (void) fflush(OUTPUT); + _nc_timed_wait(0, ms, (int *)0); + } #ifdef no_pad_char else if (no_pad_char) napms(ms); @@ -54,9 +74,11 @@ int delay_output(int ms) null = pad_char[0]; #endif /* pad_char */ - for (nullcount = ms * 1000 / SP->_baudrate; nullcount > 0; nullcount--) - putc(null, SP->_ofp); - (void) fflush(SP->_ofp); + nullcount = ms * cur_term->_baudrate / 10000; + for (_nc_nulls_sent += nullcount; nullcount > 0; nullcount--) + my_outch(null); + if (my_outch == _nc_outch) + (void) fflush(OUTPUT); } returnCode(OK); @@ -68,10 +90,7 @@ int _nc_outch(int ch) _nc_outchars++; #endif /* TRACE */ - if (SP != NULL) - putc(ch, SP->_ofp); - else - putc(ch, stdout); + putc(ch, OUTPUT); return OK; } @@ -82,9 +101,11 @@ int putp(const char *string) int tputs(const char *string, int affcnt, int (*outc)(int)) { -float number; +bool always_delay; +bool normal_delay; +int number; #ifdef BSD_TPUTS -float trailpad; +int trailpad; #endif /* BSD_TPUTS */ #ifdef TRACE @@ -103,27 +124,39 @@ char addrbuf[17]; _nc_tputs_trace = (char *)NULL; } #endif /* TRACE */ - + if (string == ABSENT_STRING || string == CANCELLED_STRING) return ERR; + if (cur_term == 0) { + always_delay = FALSE; + normal_delay = TRUE; + } else { + always_delay = (string == bell) || (string == flash_screen); + normal_delay = + !xon_xoff +#ifdef padding_baud_rate + && padding_baud_rate + && (!cur_term || cur_term->_baudrate >= padding_baud_rate) +#endif + ; + } + #ifdef BSD_TPUTS /* * This ugly kluge deals with the fact that some ancient BSD programs * (like nethack) actually do the likes of tputs("50") to get delays. */ trailpad = 0; - number = 0; - while (isdigit(*string)) { - trailpad = trailpad * 10 + *string - '0'; + trailpad = trailpad * 10 + (*string - '0'); string++; } - + trailpad *= 10; if (*string == '.') { string++; if (isdigit(*string)) { - trailpad += (float) (*string - '0') / 10.; + trailpad += (*string - '0'); string++; } while (isdigit(*string)) @@ -136,6 +169,7 @@ char addrbuf[17]; } #endif /* BSD_TPUTS */ + my_outch = outc; /* redirect delay_output() */ while (*string) { if (*string != '$') (*outc)(*string); @@ -148,30 +182,30 @@ char addrbuf[17]; } else { bool mandatory; - number = 0; string++; - if ((!isdigit(*string) && *string != '.') || !strchr(string, '>')) { (*outc)('$'); (*outc)('<'); continue; } + + number = 0; while (isdigit(*string)) { - number = number * 10 + *string - '0'; + number = number * 10 + (*string - '0'); string++; } - + number *= 10; if (*string == '.') { string++; if (isdigit(*string)) { - number += (float) (*string - '0') / 10.; + number += (*string - '0'); string++; } while (isdigit(*string)) string++; } - mandatory = !xon_xoff; + mandatory = FALSE; while (*string == '*' || *string == '/') { if (*string == '*') { @@ -184,11 +218,11 @@ char addrbuf[17]; } } -#ifdef padding_baud_rate - if (mandatory && number > 0 && padding_baud_rate && (!SP || SP->_baudrate >= padding_baud_rate)) - delay_output(number); -#endif /* padding_baud_rate */ - number = 0; + if (number > 0 + && (always_delay + || normal_delay + || mandatory)) + delay_output(number/10); } /* endelse (*string == '<') */ } /* endelse (*string == '$') */ @@ -203,11 +237,11 @@ char addrbuf[17]; /* * Emit any BSD-style prefix padding that we've accumulated now. */ -#ifdef padding_baud_rate - if (trailpad > 0 && !xon_xoff && padding_baud_rate && (!SP || SP->_baudrate >= padding_baud_rate)) - delay_output(number); -#endif /* padding_baud_rate */ + if (trailpad > 0 + && (always_delay || normal_delay)) + delay_output(trailpad/10); #endif /* BSD_TPUTS */ + my_outch = _nc_outch; return OK; }