2 * cws2fws by Alex Beregszaszi
3 * This file is placed in the public domain.
4 * Use the program however you see fit.
6 * This utility converts compressed Macromedia Flash files to uncompressed ones.
17 #define dbgprintf printf
19 #define dbgprintf(...)
22 int main(int argc
, char *argv
[])
24 int fd_in
, fd_out
, comp_len
, uncomp_len
, i
, last_out
;
25 char buf_in
[1024], buf_out
[65536];
31 printf("Usage: %s <infile.swf> <outfile.swf>\n", argv
[0]);
35 fd_in
= open(argv
[1], O_RDONLY
);
38 perror("Error while opening: ");
42 fd_out
= open(argv
[2], O_WRONLY
|O_CREAT
, 00644);
45 perror("Error while opening: ");
50 if (read(fd_in
, &buf_in
, 8) != 8)
52 printf("Header error\n");
58 if (buf_in
[0] != 'C' || buf_in
[1] != 'W' || buf_in
[2] != 'S')
60 printf("Not a compressed flash file\n");
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);
68 printf("Compressed size: %d Uncompressed size: %d\n", comp_len
-4, uncomp_len
-4);
70 // write out modified header
72 write(fd_out
, &buf_in
, 8);
74 zstream
.zalloc
= NULL
;
76 zstream
.opaque
= NULL
;
77 inflateInit(&zstream
);
79 for (i
= 0; i
< comp_len
-8;)
81 int ret
, len
= read(fd_in
, &buf_in
, 1024);
83 dbgprintf("read %d bytes\n", len
);
85 last_out
= zstream
.total_out
;
87 zstream
.next_in
= &buf_in
[0];
88 zstream
.avail_in
= len
;
89 zstream
.next_out
= &buf_out
[0];
90 zstream
.avail_out
= 65536;
92 ret
= inflate(&zstream
, Z_SYNC_FLUSH
);
93 if (ret
!= Z_STREAM_END
&& ret
!= Z_OK
)
95 printf("Error while decompressing: %d\n", ret
);
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
);
104 write(fd_out
, &buf_out
, zstream
.total_out
-last_out
);
108 if (ret
== Z_STREAM_END
|| ret
== Z_BUF_ERROR
)
112 if (zstream
.total_out
!= uncomp_len
-8)
114 printf("Size mismatch (%lu != %d), updating header...\n",
115 zstream
.total_out
, uncomp_len
-8);
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;
122 lseek(fd_out
, 4, SEEK_SET
);
123 write(fd_out
, &buf_in
, 4);
126 inflateEnd(&zstream
);