summaryrefslogtreecommitdiff
path: root/src/seq.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/seq.c')
-rw-r--r--src/seq.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/seq.c b/src/seq.c
index de92bc278..1b9da40fb 100644
--- a/src/seq.c
+++ b/src/seq.c
@@ -278,6 +278,15 @@ long_double_format (char const *fmt, struct layout *layout)
}
}
+static void ATTRIBUTE_NORETURN
+io_error (void)
+{
+ /* FIXME: consider option to silently ignore errno=EPIPE */
+ error (0, errno, _("standard output"));
+ clearerr (stdout);
+ exit (EXIT_FAILURE);
+}
+
/* Actually print the sequence of numbers in the specified range, with the
given or default stepping and format. */
@@ -295,7 +304,8 @@ print_numbers (char const *fmt, struct layout layout,
for (i = 1; ; i++)
{
long double x0 = x;
- printf (fmt, x);
+ if (printf (fmt, x) < 0)
+ io_error ();
if (out_of_range)
break;
x = first + i * step;
@@ -336,10 +346,12 @@ print_numbers (char const *fmt, struct layout layout,
break;
}
- fputs (separator, stdout);
+ if (fputs (separator, stdout) == EOF)
+ io_error ();
}
- fputs (terminator, stdout);
+ if (fputs (terminator, stdout) == EOF)
+ io_error ();
}
}
@@ -506,14 +518,16 @@ seq_fast (char const *a, char const *b)
output buffer so far, and reset to start of buffer. */
if (buf_end - (p_len + 1) < bufp)
{
- fwrite (buf, bufp - buf, 1, stdout);
+ if (fwrite (buf, bufp - buf, 1, stdout) != 1)
+ io_error ();
bufp = buf;
}
}
/* Write any remaining buffered output, and the terminator. */
*bufp++ = *terminator;
- fwrite (buf, bufp - buf, 1, stdout);
+ if (fwrite (buf, bufp - buf, 1, stdout) != 1)
+ io_error ();
IF_LINT (free (buf));
}