1/* 2 * cws2fws by Alex Beregszaszi 3 * This file is placed in the public domain. 4 * Use the program however you see fit. 5 * 6 * This utility converts compressed Macromedia Flash files to uncompressed ones. 7 */ 8 9#include <sys/stat.h> 10#include <fcntl.h> 11#include <stdio.h> 12#include <stdlib.h> 13#include <unistd.h> 14#include <zlib.h> 15 16#ifdef DEBUG 17#define dbgprintf printf 18#else 19#define dbgprintf(...) 20#endif 21 22int main(int argc, char *argv[]) 23{ 24 int fd_in, fd_out, comp_len, uncomp_len, i, last_out; 25 char buf_in[1024], buf_out[65536]; 26 z_stream zstream; 27 struct stat statbuf; 28 29 if (argc < 3) 30 { 31 printf("Usage: %s <infile.swf> <outfile.swf>\n", argv[0]); 32 exit(1); 33 } 34 35 fd_in = open(argv[1], O_RDONLY); 36 if (fd_in < 0) 37 { 38 perror("Error while opening: "); 39 exit(1); 40 } 41 42 fd_out = open(argv[2], O_WRONLY|O_CREAT, 00644); 43 if (fd_out < 0) 44 { 45 perror("Error while opening: "); 46 close(fd_in); 47 exit(1); 48 } 49 50 if (read(fd_in, &buf_in, 8) != 8) 51 { 52 printf("Header error\n"); 53 close(fd_in); 54 close(fd_out); 55 exit(1); 56 } 57 58 if (buf_in[0] != 'C' || buf_in[1] != 'W' || buf_in[2] != 'S') 59 { 60 printf("Not a compressed flash file\n"); 61 exit(1); 62 } 63 64 fstat(fd_in, &statbuf); 65 comp_len = statbuf.st_size; 66 uncomp_len = buf_in[4] | (buf_in[5] << 8) | (buf_in[6] << 16) | (buf_in[7] << 24); 67 68 printf("Compressed size: %d Uncompressed size: %d\n", comp_len-4, uncomp_len-4); 69 70 // write out modified header 71 buf_in[0] = 'F'; 72 write(fd_out, &buf_in, 8); 73 74 zstream.zalloc = NULL; 75 zstream.zfree = NULL; 76 zstream.opaque = NULL; 77 inflateInit(&zstream); 78 79 for (i = 0; i < comp_len-8;) 80 { 81 int ret, len = read(fd_in, &buf_in, 1024); 82 83 dbgprintf("read %d bytes\n", len); 84 85 last_out = zstream.total_out; 86 87 zstream.next_in = &buf_in[0]; 88 zstream.avail_in = len; 89 zstream.next_out = &buf_out[0]; 90 zstream.avail_out = 65536; 91 92 ret = inflate(&zstream, Z_SYNC_FLUSH); 93 if (ret != Z_STREAM_END && ret != Z_OK) 94 { 95 printf("Error while decompressing: %d\n", ret); 96 inflateEnd(&zstream); 97 exit(1); 98 } 99 100 dbgprintf("a_in: %d t_in: %lu a_out: %d t_out: %lu -- %lu out\n", 101 zstream.avail_in, zstream.total_in, zstream.avail_out, zstream.total_out, 102 zstream.total_out-last_out); 103 104 write(fd_out, &buf_out, zstream.total_out-last_out); 105 106 i += len; 107 108 if (ret == Z_STREAM_END || ret == Z_BUF_ERROR) 109 break; 110 } 111 112 if (zstream.total_out != uncomp_len-8) 113 { 114 printf("Size mismatch (%lu != %d), updating header...\n", 115 zstream.total_out, uncomp_len-8); 116 117 buf_in[0] = (zstream.total_out+8) & 0xff; 118 buf_in[1] = ((zstream.total_out+8) >> 8) & 0xff; 119 buf_in[2] = ((zstream.total_out+8) >> 16) & 0xff; 120 buf_in[3] = ((zstream.total_out+8) >> 24) & 0xff; 121 122 lseek(fd_out, 4, SEEK_SET); 123 write(fd_out, &buf_in, 4); 124 } 125 126 inflateEnd(&zstream); 127 close(fd_in); 128 close(fd_out); 129 return 0; 130} 131