- Changed makewad's zip routines so that it simply stores files that cannot be

compressed smaller instead of using deflate anyway. Saves 133 bytes currently.


SVN r147 (trunk)
This commit is contained in:
Randy Heit 2006-05-27 02:17:30 +00:00
parent 5abd6b972c
commit 67da924a02
4 changed files with 146 additions and 64 deletions

View file

@ -1,3 +1,7 @@
May 26, 2006
- Changed makewad's zip routines so that it simply stores files that cannot be
compressed smaller instead of using deflate anyway. Saves 133 bytes currently.
May 26, 2006 (Changes by Graf Zahl) May 26, 2006 (Changes by Graf Zahl)
- Fixed: CallStateChain relied on CallingState being preserved across the - Fixed: CallStateChain relied on CallingState being preserved across the
call of the state's action function. This is not the case when a missile call of the state's action function. This is not the case when a missile

View file

@ -165,31 +165,16 @@ int appendtozip (zipFile zipfile, const char * zipname, const char *filename)
} }
// file loaded // file loaded
// create zip entry, giving entry name and zip_inf data // create zip entry, giving entry name and zip_inf data,
if (Z_OK != zipOpenNewFileInZip(zipfile, zipname, &zip_inf, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_BEST_COMPRESSION)) // write data into zipfile, and close the zip entry
{ if (Z_OK != zipAddFileToZip(zipfile, zipname, &zip_inf, readbuf, (unsigned)len))
free (readbuf);
fprintf (stderr, "Unable to open zip for writing %s\n", filename);
return 1;
}
// write data into zipfile (zipfile remembers the state)
if (Z_OK != zipWriteInFileInZip(zipfile, readbuf, (unsigned)len))
{ {
free (readbuf); free (readbuf);
fprintf (stderr, "Unable to write %s to zip\n", filename); fprintf (stderr, "Unable to write %s to zip\n", filename);
return 1; return 1;
} }
// done writing data
free (readbuf);
// close the zip entry
if (Z_OK != zipCloseFileInZip(zipfile))
{
fprintf (stderr, "Unable to close %s in zip\n", filename);
return 1;
}
// all done // all done
free (readbuf);
return 0; return 0;
} }

View file

