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];
30 printf("Usage: %s <infile.swf> <outfile.swf>\n", argv
[0]);
34 fd_in
= open(argv
[1], O_RDONLY
);
36 perror("Error opening input file");
40 fd_out
= open(argv
[2], O_WRONLY
| O_CREAT
, 00644);
42 perror("Error opening output file");
47 if (read(fd_in
, &buf_in
, 8) != 8) {
48 printf("Header error\n");
54 if (buf_in
[0] != 'C' || buf_in
[1] != 'W' || buf_in
[2] != 'S') {
55 printf("Not a compressed flash file\n");
59 fstat(fd_in
, &statbuf
);
60 comp_len
= statbuf
.st_size
;
61 uncomp_len
= buf_in
[4] | (buf_in
[5] << 8) | (buf_in
[6] << 16) | (buf_in
[7] << 24);
63 printf("Compressed size: %d Uncompressed size: %d\n",
64 comp_len
- 4, uncomp_len
- 4);
66 // write out modified header
68 if (write(fd_out
, &buf_in
, 8) < 8) {
69 perror("Error writing output file");
73 zstream
.zalloc
= NULL
;
75 zstream
.opaque
= NULL
;
76 inflateInit(&zstream
);
78 for (i
= 0; i
< comp_len
- 8;) {
79 int ret
, len
= read(fd_in
, &buf_in
, 1024);
81 dbgprintf("read %d bytes\n", len
);
83 last_out
= zstream
.total_out
;
85 zstream
.next_in
= &buf_in
[0];
86 zstream
.avail_in
= len
;
87 zstream
.next_out
= &buf_out
[0];
88 zstream
.avail_out
= 65536;
90 ret
= inflate(&zstream
, Z_SYNC_FLUSH
);
91 if (ret
!= Z_STREAM_END
&& ret
!= Z_OK
) {
92 printf("Error while decompressing: %d\n", ret
);
97 dbgprintf("a_in: %d t_in: %lu a_out: %d t_out: %lu -- %lu out\n",
98 zstream
.avail_in
, zstream
.total_in
, zstream
.avail_out
,
99 zstream
.total_out
, zstream
.total_out
- last_out
);
101 if (write(fd_out
, &buf_out
, zstream
.total_out
- last_out
) <
102 zstream
.total_out
- last_out
) {
103 perror("Error writing output file");
109 if (ret
== Z_STREAM_END
|| ret
== Z_BUF_ERROR
)
113 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 if (write(fd_out
, &buf_in
, 4) < 4) {
124 perror("Error writing output file");
129 inflateEnd(&zstream
);