\r
This file is distributed under the GPL, see file COPYING for details */\r
\r
+#define HAVE_STAT\r
+\r
+#ifdef HAVE_SYS_STAT_H\r
+#include <sys/stat.h>\r
+#else\r
+#undef HAVE_STAT\r
+#endif\r
+\r
+#ifdef HAVE_SYS_TYPES_H\r
+#include <sys/types.h>\r
+#else\r
+#undef HAVE_STAT\r
+#endif\r
+\r
+#include <unistd.h>\r
#include <stdio.h>\r
#include <fcntl.h>\r
#include "../lib/rfxswf.h"\r
to detect errors in the file. (i.e. ids which are defined more than \r
once */\r
char idtab[65536];\r
+int action = 0;\r
\r
struct options_t options[] =\r
{\r
+ {"a","action"},\r
{"v","verbose"},\r
{"V","version"},\r
{0,0}\r
{\r
if(!strcmp(name, "V")) {\r
printf("swfdump - part of %s %s\n", PACKAGE, VERSION);\r
+ exit(0);\r
+ } \r
+ else if(name[0]=='a') {\r
+ action = 1;\r
+ return 0;\r
+ }\r
+ else {\r
+ printf("Unknown option: -%s\n", name);\r
}\r
+\r
+ return 0;\r
}\r
int args_callback_longoption(char*name,char*val)\r
{\r
}\r
void args_callback_usage(char*name)\r
{ \r
- printf("Usage: %s file.swf\n", name);\r
+ printf("Usage: %s [-a] file.swf\n", name);\r
+ printf("-h , --help\t\t\t Print help and exit\n");\r
+ printf("-a , --action\t\t\t Disassemble action tags\n");\r
+ printf("-V , --version\t\t\t Print program version and exit\n");\r
}\r
int args_callback_command(char*name,char*val)\r
{\r
filename = name;\r
return 0;\r
}\r
- \r
+\r
int main (int argc,char ** argv)\r
{ \r
SWF swf;\r
TAG*tag;\r
+#ifdef HAVE_STAT\r
+ struct stat statbuf;\r
+#endif\r
int f;\r
char prefix[128];\r
prefix[0] = 0;\r
\r
processargs(argc, argv);\r
\r
+ if(!filename)\r
+ {\r
+ fprintf(stderr, "You must supply a filename.\n");\r
+ return 1;\r
+ }\r
+\r
f = open(filename,O_RDONLY);\r
\r
if (f<0)\r
}\r
if FAILED(ReadSWF(f,&swf))\r
{ \r
- fprintf(stderr,"%s is not a valid SWF file or contains errors.\n",filename);\r
+ fprintf(stderr, "%s is not a valid SWF file or contains errors.\n",filename);\r
close(f);\r
exit(1);\r
}\r
+\r
+#ifdef HAVE_STAT\r
+ fstat(f, &statbuf);\r
+ if(statbuf.st_size != swf.FileSize)\r
+ fprintf(stderr, "Error: Real Filesize (%d) doesn't match header Filesize (%d)",\r
+ statbuf.st_size, swf.FileSize);\r
+#endif\r
+\r
close(f);\r
\r
+ printf("[HEADER] File version: %d\n", swf.FileVersion);\r
+ printf("[HEADER] File size: %ld\n", swf.FileSize);\r
+ printf("[HEADER] Frame rate: %f\n",swf.FrameRate/256.0);\r
+ printf("[HEADER] Frame count: %d\n",swf.FrameCount);\r
+ printf("[HEADER] Movie width: %.3f\n",(swf.MovieSize.xmax-swf.MovieSize.xmin)/20.0);\r
+ printf("[HEADER] Movie height: %.3f\n",(swf.MovieSize.ymax-swf.MovieSize.ymin)/20.0);\r
+\r
tag = swf.FirstTag;\r
\r
while(tag) {\r
- printf("[%02x] %s%s", tag->id, prefix, getTagName(tag));\r
+ char*name = getTagName(tag);\r
+ if(!name) {\r
+ fprintf(stderr, "Error: Unknown tag:0x%03x\n", tag->id);\r
+ tag = tag->next;\r
+ continue;\r
+ }\r
+ printf("[%03x] %9ld %s%s", tag->id, tag->len, prefix, getTagName(tag));\r
+\r
if(isDefiningTag(tag)) {\r
U16 id = GetDefineID(tag);\r
printf(" defines id %04x", id);\r
\r
printf("\n");\r
\r
- if(tag->id == ST_DEFINESPRITE)\r
- {\r
+ if(tag->id == ST_DEFINESPRITE) {\r
sprintf(prefix, " ");\r
}\r
- if(tag->id == ST_END) \r
- {\r
- sprintf(prefix, "");\r
+ else if(tag->id == ST_END) {\r
+ *prefix = 0;\r
+ }\r
+ else if(tag->id == ST_DOACTION && action) {\r
+ char myprefix[128];\r
+ ActionTAG*actions;\r
+ sprintf(myprefix, " %s", prefix);\r
+ \r
+ actions = GetActions(tag);\r
+\r
+ DumpActions(actions, myprefix);\r
}\r
tag = tag->next;\r
}\r