2 * cws2fws by Alex Beregszaszi <alex@fsn.hu>
5 * This utility converts compressed Macromedia Flash files to uncompressed ones.
15 #define dbgprintf printf
20 main(int argc
, char *argv
[])
22 int fd_in
, fd_out
, comp_len
, uncomp_len
, tag
, i
, last_out
;
23 char buf_in
[1024], buf_out
[65536];
29 printf("Usage: %s <infile.swf> <outfile.swf>\n", argv
[0]);
33 fd_in
= open(argv
[1], O_RDONLY
);
36 perror("Error while opening: ");
40 fd_out
= open(argv
[2], O_WRONLY
|O_CREAT
, 00644);
43 perror("Error while opening: ");
48 if (read(fd_in
, &buf_in
, 8) != 8)
50 printf("Header error\n");
56 if (buf_in
[0] != 'C' || buf_in
[1] != 'W' || buf_in
[2] != 'S')
58 printf("Not a compressed flash file\n");
62 fstat(fd_in
, &statbuf
);
63 comp_len
= statbuf
.st_size
;
64 uncomp_len
= buf_in
[4] | (buf_in
[5] << 8) | (buf_in
[6] << 16) | (buf_in
[7] << 24);
66 printf("Compressed size: %d Uncompressed size: %d\n", comp_len
-4, uncomp_len
-4);
68 // write out modified header
70 write(fd_out
, &buf_in
, 8);
72 zstream
.zalloc
= NULL
;
74 zstream
.opaque
= NULL
;
75 inflateInit(&zstream
);
77 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
)
93 printf("Error while decompressing: %d\n", ret
);
98 dbgprintf("a_in: %d t_in: %d a_out: %d t_out: %d -- %d out\n",
99 zstream
.avail_in
, zstream
.total_in
, zstream
.avail_out
, zstream
.total_out
,
100 zstream
.total_out
-last_out
);
102 write(fd_out
, &buf_out
, zstream
.total_out
-last_out
);
106 if (ret
== Z_STREAM_END
|| ret
== Z_BUF_ERROR
)
110 if (zstream
.total_out
!= uncomp_len
-8)
112 printf("Size mismatch (%d != %d), updating header...\n",
113 zstream
.total_out
, uncomp_len
-8);
115 buf_in
[0] = (zstream
.total_out
+8) & 0xff;
116 buf_in
[1] = (zstream
.total_out
+8 >> 8) & 0xff;
117 buf_in
[2] = (zstream
.total_out
+8 >> 16) & 0xff;
118 buf_in
[3] = (zstream
.total_out
+8 >> 24) & 0xff;
120 lseek(fd_out
, 4, SEEK_SET
);
121 write(fd_out
, &buf_in
, 4);
124 inflateEnd(&zstream
);