X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=Brotli.xs;h=abc218dd37bc4280af4c104eaf69326eae93461e;hb=bcdfc2c83a98e89eb32fbe161367106a582b4b76;hp=c28e36cec9af935f85eb9471832de9146d7bd640;hpb=0cea41a5720ced6122c74ae242472012afe06c28;p=io-compress-brotli.git diff --git a/Brotli.xs b/Brotli.xs index c28e36c..abc218d 100644 --- a/Brotli.xs +++ b/Brotli.xs @@ -200,96 +200,42 @@ _mode(self, mode) RETVAL SV* -compress(self, in) +_compress(self, in = &PL_sv_undef) IO::Compress::Brotli self SV* in - CODE: - ENTER; - SAVETMPS; - - PUSHMARK(SP); - XPUSHs(ST(0)); - XPUSHs(in); - XPUSHs(newSVuv(BROTLI_OPERATION_PROCESS)); - PUTBACK; - - call_method("_compress", G_SCALAR); - - SPAGAIN; - - RETVAL = POPs; - SvREFCNT_inc(RETVAL); - - PUTBACK; - FREETMPS; - LEAVE; - OUTPUT: - RETVAL - -SV* -flush(self) - IO::Compress::Brotli self - CODE: - ENTER; - SAVETMPS; - - PUSHMARK(SP); - XPUSHs(ST(0)); - XPUSHs(newSVpv("", 0)); - XPUSHs(newSVuv(BROTLI_OPERATION_FLUSH)); - PUTBACK; - - call_method("_compress", G_SCALAR); - - SPAGAIN; - - RETVAL = POPs; - SvREFCNT_inc(RETVAL); - - PUTBACK; - FREETMPS; - LEAVE; - OUTPUT: - RETVAL - -SV* -finish(self) - IO::Compress::Brotli self - CODE: - ENTER; - SAVETMPS; - - PUSHMARK(SP); - XPUSHs(ST(0)); - XPUSHs(newSVpv("", 0)); - XPUSHs(newSVuv(BROTLI_OPERATION_FINISH)); - PUTBACK; - - call_method("_compress", G_SCALAR); - - SPAGAIN; - - RETVAL = POPs; - SvREFCNT_inc(RETVAL); - - PUTBACK; - FREETMPS; - LEAVE; - OUTPUT: - RETVAL - -SV* -_compress(self, in, op) - 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; @@ -335,4 +281,3 @@ set_dictionary(self, dict) CODE: data = SvPV(dict, size); BrotliEncoderSetCustomDictionary(self->encoder, size, data); -