source: lib/ior-bzip.c @ 7f2612c

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 7f2612c was 7f2612c, checked in by Shane Alcock <salcock@…>, 12 years ago
  • Can't use errno without errno.h!
  • Property mode set to 100644
File size: 2.5 KB
Line 
1#include "wandio.h"
2#include <bzlib.h>
3#include <sys/types.h>
4#include <sys/stat.h>
5#include <fcntl.h>
6#include <stdlib.h>
7#include <string.h>
8#include <errno.h>
9
10enum err_t {
11        ERR_OK  = 1,
12        ERR_EOF = 0,
13        ERR_ERROR = -1
14};
15
16struct bz_t {
17        bz_stream strm;
18        char inbuff[1024*1024];
19        int outoffset;
20        io_t *parent;
21        enum err_t err;
22};
23
24
25extern io_source_t bz_source; 
26
27#define DATA(io) ((struct bz_t *)((io)->data))
28#define min(a,b) ((a)<(b) ? (a) : (b))
29
30io_t *bz_open(io_t *parent)
31{
32        io_t *io;
33        if (!parent)
34                return NULL;
35        io = malloc(sizeof(io_t));
36        io->source = &bz_source;
37        io->data = malloc(sizeof(struct bz_t));
38
39        DATA(io)->parent = parent;
40
41        DATA(io)->strm.next_in = NULL;
42        DATA(io)->strm.avail_in = 0;
43        DATA(io)->strm.next_out = NULL;
44        DATA(io)->strm.avail_out = 0;
45        DATA(io)->strm.bzalloc = NULL;
46        DATA(io)->strm.bzfree = NULL;
47        DATA(io)->strm.opaque = NULL;
48        DATA(io)->err = ERR_OK;
49
50        BZ2_bzDecompressInit(&DATA(io)->strm, 
51                0,      /* Verbosity */
52                0);     /* small */
53
54        return io;
55}
56
57
58static off_t bz_read(io_t *io, char *buffer, off_t len)
59{
60        if (DATA(io)->err == ERR_EOF)
61                return 0; /* EOF */
62        if (DATA(io)->err == ERR_ERROR) {
63                errno=EIO;
64                return -1; /* ERROR! */
65        }
66
67        DATA(io)->strm.avail_out = len;
68        DATA(io)->strm.next_out = buffer;
69
70        while (DATA(io)->err == ERR_OK && DATA(io)->strm.avail_out > 0) {
71                while (DATA(io)->strm.avail_in <= 0) {
72                        int bytes_read = wandio_read(DATA(io)->parent, 
73                                DATA(io)->inbuff,
74                                sizeof(DATA(io)->inbuff));
75                        if (bytes_read == 0) /* EOF */
76                                return len-DATA(io)->strm.avail_out;
77                        if (bytes_read < 0) { /* Error */
78                                /* Errno should already be set */
79                                DATA(io)->err = ERR_ERROR;
80                                /* Return how much data we managed to read ok */
81                                if (DATA(io)->strm.avail_out != len) {
82                                        return len-DATA(io)->strm.avail_out;
83                                }
84                                /* Now return error */
85                                return -1;
86                        }
87                        DATA(io)->strm.next_in = DATA(io)->inbuff;
88                        DATA(io)->strm.avail_in = bytes_read;
89                }
90                /* Decompress some data into the output buffer */
91                int err=BZ2_bzDecompress(&DATA(io)->strm);
92                switch(err) {
93                        case BZ_OK:
94                                DATA(io)->err = ERR_OK;
95                                break;
96                        case BZ_STREAM_END:
97                                DATA(io)->err = ERR_EOF;
98                                break;
99                        default:
100                                errno=EIO;
101                                DATA(io)->err = ERR_ERROR;
102                }
103        }
104        /* Return the number of bytes decompressed */
105        return len-DATA(io)->strm.avail_out;
106}
107
108static void bz_close(io_t *io)
109{
110        BZ2_bzDecompressEnd(&DATA(io)->strm);
111        wandio_destroy(DATA(io)->parent);
112        free(io->data);
113        free(io);
114}
115
116io_source_t bz_source = {
117        "bzip",
118        bz_read,
119        NULL,   /* peek */
120        NULL,   /* tell */
121        NULL,   /* seek */
122        bz_close
123};
124
Note: See TracBrowser for help on using the repository browser.