X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=Brotli.xs;h=5b7d008594a958e07e8a12f5be841a9655bd52d8;hb=390e0fef70ee97b173f25b04ce6308c572a0660a;hp=dff0a63f3b6017564e51b6582f683e28bcb19053;hpb=d3f7abb9b3f9f7d60a2de0f5018b837b2db4ba4f;p=io-compress-brotli.git diff --git a/Brotli.xs b/Brotli.xs index dff0a63..5b7d008 100644 --- a/Brotli.xs +++ b/Brotli.xs @@ -157,60 +157,80 @@ create(class) OUTPUT: RETVAL -SV* -window(self, window) +bool BrotliEncoderSetParameter(self, value) IO::Compress::Brotli self - U32 window - CODE: - if( window < kBrotliMinWindowBits || window > kBrotliMaxWindowBits ) { - croak("Invalid window value"); + U32 value + ALIAS: + window = 1 + quality = 2 + _mode = 3 + PREINIT: + BrotliEncoderParameter param; + INIT: + switch(ix){ + case 0: + croak("BrotliEncoderSetParameter may not be called directly"); + break; + case 1: + if( value < kBrotliMinWindowBits || value > kBrotliMaxWindowBits ) { + croak("Invalid window value"); + } + param = BROTLI_PARAM_LGWIN; + break; + case 2: + if( value < BROTLI_MIN_QUALITY || value > BROTLI_MAX_QUALITY ) { + croak("Invalid quality value"); + } + param = BROTLI_PARAM_QUALITY; + break; + case 3: + /* Validation done on Perl side */ + param = BROTLI_PARAM_MODE; + break; + default: + croak("Impossible ix in BrotliEncoderSetParameter"); + break; } - if( BrotliEncoderSetParameter(self->encoder, BROTLI_PARAM_LGWIN, window) ) - RETVAL = newSVuv(1); - else - RETVAL = newSVuv(0); - OUTPUT: - RETVAL + C_ARGS: + self->encoder, param, value SV* -quality(self, quality) - IO::Compress::Brotli self - U32 quality - CODE: - if( quality < BROTLI_MIN_QUALITY || quality > BROTLI_MAX_QUALITY ) { - croak("Invalid quality value"); - } - if( BrotliEncoderSetParameter(self->encoder, BROTLI_PARAM_QUALITY, quality) ) - RETVAL = newSVuv(1); - else - RETVAL = newSVuv(0); - OUTPUT: - RETVAL - -SV* -_mode(self, mode) - IO::Compress::Brotli self - U32 mode - CODE: - if( BrotliEncoderSetParameter(self->encoder, BROTLI_PARAM_MODE, mode) ) - RETVAL = newSVuv(1); - else - RETVAL = newSVuv(0); - OUTPUT: - RETVAL - -SV* -_compress(self, in, op) +_compress(self, in = &PL_sv_undef) IO::Compress::Brotli self SV* in - U8 op + ALIAS: + compress = 1 + flush = 2 + finish = 3 PREINIT: uint8_t *next_in, *next_out, *buffer; size_t available_in, available_out; BROTLI_BOOL result; + BrotliEncoderOperation op; CODE: - next_in = (uint8_t*) SvPV(in, available_in); + switch(ix) { + case 0: + croak("_compress may not be called directly"); + break; + case 1: + op = BROTLI_OPERATION_PROCESS; + break; + case 2: + op = BROTLI_OPERATION_FLUSH; + break; + case 3: + op = BROTLI_OPERATION_FINISH; + break; + default: + croak("Impossible ix in _compress"); + break; + } + Newx(buffer, BUFFER_SIZE, uint8_t); + if(in == &PL_sv_undef) + next_in = (uint8_t*) buffer, available_in = 0; + else + next_in = (uint8_t*) SvPV(in, available_in); RETVAL = newSVpv("", 0); while(1) { next_out = buffer; @@ -245,6 +265,7 @@ DESTROY(self) IO::Compress::Brotli self CODE: BrotliEncoderDestroyInstance(self->encoder); + Safefree(self); void set_dictionary(self, dict) @@ -256,4 +277,3 @@ set_dictionary(self, dict) CODE: data = SvPV(dict, size); BrotliEncoderSetCustomDictionary(self->encoder, size, data); -