www.pudn.com > gzip.rar > zip.c


/* zip.c -- compress files to the gzip or pkzip format 
 * Copyright (C) 1992-1993 Jean-loup Gailly 
 * This is free software; you can redistribute it and/or modify it under the 
 * terms of the GNU General Public License, see the file COPYING. 
 */ 
#include "gzip.h" 
local ulg crc;       /* crc on uncompressed file data */ 
/* zip.c -- compress files to the gzip or pkzip format 
 * Copyright (C) 1992-1993 Jean-loup Gailly 
 * This is free software; you can redistribute it and/or modify it under the 
 * terms of the GNU General Public License, see the file COPYING. 
 */ 
#include "gzip.h" 
local ulg crc = 0;       /* crc on uncompressed file data */ 
/* =========================================================================== 
 * Deflate in to out. 
 * IN assertions: the input and output buffers are cleared. 
 *   The variables time_stamp and save_orig_name are initialized. 
 */ 
int zip( void ) 
{ 
    uch  flags = 0;         /* general purpose bit flags */ 
    ush  attr = 0;          /* ascii/binary flag */ 
    ush  deflate_flags = 0; /* pkzip -es, -en or -ex equivalent */ 
    outcnt = 0;    /* Write the header to the gzip file. See algorithm.doc for the format */ 
    method = DEFLATED; 
    put_byte( GZIP_MAGIC[0] ); /* magic header */ 
    put_byte( GZIP_MAGIC[1] ); 
    put_byte( DEFLATED );      /* compression method */ 
    put_byte( flags );         /* general flags */ 
    put_long( time_stamp );    /* Write deflated file to zip file */ 
    crc = updcrc( 0, 0 ); 
    bi_init(); 
    ct_init(& attr, & method ); 
    lm_init( level, & deflate_flags ); 
    put_byte(( uch )deflate_flags ); /* extra flags */ 
    put_byte( 0 );            /* OS identifier */ 
    ( void )deflate();    /* Write the crc and uncompressed size */ 
    put_long( crc ); 
    put_long( isize ); 
    flush_outbuf(); 
    return 0; 
} 
 
char * zip_mem_inptr = NULL; /* 输入缓存 */ 
int zip_mem_insize = 0; /* 输入缓存长度 */ 
int zip_mem_inpos = 0; /* 已经使用的位置 */ 
int mem_read( char * buf, unsigned size ) 
{ 
    int len; 
#define min( a, b )    ((( int )( a ) < ( int )( b )) ? ( a ) : ( b )) 
    len = min( zip_mem_insize - zip_mem_inpos, size ); 
    if( len > 0 ) 
    { 
        memcpy( buf, & zip_mem_inptr[zip_mem_inpos], len ); 
        crc = updcrc(( uch *)buf, len ); 
        isize += ( ulg )len; 
        zip_mem_inpos += len; 
    } 
    else 
        len = - 1; 
    return ( int )len; 
}