RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Anders F. Björklund
  Root:   /v/rpm/cvs                       Email:  [EMAIL PROTECTED]
  Module: xar                              Date:   14-Oct-2007 10:22:00
  Branch: HEAD                             Handle: 2007101409220000

  Added files:
    xar/lib                 lzmaxar.c lzmaxar.h

  Log:
    oops, did I forget these files last time?

  Summary:
    Revision    Changes     Path
    1.1         +287 -0     xar/lib/lzmaxar.c
    1.1         +47 -0      xar/lib/lzmaxar.h
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: xar/lib/lzmaxar.c
  ============================================================================
  $ cvs diff -u -r0 -r1.1 lzmaxar.c
  --- /dev/null 2007-10-14 10:11:00 +0200
  +++ lzmaxar.c 2007-10-14 10:22:00 +0200
  @@ -0,0 +1,287 @@
  +/*
  + * Copyright (c) 2005 Rob Braun
  + * All rights reserved.
  + *
  + * Redistribution and use in source and binary forms, with or without
  + * modification, are permitted provided that the following conditions
  + * are met:
  + * 1. Redistributions of source code must retain the above copyright
  + *    notice, this list of conditions and the following disclaimer.
  + * 2. Redistributions in binary form must reproduce the above copyright
  + *    notice, this list of conditions and the following disclaimer in the
  + *    documentation and/or other materials provided with the distribution.
  + * 3. Neither the name of Rob Braun nor the names of his contributors
  + *    may be used to endorse or promote products derived from this software
  + *    without specific prior written permission.
  + *
  + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 
IS"
  + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  + * POSSIBILITY OF SUCH DAMAGE.
  + */
  +/*
  + * 19-Sep-2007
  + * DRI: Anders F Bjorklund <[EMAIL PROTECTED]>
  + */
  +/*
  + * Portions Copyright 2006, Apple Computer, Inc.
  + * Christopher Ryan <[EMAIL PROTECTED]>
  +*/
  +
  +
  +#include "config.h"
  +#ifndef HAVE_ASPRINTF
  +#include "asprintf.h"
  +#endif
  +#include <stdio.h>
  +#include <stdlib.h>
  +#include <string.h>
  +#include <sys/types.h>
  +#ifdef HAVE_LIBLZMA
  +#include <lzma.h>
  +#endif
  +#include "xar.h"
  +#include "filetree.h"
  +#include "io.h"
  +
  +#ifdef HAVE_LIBLZMA
  +
  +struct _lzma_context{
  +     uint8_t         lzmacompressed;
  +     lzma_stream     lzma;
  +     lzma_options_stream options;
  +     lzma_allocator allocator;
  +     lzma_memory_limitter *limit;
  +};
  +
  +#define preset_level 9
  +#define memory_limit 400*1024*1024 /* 1=1M, 5=24M, 6=39M, 7=93M, 8=185M, 
