aboutsummaryrefslogtreecommitdiff
path: root/ncurses/tinfo/lib_tputs.c
diff options
context:
space:
mode:
Diffstat (limited to 'ncurses/tinfo/lib_tputs.c')
-rw-r--r--ncurses/tinfo/lib_tputs.c44
1 files changed, 31 insertions, 13 deletions
diff --git a/ncurses/tinfo/lib_tputs.c b/ncurses/tinfo/lib_tputs.c
index 523678210da6..3f24a53d63b2 100644
--- a/ncurses/tinfo/lib_tputs.c
+++ b/ncurses/tinfo/lib_tputs.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2018,2019 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 *
@@ -51,7 +51,7 @@
#include <termcap.h> /* ospeed */
#include <tic.h>
-MODULE_ID("$Id: lib_tputs.c,v 1.93 2013/01/12 20:57:32 tom Exp $")
+MODULE_ID("$Id: lib_tputs.c,v 1.102 2019/03/17 21:57:04 tom Exp $")
NCURSES_EXPORT_VAR(char) PC = 0; /* used by termcap library */
NCURSES_EXPORT_VAR(NCURSES_OSPEED) ospeed = 0; /* used by termcap library */
@@ -121,14 +121,29 @@ NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_DCL0)
{
if (SP_PARM != 0 && SP_PARM->_ofd >= 0) {
if (SP_PARM->out_inuse) {
+ char *buf = SP_PARM->out_buffer;
size_t amount = SP->out_inuse;
- /*
- * Help a little, if the write is interrupted, by first resetting
- * our amount.
- */
+
SP->out_inuse = 0;
- IGNORE_RC(write(SP_PARM->_ofd, SP_PARM->out_buffer, amount));
+ TR(TRACE_CHARPUT, ("flushing %ld bytes", (unsigned long) amount));
+ while (amount) {
+ ssize_t res = write(SP_PARM->_ofd, buf, amount);
+
+ if (res > 0) {
+ /* if the write was incomplete, try again */
+ amount -= (size_t) res;
+ buf += res;
+ } else if (errno == EAGAIN) {
+ continue;
+ } else if (errno == EINTR) {
+ continue;
+ } else {
+ break; /* an error we can not recover from */
+ }
+ }
}
+ } else {
+ fflush(stdout);
}
}
@@ -258,13 +273,16 @@ NCURSES_SP_NAME(tputs) (NCURSES_SP_DCLx
#endif /* BSD_TPUTS */
#ifdef TRACE
- char addrbuf[32];
-
if (USE_TRACEF(TRACE_TPUTS)) {
- if (outc == NCURSES_SP_NAME(_nc_outch))
+ char addrbuf[32];
+ TR_FUNC_BFR(1);
+
+ if (outc == NCURSES_SP_NAME(_nc_outch)) {
_nc_STRCPY(addrbuf, "_nc_outch", sizeof(addrbuf));
- else
- _nc_SPRINTF(addrbuf, _nc_SLIMIT(sizeof(addrbuf)) "%p", outc);
+ } else {
+ _nc_SPRINTF(addrbuf, _nc_SLIMIT(sizeof(addrbuf)) "%s",
+ TR_FUNC_ARG(0, outc));
+ }
if (_nc_tputs_trace) {
_tracef("tputs(%s = %s, %d, %s) called", _nc_tputs_trace,
_nc_visbuf(string), affcnt, addrbuf);
@@ -412,7 +430,7 @@ NCURSES_EXPORT(int)
_nc_outc_wrapper(SCREEN *sp, int c)
{
if (0 == sp) {
- return (ERR);
+ return fputc(c, stdout);
} else {
return sp->jump(c);
}