#endif
#include <ctype.h>
-#include <term.h> /* padding_baud_rate, xon_xoff */
#include <termcap.h> /* ospeed */
#include <tic.h>
-MODULE_ID("$Id: lib_tputs.c,v 1.73 2009/05/10 00:54:17 tom Exp $")
+MODULE_ID("$Id: lib_tputs.c,v 1.80 2009/11/21 23:09:31 tom Exp $")
NCURSES_EXPORT_VAR(char) PC = 0; /* used by termcap library */
NCURSES_EXPORT_VAR(NCURSES_OSPEED) ospeed = 0; /* used by termcap library */
#endif
#if NCURSES_SP_FUNCS
-#define my_outch SP_PARM->_outch
+#define SetOutCh(func) if (SP_PARM) SP_PARM->_outch = func; else _nc_prescreen._outch = func
+#define GetOutCh() (SP_PARM ? SP_PARM->_outch : _nc_prescreen._outch)
#else
-static NCURSES_SP_OUTC my_outch = NCURSES_SP_NAME(_nc_outch);
+#define SetOutCh(func) static_outch = func
+#define GetOutCh() static_outch
+static NCURSES_SP_OUTC static_outch = NCURSES_SP_NAME(_nc_outch);
#endif
NCURSES_EXPORT(int)
NCURSES_SP_NAME(delay_output) (NCURSES_SP_DCLx int ms)
{
- T((T_CALLED("delay_output(%p,%d)"), SP_PARM, ms));
+ T((T_CALLED("delay_output(%p,%d)"), (void *) SP_PARM, ms));
+
+ if (!HasTInfoTerminal(SP_PARM))
+ returnCode(ERR);
if (no_pad_char) {
NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG);
napms(ms);
} else {
+ NCURSES_SP_OUTC my_outch = GetOutCh();
register int nullcount;
nullcount = (ms * _nc_baudrate(ospeed)) / (BAUDBYTE * 1000);
NCURSES_EXPORT(int)
NCURSES_SP_NAME(_nc_outch) (NCURSES_SP_DCLx int ch)
{
+ int rc = OK;
+
COUNT_OUTCHARS(1);
- if (SP_PARM != 0
+ if (HasTInfoTerminal(SP_PARM)
+ && SP_PARM != 0
&& SP_PARM->_cleanup) {
- char tmp = ch;
+ char tmp = (char) ch;
/*
* POSIX says write() is safe in a signal handler, but the
* buffered I/O is not.
*/
- write(fileno(NC_OUTPUT(SP_PARM)), &tmp, 1);
+ if (write(fileno(NC_OUTPUT(SP_PARM)), &tmp, 1) == -1)
+ rc = ERR;
} else {
- putc(ch, NC_OUTPUT(SP_PARM));
+ if (putc(ch, NC_OUTPUT(SP_PARM)) == EOF)
+ rc = ERR;
}
- return OK;
+ return rc;
}
#if NCURSES_SP_FUNCS
string, 1, NCURSES_SP_NAME(_nc_outch));
}
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_DCLx
+ const char *name GCC_UNUSED,
+ const char *string)
+{
+ int rc = ERR;
+
+ if (string != 0) {
+ TPUTS_TRACE(name);
+ rc = NCURSES_SP_NAME(putp) (NCURSES_SP_ARGx string);
+ }
+ return rc;
+}
+
#if NCURSES_SP_FUNCS
NCURSES_EXPORT(int)
putp(const char *string)
{
return NCURSES_SP_NAME(putp) (CURRENT_SCREEN, string);
}
+
+NCURSES_EXPORT(int)
+_nc_putp(const char *name, const char *string)
+{
+ return NCURSES_SP_NAME(_nc_putp) (CURRENT_SCREEN, name, string);
+}
#endif
NCURSES_EXPORT(int)
int affcnt,
NCURSES_SP_OUTC outc)
{
+ NCURSES_SP_OUTC my_outch = GetOutCh();
bool always_delay;
bool normal_delay;
int number;
if (outc == NCURSES_SP_NAME(_nc_outch))
(void) strcpy(addrbuf, "_nc_outch");
else
- (void) sprintf(addrbuf, "%p", outc);
+ (void) sprintf(addrbuf, "%p", (void *) outc);
if (_nc_tputs_trace) {
_tracef("tputs(%s = %s, %d, %s) called", _nc_tputs_trace,
_nc_visbuf(string), affcnt, addrbuf);
}
#endif /* TRACE */
+ if (SP_PARM != 0 && !HasTInfoTerminal(SP_PARM))
+ return ERR;
+
if (!VALID_STRING(string))
return ERR;
- if (cur_term == 0) {
+ if (
+#if NCURSES_SP_FUNCS
+ (SP_PARM != 0 && SP_PARM->_term == 0)
+#else
+ cur_term == 0
+#endif
+ ) {
always_delay = FALSE;
normal_delay = TRUE;
} else {
}
#endif /* BSD_TPUTS */
- my_outch = outc; /* redirect delay_output() */
+ SetOutCh(outc); /* redirect delay_output() */
while (*string) {
if (*string != '$')
(*outc) (NCURSES_SP_ARGx *string);
delay_output(trailpad / 10);
#endif /* BSD_TPUTS */
- my_outch = NCURSES_SP_NAME(_nc_outch);
+ SetOutCh(my_outch);
return OK;
}