diff options
Diffstat (limited to 'src/gallium/auxiliary/os/os_stream_stdc.c')
-rw-r--r-- | src/gallium/auxiliary/os/os_stream_stdc.c | 78 |
1 files changed, 43 insertions, 35 deletions
diff --git a/src/gallium/auxiliary/os/os_stream_stdc.c b/src/gallium/auxiliary/os/os_stream_stdc.c index caa60c0b50..9e7ed71107 100644 --- a/src/gallium/auxiliary/os/os_stream_stdc.c +++ b/src/gallium/auxiliary/os/os_stream_stdc.c @@ -40,65 +40,73 @@ #include "os_stream.h" -struct os_stream +struct os_stdc_stream { + struct os_stream base; + FILE *file; }; -struct os_stream * -os_stream_create(const char *filename, size_t max_size) +static INLINE struct os_stdc_stream * +os_stdc_stream(struct os_stream *stream) { - struct os_stream *stream; - - (void)max_size; - - stream = (struct os_stream *)calloc(1, sizeof(struct os_stream)); - if(!stream) - goto no_stream; - - stream->file = fopen(filename, "w"); - if(!stream->file) - goto no_file; - - return stream; - -no_file: + return (struct os_stdc_stream *)stream; +} + + +static void +os_stdc_stream_close(struct os_stream *_stream) +{ + struct os_stdc_stream *stream = os_stdc_stream(_stream); + + fclose(stream->file); + free(stream); -no_stream: - return NULL; } -boolean -os_stream_write(struct os_stream *stream, const void *data, size_t size) +static boolean +os_stdc_stream_write(struct os_stream *_stream, const void *data, size_t size) { - if(!stream) - return FALSE; - + struct os_stdc_stream *stream = os_stdc_stream(_stream); + return fwrite(data, size, 1, stream->file) == size ? TRUE : FALSE; } -void -os_stream_flush(struct os_stream *stream) +static void +os_stdc_stream_flush(struct os_stream *_stream) { - if(!stream) - return; - + struct os_stdc_stream *stream = os_stdc_stream(_stream); + fflush(stream->file); } -void -os_stream_close(struct os_stream *stream) +struct os_stream * +os_file_stream_create(const char *filename) { + struct os_stdc_stream *stream; + + stream = (struct os_stdc_stream *)calloc(1, sizeof(*stream)); if(!stream) - return; - - fclose(stream->file); + goto no_stream; + + stream->base.close = &os_stdc_stream_close; + stream->base.write = &os_stdc_stream_write; + stream->base.flush = &os_stdc_stream_flush; + stream->file = fopen(filename, "w"); + if(!stream->file) + goto no_file; + + return &stream->base; + +no_file: free(stream); +no_stream: + return NULL; } |