diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2008-01-16 16:29:19 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2008-01-16 16:40:01 +0000 |
commit | 5cbc45488e276cb6e6ecfa7bc7dd4fae342de85e (patch) | |
tree | 672c700de47687c25c68cb22743c0a058e4b06d1 /src | |
parent | 2c10c7559db11ccf511e119f4d4fb2da97508786 (diff) |
[cairo-output-stream] Introduce _cairo_output_stream_create_in_error()
Use a utility function to wrap an incoming error status into a new
error stream. As a side-effect, all error streams must be destroyed as
in the general case the caller can not distinguish between a static
error object and one allocated to hold an unusual error status.
Diffstat (limited to 'src')
-rw-r--r-- | src/cairo-base85-stream.c | 3 | ||||
-rw-r--r-- | src/cairo-deflate-stream.c | 7 | ||||
-rw-r--r-- | src/cairo-output-stream-private.h | 3 | ||||
-rw-r--r-- | src/cairo-output-stream.c | 26 | ||||
-rw-r--r-- | src/cairo-ps-surface.c | 10 | ||||
-rw-r--r-- | src/cairo-type1-fallback.c | 8 | ||||
-rw-r--r-- | src/cairo-type1-subset.c | 5 |
7 files changed, 46 insertions, 16 deletions
diff --git a/src/cairo-base85-stream.c b/src/cairo-base85-stream.c index 97ef2635f..b7dc9b14b 100644 --- a/src/cairo-base85-stream.c +++ b/src/cairo-base85-stream.c @@ -113,6 +113,9 @@ _cairo_base85_stream_create (cairo_output_stream_t *output) { cairo_base85_stream_t *stream; + if (output->status) + return _cairo_output_stream_create_in_error (output->status); + stream = malloc (sizeof (cairo_base85_stream_t)); if (stream == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); diff --git a/src/cairo-deflate-stream.c b/src/cairo-deflate-stream.c index 707832db4..8734b1782 100644 --- a/src/cairo-deflate-stream.c +++ b/src/cairo-deflate-stream.c @@ -117,11 +117,8 @@ _cairo_deflate_stream_create (cairo_output_stream_t *output) { cairo_deflate_stream_t *stream; - if (output->status) { - _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); - return (cairo_output_stream_t *) &_cairo_output_stream_nil; - } - + if (output->status) + return _cairo_output_stream_create_in_error (output->status); stream = malloc (sizeof (cairo_deflate_stream_t)); if (stream == NULL) { diff --git a/src/cairo-output-stream-private.h b/src/cairo-output-stream-private.h index 0e7d4dbe4..8377eca4a 100644 --- a/src/cairo-output-stream-private.h +++ b/src/cairo-output-stream-private.h @@ -87,6 +87,9 @@ _cairo_output_stream_create (cairo_write_func_t write_func, cairo_close_func_t close_func, void *closure); +cairo_private cairo_output_stream_t * +_cairo_output_stream_create_in_error (cairo_status_t status); + /* 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. */ diff --git a/src/cairo-output-stream.c b/src/cairo-output-stream.c index 6451b0fe6..2cb9e03bc 100644 --- a/src/cairo-output-stream.c +++ b/src/cairo-output-stream.c @@ -134,6 +134,29 @@ _cairo_output_stream_create (cairo_write_func_t write_func, return &stream->base; } +cairo_output_stream_t * +_cairo_output_stream_create_in_error (cairo_status_t status) +{ + cairo_output_stream_t *stream; + + /* check for the common ones */ + if (status == CAIRO_STATUS_NO_MEMORY) + return (cairo_output_stream_t *) &_cairo_output_stream_nil; + if (status == CAIRO_STATUS_WRITE_ERROR) + return (cairo_output_stream_t *) &_cairo_output_stream_nil_write_error; + + stream = malloc (sizeof (cairo_output_stream_t)); + if (stream == NULL) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_output_stream_t *) &_cairo_output_stream_nil; + } + + _cairo_output_stream_init (stream, NULL, NULL); + stream->status = status; + + return stream; +} + cairo_status_t _cairo_output_stream_close (cairo_output_stream_t *stream) { @@ -165,8 +188,7 @@ _cairo_output_stream_destroy (cairo_output_stream_t *stream) { cairo_status_t status; - if (stream == NULL) - return _cairo_error (CAIRO_STATUS_NULL_POINTER); + assert (stream != NULL); if (stream == &_cairo_output_stream_nil || stream == &_cairo_output_stream_nil_write_error) diff --git a/src/cairo-ps-surface.c b/src/cairo-ps-surface.c index e2695bf1d..93c905558 100644 --- a/src/cairo-ps-surface.c +++ b/src/cairo-ps-surface.c @@ -176,6 +176,9 @@ _word_wrap_stream_create (cairo_output_stream_t *output, int max_column) { word_wrap_stream_t *stream; + if (output->status) + return _cairo_output_stream_create_in_error (output->status); + stream = malloc (sizeof (word_wrap_stream_t)); if (stream == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); @@ -301,7 +304,7 @@ _cairo_ps_surface_emit_path (cairo_ps_surface_t *surface, word_wrap = _word_wrap_stream_create (stream, 79); status = _cairo_output_stream_get_status (word_wrap); if (status) - return status; + return _cairo_output_stream_destroy (word_wrap); path_info.surface = surface; path_info.stream = word_wrap; @@ -3255,9 +3258,10 @@ _cairo_ps_surface_show_glyphs (void *abstract_surface, _cairo_output_stream_printf (surface->stream, "<%02x> S\n", glyph_ids[i].glyph_id); } else { word_wrap = _word_wrap_stream_create (surface->stream, 79); - status = _cairo_output_stream_get_status (word_wrap); - if (status) + if (_cairo_output_stream_get_status (word_wrap)) { + status = _cairo_output_stream_destroy (word_wrap); goto fail; + } _cairo_output_stream_printf (word_wrap, "<"); for (j = i; j < last+1; j++) diff --git a/src/cairo-type1-fallback.c b/src/cairo-type1-fallback.c index 3532692ce..0ca499869 100644 --- a/src/cairo-type1-fallback.c +++ b/src/cairo-type1-fallback.c @@ -601,10 +601,8 @@ cairo_type1_font_write_private_dict (cairo_type1_font_t *font, cairo_type1_write_stream_encrypted, NULL, font); - if (encrypted_output == NULL) { - status = _cairo_error (CAIRO_STATUS_NO_MEMORY); - goto fail; - } + if (_cairo_output_stream_get_status (encrypted_output)) + return _cairo_output_stream_destroy (encrypted_output); /* Note: the first four spaces at the start of this private dict * are the four "random" bytes of plaintext required by the @@ -697,6 +695,8 @@ cairo_type1_font_generate (cairo_type1_font_t *font, const char *name) return status; font->output = _cairo_output_stream_create (cairo_type1_write_stream, NULL, font); + if (_cairo_output_stream_get_status (font->output)) + return _cairo_output_stream_destroy (font->output); status = cairo_type1_font_write (font, name); if (status) diff --git a/src/cairo-type1-subset.c b/src/cairo-type1-subset.c index 2d57368dc..bc46954ae 100644 --- a/src/cairo-type1-subset.c +++ b/src/cairo-type1-subset.c @@ -1126,9 +1126,10 @@ cairo_type1_font_subset_generate (void *abstract_font, goto fail; font->output = _cairo_output_stream_create (type1_font_write, NULL, font); - status = _cairo_output_stream_get_status (font->output); - if (status) + if (_cairo_output_stream_get_status (font->output)) { + status = _cairo_output_stream_destroy (font->output); goto fail; + } status = cairo_type1_font_subset_write (font, name); if (status) |