23 #define dbgprintf printf 
   25 #define dbgprintf(...) do { if (0) printf(__VA_ARGS__); } while (0) 
   28 int main(
int argc, 
char *argv[])
 
   30     int fd_in, fd_out, comp_len, uncomp_len, 
i, last_out;
 
   31     char buf_in[1024], buf_out[65536];
 
   37         printf(
"Usage: %s <infile.swf> <outfile.swf>\n", argv[0]);
 
   41     fd_in = open(argv[1], O_RDONLY);
 
   43         perror(
"Error opening input file");
 
   47     fd_out = open(argv[2], O_WRONLY | O_CREAT, 00644);
 
   49         perror(
"Error opening output file");
 
   54     if (read(fd_in, &buf_in, 8) != 8) {
 
   59     if (buf_in[0] != 
'C' || buf_in[1] != 
'W' || buf_in[2] != 
'S') {
 
   60         printf(
"Not a compressed flash file\n");
 
   64     if (fstat(fd_in, &statbuf) < 0) {
 
   65         perror(
"fstat failed");
 
   68     comp_len   = statbuf.st_size;
 
   69     uncomp_len = buf_in[4] | (buf_in[5] << 8) | (buf_in[6] << 16) | (buf_in[7] << 24);
 
   71     printf(
"Compressed size: %d Uncompressed size: %d\n",
 
   72            comp_len - 4, uncomp_len - 4);
 
   76     if (write(fd_out, &buf_in, 8) < 8) {
 
   77         perror(
"Error writing output file");
 
   81     zstream.zalloc = 
NULL;
 
   83     zstream.opaque = 
NULL;
 
   84     if (inflateInit(&zstream) != Z_OK) {
 
   85         fprintf(stderr, 
"inflateInit failed\n");
 
   89     for (
i = 0; 
i < comp_len - 8;) {
 
   90         int ret, 
len = read(fd_in, &buf_in, 1024);
 
  100         last_out = zstream.total_out;
 
  102         zstream.next_in   = &buf_in[0];
 
  103         zstream.avail_in  = 
len;
 
  104         zstream.next_out  = &buf_out[0];
 
  105         zstream.avail_out = 65536;
 
  108         if (
ret != Z_STREAM_END && 
ret != Z_OK) {
 
  109             printf(
"Error while decompressing: %d\n", 
ret);
 
  110             inflateEnd(&zstream);
 
  114         dbgprintf(
"a_in: %d t_in: %lu a_out: %d t_out: %lu -- %lu out\n",
 
  115                   zstream.avail_in, zstream.total_in, zstream.avail_out,
 
  116                   zstream.total_out, zstream.total_out - last_out);
 
  118         if (write(fd_out, &buf_out, zstream.total_out - last_out) <
 
  119             zstream.total_out - last_out) {
 
  120             perror(
"Error writing output file");
 
  121             inflateEnd(&zstream);
 
  127         if (
ret == Z_STREAM_END || 
ret == Z_BUF_ERROR)
 
  131     if (zstream.total_out != uncomp_len - 8) {
 
  132         printf(
"Size mismatch (%lu != %d), updating header...\n",
 
  133                zstream.total_out, uncomp_len - 8);
 
  135         buf_in[0] =  (zstream.total_out + 8)        & 0xff;
 
  136         buf_in[1] = ((zstream.total_out + 8) >>  8) & 0xff;
 
  137         buf_in[2] = ((zstream.total_out + 8) >> 16) & 0xff;
 
  138         buf_in[3] = ((zstream.total_out + 8) >> 24) & 0xff;
 
  140         if (   lseek(fd_out, 4, SEEK_SET) < 0
 
  141             || write(fd_out, &buf_in, 4) < 4) {
 
  142             perror(
"Error writing output file");
 
  143             inflateEnd(&zstream);
 
  149     inflateEnd(&zstream);