Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 9 Dec 2008 16:00:58 GMT
From:      Anselm Strauss <strauss@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 154398 for review
Message-ID:  <200812091600.mB9G0wwI029886@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=154398

Change 154398 by strauss@strauss_silversurfer on 2008/12/09 16:00:15

	Added deflate compression, still compile problems (linking)

Affected files ...

.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_write_set_format_zip.c#42 edit

Differences ...

==== //depot/projects/soc2008/strauss_libarchive/libarchive/archive_write_set_format_zip.c#42 (text+ko) ====

@@ -76,6 +76,11 @@
 #define ZIP_VERSION_BY 0x0314 /* Made by UNIX, using ZIP version 2.0. */
 #define ZIP_FLAGS 0x08 /* Flagging bit 3 (count from 0) for using data descriptor. */
 
+enum compression {
+	COMPRESSION_STORE = 0,
+	COMPRESSION_DEFLATE = 6
+}; 
+
 static ssize_t archive_write_zip_data(struct archive_write *, const void *buff, size_t s);
 static int archive_write_zip_finish(struct archive_write *);
 static int archive_write_zip_destroy(struct archive_write *);
@@ -177,11 +182,6 @@
 	char comment_length[2];
 };
 
-static enum compression {
-	COMPRESSION_STORE = 0,
-	COMPRESSION_DEFLATE = 6
-}; 
-
 int
 archive_write_set_format_zip(struct archive *_a)
 {
@@ -294,7 +294,7 @@
 	zip_encode(path_length(entry), &h.filename_length, sizeof(h.filename_length));
 	zip_encode(sizeof(e), &h.extra_length, sizeof(h.extra_length));
 	
-	if (zip->compression = COMPRESSION_STORE) {
+	if (zip->compression == COMPRESSION_STORE) {
 		/* Setting compressed and uncompressed sizes even when specification says
 		 * to set to zero when using data descriptors. Otherwise the end of the
 		 * data for an entry is rather difficult to find. */
@@ -342,35 +342,62 @@
 	struct zip *zip = a->format_data;
 	struct zip_file_header_link *l = zip->central_directory_end;
 	z_stream stream;
+	size_t chunk = sizeof(*buff);
+	unsigned char buff_out[chunk];
 	
 	if (s > zip->remaining_data_bytes)
 		s = zip->remaining_data_bytes;
+
+	if (s == 0) return 0;
 	
 	switch (zip->compression) {
 		
 		case COMPRESSION_STORE:
 		
 			ret = (a->compressor.write)(a, buff, s);
+			if (ret < 0) return (ret);
+			zip->written_bytes += s;
+			zip->remaining_data_bytes -= s;
+			l->crc32 = crc32(l->crc32, buff, s);
+			return (ret);
 		
 		case COMPRESSION_DEFLATE:
 			
-			deflateInit2(
-					stream,
-					
-			);
+			stream.zalloc = Z_NULL;
+			stream.zfree = Z_NULL;
+			stream.opaque = Z_NULL;
+			ret = deflateInit(&stream, Z_DEFAULT_COMPRESSION);
+			if (ret != Z_OK) return (ARCHIVE_FATAL);
+			stream.next_in = (unsigned char*) buff;
+			stream.avail_in = s;
+			do {
+				stream.next_out = buff_out;
+				stream.avail_out = chunk;
+				ret = deflate(&stream, Z_FINISH);
+				if (ret == Z_STREAM_ERROR) {
+					deflateEnd(&stream);
+					return (ARCHIVE_FATAL);
+				}
+				ret = (a->compressor.write)(a, buff_out, stream.avail_out);
+				if (ret < 0) {
+					deflateEnd(&stream);
+					return (ret);
+				}
+				zip->written_bytes += ret;
+			} while (stream.avail_out == 0);
+			zip->remaining_data_bytes -= s;
+			l->crc32 = crc32(l->crc32, buff, s);
+			deflateEnd(&stream);
+			return (s);
 			
+		default:
+
+			archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "Invalid ZIP compression type");
+			return ARCHIVE_FATAL;
 	}
 	
 	/* TODO: set compressed size in data descriptor and local file header link */
 	
-	if (ret >= 0) {
-		zip->written_bytes += s;
-		zip->remaining_data_bytes -= s;
-		l->crc32 = crc32(l->crc32, buff, s);
-		return (s);
-	} else {
-		return (ret);
-	}
 }
 
 static int
@@ -434,7 +461,7 @@
 		zip_encode(dos_time(archive_entry_mtime(l->entry)), &h.timedate, sizeof(h.timedate));
 		zip_encode(l->crc32, &h.crc32, sizeof(h.crc32));
 		/* TODO: write compressed size */
-		zip_encode(archive_entry_size(entry), &h.uncompressed_size, sizeof(h.uncompressed_size));
+		zip_encode(archive_entry_size(l->entry), &h.uncompressed_size, sizeof(h.uncompressed_size));
 		zip_encode(path_length(l->entry), &h.filename_length, sizeof(h.filename_length));
 		zip_encode(sizeof(e), &h.extra_length, sizeof(h.extra_length));
 		mode = archive_entry_mode(l->entry);
@@ -588,7 +615,7 @@
 set_compression(struct archive_write *a, enum compression compression)
 {
 	/* TODO: check archive state, should not switch between header and data */
-	/* TODO: check if valid compression? */
 	
-	a->format_data->compression = compression;
+	struct zip *zip = a->format_data;
+	zip->compression = compression;
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200812091600.mB9G0wwI029886>