9=369M */
  +
  +#define LZMA_CONTEXT(x) ((struct _lzma_context *)(*x))
  +#endif
  +
  +int xar_lzma_fromheap_done(xar_t x, xar_file_t f, xar_prop_t p, void 
**context) {
  +#ifdef HAVE_LIBLZMA
  +
  +     if( !context || !LZMA_CONTEXT(context) )
  +             return 0;
  +
  +     if( LZMA_CONTEXT(context)->lzmacompressed){
  +             lzma_end(&LZMA_CONTEXT(context)->lzma);         
  +     }
  +
  +     /* free the context */
  +     free(LZMA_CONTEXT(context));
  +     *context = NULL;
  +     
  +#endif
  +     return 0;
  +}
  +
  +int xar_lzma_fromheap_in(xar_t x, xar_file_t f, xar_prop_t p, void **in, 
size_t *inlen, void **context) {
  +#ifdef HAVE_LIBLZMA
  +     const char *opt;
  +     void *out = NULL;
  +     size_t outlen, offset = 0;
  +     lzma_ret r;
  +     xar_prop_t tmpp;
  +     
  +     /* on first run, we init the context and check the compression type */
  +     if( !LZMA_CONTEXT(context) ) {
  +             *context = calloc(1,sizeof(struct _lzma_context));
  +     
  +             opt = NULL;
  +             tmpp = xar_prop_pget(p, "encoding");
  +             if( tmpp )
  +                     opt = xar_attr_pget(f, tmpp, "style");
  +             if( !opt ) return 0;
  +             if( strcmp(opt, "application/x-lzma") != 0 ) return 0;
  +             
  +             lzma_init_decoder();
  +             LZMA_CONTEXT(context)->lzma = LZMA_STREAM_INIT_VAR;
  +             r = lzma_stream_decoder(&LZMA_CONTEXT(context)->lzma, NULL, 
NULL);
  +             if( (r != LZMA_OK) ) {
  +                     xar_err_new(x);
  +                     xar_err_set_file(x, f);
  +                     xar_err_set_string(x, "Error decompressing file");
  +                     xar_err_callback(x, XAR_SEVERITY_FATAL, 
XAR_ERR_ARCHIVE_EXTRACTION);
  +                     return -1;
  +             }
  +             LZMA_CONTEXT(context)->lzmacompressed = 1;
  +     }else if( !LZMA_CONTEXT(context)->lzmacompressed ){
  +             /* once the context has been initialized, then we have already
  +                checked the compression type, so we need only check if we
  +                actually are compressed */
  +             return 0;
  +     }
  +
  +     outlen = *inlen;
  +
  +     LZMA_CONTEXT(context)->lzma.next_in = *in;
  +     LZMA_CONTEXT(context)->lzma.avail_in = *inlen;
  +     LZMA_CONTEXT(context)->lzma.next_out = out;
  +     LZMA_CONTEXT(context)->lzma.avail_out = 0;
  +
  +     while( LZMA_CONTEXT(context)->lzma.avail_in != 0 ) {
  +             outlen = outlen * 2;
  +             out = realloc(out, outlen);
  +             if( out == NULL ) abort();
  +
  +             LZMA_CONTEXT(context)->lzma.next_out = ((unsigned char *)out) + 
offset;
  +             LZMA_CONTEXT(context)->lzma.avail_out = outlen - offset;
  +
  +             r = lzma_code(&(LZMA_CONTEXT(context)->lzma), LZMA_RUN);
  +             if( (r != LZMA_OK) && (r != LZMA_STREAM_END) ) {
  +                     xar_err_new(x);
  +                     xar_err_set_file(x, f);
  +                     xar_err_set_errno(x, r);
  +                     xar_err_set_string(x, "Error decompressing file");
  +                     xar_err_callback(x, XAR_SEVERITY_FATAL, 
XAR_ERR_ARCHIVE_EXTRACTION);
  +                     return -1;
  +             }
  +             offset += outlen - offset - 
LZMA_CONTEXT(context)->lzma.avail_out;
  +             if( (r == LZMA_STREAM_END) && (offset == 0) )
  +                     break;
  +     }
  +
  +     free(*in);
  +     *in = out;
  +     *inlen = offset;
  +#endif /* HAVE_LIBLZMA */
  +     return 0;
  +}
  +
  +int xar_lzma_toheap_done(xar_t x, xar_file_t f, xar_prop_t p, void 
**context) {
  +#ifdef HAVE_LIBLZMA
  +     xar_prop_t tmpp;
  +     
  +     if( LZMA_CONTEXT(context)->lzmacompressed){
  +             lzma_end(&LZMA_CONTEXT(context)->lzma);         
  +             lzma_memory_limitter_end(LZMA_CONTEXT(context)->limit, 1);
  +
  +             tmpp = xar_prop_pset(f, p, "encoding", NULL);
  +             if( tmpp )
  +                     xar_attr_pset(f, tmpp, "style", "application/x-lzma");
  +     }
  +
  +     /* free the context */
  +     free(LZMA_CONTEXT(context));
  +     *context = NULL;
  +     
  +#endif /* HAVE_LIBLZMA */
  +     return 0;
  +}
  +
  +int32_t xar_lzma_toheap_in(xar_t x, xar_file_t f, xar_prop_t p, void **in, 
size_t *inlen, void **context) {
  +#ifdef HAVE_LIBLZMA
  +     void *out = NULL;
  +     size_t outlen, offset = 0;
  +     lzma_ret r;
  +     const char *opt;
  +
  +     /* on first run, we init the context and check the compression type */
  +     if( !LZMA_CONTEXT(context) ) {
  +             *context = calloc(1,sizeof(struct _lzma_context));
  +             
  +             opt = xar_opt_get(x, XAR_OPT_COMPRESSION);
  +             if( !opt )
  +                     return 0;
  +             
  +             if( strcmp(opt, XAR_OPT_VAL_LZMA) != 0 )
  +                     return 0;
  +             
  +             lzma_init_encoder();
  +             LZMA_CONTEXT(context)->options.check = LZMA_CHECK_CRC64;
  +             LZMA_CONTEXT(context)->options.has_crc32 = 1; /* true */
  +             LZMA_CONTEXT(context)->options.alignment = 0;
  +#if defined (__ppc__) || defined (powerpc) || defined (__ppc64__)
  +             LZMA_CONTEXT(context)->options.filters[0].id = 
LZMA_FILTER_POWERPC;
  +#elif defined (__i386__) || defined (__amd64__) || defined(__x86_64__)
  +             LZMA_CONTEXT(context)->options.filters[0].id = LZMA_FILTER_X86;
  +#else
  +             LZMA_CONTEXT(context)->options.filters[0].id = LZMA_FILTER_COPY;
  +#endif
  +             LZMA_CONTEXT(context)->options.filters[0].options = NULL;
  +             LZMA_CONTEXT(context)->options.filters[1].id = LZMA_FILTER_LZMA;
  +             LZMA_CONTEXT(context)->options.filters[1].options = 
(lzma_options_lzma *)(lzma_preset_lzma + preset_level - 1);
  +             /* Terminate the filter options array. */
  +             LZMA_CONTEXT(context)->options.filters[2].id = UINT64_MAX;
  +             LZMA_CONTEXT(context)->lzma = LZMA_STREAM_INIT_VAR;
  +             LZMA_CONTEXT(context)->limit = 
lzma_memory_limitter_create(memory_limit);
  +             LZMA_CONTEXT(context)->allocator.opaque = 
LZMA_CONTEXT(context)->limit;
  +             LZMA_CONTEXT(context)->allocator.alloc = (void*) 
lzma_memory_alloc;
  +             LZMA_CONTEXT(context)->allocator.free = (void*) 
lzma_memory_free;
  +             LZMA_CONTEXT(context)->lzma.allocator = 
&LZMA_CONTEXT(context)->allocator;
  +             r = lzma_stream_encoder_single(&LZMA_CONTEXT(context)->lzma, 
&(LZMA_CONTEXT(context)->options));
  +             if( (r != LZMA_OK) ) {
  +                     xar_err_new(x);
  +                     xar_err_set_file(x, f);
  +                     xar_err_set_string(x, "Error compressing file");
  +                     xar_err_callback(x, XAR_SEVERITY_FATAL, 
XAR_ERR_ARCHIVE_CREATION);
  +                     return -1;
  +             }
  +             LZMA_CONTEXT(context)->lzmacompressed = 1;
  +             if( *inlen == 0 )
  +                     return 0;
  +     }else if( !LZMA_CONTEXT(context)->lzmacompressed ){
  +             /* once the context has been initialized, then we have already
  +             checked the compression type, so we need only check if we
  +             actually are compressed */
  +             return 0;
  +     }
  +     
  +     outlen = *inlen/2;
  +     if(outlen == 0) outlen = 1024;
  +     LZMA_CONTEXT(context)->lzma.next_in = *in;
  +     LZMA_CONTEXT(context)->lzma.avail_in = *inlen;
  +     LZMA_CONTEXT(context)->lzma.next_out = out;
  +     LZMA_CONTEXT(context)->lzma.avail_out = 0;
  +
  +     if( *inlen != 0 ) {
  +             do {
  +                     outlen *= 2;
  +                     out = realloc(out, outlen);
  +                     if( out == NULL ) abort();
  +
  +                     LZMA_CONTEXT(context)->lzma.next_out = ((unsigned char 
*)out) + offset;
  +                     LZMA_CONTEXT(context)->lzma.avail_out = outlen - offset;
  +
  +                     r = lzma_code(&LZMA_CONTEXT(context)->lzma, LZMA_RUN);
  +                     offset = outlen - LZMA_CONTEXT(context)->lzma.avail_out;
  +             } while( r == LZMA_OK && LZMA_CONTEXT(context)->lzma.avail_in 
!= 0);
  +     } else {
  +             do {
  +                     outlen *= 2;
  +                     out = realloc(out, outlen);
  +                     if( out == NULL ) abort();
  +
  +                     LZMA_CONTEXT(context)->lzma.next_out = ((unsigned char 
*)out) + offset;
  +                     LZMA_CONTEXT(context)->lzma.avail_out = outlen - offset;
  +
  +                     r = lzma_code(&LZMA_CONTEXT(context)->lzma, 
LZMA_FINISH);
  +                     offset = outlen - LZMA_CONTEXT(context)->lzma.avail_out;
  +             } while( r == LZMA_OK && r != LZMA_STREAM_END);
  +     }
  +     
  +     if( (r != LZMA_OK && r != LZMA_STREAM_END) ) {
  +             xar_err_new(x);
  +             xar_err_set_file(x, f);
  +             xar_err_set_string(x, "Error compressing file");
  +             xar_err_set_errno(x, r);
  +             xar_err_callback(x, XAR_SEVERITY_FATAL, 
XAR_ERR_ARCHIVE_CREATION);
  +             return -1;
  +     }
  +
  +     free(*in);
  +     *in = out;
  +     *inlen = offset;
  +#endif /* HAVE_LIBLZMA */
  +     return 0;
  +}
  @@ .
  patch -p0 <<'@@ .'
  Index: xar/lib/lzmaxar.h
  ============================================================================
  $ cvs diff -u -r0 -r1.1 lzmaxar.h
  --- /dev/null 2007-10-14 10:22:00 +0200
  +++ lzmaxar.h 2007-10-14 10:22:00 +0200
  @@ -0,0 +1,47 @@
  +/*
  + * Copyright (c) 2005 Rob Braun
  + * All rights reserved.
  + *
  + * Redistribution and use in source and binary forms, with or without
  + * modification, are permitted provided that the following conditions
  + * are met:
  + * 1. Redistributions of source code must retain the above copyright
  + *    notice, this list of conditions and the following disclaimer.
  + * 2. Redistributions in binary form must reproduce the above copyright
  + *    notice, this list of conditions and the following disclaimer in the
  + *    documentation and/or other materials provided with the distribution.
  + * 3. Neither the name of Rob Braun nor the names of his contributors
  + *    may be used to endorse or promote products derived from this software
  + *    without specific prior written permission.
  + *
  + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 
IS"
  + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  + * POSSIBILITY OF SUCH DAMAGE.
  + */
  +/*
  + * 
  + * DRI: 
  + */
  +/*
  + * Portions Copyright 2006, Apple Computer, Inc.
  + * Christopher Ryan <[EMAIL PROTECTED]>
  +*/
  +
  +#ifndef _XAR_LZMA_H_
  +#define _XAR_LZMA_H_
  +
  +int xar_lzma_fromheap_in(xar_t x, xar_file_t f, xar_prop_t p, void **in, 
size_t *inlen, void **context);
  +int xar_lzma_fromheap_done(xar_t x, xar_file_t f, xar_prop_t p, void 
**context);
  +
  +int32_t xar_lzma_toheap_in(xar_t x, xar_file_t f, xar_prop_t p, void **in, 
size_t *inlen, void **context);
  +int xar_lzma_toheap_done(xar_t x, xar_file_t f, xar_prop_t p, void 
**context);
  +
  +#endif /* _XAR_LZMA_H_ */
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [email protected]

Reply via email to