From 89e7d5d4208bd943c884d4261dc7484ac654132c Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Thu, 7 Sep 2006 16:01:07 -0700 Subject: [PATCH] Make _cairo_output_stream_destroy return the stream's status as a last gasp. --- src/cairo-output-stream-private.h | 12 +++++++++--- src/cairo-output-stream.c | 28 +++++++++++++++++----------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/cairo-output-stream-private.h b/src/cairo-output-stream-private.h index d1eeeeb49..913fb6075 100644 --- a/src/cairo-output-stream-private.h +++ b/src/cairo-output-stream-private.h @@ -60,7 +60,7 @@ _cairo_output_stream_init (cairo_output_stream_t *stream, cairo_output_stream_write_func_t write_func, cairo_output_stream_close_func_t close_func); -cairo_private void +cairo_private cairo_status_t _cairo_output_stream_fini (cairo_output_stream_t *stream); @@ -86,10 +86,16 @@ _cairo_output_stream_create (cairo_write_func_t write_func, cairo_close_func_t close_func, void *closure); -cairo_private void +/* Returns the final status value associated with this object, just + * before its last gasp. This final status value will capture any + * status failure returned by the stream's close_func as well. */ +cairo_private cairo_status_t _cairo_output_stream_close (cairo_output_stream_t *stream); -cairo_private void +/* Returns the final status value associated with this object, just + * before its last gasp. This final status value will capture any + * status failure returned by the stream's close_func as well. */ +cairo_private cairo_status_t _cairo_output_stream_destroy (cairo_output_stream_t *stream); cairo_private void diff --git a/src/cairo-output-stream.c b/src/cairo-output-stream.c index ad52d3d3b..f9e527f33 100644 --- a/src/cairo-output-stream.c +++ b/src/cairo-output-stream.c @@ -57,13 +57,12 @@ _cairo_output_stream_init (cairo_output_stream_t *stream, stream->closed = FALSE; } -cairo_private void +cairo_private cairo_status_t _cairo_output_stream_fini (cairo_output_stream_t *stream) { - _cairo_output_stream_close (stream); + return _cairo_output_stream_close (stream); } - const cairo_output_stream_t cairo_output_stream_nil = { NULL, /* write_func */ NULL, /* close_func */ @@ -130,37 +129,44 @@ _cairo_output_stream_create (cairo_write_func_t write_func, return &stream->base; } -void +cairo_status_t _cairo_output_stream_close (cairo_output_stream_t *stream) { cairo_status_t status; if (stream->closed) - return; + return stream->status; if (stream == &cairo_output_stream_nil || stream == &cairo_output_stream_nil_write_error) { - return; + return stream->status; } if (stream->close_func) { status = stream->close_func (stream); - if (status) + /* Don't overwrite a pre-existing status failure. */ + if (stream->status == CAIRO_STATUS_SUCCESS) stream->status = status; } stream->closed = TRUE; + + return stream->status; } -void +cairo_status_t _cairo_output_stream_destroy (cairo_output_stream_t *stream) { - if (stream == NULL) - return; + cairo_status_t status; - _cairo_output_stream_fini (stream); + if (stream == NULL) + return CAIRO_STATUS_NULL_POINTER; + + status = _cairo_output_stream_fini (stream); free (stream); + + return status; } void