Modified: commons/sandbox/runtime/trunk/src/main/native/shared/bzip2.c
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/bzip2.c?rev=1158327&r1=1158326&r2=1158327&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/bzip2.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/bzip2.c Tue Aug 16 
15:40:07 2011
@@ -36,21 +36,17 @@ void _cr_bz_internal_error(int errorcode
 
 typedef struct acr_bzstream {
     bz_stream           bz;
-    int                 compressing;
     unsigned int        blen;
-    jbyteArray          nia;
-    jbyte              *nip;
-    jbyteArray          noa;
-    jbyte              *nop;
+    int                 state;
+    jboolean            eos;
+    void               *next_array;
+    char               *next_data;
 } acr_bzstream;
 
 
 static const char *bz_errmsg(int err)
 {
     switch (err) {
-        case BZ_SEQUENCE_ERROR:
-            return "Out of sequence method call";
-        break;
         case BZ_DATA_ERROR:
             return "Data integrity error";
         break;
@@ -63,15 +59,15 @@ static const char *bz_errmsg(int err)
     return "Unknown Bzip2 error";
 }
 
-ACR_BZIP2_EXPORT(jstring, Bzip2, sver0)(JNI_STDARGS)
+ACR_BZIP2_EXPORT(jstring, Bzip2, version0)(JNI_STDARGS)
 {
     return AcrNewJavaStringU(env, BZ2_bzlibVersion());
 }
 
-ACR_BZIP2_EXPORT(jlong, Bzip2, compress0)(JNI_STDARGS, jbyteArray src, jint 
spos,
-                                          jbyteArray dst, jint dpos, jint dlen,
-                                          jint len, jint blockSize100k,
-                                          jint workFactor)
+ACR_BZIP2_EXPORT(jlong, Bzip2, b2bdeflate0)(JNI_STDARGS, jbyteArray src, jint 
spos,
+                                            jbyteArray dst, jint dpos, jint 
dlen,
+                                            jint len, jint blockSize100k,
+                                            jint workFactor)
 {
     unsigned int dstLen;
     char *scp;
@@ -103,10 +99,10 @@ ACR_BZIP2_EXPORT(jlong, Bzip2, compress0
     return 0;
 }
 
-ACR_BZIP2_EXPORT(jint, Bzip2, compress1)(JNI_STDARGS, jobject src, jint spos,
-                                         jobject dst, jint dpos, jint dlen,
-                                         jint len, jint blockSize100k,
-                                         jint workFactor)
+ACR_BZIP2_EXPORT(jint, Bzip2, b2bdeflate1)(JNI_STDARGS, jobject src, jint spos,
+                                           jobject dst, jint dpos, jint dlen,
+                                           jint len, jint blockSize100k,
+                                           jint workFactor)
 {
     unsigned int dstLen;
     char *scp;
@@ -135,9 +131,9 @@ ACR_BZIP2_EXPORT(jint, Bzip2, compress1)
     return 0;
 }
 
-ACR_BZIP2_EXPORT(jint, Bzip2, compress2)(JNI_STDARGS, jlong src, jlong dst,
-                                         jlong dlen, jlong len, jint 
blockSize100k,
-                                         jint workFactor)
+ACR_BZIP2_EXPORT(jlong, Bzip2, b2bdeflate2)(JNI_STDARGS, jlong src, jlong dst,
+                                            jlong dlen, jlong len, jint 
blockSize100k,
+                                            jint workFactor)
 {
     unsigned int dstLen;
     char *scp = J2P(src, char *);
@@ -162,7 +158,7 @@ ACR_BZIP2_EXPORT(jint, Bzip2, compress2)
     return 0;
 }
 
-ACR_BZIP2_EXPORT(jint, Bzip2, decompress0)(JNI_STDARGS, jbyteArray src, jint 
spos,
+ACR_BZIP2_EXPORT(jint, Bzip2, b2binflate0)(JNI_STDARGS, jbyteArray src, jint 
spos,
                                            jbyteArray dst, jint dpos, jint 
dlen,
                                            jint len, jboolean small)
 {
@@ -197,7 +193,7 @@ ACR_BZIP2_EXPORT(jint, Bzip2, decompress
     return 0;
 }
 
-ACR_BZIP2_EXPORT(jint, Bzip2, decompress1)(JNI_STDARGS, jobject src, jint spos,
+ACR_BZIP2_EXPORT(jint, Bzip2, b2binflate1)(JNI_STDARGS, jobject src, jint spos,
                                            jobject dst, jint dpos, jint dlen,
                                            jint len, jboolean small)
 {
@@ -230,7 +226,7 @@ ACR_BZIP2_EXPORT(jint, Bzip2, decompress
     return 0;
 }
 
-ACR_BZIP2_EXPORT(jlong, Bzip2, decompress2)(JNI_STDARGS, jlong src,
+ACR_BZIP2_EXPORT(jlong, Bzip2, b2binflate2)(JNI_STDARGS, jlong src,
                                             jlong dst, jlong dlen,
                                             jlong len, jboolean small)
 {
@@ -260,179 +256,394 @@ ACR_BZIP2_EXPORT(jlong, Bzip2, decompres
     return 0;
 }
 
-ACR_BZIP2_EXPORT(jint, Bzip2, size0)(JNI_STDARGS)
+ACR_BZIP2_EXPORT(jint, Libbzip2, bzsize0)(JNI_STDARGS)
 {
-    int ssize = ISIZEOF(acr_bzstream);
+    int ssize  = ISIZEOF(acr_bzstream);
     ACR_BZSIZE = ACR_ALIGN_DEFAULT(ssize);
     return ACR_BZSIZE;
 }
 
-ACR_BZIP2_EXPORT(void, Bzip2, init0)(JNI_STDARGS, jbyteArray stream,
-                                     jint bsize)
+ACR_BZIP2_EXPORT(jlong, Libbzip2, newStream)(JNI_STDARGS, jint bsize)
 {
-    acr_bzstream *s = JARRAY_CRITICAL(acr_bzstream, stream);
-
-    memset(&s->bz, 0, sizeof(bz_stream));
-    s->blen = bsize;
-    RELEASE_CRITICAL(stream, s);
+    acr_bzstream *s;
+    s = ACR_EALLOC(acr_bzstream, bsize);
+    if (s != 0)
+        s->blen = bsize;
+    return P2J(s);
 }
 
-ACR_BZIP2_EXPORT(jint, Bzip2, bzinit0)(JNI_STDARGS, jbyteArray stream,
-                                       jint blockSize100k,
-                                       jint workFactor)
+ACR_BZIP2_EXPORT(jint, Libbzip2, compressInit)(JNI_STDARGS,
+                                               jlong stream,
+                                               jint blockSize100k,
+                                               jint workFactor)
 {
     int rc;
-    acr_bzstream *s = JARRAY_CRITICAL(acr_bzstream, stream);
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
 
     rc = BZ2_bzCompressInit((bz_stream *)s, blockSize100k, 0, workFactor);
-    s->compressing = 1;
-    RELEASE_CRITICAL(stream, s);    
+    s->state = BZ_RUN;
+    s->eos   = JNI_FALSE;
+        
     return rc;
 }
 
-ACR_BZIP2_EXPORT(jlong, Bzip2, bzinit1)(JNI_STDARGS, jbyteArray stream,
-                                        jboolean small)
+ACR_BZIP2_EXPORT(jlong, Libbzip2, decompressInit)(JNI_STDARGS, jlong stream,
+                                                  jboolean small)
 {
     int rc;
-    acr_bzstream *s = JARRAY_CRITICAL(acr_bzstream, stream);
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
 
     rc = BZ2_bzDecompressInit((bz_stream *)s, 0, small);
-    s->compressing = 0;
-    RELEASE_CRITICAL(stream, s);
+    s->state = BZ_RUN;
+    s->eos   = JNI_FALSE;
+    
     return rc;
 }
 
-ACR_BZIP2_EXPORT(jint, Bzip2, end0)(JNI_STDARGS, jbyteArray stream)
+
+ACR_BZIP2_EXPORT(jint, Libbzip2, setInput0)(JNI_STDARGS, jlong stream,
+                                           jbyteArray src, jint off, jint len)
 {
-    int rc;
-    acr_bzstream *s = JARRAY_CRITICAL(acr_bzstream, stream);
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
 
-    if (s->compressing)
-        rc = BZ2_bzCompressEnd((bz_stream *)s);
-    else
-        rc = BZ2_bzDecompressEnd((bz_stream *)s);
-    if (s->nip != 0 && s->nia != 0)
-        (*env)->ReleaseByteArrayElements(env, s->nia, s->nip, 0);
-    if (s->nop != 0 && s->noa != 0)
-        (*env)->ReleaseByteArrayElements(env, s->noa, s->nop, 0);
-    memset(&s->bz, 0, sizeof(bz_stream));
-    RELEASE_CRITICAL(stream, s);
-    return rc;
+    s->next_data = ACR_REALLOC(char, s->next_array, len);
+    if (s->next_data == 0)
+        return BZ_MEM_ERROR;
+    s->next_array  = s->next_data;
+    (*env)->GetByteArrayRegion(env, src, off, len, s->next_array);
+    s->bz.next_in  = s->next_data + off;
+    s->bz.avail_in = len;
+    return BZ_OK;
+}
+
+ACR_BZIP2_EXPORT(jint, Libbzip2, setInput1)(JNI_STDARGS, jlong stream,
+                                            jobject src, jint off, jint len)
+{
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
+
+    ACR_MFREE(s->next_array);
+    s->next_data = (*env)->GetDirectBufferAddress(env, src);
+    if (s->next_data == 0)
+        return BZ_PARAM_ERROR;
+    s->bz.next_in  = s->next_data + off;
+    s->bz.avail_in = len;
+    return BZ_OK;
 }
 
-ACR_BZIP2_EXPORT(jint, Bzip2, nextinp0)(JNI_STDARGS, jbyteArray stream,
-                                        jbyteArray src, jint off, jint len)
+ACR_BZIP2_EXPORT(jint, Libbzip2, setInput2)(JNI_STDARGS, jlong stream,
+                                            jlong src, jlong len)
 {
     int rc = BZ_PARAM_ERROR;
-    acr_bzstream *s = JARRAY_CRITICAL(acr_bzstream, stream);
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
 
-    if (s->nip != 0 && s->nia != 0)
-        (*env)->ReleaseByteArrayElements(env, s->nia, s->nip, 0);
-    s->nia = 0;
-    s->nip = (*env)->GetByteArrayElements(env, src, 0);
-    if (s->nip != 0) {
-        s->nia = src;
-        s->bz.next_in  = (char *)s->nip + off;
-        s->bz.avail_in = len;
+    ACR_MFREE(s->next_array);
+    s->next_data  = J2P(src, char *);
+    if (s->next_data != 0) {
+        s->bz.next_in  = s->next_data;
+        s->bz.avail_in = (unsigned int)len;
         rc = BZ_OK;
     }
     return rc;
 }
 
-ACR_BZIP2_EXPORT(jint, Bzip2, nextinp1)(JNI_STDARGS, jbyteArray stream,
-                                        jobject src, jint off, jint len)
+ACR_BZIP2_EXPORT(void, Libbzip2, setInput3)(JNI_STDARGS, jlong stream)
 {
-    int rc = BZ_PARAM_ERROR;
-    acr_bzstream *s = JARRAY_CRITICAL(acr_bzstream, stream);
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
 
-    if (s->nip != 0 && s->nia != 0)
-        (*env)->ReleaseByteArrayElements(env, s->nia, s->nip, 0);
-    s->nia = 0;
-    s->nip = (*env)->GetDirectBufferAddress(env, src);
-    if (s->nip != 0) {
-        s->bz.next_in  = (char *)s->nip + off;
-        s->bz.avail_in = len;
-        rc = BZ_OK;
+    ACR_MFREE(s->next_array);
+    /* Use internal buffer */
+    s->bz.next_in  = ACR_BZBUFF(s);
+    s->bz.avail_in = s->blen;    
+}
+
+ACR_BZIP2_EXPORT(jlong, Libbzip2, getTotalIn)(JNI_STDARGS, jlong stream)
+{
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
+    jlong rv = (jlong)s->bz.total_in_hi32 << 32 | (jlong)s->bz.total_in_lo32;
+    
+    return rv;
+}
+
+ACR_BZIP2_EXPORT(jlong, Libbzip2, getTotalOut)(JNI_STDARGS, jlong stream)
+{
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
+    return (jlong)s->bz.total_out_hi32 << 32 | (jlong)s->bz.total_out_lo32;
+}
+
+ACR_BZIP2_EXPORT(jint, Libbzip2, getAvailIn)(JNI_STDARGS, jlong stream)
+{
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
+    return s->bz.avail_in;
+}
+
+ACR_BZIP2_EXPORT(jlong, Libbzip2, getAvailOut)(JNI_STDARGS, jlong stream)
+{
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
+    return (jlong)s->bz.avail_out;
+}
+
+ACR_BZIP2_EXPORT(jboolean, Libbzip2, needsInput)(JNI_STDARGS, jlong stream)
+{
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
+
+    if (s->state == BZ_RUN && s->bz.avail_in == 0)
+        return JNI_TRUE;
+    else
+        return JNI_FALSE;
+}
+
+ACR_BZIP2_EXPORT(jboolean, Libbzip2, flush)(JNI_STDARGS, long stream)
+{
+    jboolean rv = JNI_FALSE;
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
+
+    if (s->state == BZ_RUN) {
+        s->state = BZ_FLUSH;
+        rv = JNI_TRUE;
     }
-    return rc;
+    return rv;
 }
 
-ACR_BZIP2_EXPORT(jint, Bzip2, nextinp2)(JNI_STDARGS, jbyteArray stream,
-                                        jlong src, jlong off, jlong len)
+ACR_BZIP2_EXPORT(jboolean, Libbzip2, finish)(JNI_STDARGS, long stream)
 {
-    int rc = BZ_PARAM_ERROR;
-    acr_bzstream *s = JARRAY_CRITICAL(acr_bzstream, stream);
+    jboolean rv = JNI_FALSE;
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
 
-    if (s->nip != 0 && s->nia != 0)
-        (*env)->ReleaseByteArrayElements(env, s->nia, s->nip, 0);
-    s->nia = 0;
-    s->nip = J2P(src, jbyte*);
-    if (s->nip != 0) {
-        s->bz.next_in  = (char *)s->nip + (ptrdiff_t)off;
-        s->bz.avail_in = (unsigned int)len;
-        rc = BZ_OK;
+    if (s->state == BZ_RUN) {
+        s->state = BZ_FINISH;
+        rv = JNI_TRUE;
     }
-    return rc;
+    return rv;
+}
+
+ACR_BZIP2_EXPORT(jboolean, Libbzip2, finished)(JNI_STDARGS, long stream)
+{
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
+    return s->eos;
+}
+
+ACR_BZIP2_EXPORT(void, Bzip2Deflater, close0)(JNI_STDARGS, jlong stream)
+{
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
+    BZ2_bzCompressEnd((bz_stream *)s);
+    AcrFree(s->next_array);
+    AcrFree(s);
 }
 
-ACR_BZIP2_EXPORT(void, Bzip2, nextinp3)(JNI_STDARGS, jbyteArray stream)
+ACR_BZIP2_EXPORT(jint, Bzip2Deflater, deflate0)(JNI_STDARGS, jlong stream)
 {
-    acr_bzstream *s = JARRAY_CRITICAL(acr_bzstream, stream);
+    int rc;
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
 
-    if (s->nip != 0 && s->nia != 0)
-        (*env)->ReleaseByteArrayElements(env, s->nia, s->nip, 0);
-    s->nia = 0;
-    s->nip = 0;
+    if (s->eos)
+        return -1;
     /* Use internal buffer */
-    s->bz.next_in  = ACR_BZBUFF(s);
-    s->bz.avail_in = ACR_BZSIZE;
+    s->bz.next_out  = ACR_BZBUFF(s);
+    s->bz.avail_out = s->blen;
+    rc = BZ2_bzCompress((bz_stream *)s, s->state);
+    if (rc == BZ_SEQUENCE_ERROR || rc == BZ_PARAM_ERROR) {
+        ACR_THROW_MSG(ACR_EX_EILLEGAL, 0);
+        return -1;
+    }
+    else if (rc == BZ_RUN_OK)
+        s->state = BZ_RUN;
+    else if (rc == BZ_STREAM_END)
+        s->eos = JNI_TRUE;
+    
+    return s->blen - s->bz.avail_out;
 }
 
-ACR_BZIP2_EXPORT(jint, Bzip2, nextout1)(JNI_STDARGS, jbyteArray stream,
-                                        jobject src, jint off, jint len)
+ACR_BZIP2_EXPORT(jint, Bzip2Deflater, deflate1)(JNI_STDARGS, jlong stream,
+                                                jbyteArray buf, jint off, jint 
len)
 {
-    int rc = BZ_PARAM_ERROR;
-    acr_bzstream *s = JARRAY_CRITICAL(acr_bzstream, stream);
+    int rc;
+    jbyte *next_out;
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
 
-    if (s->nop != 0 && s->noa != 0)
-        (*env)->ReleaseByteArrayElements(env, s->noa, s->nop, 0);
-    s->noa = 0;
-    s->nop = (*env)->GetDirectBufferAddress(env, src);
-    if (s->nop != 0) {
-        s->bz.next_out  = (char *)s->nop + off;
-        s->bz.avail_out = len;
-        rc = BZ_OK;
-    }
-    return rc;
+    if (s->eos)
+        return -1;
+    next_out = (*env)->GetByteArrayElements(env, buf, 0);
+    if (next_out == 0) {
+        ACR_THROW_MSG(ACR_EX_ENOMEM, 0);
+        return -1;
+    }
+
+    s->bz.next_out  = (char *)next_out + off;
+    s->bz.avail_out = len;
+    rc = BZ2_bzCompress((bz_stream *)s, s->state);
+    (*env)->ReleaseByteArrayElements(env, buf, next_out, 0);
+    if (rc == BZ_SEQUENCE_ERROR || rc == BZ_PARAM_ERROR) {
+        /* Report both errors as illegal */
+        ACR_THROW_MSG(ACR_EX_EILLEGAL, 0);
+        return -1;
+    }
+    else if (rc == BZ_RUN_OK)
+        s->state = BZ_RUN;
+    else if (rc == BZ_STREAM_END)
+        s->eos = JNI_TRUE;
+    
+    return len - s->bz.avail_out;
 }
 
-ACR_BZIP2_EXPORT(jint, Bzip2, nextout2)(JNI_STDARGS, jbyteArray stream,
-                                        jlong src, jlong off, jlong len)
+ACR_BZIP2_EXPORT(jint, Bzip2Deflater, deflate2)(JNI_STDARGS, jlong stream,
+                                                jobject buf, jint off, jint 
len)
 {
-    int rc = BZ_PARAM_ERROR;
-    acr_bzstream *s = JARRAY_CRITICAL(acr_bzstream, stream);
+    int rc;
+    char *next_out;
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
 
-    if (s->nop != 0 && s->noa != 0)
-        (*env)->ReleaseByteArrayElements(env, s->noa, s->nop, 0);
-    s->noa = 0;
-    s->nop = J2P(src, jbyte*);
-    if (s->nop != 0) {
-        s->bz.next_out  = (char *)s->nop + (ptrdiff_t)off;
-        s->bz.avail_out = (unsigned int)len;
-        rc = BZ_OK;
+    if (s->eos)
+        return -1;
+    next_out = (*env)->GetDirectBufferAddress(env, buf);
+    if (next_out == 0) {
+        ACR_THROW_MSG(ACR_EX_EINVAL, 0);
+        return -1;
+    }
+
+    s->bz.next_out  = next_out + off;
+    s->bz.avail_out = len;
+    rc = BZ2_bzCompress((bz_stream *)s, s->state);
+    if (rc == BZ_SEQUENCE_ERROR || rc == BZ_PARAM_ERROR) {
+        /* Report both errors as illegal */
+        ACR_THROW_MSG(ACR_EX_EILLEGAL, 0);
+        return -1;
+    }
+    else if (rc == BZ_RUN_OK)
+        s->state = BZ_RUN;
+    else if (rc == BZ_STREAM_END)
+        s->eos = JNI_TRUE;
+
+    return len - s->bz.avail_out;
+}
+
+ACR_BZIP2_EXPORT(jlong, Bzip2Deflater, deflate3)(JNI_STDARGS, jlong stream,
+                                                 jlong buf, jlong len)
+{
+    int rc;
+    char *next_out  = J2P(buf, char *);
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
+
+    if (s->eos)
+        return -1;
+
+    s->bz.next_out  = next_out;
+    s->bz.avail_out = (unsigned int)len;
+    rc = BZ2_bzCompress((bz_stream *)s, s->state);
+    if (rc == BZ_SEQUENCE_ERROR || rc == BZ_PARAM_ERROR) {
+        /* Report both errors as illegal */
+        ACR_THROW_MSG(ACR_EX_EILLEGAL, 0);
+        return -1;
     }
-    return rc;
+    else if (rc == BZ_RUN_OK)
+        s->state = BZ_RUN;
+    else if (rc == BZ_STREAM_END)
+        s->eos = JNI_TRUE;
+
+    return len - s->bz.avail_out;
+}
+
+ACR_BZIP2_EXPORT(void, Bzip2Inflater, close0)(JNI_STDARGS, jlong stream)
+{
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
+
+    BZ2_bzDecompressEnd((bz_stream *)s);
+    AcrFree(s->next_array);
+    AcrFree(s);    
 }
 
-ACR_BZIP2_EXPORT(void, Bzip2, nextout3)(JNI_STDARGS, jbyteArray stream)
+ACR_BZIP2_EXPORT(jint, Bzip2Inflater, inflate0)(JNI_STDARGS, jlong stream)
 {
-    acr_bzstream *s = JARRAY_CRITICAL(acr_bzstream, stream);
+    int rc;
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
 
-    if (s->nop != 0 && s->noa != 0)
-        (*env)->ReleaseByteArrayElements(env, s->noa, s->nop, 0);
-    s->noa = 0;
-    s->nop = 0;
+    if (s->eos)
+        return -1;
     /* Use internal buffer */
     s->bz.next_out  = ACR_BZBUFF(s);
-    s->bz.avail_out = ACR_BZSIZE;
+    s->bz.avail_out = s->blen;
+    rc = BZ2_bzDecompress((bz_stream *)s);
+    if (rc == BZ_STREAM_END)
+        s->eos = JNI_TRUE;
+    else if (rc == BZ_MEM_ERROR)
+        ACR_THROW_MSG(ACR_EX_ENOMEM, 0);
+    else if (rc != BZ_OK)
+        ACR_THROW_MSG(ACR_EX_EILSEQ, bz_errmsg(rc));
+    
+    return s->blen - s->bz.avail_out;
+}
+
+ACR_BZIP2_EXPORT(jint, Bzip2Inflater, inflate1)(JNI_STDARGS, jlong stream,
+                                                jbyteArray buf, jint off, jint 
len)
+{
+    int rc = BZ_PARAM_ERROR;
+    char *next_out;
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
+
+    if (s->eos)
+        return -1;
+    next_out = (*env)->GetPrimitiveArrayCritical(env, buf, 0);
+    if (next_out == 0) {
+        ACR_THROW_MSG(ACR_EX_ENOMEM, 0);
+        return -1;
+    }
+
+    s->bz.next_out  = next_out + off;
+    s->bz.avail_out = len;
+    rc = BZ2_bzDecompress((bz_stream *)s);
+    (*env)->ReleasePrimitiveArrayCritical(env, buf, next_out, 0);
+    if (rc == BZ_STREAM_END)
+        s->eos = JNI_TRUE;
+    else if (rc == BZ_MEM_ERROR)
+        ACR_THROW_MSG(ACR_EX_ENOMEM, 0);
+    else if (rc != BZ_OK)
+        ACR_THROW_MSG(ACR_EX_EILSEQ, bz_errmsg(rc));    
+    return len - s->bz.avail_out;
+}
+
+ACR_BZIP2_EXPORT(jint, Bzip2Inflater, inflate2)(JNI_STDARGS, jlong stream,
+                                                jobject buf, jint off, jint 
len)
+{
+    int rc = BZ_PARAM_ERROR;
+    char *next_out;
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
+
+    if (s->eos)
+        return -1;
+    next_out = (*env)->GetDirectBufferAddress(env, buf);
+    if (next_out == 0) {
+        ACR_THROW_MSG(ACR_EX_EINVAL, 0);
+        return -1;
+    }
+
+    s->bz.next_out  = next_out + off;
+    s->bz.avail_out = len;
+    rc = BZ2_bzDecompress((bz_stream *)s);
+    if (rc == BZ_STREAM_END)
+        s->eos = JNI_TRUE;
+    else if (rc == BZ_MEM_ERROR)
+        ACR_THROW_MSG(ACR_EX_ENOMEM, 0);
+    else if (rc != BZ_OK)
+        ACR_THROW_MSG(ACR_EX_EILSEQ, bz_errmsg(rc));
+    return len - s->bz.avail_out;
+}
+
+ACR_BZIP2_EXPORT(jlong, Bzip2Inflater, inflate3)(JNI_STDARGS, jlong stream,
+                                                 jlong buf, jlong len)
+{
+    int rc = BZ_PARAM_ERROR;
+    char *next_out  = J2P(buf, char *);
+    acr_bzstream *s = J2P(stream, acr_bzstream *);
+
+    if (s->eos)
+        return -1;
+    s->bz.next_out  = next_out;
+    s->bz.avail_out = (unsigned int)len;
+    rc = BZ2_bzDecompress((bz_stream *)s);
+    if (rc == BZ_STREAM_END)
+        s->eos = JNI_TRUE;
+    else if (rc == BZ_MEM_ERROR)
+        ACR_THROW_MSG(ACR_EX_ENOMEM, 0);
+    else if (rc != BZ_OK)
+        ACR_THROW_MSG(ACR_EX_EILSEQ, bz_errmsg(rc));
+    return len - s->bz.avail_out;
 }

Modified: 
commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestBzip2.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestBzip2.java?rev=1158327&r1=1158326&r2=1158327&view=diff
==============================================================================
--- 
commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestBzip2.java
 (original)
+++ 
commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestBzip2.java
 Tue Aug 16 15:40:07 2011
@@ -23,21 +23,57 @@ import org.testng.Assert;
 
 public class TestBzip2 extends Assert
 {
+    private static final String loremIpsum =
+    "Lorem ipsum dolor sit amet, consectetur adipisicing elit, " +
+    "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " +
+    "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris " +
+    "nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in " +
+    "reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla " +
+    "pariatur. Excepteur sint occaecat cupidatat non proident, sunt in " +
+    "culpa qui officia deserunt mollit anim id est laborum.";
 
+    
     @Test(groups = { "core" })
     public void bufToBuffCompressing()
+        throws Exception
     {
-        byte[] cd = new byte[1000];
-        byte[] dd = new byte[1000];
-        byte[] dc = new byte[1000];
+        byte[] cd = loremIpsum.getBytes();
+        byte[] dd = new byte[500];
+        byte[] dc = new byte[loremIpsum.length()];
 
-        for (int i = 0; i < 1000; i++)
-            cd[i] = (byte)(i % 10);
-
-        int sc = Bzip2.buffToBuffCompress(cd, 0, dd, 0, 1000, 9, 30);
-        assertTrue(sc != 0);
+        int sc = Bzip2.buffToBuffCompress(cd, 0, dd, 0, cd.length, 9, 30);
+        // 302 is pre-computed length.
+        assertEquals(sc, 302);
         int sd = Bzip2.buffToBuffDecompress(dd, 0, dc, 0, sc, false);
-        assertEquals(sd, 1000);
+        assertEquals(sd, loremIpsum.length());
+    }
+
+    @Test(groups = { "core" })
+    public void bzDeflater()
+        throws Exception
+    {
+        byte[] cd = loremIpsum.getBytes();
+
+        Bzip2Deflater bz = new Bzip2Deflater();
+        bz.setInput(cd);
+        byte[] dd = new byte[50];
+
+        int i;
+        for (i = 0; i < 10; i++) {
+            int rc = bz.deflate(dd);
+            if (i == 0) {
+                // Set finish mode
+                bz.finish();
+            }
+            if (bz.finished()) {
+                // Finished compressing
+                break;
+            }
+        }
+        assertEquals(i, 7);
+        // 302 is pre-computed length.
+        assertEquals(bz.getTotalOut(), 302);
+        bz.close();
     }
 
 }


Reply via email to