Ævar suggested that using typemaps quite a bit of code could be cleaned
up and have some of the default sanity checks for free (see generated C
code in Brotli.c).
This also allows removing some of the perl sub wrappers, althought there
are some more cleanups that could be done on that, and the impact is
arguably low-to-none.
#define BUFFER_SIZE 1048576
#define BUFFER_SIZE 1048576
+typedef struct brotli_decoder {
+ BrotliDecoderState *decoder;
+}* IO__Uncompress__Brotli;
+
+typedef struct brotli_encoder {
+ BrotliEncoderState *encoder;
+}* IO__Compress__Brotli;
+
+
MODULE = IO::Compress::Brotli PACKAGE = IO::Uncompress::Brotli
PROTOTYPES: ENABLE
MODULE = IO::Compress::Brotli PACKAGE = IO::Uncompress::Brotli
PROTOTYPES: ENABLE
SV* buffer
PREINIT:
size_t decoded_size;
SV* buffer
PREINIT:
size_t decoded_size;
-SV* BrotliDecoderCreateInstance()
+IO::Uncompress::Brotli
+create(class)
+ SV* class
- RETVAL = newSViv((IV)BrotliDecoderCreateInstance(NULL, NULL, NULL));
+ Newx(RETVAL, 1, struct brotli_decoder);
+ RETVAL->decoder = BrotliDecoderCreateInstance(NULL, NULL, NULL);
-void BrotliDecoderDestroyInstance(state)
- SV* state
+void
+DESTROY(self)
+ IO::Uncompress::Brotli self
- BrotliDecoderDestroyInstance((BrotliDecoderState*)SvIV(state));
+ BrotliDecoderDestroyInstance(self->decoder);
+ Safefree(self);
-SV* BrotliDecoderDecompressStream(state, in)
- SV* state
+SV*
+decompress(self, in)
+ IO::Uncompress::Brotli self
SV* in
PREINIT:
uint8_t *next_in, *next_out, *buffer;
SV* in
PREINIT:
uint8_t *next_in, *next_out, *buffer;
while(result == BROTLI_RESULT_NEEDS_MORE_OUTPUT) {
next_out = buffer;
available_out=BUFFER_SIZE;
while(result == BROTLI_RESULT_NEEDS_MORE_OUTPUT) {
next_out = buffer;
available_out=BUFFER_SIZE;
- result = BrotliDecoderDecompressStream( (BrotliDecoderState*) SvIV(state),
+ result = BrotliDecoderDecompressStream( self->decoder,
&available_in,
(const uint8_t**) &next_in,
&available_out,
&available_in,
(const uint8_t**) &next_in,
&available_out,
-void BrotliDecoderSetCustomDictionary(state, dict)
- SV* state
+void
+set_dictionary(self, dict)
+ IO::Uncompress::Brotli self
SV* dict
PREINIT:
size_t size;
uint8_t *data;
CODE:
data = SvPV(dict, size);
SV* dict
PREINIT:
size_t size;
uint8_t *data;
CODE:
data = SvPV(dict, size);
- BrotliDecoderSetCustomDictionary((BrotliDecoderState*) SvIV(state), size, data);
+ BrotliDecoderSetCustomDictionary(self->decoder, size, data);
MODULE = IO::Compress::Brotli PACKAGE = IO::Compress::Brotli
PROTOTYPES: ENABLE
MODULE = IO::Compress::Brotli PACKAGE = IO::Compress::Brotli
PROTOTYPES: ENABLE
-SV* bro(buffer, quality=BROTLI_DEFAULT_QUALITY, lgwin=BROTLI_DEFAULT_WINDOW)
+SV*
+bro(buffer, quality=BROTLI_DEFAULT_QUALITY, lgwin=BROTLI_DEFAULT_WINDOW)
SV* buffer
U32 quality
U32 lgwin
SV* buffer
U32 quality
U32 lgwin
-SV* BrotliEncoderCreateInstance()
+IO::Compress::Brotli
+create(class)
+ SV* class
- RETVAL = newSViv((IV)BrotliEncoderCreateInstance(NULL, NULL, NULL));
+ Newx(RETVAL, 1, struct brotli_encoder);
+ RETVAL->encoder = BrotliEncoderCreateInstance(NULL, NULL, NULL);
-SV* BrotliEncoderSetWindow(state, window)
- SV* state
+SV*
+window(self, window)
+ IO::Compress::Brotli self
U32 window
CODE:
if( window < kBrotliMinWindowBits || window > kBrotliMaxWindowBits ) {
croak("Invalid window value");
}
U32 window
CODE:
if( window < kBrotliMinWindowBits || window > kBrotliMaxWindowBits ) {
croak("Invalid window value");
}
- if( BrotliEncoderSetParameter((BrotliEncoderState*) SvIV(state), BROTLI_PARAM_LGWIN, window) )
+ if( BrotliEncoderSetParameter(self->encoder, BROTLI_PARAM_LGWIN, window) )
RETVAL = newSVuv(1);
else
RETVAL = newSVuv(0);
OUTPUT:
RETVAL
RETVAL = newSVuv(1);
else
RETVAL = newSVuv(0);
OUTPUT:
RETVAL
-SV* BrotliEncoderSetQuality(state, quality)
- SV* state
+SV*
+quality(self, quality)
+ IO::Compress::Brotli self
U32 quality
CODE:
if( quality < BROTLI_MIN_QUALITY || quality > BROTLI_MAX_QUALITY ) {
croak("Invalid quality value");
}
U32 quality
CODE:
if( quality < BROTLI_MIN_QUALITY || quality > BROTLI_MAX_QUALITY ) {
croak("Invalid quality value");
}
- if( BrotliEncoderSetParameter((BrotliEncoderState*) SvIV(state), BROTLI_PARAM_QUALITY, quality) )
+ if( BrotliEncoderSetParameter(self->encoder, BROTLI_PARAM_QUALITY, quality) )
RETVAL = newSVuv(1);
else
RETVAL = newSVuv(0);
OUTPUT:
RETVAL
RETVAL = newSVuv(1);
else
RETVAL = newSVuv(0);
OUTPUT:
RETVAL
-SV* BrotliEncoderSetMode(state, mode)
- SV* state
+SV*
+_mode(self, mode)
+ IO::Compress::Brotli self
- if( BrotliEncoderSetParameter((BrotliEncoderState*) SvIV(state), BROTLI_PARAM_MODE, mode) )
+ if( BrotliEncoderSetParameter(self->encoder, BROTLI_PARAM_MODE, mode) )
RETVAL = newSVuv(1);
else
RETVAL = newSVuv(0);
OUTPUT:
RETVAL
RETVAL = newSVuv(1);
else
RETVAL = newSVuv(0);
OUTPUT:
RETVAL
-SV* BrotliEncoderCompressStream(state, in, op)
- SV* state
+SV*
+_compress(self, in, op)
+ IO::Compress::Brotli self
while(1) {
next_out = buffer;
available_out = BUFFER_SIZE;
while(1) {
next_out = buffer;
available_out = BUFFER_SIZE;
- result = BrotliEncoderCompressStream( (BrotliEncoderState*) SvIV(state),
+ result = BrotliEncoderCompressStream( self->encoder,
(BrotliEncoderOperation) op,
&available_in,
(const uint8_t**) &next_in,
(BrotliEncoderOperation) op,
&available_in,
(const uint8_t**) &next_in,
- BrotliEncoderIsFinished((BrotliEncoderState*) SvIV(state)) ||
- (!available_in && !BrotliEncoderHasMoreOutput((BrotliEncoderState*) SvIV(state)))
+ BrotliEncoderIsFinished(self->encoder) ||
+ (!available_in && !BrotliEncoderHasMoreOutput(self->encoder))
) break;
}
Safefree(buffer);
OUTPUT:
RETVAL
) break;
}
Safefree(buffer);
OUTPUT:
RETVAL
-void BrotliEncoderDestroyInstance(state)
- SV* state
+void
+DESTROY(self)
+ IO::Compress::Brotli self
- BrotliEncoderDestroyInstance((BrotliEncoderState*)SvIV(state));
+ BrotliEncoderDestroyInstance(self->encoder);
-void BrotliEncoderSetCustomDictionary(state, dict)
- SV* state
+void
+set_dictionary(self, dict)
+ IO::Compress::Brotli self
SV* dict
PREINIT:
size_t size;
uint8_t *data;
CODE:
data = SvPV(dict, size);
SV* dict
PREINIT:
size_t size;
uint8_t *data;
CODE:
data = SvPV(dict, size);
- BrotliEncoderSetCustomDictionary((BrotliEncoderState*) SvIV(state), size, data);
+ BrotliEncoderSetCustomDictionary(self->encoder, size, data);
+
t/00-load.t
t/01-uncompress.t
t/02-roundtrip.t
t/00-load.t
t/01-uncompress.t
t/02-roundtrip.t
our $VERSION = '0.001001';
our $VERSION = '0.001001';
-sub create {
- my ($class) = @_;
- my $state = BrotliEncoderCreateInstance();
- bless \$state, $class
-}
-
-sub DESTROY {
- my ($self) = @_;
- BrotliEncoderDestroyInstance($$self)
-}
-
-sub quality {
- my ($self, $quality) = @_;
- BrotliEncoderSetQuality($$self, $quality)
-}
-
-sub window {
- my ($self, $window) = @_;
- BrotliEncoderSetWindow($$self, $window)
-}
-
my %BROTLI_ENCODER_MODE = ( generic => 0, text => 1, font => 2 );
sub mode {
my ($self, $mode) = @_;
my %BROTLI_ENCODER_MODE = ( generic => 0, text => 1, font => 2 );
sub mode {
my ($self, $mode) = @_;
die "Invalid encoder mode"
unless $BROTLI_ENCODER_MODE{$mode};
die "Invalid encoder mode"
unless $BROTLI_ENCODER_MODE{$mode};
- BrotliEncoderSetMode($$self, $mode)
};
sub compress {
my ($self, $data) = @_;
};
sub compress {
my ($self, $data) = @_;
- BrotliEncoderCompressStream($$self, $data, BROTLI_OPERATION_PROCESS )
+ $self->_compress($data, BROTLI_OPERATION_PROCESS )
}
sub flush {
my ($self) = @_;
}
sub flush {
my ($self) = @_;
- BrotliEncoderCompressStream($$self, '', BROTLI_OPERATION_FLUSH )
+ $self->_compress('', BROTLI_OPERATION_FLUSH )
}
sub finish {
my ($self) = @_;
}
sub finish {
my ($self) = @_;
- BrotliEncoderCompressStream($$self, '', BROTLI_OPERATION_FINISH )
-}
-
-# Untested, probably not working
-sub set_dictionary {
- my ($self, $dict) = @_;
- BrotliEncoderSetCustomDictionary($$self, $dict)
+ $self->_compress('', BROTLI_OPERATION_FINISH )
require XSLoader;
XSLoader::load('IO::Compress::Brotli', $VERSION);
require XSLoader;
XSLoader::load('IO::Compress::Brotli', $VERSION);
-sub create {
- my ($class) = @_;
- my $state = BrotliDecoderCreateInstance();
- bless \$state, $class
-}
-
-sub DESTROY {
- my ($self) = @_;
- BrotliDecoderDestroyInstance($$self)
-}
-
-sub decompress {
- my ($self, $data) = @_;
- BrotliDecoderDecompressStream($$self, $data)
-}
-
-# Untested, probably not working
-sub set_dictionary {
- my ($self, $dict) = @_;
- BrotliDecoderSetCustomDictionary($$self, $dict)
-}
-
--- /dev/null
+IO::Compress::Brotli T_PTROBJ
+IO::Uncompress::Brotli T_PTROBJ