diff options
Diffstat (limited to 'src/seq.c')
-rw-r--r-- | src/seq.c | 24 |
1 files changed, 19 insertions, 5 deletions
@@ -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)); } |