use the dump function in swfaction.c.
[swftools.git] / src / swfdump.c
index 7f58a1f..8f50162 100644 (file)
@@ -7,8 +7,20 @@
 \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
@@ -21,9 +33,11 @@ char * filename = 0;
    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
@@ -35,7 +49,16 @@ int args_callback_option(char*name,char*val)
     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
@@ -43,7 +66,10 @@ int args_callback_longoption(char*name,char*val)
 }\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
@@ -54,12 +80,14 @@ int args_callback_command(char*name,char*val)
     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
@@ -67,8 +95,13 @@ int main (int argc,char ** argv)
 \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
-    fstat(f, &statbuf);\r
 \r
     if (f<0)\r
     { \r
@@ -77,17 +110,22 @@ int main (int argc,char ** argv)
     }\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
-    close(f);\r
 \r
-    printf("[HEADER]        File version: %d\n", swf.FileVersion);\r
-    printf("[HEADER]        File size: %d\n", swf.FileSize);\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
@@ -96,7 +134,14 @@ int main (int argc,char ** argv)
     tag = swf.FirstTag;\r
 \r
     while(tag) {\r
-       printf("[%03x] %9d %s%s", tag->id, tag->len, 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
@@ -119,13 +164,20 @@ int main (int argc,char ** argv)
        \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