summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2008-01-16 16:29:19 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2008-01-16 16:40:01 +0000
commit5cbc45488e276cb6e6ecfa7bc7dd4fae342de85e (patch)
tree672c700de47687c25c68cb22743c0a058e4b06d1 /src
parent2c10c7559db11ccf511e119f4d4fb2da97508786 (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.c3
-rw-r--r--src/cairo-deflate-stream.c7
-rw-r--r--src/cairo-output-stream-private.h3
-rw-r--r--src/cairo-output-stream.c26
-rw-r--r--src/cairo-ps-surface.c10
-rw-r--r--src/cairo-type1-fallback.c8
-rw-r--r--src/cairo-type1-subset.c5
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)