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.
23 #define dbgprintf printf
25 #define dbgprintf(...)
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];
36 printf("Usage: %s <infile.swf> <outfile.swf>\n", argv
[0]);
40 fd_in
= open(argv
[1], O_RDONLY
);
42 perror("Error opening input file");
46 fd_out
= open(argv
[2], O_WRONLY
| O_CREAT
, 00644);
48 perror("Error opening output file");
53 if (read(fd_in
, &buf_in
, 8) != 8) {
54 printf("Header error\n");
60 if (buf_in
[0] != 'C' || buf_in
[1] != 'W' || buf_in
[2] != 'S') {
61 printf("Not a compressed flash file\n");
65 if (fstat(fd_in
, &statbuf
) < 0) {
66 perror("fstat failed");
69 comp_len
= statbuf
.st_size
;
70 uncomp_len
= buf_in
[4] | (buf_in
[5] << 8) | (buf_in
[6] << 16) | (buf_in
[7] << 24);
72 printf("Compressed size: %d Uncompressed size: %d\n",
73 comp_len
- 4, uncomp_len
- 4);
75 // write out modified header
77 if (write(fd_out
, &buf_in
, 8) < 8) {
78 perror("Error writing output file");
82 zstream
.zalloc
= NULL
;
84 zstream
.opaque
= NULL
;
85 if (inflateInit(&zstream
) != Z_OK
) {
86 fprintf(stderr
, "inflateInit failed\n");
90 for (i
= 0; i
< comp_len
- 8;) {
91 int ret
, len
= read(fd_in
, &buf_in
, 1024);
93 dbgprintf("read %d bytes\n", len
);
95 last_out
= zstream
.total_out
;
97 zstream
.next_in
= &buf_in
[0];
98 zstream
.avail_in
= len
;
99 zstream
.next_out
= &buf_out
[0];
100 zstream
.avail_out
= 65536;
102 ret
= inflate(&zstream
, Z_SYNC_FLUSH
);
103 if (ret
!= Z_STREAM_END
&& ret
!= Z_OK
) {
104 printf("Error while decompressing: %d\n", ret
);
105 inflateEnd(&zstream
);
109 dbgprintf("a_in: %d t_in: %lu a_out: %d t_out: %lu -- %lu out\n",
110 zstream
.avail_in
, zstream
.total_in
, zstream
.avail_out
,
111 zstream
.total_out
, zstream
.total_out
- last_out
);
113 if (write(fd_out
, &buf_out
, zstream
.total_out
- last_out
) <
114 zstream
.total_out
- last_out
) {
115 perror("Error writing output file");
121 if (ret
== Z_STREAM_END
|| ret
== Z_BUF_ERROR
)
125 if (zstream
.total_out
!= uncomp_len
- 8) {
126 printf("Size mismatch (%lu != %d), updating header...\n",
127 zstream
.total_out
, uncomp_len
- 8);
129 buf_in
[0] = (zstream
.total_out
+ 8) & 0xff;
130 buf_in
[1] = ((zstream
.total_out
+ 8) >> 8) & 0xff;
131 buf_in
[2] = ((zstream
.total_out
+ 8) >> 16) & 0xff;
132 buf_in
[3] = ((zstream
.total_out
+ 8) >> 24) & 0xff;
134 if ( lseek(fd_out
, 4, SEEK_SET
) < 0
135 || write(fd_out
, &buf_in
, 4) < 4) {
136 perror("Error writing output file");
141 inflateEnd(&zstream
);