2 Shows the structure of a swf file
\r
4 Part of the swftools package.
\r
6 Copyright (c) 2001 Matthias Kramm <kramm@quiss.org>
\r
8 This file is distributed under the GPL, see file COPYING for details */
\r
12 #ifdef HAVE_SYS_STAT_H
\r
13 #include <sys/stat.h>
\r
18 #ifdef HAVE_SYS_TYPES_H
\r
19 #include <sys/types.h>
\r
27 #include "../lib/rfxswf.h"
\r
28 #include "../lib/args.h"
\r
30 char * filename = 0;
\r
32 /* idtab stores the ids which are defined in the file. This allows us
\r
33 to detect errors in the file. (i.e. ids which are defined more than
\r
38 struct options_t options[] =
\r
47 int args_callback_option(char*name,char*val)
\r
49 if(!strcmp(name, "V")) {
\r
50 printf("swfdump - part of %s %s\n", PACKAGE, VERSION);
\r
53 else if(name[0]=='a') {
\r
58 printf("Unknown option: -%s\n", name);
\r
63 int args_callback_longoption(char*name,char*val)
\r
65 return args_long2shortoption(options, name, val);
\r
67 void args_callback_usage(char*name)
\r
69 printf("Usage: %s [-a] file.swf\n", name);
\r
70 printf("-h , --help\t\t\t Print help and exit\n");
\r
71 printf("-a , --action\t\t\t Disassemble action tags\n");
\r
72 printf("-V , --version\t\t\t Print program version and exit\n");
\r
74 int args_callback_command(char*name,char*val)
\r
77 fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n",
\r
84 int main (int argc,char ** argv)
\r
89 struct stat statbuf;
\r
94 memset(idtab,0,65536);
\r
96 processargs(argc, argv);
\r
100 fprintf(stderr, "You must supply a filename.\n");
\r
104 f = open(filename,O_RDONLY);
\r
108 perror("Couldn't open file: ");
\r
111 if FAILED(ReadSWF(f,&swf))
\r
113 fprintf(stderr, "%s is not a valid SWF file or contains errors.\n",filename);
\r
119 fstat(f, &statbuf);
\r
120 if(statbuf.st_size != swf.FileSize)
\r
121 fprintf(stderr, "Error: Real Filesize (%d) doesn't match header Filesize (%d)",
\r
122 statbuf.st_size, swf.FileSize);
\r
127 printf("[HEADER] File version: %d\n", swf.FileVersion);
\r
128 printf("[HEADER] File size: %ld\n", swf.FileSize);
\r
129 printf("[HEADER] Frame rate: %f\n",swf.FrameRate/256.0);
\r
130 printf("[HEADER] Frame count: %d\n",swf.FrameCount);
\r
131 printf("[HEADER] Movie width: %.3f\n",(swf.MovieSize.xmax-swf.MovieSize.xmin)/20.0);
\r
132 printf("[HEADER] Movie height: %.3f\n",(swf.MovieSize.ymax-swf.MovieSize.ymin)/20.0);
\r
134 tag = swf.FirstTag;
\r
137 char*name = getTagName(tag);
\r
139 fprintf(stderr, "Error: Unknown tag:0x%03x\n", tag->id);
\r
143 printf("[%03x] %9ld %s%s", tag->id, tag->len, prefix, getTagName(tag));
\r
145 if(isDefiningTag(tag)) {
\r
146 U16 id = GetDefineID(tag);
\r
147 printf(" defines id %04x", id);
\r
149 fprintf(stderr, "Error: Id %04x is defined more than once.\n", id);
\r
152 else if(tag->id == ST_PLACEOBJECT ||
\r
153 tag->id == ST_PLACEOBJECT2) {
\r
154 printf(" places id %04x at depth %04x", GetPlaceID(tag), GetDepth(tag));
\r
156 printf(" name \"%s\"",GetName(tag));
\r
158 else if(tag->id == ST_REMOVEOBJECT) {
\r
159 printf(" removes id %04x from depth %04x", GetPlaceID(tag), GetDepth(tag));
\r
161 else if(tag->id == ST_REMOVEOBJECT2) {
\r
162 printf(" removes object from depth %04x", GetDepth(tag));
\r
167 if(tag->id == ST_DEFINESPRITE) {
\r
168 sprintf(prefix, " ");
\r
170 else if(tag->id == ST_END) {
\r
173 else if(tag->id == ST_DOACTION && action) {
\r
174 char myprefix[128];
\r
176 sprintf(myprefix, " %s", prefix);
\r
178 actions = GetActions(tag);
\r
180 DumpActions(actions, myprefix);
\r