@ -129,11 +129,6 @@ typedef struct
uLong dosDate; uLong dosDate;
uLong crc32; uLong crc32;
int encrypt; int encrypt;
#ifndef NOCRYPT
unsigned long keys[3]; /* keys defining the pseudo-random sequence */
const unsigned long* pcrc_32_tab;
int crypt_header_size;
#endif
} curfile_info; } curfile_info;
typedef struct typedef struct
@ -154,11 +149,6 @@ typedef struct
#ifndef NOCRYPT
#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED
#include "crypt.h"
#endif
local linkedlist_datablock_internal* allocate_new_datablock() local linkedlist_datablock_internal* allocate_new_datablock()
{ {
linkedlist_datablock_internal* ldi; linkedlist_datablock_internal* ldi;
@ -717,11 +707,6 @@ extern int ZEXPORT zipOpenNewFileInZip3 (file, filename, zipfi,
uInt i; uInt i;
int err = ZIP_OK; int err = ZIP_OK;
# ifdef NOCRYPT
if (password != NULL)
return ZIP_PARAMERROR;
# endif
if (file == NULL) if (file == NULL)
return ZIP_PARAMERROR; return ZIP_PARAMERROR;
if ((method!=0) && (method!=Z_DEFLATED)) if ((method!=0) && (method!=Z_DEFLATED))
@ -874,23 +859,6 @@ extern int ZEXPORT zipOpenNewFileInZip3 (file, filename, zipfi,
if (err==Z_OK) if (err==Z_OK)
zi->ci.stream_initialised = 1; zi->ci.stream_initialised = 1;
} }
# ifndef NOCRYPT
zi->ci.crypt_header_size = 0;
if ((err==Z_OK) && (password != NULL))
{
unsigned char bufHead[RAND_HEAD_LEN];
unsigned int sizeHead;
zi->ci.encrypt = 1;
zi->ci.pcrc_32_tab = get_crc_table();
/*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/
sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting);
zi->ci.crypt_header_size = sizeHead;
if (ZWRITE(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead)
err = ZIP_ERRNO;
}
# endif
if (err==Z_OK) if (err==Z_OK)
zi->in_opened_file_inzip = 1; zi->in_opened_file_inzip = 1;
@ -947,16 +915,6 @@ local int zipFlushWriteBuffer(zi)
{ {
int err=ZIP_OK; int err=ZIP_OK;
if (zi->ci.encrypt != 0)
{
#ifndef NOCRYPT
uInt i;
int t;
for (i=0;i<zi->ci.pos_in_buffered_data;i++)
zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab,
zi->ci.buffered_data[i],t);
#endif
}
if (ZWRITE(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data) if (ZWRITE(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data)
!=zi->ci.pos_in_buffered_data) !=zi->ci.pos_in_buffered_data)
err = ZIP_ERRNO; err = ZIP_ERRNO;
@ -1081,9 +1039,6 @@ extern int ZEXPORT zipCloseFileInZipRaw (file, uncompressed_size, crc32)
uncompressed_size = (uLong)zi->ci.stream.total_in; uncompressed_size = (uLong)zi->ci.stream.total_in;
} }
compressed_size = (uLong)zi->ci.stream.total_out; compressed_size = (uLong)zi->ci.stream.total_out;
# ifndef NOCRYPT
compressed_size += zi->ci.crypt_header_size;
# endif
ziplocal_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/ ziplocal_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/
ziplocal_putValue_inmemory(zi->ci.central_header+20, ziplocal_putValue_inmemory(zi->ci.central_header+20,
@ -1131,6 +1086,135 @@ extern int ZEXPORT zipCloseFileInZip (file)
return zipCloseFileInZipRaw (file,0,0); return zipCloseFileInZipRaw (file,0,0);
} }
extern int ZEXPORT zipAddFileToZip (file, filename, zipfi, buf, len)
zipFile file;
const char *filename;
const zip_fileinfo *zipfi;
const void *buf;
unsigned len;
{
zip_internal* zi;
uLong compressed_size;
uLong uncompressed_size;
uLong crc32;
long data_pos;
int err = ZIP_OK;
if (file == NULL)
return ZIP_PARAMERROR;
if (err == ZIP_OK)
err = zipOpenNewFileInZip(file, filename, zipfi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_BEST_COMPRESSION);
zi = (zip_internal*)file;
data_pos = ZTELL(zi->z_filefunc, zi->filestream);
if (err == ZIP_OK)
err = zipWriteInFileInZip(file, buf, len);
if (err != ZIP_OK)
return err;
zi->ci.stream.avail_in = 0;
while (err==ZIP_OK)
{
uLong uTotalOutBefore;
if (zi->ci.stream.avail_out == 0)
{
if (zipFlushWriteBuffer(zi) == ZIP_ERRNO)
err = ZIP_ERRNO;
zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
zi->ci.stream.next_out = zi->ci.buffered_data;
}
uTotalOutBefore = zi->ci.stream.total_out;
err=deflate(&zi->ci.stream, Z_FINISH);
zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
}
if (err==Z_STREAM_END)
err=ZIP_OK; /* this is normal */
if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK))
if (zipFlushWriteBuffer(zi)==ZIP_ERRNO)
err = ZIP_ERRNO;
err=deflateEnd(&zi->ci.stream);
zi->ci.stream_initialised = 0;
crc32 = (uLong)zi->ci.crc32;
uncompressed_size = (uLong)zi->ci.stream.total_in;
compressed_size = (uLong)zi->ci.stream.total_out;
if (uncompressed_size <= compressed_size)
{
/* Compressed size was no better than uncompressed, so redo it. */
zi->ci.stream.avail_in = (uInt)0;
zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
zi->ci.stream.next_out = zi->ci.buffered_data;
zi->ci.stream.total_in = 0;
zi->ci.stream.total_out = 0;
zi->ci.method = 0;
ziplocal_putValue_inmemory(zi->ci.central_header+10,0,2); /* method */
if (ZSEEK(zi->z_filefunc,zi->filestream,
data_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
err = ZIP_ERRNO;
err = zipWriteInFileInZip(file, buf, len);
if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK))
if (zipFlushWriteBuffer(zi)==ZIP_ERRNO)
err = ZIP_ERRNO;
compressed_size = (uLong)zi->ci.stream.total_out;
}
ziplocal_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/
ziplocal_putValue_inmemory(zi->ci.central_header+20,
compressed_size,4); /*compr size*/
if (zi->ci.stream.data_type == Z_ASCII)
ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2);
ziplocal_putValue_inmemory(zi->ci.central_header+24,
uncompressed_size,4); /*uncompr size*/
if (err==ZIP_OK)
err = add_data_in_datablock(&zi->central_dir,zi->ci.central_header,
(uLong)zi->ci.size_centralheader);
free(zi->ci.central_header);
if (err==ZIP_OK)
{
long cur_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream);
if (ZSEEK(zi->z_filefunc,zi->filestream,
zi->ci.pos_local_header + 8,ZLIB_FILEFUNC_SEEK_SET)!=0)
err = ZIP_ERRNO;
if (err==ZIP_OK)
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2);
if (err==ZIP_OK)
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4);
if (err==ZIP_OK)
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */
if (err==ZIP_OK) /* compressed size, unknown */
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4);
if (err==ZIP_OK) /* uncompressed size, unknown */
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4);
if (ZSEEK(zi->z_filefunc,zi->filestream,
cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0)
err = ZIP_ERRNO;
}
zi->number_entry ++;
zi->in_opened_file_inzip = 0;
return err;
}
extern int ZEXPORT zipClose (file, global_comment) extern int ZEXPORT zipClose (file, global_comment)
zipFile file; zipFile file;
const char* global_comment; const char* global_comment;

View file

@ -208,6 +208,15 @@ extern int ZEXPORT zipWriteInFileInZip OF((zipFile file,
Write data in the zipfile Write data in the zipfile
*/ */
extern int ZEXPORT zipAddFileToZip OF((zipFile file,
const char *filename,
const zip_fileinfo *zipfi,
const void *buf,
unsigned len));
/*
[RH] Add a file to the zipfile, using deflate or stored, whichever is best
*/
extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); extern int ZEXPORT zipCloseFileInZip OF((zipFile file));
/* /*
Close the current file in the zipfile Close the current file in the zipfile