source: lib/ior-zlib.c @ c66068d

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since c66068d was c66068d, checked in by Perry Lorier <perry@…>, 12 years ago

Rewrite the libtrace io subsystem to use the new wandio abstraction layer.

  • Property mode set to 100644
File size: 2.4 KB
Line 
1#include <zlib.h>
2#include "wandio.h"
3#include <sys/types.h>
4#include <sys/stat.h>
5#include <fcntl.h>
6#include <stdlib.h>
7#include <string.h>
8
9enum err_t {
10        ERR_OK  = 1,
11        ERR_EOF = 0,
12        ERR_ERROR = -1
13};
14
15struct zlib_t {
16        z_stream strm;
17        Bytef inbuff[1024*1024]; /* bytef is what zlib uses for buffer pointers */
18        int outoffset;
19        io_t *parent;
20        enum err_t err;
21};
22
23
24extern io_source_t zlib_source; 
25
26#define DATA(io) ((struct zlib_t *)((io)->data))
27#define min(a,b) ((a)<(b) ? (a) : (b))
28
29io_t *zlib_open(io_t *parent)
30{
31        io_t *io;
32        if (!parent)
33                return NULL;
34        io = malloc(sizeof(io_t));
35        io->source = &zlib_source;
36        io->data = malloc(sizeof(struct zlib_t));
37
38        DATA(io)->parent = parent;
39
40        DATA(io)->strm.next_in = NULL;
41        DATA(io)->strm.avail_in = 0;
42        DATA(io)->strm.next_out = NULL;
43        DATA(io)->strm.avail_out = 0;
44        DATA(io)->strm.zalloc = Z_NULL;
45        DATA(io)->strm.zfree = Z_NULL;
46        DATA(io)->strm.opaque = NULL;
47        DATA(io)->err = ERR_OK;
48
49        inflateInit2(&DATA(io)->strm, 15 | 32);
50
51        return io;
52}
53
54
55static off_t zlib_read(io_t *io, char *buffer, off_t len)
56{
57        if (DATA(io)->err == ERR_EOF)
58                return 0; /* EOF */
59        if (DATA(io)->err == ERR_ERROR)
60                return -1; /* ERROR! */
61
62        DATA(io)->strm.avail_out = len;
63        DATA(io)->strm.next_out = (Bytef*)buffer;
64
65        while (DATA(io)->err == ERR_OK && DATA(io)->strm.avail_out > 0) {
66                while (DATA(io)->strm.avail_in <= 0) {
67                        int bytes_read = wandio_read(DATA(io)->parent, 
68                                (char*)DATA(io)->inbuff,
69                                sizeof(DATA(io)->inbuff));
70                        if (bytes_read == 0) /* EOF */
71                                return len-DATA(io)->strm.avail_out;
72                        if (bytes_read < 0) { /* Error */
73                                DATA(io)->err = ERR_ERROR;
74                                /* Return how much data we managed to read ok */
75                                if (DATA(io)->strm.avail_out != len) {
76                                        return len-DATA(io)->strm.avail_out;
77                                }
78                                /* Now return error */
79                                return -1;
80                        }
81                        DATA(io)->strm.next_in = DATA(io)->inbuff;
82                        DATA(io)->strm.avail_in = bytes_read;
83                }
84                /* Decompress some data into the output buffer */
85                int err=inflate(&DATA(io)->strm, 0);
86                switch(err) {
87                        case Z_OK:
88                                DATA(io)->err = ERR_OK;
89                                break;
90                        case Z_STREAM_END:
91                                DATA(io)->err = ERR_EOF;
92                                break;
93                        default:
94                                DATA(io)->err = ERR_ERROR;
95                }
96        }
97        /* Return the number of bytes decompressed */
98        return len-DATA(io)->strm.avail_out;
99}
100
101static void zlib_close(io_t *io)
102{
103        inflateEnd(&DATA(io)->strm);
104        wandio_destroy(DATA(io)->parent);
105        free(io->data);
106        free(io);
107}
108
109io_source_t zlib_source = {
110        "zlib",
111        zlib_read,
112        NULL,   /* peek */
113        NULL,   /* tell */
114        NULL,   /* seek */
115        zlib_close
116};
117
Note: See TracBrowser for help on using the repository browser.