swfmill 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.swfmill +0 -134
 - data/README.rdoc +28 -8
 - data/Rakefile +6 -5
 - data/VERSION +1 -1
 - data/ext/.gitignore +1 -0
 - data/ext/buffer.h +95 -0
 - data/ext/deflate.h +125 -0
 - data/ext/extconf.rb +77 -43
 - data/ext/inflate.h +82 -0
 - data/ext/swfmill/.gitignore +3 -16
 - data/ext/swfmill/AUTHORS +2 -1
 - data/ext/swfmill/Makefile.in +2 -1
 - data/ext/swfmill/NEWS +5 -0
 - data/ext/swfmill/autogen.sh +7 -1
 - data/ext/swfmill/configure +361 -275
 - data/ext/swfmill/configure.ac +28 -20
 - data/ext/swfmill/src/Makefile.am +93 -20
 - data/ext/swfmill/src/Makefile.in +454 -170
 - data/ext/swfmill/src/SWF.h +3 -0
 - data/ext/swfmill/src/SWFFile.cpp +1 -1
 - data/ext/swfmill/src/SWFShapeMaker.cpp +4 -3
 - data/ext/swfmill/src/codegen/basics.xsl +2 -1
 - data/ext/swfmill/src/codegen/header.xsl +3 -0
 - data/ext/swfmill/src/codegen/parsexml.xsl +53 -2
 - data/ext/swfmill/src/codegen/writexml.xsl +54 -1
 - data/ext/swfmill/src/swfmill.cpp +52 -35
 - data/ext/swfmill/src/swft/swft_import_jpeg.cpp +62 -16
 - data/ext/swfmill/src/xslt/simple-elements.xslt +1 -0
 - data/ext/swfmill/test/Makefile.in +2 -1
 - data/ext/swfmill/test/xml/Makefile.in +2 -1
 - data/ext/swfmill_ext.cc +12 -366
 - data/ext/swfmill_ext_to_swf.cc +260 -0
 - data/ext/swfmill_ext_to_swf.h +6 -0
 - data/ext/swfmill_ext_to_xml.cc +262 -0
 - data/ext/swfmill_ext_to_xml.h +6 -0
 - data/ext/test/Makefile +16 -0
 - data/ext/test/buffer_test.cc +84 -0
 - data/ext/test/deflate_test.cc +61 -0
 - data/ext/test/inflate_test.cc +84 -0
 - data/ext/test/test.dat +0 -0
 - data/lib/swfmill.rb +14 -23
 - data/spec/swfmill_spec.rb +0 -123
 - metadata +28 -17
 - data/ext/swfmill/src/codegen/Makefile.am +0 -15
 - data/ext/swfmill/src/codegen/Makefile.in +0 -346
 - data/ext/swfmill/src/swft/Makefile.am +0 -55
 - data/ext/swfmill/src/swft/Makefile.in +0 -717
 - data/ext/swfmill/src/xslt/Makefile.am +0 -51
 - data/ext/swfmill/src/xslt/Makefile.in +0 -536
 - data/ext/swfmill/src/xslt/README +0 -19
 - data/ext/swfmill/src/xslt/simple.cpp +0 -1686
 
    
        data/ext/swfmill/src/SWF.h
    CHANGED
    
    
    
        data/ext/swfmill/src/SWFFile.cpp
    CHANGED
    
    | 
         @@ -209,7 +209,7 @@ int File::saveXML( FILE *fp, Context *ctx ) { 
     | 
|
| 
       209 
209 
     | 
    
         
             
            	xmlDocPtr doc = getXML( ctx );
         
     | 
| 
       210 
210 
     | 
    
         
             
            	if( !doc ) goto fail;
         
     | 
| 
       211 
211 
     | 
    
         | 
| 
       212 
     | 
    
         
            -
            	 
     | 
| 
      
 212 
     | 
    
         
            +
            	xmlDocDumpFormatMemoryEnc( doc, (xmlChar**)&data, &size, "UTF-8", 1 );
         
     | 
| 
       213 
213 
     | 
    
         | 
| 
       214 
214 
     | 
    
         
             
            	if( size ) fwrite( data, size, 1, fp );
         
     | 
| 
       215 
215 
     | 
    
         | 
| 
         @@ -15,9 +15,10 @@ ShapeMaker::ShapeMaker( List<ShapeItem>* e, double fx, double fy, double ofsx, d 
     | 
|
| 
       15 
15 
     | 
    
         
             
            	factory = fy;
         
     | 
| 
       16 
16 
     | 
    
         
             
            	offsetx = ofsx;
         
     | 
| 
       17 
17 
     | 
    
         
             
            	offsety = ofsy;
         
     | 
| 
       18 
     | 
    
         
            -
            	diffx = diffy = 0;
         
     | 
| 
       19 
     | 
    
         
            -
            	lastx = lasty = 0;
         
     | 
| 
       20 
     | 
    
         
            -
            	smoothx = smoothy = 0;
         
     | 
| 
      
 18 
     | 
    
         
            +
            	diffx = diffy = 0.0;
         
     | 
| 
      
 19 
     | 
    
         
            +
            	lastx = lasty = 0.0;
         
     | 
| 
      
 20 
     | 
    
         
            +
            	smoothx = smoothy = 0.0;
         
     | 
| 
      
 21 
     | 
    
         
            +
            	minx = miny = maxx = maxy = 0.0;
         
     | 
| 
       21 
22 
     | 
    
         
             
            	have_first = false;
         
     | 
| 
       22 
23 
     | 
    
         | 
| 
       23 
24 
     | 
    
         
             
            	fillStyle0 = lineStyle = fillStyle1 = -1;
         
     | 
| 
         @@ -57,7 +57,7 @@ namespace <xsl:value-of select="/format/@format"/> { 
     | 
|
| 
       57 
57 
     | 
    
         | 
| 
       58 
58 
     | 
    
         
             
            // ------------ context structure
         
     | 
| 
       59 
59 
     | 
    
         | 
| 
       60 
     | 
    
         
            -
            Context::Context() {
         
     | 
| 
      
 60 
     | 
    
         
            +
            Context::Context() : swf_encoding(0) {
         
     | 
| 
       61 
61 
     | 
    
         
             
            	swfVersion = 0;
         
     | 
| 
       62 
62 
     | 
    
         
             
            	transientPropsToXML = false;
         
     | 
| 
       63 
63 
     | 
    
         
             
            	debugTrace = false;
         
     | 
| 
         @@ -65,6 +65,7 @@ Context::Context() { 
     | 
|
| 
       65 
65 
     | 
    
         
             
            	isLast = false;
         
     | 
| 
       66 
66 
     | 
    
         
             
            	tagVersion = 0;
         
     | 
| 
       67 
67 
     | 
    
         
             
            	quiet = false;
         
     | 
| 
      
 68 
     | 
    
         
            +
            	convertEncoding = false;
         
     | 
| 
       68 
69 
     | 
    
         
             
            	<xsl:apply-templates select="//*[@context]" mode="ctor"/>
         
     | 
| 
       69 
70 
     | 
    
         
             
            }
         
     | 
| 
       70 
71 
     | 
    
         | 
| 
         @@ -8,11 +8,62 @@ 
     | 
|
| 
       8 
8 
     | 
    
         
             
            #include <cctype>
         
     | 
| 
       9 
9 
     | 
    
         
             
            #include <cstdlib>
         
     | 
| 
       10 
10 
     | 
    
         
             
            #include "base64.h"
         
     | 
| 
      
 11 
     | 
    
         
            +
            #include <errno.h>
         
     | 
| 
      
 12 
     | 
    
         
            +
            #include <iconv.h>
         
     | 
| 
       11 
13 
     | 
    
         | 
| 
       12 
14 
     | 
    
         
             
            using namespace std;
         
     | 
| 
       13 
15 
     | 
    
         | 
| 
       14 
16 
     | 
    
         
             
            namespace <xsl:value-of select="/format/@format"/> {
         
     | 
| 
       15 
17 
     | 
    
         | 
| 
      
 18 
     | 
    
         
            +
            char *fromXmlChar(const Context *ctx, const xmlChar *from_str) {
         
     | 
| 
      
 19 
     | 
    
         
            +
            	if (ctx->convertEncoding) {
         
     | 
| 
      
 20 
     | 
    
         
            +
            		size_t len = strlen((const char *)from_str);
         
     | 
| 
      
 21 
     | 
    
         
            +
            		iconv_t cd = iconv_open(ctx->swf_encoding, "UTF-8");
         
     | 
| 
      
 22 
     | 
    
         
            +
            		if (cd < 0) {
         
     | 
| 
      
 23 
     | 
    
         
            +
            			fprintf(stderr, "iconv_open failed.\n");
         
     | 
| 
      
 24 
     | 
    
         
            +
            			char *buf = new char[1];
         
     | 
| 
      
 25 
     | 
    
         
            +
            			buf[0] = '\0';
         
     | 
| 
      
 26 
     | 
    
         
            +
            			return buf;
         
     | 
| 
      
 27 
     | 
    
         
            +
            		}
         
     | 
| 
      
 28 
     | 
    
         
            +
            		size_t buf_size = (len + 1) * 2;
         
     | 
| 
      
 29 
     | 
    
         
            +
            		for (;;) {
         
     | 
| 
      
 30 
     | 
    
         
            +
            			char * const dst = new char[buf_size];
         
     | 
| 
      
 31 
     | 
    
         
            +
            			size_t inbytesleft = len;
         
     | 
| 
      
 32 
     | 
    
         
            +
            			size_t outbytesleft = buf_size - 1; // reserve 1 byte for '\0'
         
     | 
| 
      
 33 
     | 
    
         
            +
            			char *pin = (char*)from_str;
         
     | 
| 
      
 34 
     | 
    
         
            +
            			char *pout = dst;
         
     | 
| 
      
 35 
     | 
    
         
            +
            			bool expandbuf = false;
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
            			while (inbytesleft > 0) {
         
     | 
| 
      
 38 
     | 
    
         
            +
            				size_t r = iconv(cd, &pin, &inbytesleft, &pout, &outbytesleft);
         
     | 
| 
      
 39 
     | 
    
         
            +
            				if (r == (size_t)-1) {
         
     | 
| 
      
 40 
     | 
    
         
            +
            					if (errno == E2BIG) {
         
     | 
| 
      
 41 
     | 
    
         
            +
            						expandbuf = true;
         
     | 
| 
      
 42 
     | 
    
         
            +
            					} else {
         
     | 
| 
      
 43 
     | 
    
         
            +
            						// bad input charctor
         
     | 
| 
      
 44 
     | 
    
         
            +
            						fprintf(stderr, "iconv failed: %s\n", from_str);
         
     | 
| 
      
 45 
     | 
    
         
            +
            					}
         
     | 
| 
      
 46 
     | 
    
         
            +
            					break;
         
     | 
| 
      
 47 
     | 
    
         
            +
            				}
         
     | 
| 
      
 48 
     | 
    
         
            +
            			}
         
     | 
| 
      
 49 
     | 
    
         
            +
            			if (expandbuf) {
         
     | 
| 
      
 50 
     | 
    
         
            +
            				iconv(cd, 0, 0, 0, 0);
         
     | 
| 
      
 51 
     | 
    
         
            +
            				delete[] dst;
         
     | 
| 
      
 52 
     | 
    
         
            +
            				buf_size *= 2;
         
     | 
| 
      
 53 
     | 
    
         
            +
            				continue;
         
     | 
| 
      
 54 
     | 
    
         
            +
            			}
         
     | 
| 
      
 55 
     | 
    
         
            +
            			*pout = '\0';
         
     | 
| 
      
 56 
     | 
    
         
            +
            			iconv_close(cd);
         
     | 
| 
      
 57 
     | 
    
         
            +
            			return dst;
         
     | 
| 
      
 58 
     | 
    
         
            +
            		}
         
     | 
| 
      
 59 
     | 
    
         
            +
            	} else {
         
     | 
| 
      
 60 
     | 
    
         
            +
            		size_t len = strlen((const char *)from_str) + 1;
         
     | 
| 
      
 61 
     | 
    
         
            +
            		char *buf = new char[len];
         
     | 
| 
      
 62 
     | 
    
         
            +
            		strcpy(buf, (const char *)from_str);
         
     | 
| 
      
 63 
     | 
    
         
            +
            		return buf;
         
     | 
| 
      
 64 
     | 
    
         
            +
            	}
         
     | 
| 
      
 65 
     | 
    
         
            +
            }
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
       16 
67 
     | 
    
         
             
            char *strdupx(const char *src) {
         
     | 
| 
       17 
68 
     | 
    
         
             
            	char *t = new char[strlen(src)+1];
         
     | 
| 
       18 
69 
     | 
    
         
             
            	strcpy(t, src);
         
     | 
| 
         @@ -174,8 +225,8 @@ void <xsl:value-of select="@name"/>::parseXML( xmlNodePtr node, Context *ctx ) { 
     | 
|
| 
       174 
225 
     | 
    
         
             
            <xsl:template match="string" mode="parsexml">
         
     | 
| 
       175 
226 
     | 
    
         
             
            	tmp = xmlGetProp( node, (const xmlChar *)"<xsl:value-of select="@name"/>" );
         
     | 
| 
       176 
227 
     | 
    
         
             
            	if( tmp ) {
         
     | 
| 
       177 
     | 
    
         
            -
            		<xsl:value-of select="@name"/> =  
     | 
| 
       178 
     | 
    
         
            -
             
     | 
| 
      
 228 
     | 
    
         
            +
            		<xsl:value-of select="@name"/> = fromXmlChar(ctx, (const xmlChar*)tmp);
         
     | 
| 
      
 229 
     | 
    
         
            +
            		xmlFree(tmp);
         
     | 
| 
       179 
230 
     | 
    
         
             
            	} else {
         
     | 
| 
       180 
231 
     | 
    
         
             
            		fprintf(stderr,"WARNING: no <xsl:value-of select="@name"/> property in %s element\n", (const char *)node->name );
         
     | 
| 
       181 
232 
     | 
    
         
             
            		<xsl:value-of select="@name"/> = strdupx("[undefined]");
         
     | 
| 
         @@ -6,9 +6,61 @@ 
     | 
|
| 
       6 
6 
     | 
    
         
             
            #include "<xsl:value-of select="/format/@format"/>.h"
         
     | 
| 
       7 
7 
     | 
    
         
             
            #include "base64.h"
         
     | 
| 
       8 
8 
     | 
    
         
             
            #include <cstring>
         
     | 
| 
      
 9 
     | 
    
         
            +
            #include <errno.h>
         
     | 
| 
      
 10 
     | 
    
         
            +
            #include <iconv.h>
         
     | 
| 
       9 
11 
     | 
    
         | 
| 
       10 
12 
     | 
    
         
             
            namespace <xsl:value-of select="/format/@format"/> {
         
     | 
| 
       11 
13 
     | 
    
         | 
| 
      
 14 
     | 
    
         
            +
            xmlChar *toXmlChar(const Context *ctx, const char *from_str) {
         
     | 
| 
      
 15 
     | 
    
         
            +
            	if (ctx->convertEncoding) {
         
     | 
| 
      
 16 
     | 
    
         
            +
            		size_t len = strlen(from_str);
         
     | 
| 
      
 17 
     | 
    
         
            +
            		iconv_t cd = iconv_open("UTF-8", ctx->swf_encoding);
         
     | 
| 
      
 18 
     | 
    
         
            +
            		if (cd < 0) {
         
     | 
| 
      
 19 
     | 
    
         
            +
            			fprintf(stderr, "iconv_open failed.\n");
         
     | 
| 
      
 20 
     | 
    
         
            +
            			return xmlCharStrdup("");
         
     | 
| 
      
 21 
     | 
    
         
            +
            		}
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            		size_t buf_size = (len + 1) * 2;
         
     | 
| 
      
 24 
     | 
    
         
            +
            		char *dst;
         
     | 
| 
      
 25 
     | 
    
         
            +
            		for (;;) {
         
     | 
| 
      
 26 
     | 
    
         
            +
            			dst = new char[buf_size];
         
     | 
| 
      
 27 
     | 
    
         
            +
            			size_t inbytesleft = len;
         
     | 
| 
      
 28 
     | 
    
         
            +
            			size_t outbytesleft = buf_size - 1;
         
     | 
| 
      
 29 
     | 
    
         
            +
            			char *pin = (char*)from_str;
         
     | 
| 
      
 30 
     | 
    
         
            +
            			char *pout = dst;
         
     | 
| 
      
 31 
     | 
    
         
            +
            			bool expandbuf = false;
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
            			while (inbytesleft > 0) {
         
     | 
| 
      
 34 
     | 
    
         
            +
            				size_t r = iconv(cd, &pin, &inbytesleft, &pout, &outbytesleft);
         
     | 
| 
      
 35 
     | 
    
         
            +
            				if (r == (size_t)-1) {
         
     | 
| 
      
 36 
     | 
    
         
            +
            					if (errno == E2BIG) {
         
     | 
| 
      
 37 
     | 
    
         
            +
            						// buf_size shorten
         
     | 
| 
      
 38 
     | 
    
         
            +
            						expandbuf = true;
         
     | 
| 
      
 39 
     | 
    
         
            +
            					} else {
         
     | 
| 
      
 40 
     | 
    
         
            +
            						//bad input charctor
         
     | 
| 
      
 41 
     | 
    
         
            +
            						fprintf(stderr, "iconv failed: %s\n", from_str);
         
     | 
| 
      
 42 
     | 
    
         
            +
            					}
         
     | 
| 
      
 43 
     | 
    
         
            +
            					break;
         
     | 
| 
      
 44 
     | 
    
         
            +
            				}
         
     | 
| 
      
 45 
     | 
    
         
            +
            			}
         
     | 
| 
      
 46 
     | 
    
         
            +
            			if (expandbuf) {
         
     | 
| 
      
 47 
     | 
    
         
            +
            				delete[] dst;
         
     | 
| 
      
 48 
     | 
    
         
            +
            				iconv(cd, 0, 0, 0, 0);
         
     | 
| 
      
 49 
     | 
    
         
            +
            				buf_size *= 2;
         
     | 
| 
      
 50 
     | 
    
         
            +
            				continue;
         
     | 
| 
      
 51 
     | 
    
         
            +
            			}
         
     | 
| 
      
 52 
     | 
    
         
            +
                                    *pout = '\0';
         
     | 
| 
      
 53 
     | 
    
         
            +
            			break;
         
     | 
| 
      
 54 
     | 
    
         
            +
            		}
         
     | 
| 
      
 55 
     | 
    
         
            +
            		iconv_close(cd);
         
     | 
| 
      
 56 
     | 
    
         
            +
            		xmlChar *ret = xmlCharStrdup(dst);
         
     | 
| 
      
 57 
     | 
    
         
            +
            		delete[] dst;
         
     | 
| 
      
 58 
     | 
    
         
            +
            		return ret;
         
     | 
| 
      
 59 
     | 
    
         
            +
            	} else {
         
     | 
| 
      
 60 
     | 
    
         
            +
            		return xmlCharStrdup(from_str);
         
     | 
| 
      
 61 
     | 
    
         
            +
            	}
         
     | 
| 
      
 62 
     | 
    
         
            +
            }
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
       12 
64 
     | 
    
         
             
            #define TMP_STRLEN 0xFF
         
     | 
| 
       13 
65 
     | 
    
         | 
| 
       14 
66 
     | 
    
         
             
            <xsl:for-each select="type|tag|action|filter|style|stackitem|namespaceconstant|multinameconstant|trait|opcode">
         
     | 
| 
         @@ -72,7 +124,8 @@ void <xsl:value-of select="@name"/>::writeXML( xmlNodePtr xml, Context *ctx ) { 
     | 
|
| 
       72 
124 
     | 
    
         | 
| 
       73 
125 
     | 
    
         
             
            <xsl:template match="string" mode="writexml">
         
     | 
| 
       74 
126 
     | 
    
         
             
            	if( <xsl:value-of select="@name"/> ) {
         
     | 
| 
       75 
     | 
    
         
            -
            		 
     | 
| 
      
 127 
     | 
    
         
            +
            		xmlChar *xmlstr = toXmlChar(ctx, <xsl:value-of select="@name"/>);
         
     | 
| 
      
 128 
     | 
    
         
            +
            		xmlSetProp(node, (const xmlChar *)"<xsl:value-of select="@name"/>", xmlstr);
         
     | 
| 
       76 
129 
     | 
    
         
             
            	}
         
     | 
| 
       77 
130 
     | 
    
         
             
            </xsl:template>
         
     | 
| 
       78 
131 
     | 
    
         | 
    
        data/ext/swfmill/src/swfmill.cpp
    CHANGED
    
    | 
         @@ -17,6 +17,7 @@ bool quiet = false; 
     | 
|
| 
       17 
17 
     | 
    
         
             
            bool verbose = false;
         
     | 
| 
       18 
18 
     | 
    
         
             
            bool dump = false;
         
     | 
| 
       19 
19 
     | 
    
         
             
            bool nonet = false;
         
     | 
| 
      
 20 
     | 
    
         
            +
            const char *swf_encoding = "UTF-8";
         
     | 
| 
       20 
21 
     | 
    
         
             
            const char *internal_stylesheet = NULL;
         
     | 
| 
       21 
22 
     | 
    
         | 
| 
       22 
23 
     | 
    
         
             
            void usage() {
         
     | 
| 
         @@ -43,23 +44,21 @@ void usage() { 
     | 
|
| 
       43 
44 
     | 
    
         
             
            		"        <out> is a single SWF file, or (by default) 'stdout'\n"
         
     | 
| 
       44 
45 
     | 
    
         
             
            		"        (for details, see README)\n"
         
     | 
| 
       45 
46 
     | 
    
         
             
            		"\n"
         
     | 
| 
       46 
     | 
    
         
            -
            		"    xslt <xsl> <in> [<out>"
         
     | 
| 
       47 
     | 
    
         
            -
            		//" [<param>*]"
         
     | 
| 
       48 
     | 
    
         
            -
            		"]\n"
         
     | 
| 
      
 47 
     | 
    
         
            +
            		"    xslt <xsl> <in> [<out>]\n"
         
     | 
| 
       49 
48 
     | 
    
         
             
            		"        transform <in> to <out> as described by <xsl>.\n"
         
     | 
| 
       50 
49 
     | 
    
         
             
            		"        <xsl> is the XSLT stylesheet,\n"
         
     | 
| 
       51 
50 
     | 
    
         
             
            		"            and can use the swft: extension.\n"
         
     | 
| 
       52 
51 
     | 
    
         
             
            		"        <in>  must be some XML (depends on <xsl>)\n"
         
     | 
| 
       53 
52 
     | 
    
         
             
            		"        <out> is either SWF (when it ends in .swf)\n"
         
     | 
| 
       54 
53 
     | 
    
         
             
            		"            or XML, by default on 'stdout'\n"
         
     | 
| 
       55 
     | 
    
         
            -
            //		"           <param>* is a whitespace-separated list of name=value\n"
         
     | 
| 
       56 
     | 
    
         
            -
            //		"                 assignments for xsl parameters\n"
         
     | 
| 
       57 
54 
     | 
    
         
             
            		"\n"
         
     | 
| 
       58 
55 
     | 
    
         
             
            		"<option>s are:\n"
         
     | 
| 
       59 
56 
     | 
    
         
             
            		"    -h print this help and quit\n"
         
     | 
| 
       60 
57 
     | 
    
         
             
            		"    -v verbose output\n"
         
     | 
| 
       61 
58 
     | 
    
         
             
            		"    -V extra-verbose debugging output\n"
         
     | 
| 
       62 
59 
     | 
    
         
             
            		"    -d dump SWF data when loaded (for debugging)\n"
         
     | 
| 
      
 60 
     | 
    
         
            +
            		"    -e specify text encoding in SWF (for SWF 5 and earlier only;\n"
         
     | 
| 
      
 61 
     | 
    
         
            +
            		"           default: UTF-8).\n"
         
     | 
| 
       63 
62 
     | 
    
         
             
            		"    -n deactivate libxml network access\n"
         
     | 
| 
       64 
63 
     | 
    
         
             
            		"\n"
         
     | 
| 
       65 
64 
     | 
    
         
             
            		"Please report bugs at http://bugs.launchpad.net/swfmill/+filebug\n\n"
         
     | 
| 
         @@ -71,7 +70,6 @@ xsltStylesheetPtr xsltParseStylesheetMemory( const char *buffer, int size ) { 
     | 
|
| 
       71 
70 
     | 
    
         
             
            	xmlDocPtr doc = xmlParseMemory( buffer, size );
         
     | 
| 
       72 
71 
     | 
    
         
             
            	if( !doc ) return NULL;
         
     | 
| 
       73 
72 
     | 
    
         
             
            	xsltStylesheetPtr ret = xsltParseStylesheetDoc( doc );
         
     | 
| 
       74 
     | 
    
         
            -
            //	xmlFreeDoc( doc );
         
     | 
| 
       75 
73 
     | 
    
         
             
            	return ret;
         
     | 
| 
       76 
74 
     | 
    
         
             
            }
         
     | 
| 
       77 
75 
     | 
    
         | 
| 
         @@ -83,7 +81,7 @@ int swfmill_swf2xml( int argc, char *argv[] ) { 
     | 
|
| 
       83 
81 
     | 
    
         | 
| 
       84 
82 
     | 
    
         
             
            	File input;
         
     | 
| 
       85 
83 
     | 
    
         
             
            	unsigned int filesize, size, xmlsize;
         
     | 
| 
       86 
     | 
    
         
            -
             
     | 
| 
      
 84 
     | 
    
         
            +
            	struct stat filestat;
         
     | 
| 
       87 
85 
     | 
    
         
             
            	char sig;
         
     | 
| 
       88 
86 
     | 
    
         
             
            	Context ctx;
         
     | 
| 
       89 
87 
     | 
    
         | 
| 
         @@ -95,7 +93,7 @@ int swfmill_swf2xml( int argc, char *argv[] ) { 
     | 
|
| 
       95 
93 
     | 
    
         
             
            	infile = argv[0];
         
     | 
| 
       96 
94 
     | 
    
         
             
            	if( argc>1 ) outfile = argv[1];
         
     | 
| 
       97 
95 
     | 
    
         | 
| 
       98 
     | 
    
         
            -
            // open files
         
     | 
| 
      
 96 
     | 
    
         
            +
            	// open files
         
     | 
| 
       99 
97 
     | 
    
         
             
            	std_in = !strncmp( infile, "stdin", 5 );
         
     | 
| 
       100 
98 
     | 
    
         
             
            	std_out = !strncmp( outfile, "stdout", 6 );
         
     | 
| 
       101 
99 
     | 
    
         
             
            	in_fp = std_in ? stdin : fopen( infile, "rb" );
         
     | 
| 
         @@ -106,33 +104,37 @@ int swfmill_swf2xml( int argc, char *argv[] ) { 
     | 
|
| 
       106 
104 
     | 
    
         | 
| 
       107 
105 
     | 
    
         
             
            	if( !quiet ) fprintf(stderr,"Reading from %s\n", infile );
         
     | 
| 
       108 
106 
     | 
    
         | 
| 
       109 
     | 
    
         
            -
            // stat filesize
         
     | 
| 
       110 
     | 
    
         
            -
             
     | 
| 
       111 
     | 
    
         
            -
             
     | 
| 
       112 
     | 
    
         
            -
             
     | 
| 
       113 
     | 
    
         
            -
             
     | 
| 
       114 
     | 
    
         
            -
             
     | 
| 
       115 
     | 
    
         
            -
             
     | 
| 
       116 
     | 
    
         
            -
             
     | 
| 
       117 
     | 
    
         
            -
                
         
     | 
| 
       118 
     | 
    
         
            -
            // setup context
         
     | 
| 
      
 107 
     | 
    
         
            +
            	// stat filesize
         
     | 
| 
      
 108 
     | 
    
         
            +
            	filesize = (unsigned int)-1;
         
     | 
| 
      
 109 
     | 
    
         
            +
            	if( !std_in ) {
         
     | 
| 
      
 110 
     | 
    
         
            +
            		stat( infile, &filestat );
         
     | 
| 
      
 111 
     | 
    
         
            +
            	filesize = filestat.st_size;
         
     | 
| 
      
 112 
     | 
    
         
            +
            	}
         
     | 
| 
      
 113 
     | 
    
         
            +
            	
         
     | 
| 
      
 114 
     | 
    
         
            +
            	// setup context
         
     | 
| 
       119 
115 
     | 
    
         
             
            	ctx.debugTrace = verbose;
         
     | 
| 
       120 
116 
     | 
    
         
             
            	ctx.quiet = quiet;
         
     | 
| 
       121 
117 
     | 
    
         | 
| 
       122 
     | 
    
         
            -
             
     | 
| 
       123 
     | 
    
         
            -
             
     | 
| 
       124 
     | 
    
         
            -
             
     | 
| 
       125 
     | 
    
         
            -
             
     | 
| 
       126 
     | 
    
         
            -
             
     | 
| 
       127 
     | 
    
         
            -
             
     | 
| 
       128 
     | 
    
         
            -
             
     | 
| 
       129 
     | 
    
         
            -
             
     | 
| 
       130 
     | 
    
         
            -
             
     | 
| 
       131 
     | 
    
         
            -
             
     | 
| 
       132 
     | 
    
         
            -
             
     | 
| 
       133 
     | 
    
         
            -
             
     | 
| 
       134 
     | 
    
         
            -
            			 
     | 
| 
      
 118 
     | 
    
         
            +
            	// setup encoding conversion.
         
     | 
| 
      
 119 
     | 
    
         
            +
            	if (strcmp(swf_encoding, "UTF-8")) {
         
     | 
| 
      
 120 
     | 
    
         
            +
            		ctx.convertEncoding = true;
         
     | 
| 
      
 121 
     | 
    
         
            +
            		ctx.swf_encoding = swf_encoding;
         
     | 
| 
      
 122 
     | 
    
         
            +
            	}
         
     | 
| 
      
 123 
     | 
    
         
            +
             
     | 
| 
      
 124 
     | 
    
         
            +
            	// treat input as SWF, produce XML
         
     | 
| 
      
 125 
     | 
    
         
            +
            	if( (size = input.load( in_fp, &ctx, filesize )) != 0 ) {
         
     | 
| 
      
 126 
     | 
    
         
            +
            		if( dump ) input.dump();
         
     | 
| 
      
 127 
     | 
    
         
            +
            		out_fp = std_out ? stdout : fopen( outfile, "wb" );
         
     | 
| 
      
 128 
     | 
    
         
            +
            		if( !out_fp ) {
         
     | 
| 
      
 129 
     | 
    
         
            +
            			fprintf(stderr,"ERROR: could not open file %s for writing\n", outfile );
         
     | 
| 
      
 130 
     | 
    
         
            +
            			goto fail;
         
     | 
| 
      
 131 
     | 
    
         
            +
            		}
         
     | 
| 
      
 132 
     | 
    
         
            +
            		if( !quiet ) fprintf(stderr,"Writing XML to %s\n", outfile );
         
     | 
| 
      
 133 
     | 
    
         
            +
            		if( (xmlsize = input.saveXML( out_fp, &ctx )) != 0 ) {
         
     | 
| 
      
 134 
     | 
    
         
            +
            			if( !quiet ) fprintf(stderr,"XML saved to %s (%i bytes).\n", outfile, xmlsize );
         
     | 
| 
      
 135 
     | 
    
         
            +
            			success = true;
         
     | 
| 
       135 
136 
     | 
    
         
             
            		}
         
     | 
| 
      
 137 
     | 
    
         
            +
            	}
         
     | 
| 
       136 
138 
     | 
    
         
             
            fail:
         
     | 
| 
       137 
139 
     | 
    
         
             
            	if( in_fp && !std_in ) fclose(in_fp);
         
     | 
| 
       138 
140 
     | 
    
         
             
            	if( out_fp && !std_out ) fclose(out_fp);
         
     | 
| 
         @@ -162,7 +164,7 @@ int swfmill_xml2swf( int argc, char *argv[] ) { 
     | 
|
| 
       162 
164 
     | 
    
         
             
            	infile = argv[0];
         
     | 
| 
       163 
165 
     | 
    
         
             
            	if( argc>1 ) outfile = argv[1];
         
     | 
| 
       164 
166 
     | 
    
         | 
| 
       165 
     | 
    
         
            -
            // open files
         
     | 
| 
      
 167 
     | 
    
         
            +
            	// open files
         
     | 
| 
       166 
168 
     | 
    
         
             
            	std_in = !strncmp( infile, "stdin", 5 );
         
     | 
| 
       167 
169 
     | 
    
         
             
            	std_out = !strncmp( outfile, "stdout", 6 );
         
     | 
| 
       168 
170 
     | 
    
         
             
            	in_fp = std_in ? stdin : fopen( infile, "rb" );
         
     | 
| 
         @@ -173,10 +175,16 @@ int swfmill_xml2swf( int argc, char *argv[] ) { 
     | 
|
| 
       173 
175 
     | 
    
         | 
| 
       174 
176 
     | 
    
         
             
            	if( !quiet ) fprintf(stderr,"Reading from %s\n", infile );
         
     | 
| 
       175 
177 
     | 
    
         | 
| 
       176 
     | 
    
         
            -
            // setup context
         
     | 
| 
      
 178 
     | 
    
         
            +
            	// setup context
         
     | 
| 
       177 
179 
     | 
    
         
             
            	ctx.debugTrace = verbose;
         
     | 
| 
       178 
180 
     | 
    
         
             
            	ctx.quiet = quiet;
         
     | 
| 
       179 
     | 
    
         
            -
             
     | 
| 
      
 181 
     | 
    
         
            +
             
     | 
| 
      
 182 
     | 
    
         
            +
            	// setup encoding conversion.
         
     | 
| 
      
 183 
     | 
    
         
            +
            	if (strcmp(swf_encoding, "UTF-8")) {
         
     | 
| 
      
 184 
     | 
    
         
            +
            		ctx.convertEncoding = true;
         
     | 
| 
      
 185 
     | 
    
         
            +
            		ctx.swf_encoding = swf_encoding;
         
     | 
| 
      
 186 
     | 
    
         
            +
            	}
         
     | 
| 
      
 187 
     | 
    
         
            +
             
     | 
| 
       180 
188 
     | 
    
         
             
            	{
         
     | 
| 
       181 
189 
     | 
    
         
             
            		filename = std_in ? "-" : infile ;
         
     | 
| 
       182 
190 
     | 
    
         
             
            		doc = xmlParseFile( filename );
         
     | 
| 
         @@ -212,7 +220,7 @@ int swfmill_xml2swf( int argc, char *argv[] ) { 
     | 
|
| 
       212 
220 
     | 
    
         
             
            		}
         
     | 
| 
       213 
221 
     | 
    
         | 
| 
       214 
222 
     | 
    
         
             
            		// treat input as XML, produce SWF
         
     | 
| 
       215 
     | 
    
         
            -
            		input.setXML( doc->xmlRootNode,  
     | 
| 
      
 223 
     | 
    
         
            +
            		input.setXML( doc->xmlRootNode, &ctx );
         
     | 
| 
       216 
224 
     | 
    
         
             
            		if( dump ) input.dump();
         
     | 
| 
       217 
225 
     | 
    
         
             
            		out_fp = std_out ? stdout : fopen( outfile, "wb" );
         
     | 
| 
       218 
226 
     | 
    
         
             
            		if( !out_fp ) {
         
     | 
| 
         @@ -438,6 +446,15 @@ int main( int argc, char *argv[] ) { 
     | 
|
| 
       438 
446 
     | 
    
         
             
            						usage();
         
     | 
| 
       439 
447 
     | 
    
         
             
            						goto fail;
         
     | 
| 
       440 
448 
     | 
    
         
             
            						break;
         
     | 
| 
      
 449 
     | 
    
         
            +
            					case 'e':
         
     | 
| 
      
 450 
     | 
    
         
            +
            						++swallow;
         
     | 
| 
      
 451 
     | 
    
         
            +
            						if (i+swallow < argc) {
         
     | 
| 
      
 452 
     | 
    
         
            +
            							swf_encoding = argv[i+swallow];
         
     | 
| 
      
 453 
     | 
    
         
            +
            						} else {
         
     | 
| 
      
 454 
     | 
    
         
            +
            							usage();
         
     | 
| 
      
 455 
     | 
    
         
            +
            							goto fail;
         
     | 
| 
      
 456 
     | 
    
         
            +
            						}
         
     | 
| 
      
 457 
     | 
    
         
            +
            						break;
         
     | 
| 
       441 
458 
     | 
    
         
             
            					default:
         
     | 
| 
       442 
459 
     | 
    
         
             
            						fprintf(stderr,"ERROR: unknown option %c\n",argv[i][j]);
         
     | 
| 
       443 
460 
     | 
    
         
             
            						usage();
         
     | 
| 
         @@ -23,6 +23,62 @@ int getJpegWord( FILE *fp ) { 
     | 
|
| 
       23 
23 
     | 
    
         
             
            	return r;
         
     | 
| 
       24 
24 
     | 
    
         
             
            }
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
      
 26 
     | 
    
         
            +
            bool getJpegDimensions (FILE *infile, int &image_width, int &image_height) {
         
     | 
| 
      
 27 
     | 
    
         
            +
            	image_width = image_height = 0;
         
     | 
| 
      
 28 
     | 
    
         
            +
            	
         
     | 
| 
      
 29 
     | 
    
         
            +
            	if (fgetc(infile) != 0xff || fgetc(infile) != 0xd8) {
         
     | 
| 
      
 30 
     | 
    
         
            +
            		return false;
         
     | 
| 
      
 31 
     | 
    
         
            +
            	}
         
     | 
| 
      
 32 
     | 
    
         
            +
            	
         
     | 
| 
      
 33 
     | 
    
         
            +
            	while (!feof(infile)) {
         
     | 
| 
      
 34 
     | 
    
         
            +
            		if (fgetc(infile) != 0xff) {
         
     | 
| 
      
 35 
     | 
    
         
            +
            			return false;
         
     | 
| 
      
 36 
     | 
    
         
            +
            		}
         
     | 
| 
      
 37 
     | 
    
         
            +
            		
         
     | 
| 
      
 38 
     | 
    
         
            +
            		int marker;
         
     | 
| 
      
 39 
     | 
    
         
            +
            		do {
         
     | 
| 
      
 40 
     | 
    
         
            +
            			marker = fgetc(infile);
         
     | 
| 
      
 41 
     | 
    
         
            +
            		} while (marker == 0xff);
         
     | 
| 
      
 42 
     | 
    
         
            +
            		
         
     | 
| 
      
 43 
     | 
    
         
            +
            		switch (marker) {
         
     | 
| 
      
 44 
     | 
    
         
            +
            			case 0xc0:
         
     | 
| 
      
 45 
     | 
    
         
            +
            			case 0xc1:
         
     | 
| 
      
 46 
     | 
    
         
            +
            			case 0xc2:
         
     | 
| 
      
 47 
     | 
    
         
            +
            			case 0xc3:
         
     | 
| 
      
 48 
     | 
    
         
            +
            			case 0xc5:
         
     | 
| 
      
 49 
     | 
    
         
            +
            			case 0xc6:
         
     | 
| 
      
 50 
     | 
    
         
            +
            			case 0xc7:
         
     | 
| 
      
 51 
     | 
    
         
            +
            			case 0xc9:
         
     | 
| 
      
 52 
     | 
    
         
            +
            			case 0xca:
         
     | 
| 
      
 53 
     | 
    
         
            +
            			case 0xcb:
         
     | 
| 
      
 54 
     | 
    
         
            +
            			case 0xcd:
         
     | 
| 
      
 55 
     | 
    
         
            +
            			case 0xce:
         
     | 
| 
      
 56 
     | 
    
         
            +
            			case 0xcf:
         
     | 
| 
      
 57 
     | 
    
         
            +
            			getJpegWord(infile);
         
     | 
| 
      
 58 
     | 
    
         
            +
            			fgetc(infile);
         
     | 
| 
      
 59 
     | 
    
         
            +
            			image_height = getJpegWord(infile);
         
     | 
| 
      
 60 
     | 
    
         
            +
            			image_width = getJpegWord(infile);
         
     | 
| 
      
 61 
     | 
    
         
            +
            			fgetc(infile);
         
     | 
| 
      
 62 
     | 
    
         
            +
            			return true;
         
     | 
| 
      
 63 
     | 
    
         
            +
            			
         
     | 
| 
      
 64 
     | 
    
         
            +
            			case 0xda:
         
     | 
| 
      
 65 
     | 
    
         
            +
            			case 0xd9:
         
     | 
| 
      
 66 
     | 
    
         
            +
            			return false;
         
     | 
| 
      
 67 
     | 
    
         
            +
            			
         
     | 
| 
      
 68 
     | 
    
         
            +
            			default:
         
     | 
| 
      
 69 
     | 
    
         
            +
            			int length = getJpegWord(infile);
         
     | 
| 
      
 70 
     | 
    
         
            +
            			if (length < 2) {
         
     | 
| 
      
 71 
     | 
    
         
            +
            				return false;
         
     | 
| 
      
 72 
     | 
    
         
            +
            			} else {
         
     | 
| 
      
 73 
     | 
    
         
            +
            				fseek(infile, length-2, SEEK_CUR);
         
     | 
| 
      
 74 
     | 
    
         
            +
            			}
         
     | 
| 
      
 75 
     | 
    
         
            +
            			break;
         
     | 
| 
      
 76 
     | 
    
         
            +
            		}
         
     | 
| 
      
 77 
     | 
    
         
            +
            	}
         
     | 
| 
      
 78 
     | 
    
         
            +
            	
         
     | 
| 
      
 79 
     | 
    
         
            +
            	return false;
         
     | 
| 
      
 80 
     | 
    
         
            +
            }
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
       26 
82 
     | 
    
         
             
            void swft_import_jpeg( xmlXPathParserContextPtr ctx, int nargs ) {
         
     | 
| 
       27 
83 
     | 
    
         
             
            	xsltTransformContextPtr tctx;
         
     | 
| 
       28 
84 
     | 
    
         
             
            	unsigned char *filename;
         
     | 
| 
         @@ -51,7 +107,6 @@ void swft_import_jpeg( xmlXPathParserContextPtr ctx, int nargs ) { 
     | 
|
| 
       51 
107 
     | 
    
         
             
            	bool quiet = true;
         
     | 
| 
       52 
108 
     | 
    
         
             
            	xmlXPathObjectPtr quietObj = xsltVariableLookup( tctx, (const xmlChar*)"quiet", NULL );
         
     | 
| 
       53 
109 
     | 
    
         
             
            	if( quietObj && quietObj->stringval ) { quiet = !strcmp("true",(const char*)quietObj->stringval ); };
         
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
110 
     | 
    
         | 
| 
       56 
111 
     | 
    
         
             
            	FILE *fp = fopen( (const char *)filename, "rb" );
         
     | 
| 
       57 
112 
     | 
    
         
             
            	if( !fp ) {
         
     | 
| 
         @@ -67,28 +122,19 @@ void swft_import_jpeg( xmlXPathParserContextPtr ctx, int nargs ) { 
     | 
|
| 
       67 
122 
     | 
    
         | 
| 
       68 
123 
     | 
    
         
             
            	swft_addFileName( node, (const char *)filename );
         
     | 
| 
       69 
124 
     | 
    
         | 
| 
       70 
     | 
    
         
            -
            	 
     | 
| 
       71 
     | 
    
         
            -
            	int width 
     | 
| 
       72 
     | 
    
         
            -
            	 
     | 
| 
       73 
     | 
    
         
            -
            		 
     | 
| 
       74 
     | 
    
         
            -
             
     | 
| 
       75 
     | 
    
         
            -
            				// StartOfFrame
         
     | 
| 
       76 
     | 
    
         
            -
            				// skip length and precision (UGLY, eh?)
         
     | 
| 
       77 
     | 
    
         
            -
            				fgetc(fp); fgetc(fp); fgetc(fp);
         
     | 
| 
       78 
     | 
    
         
            -
            				
         
     | 
| 
       79 
     | 
    
         
            -
            				// read height, width
         
     | 
| 
       80 
     | 
    
         
            -
            				height = getJpegWord( fp );
         
     | 
| 
       81 
     | 
    
         
            -
            				width = getJpegWord( fp );
         
     | 
| 
       82 
     | 
    
         
            -
            			}
         
     | 
| 
       83 
     | 
    
         
            -
            		}
         
     | 
| 
      
 125 
     | 
    
         
            +
            	unsigned char *data = NULL;
         
     | 
| 
      
 126 
     | 
    
         
            +
            	int width, height;
         
     | 
| 
      
 127 
     | 
    
         
            +
            	if (!getJpegDimensions(fp, width, height)) {
         
     | 
| 
      
 128 
     | 
    
         
            +
            		fprintf(stderr, "WARNING: could not extract dimensions for jpeg %s\n", filename);
         
     | 
| 
      
 129 
     | 
    
         
            +
            		goto fail;
         
     | 
| 
       84 
130 
     | 
    
         
             
            	}
         
     | 
| 
      
 131 
     | 
    
         
            +
            	
         
     | 
| 
       85 
132 
     | 
    
         
             
            	snprintf(tmp,TMP_STRLEN,"%i", width);
         
     | 
| 
       86 
133 
     | 
    
         
             
            	xmlSetProp( node, (const xmlChar *)"width", (const xmlChar *)&tmp );
         
     | 
| 
       87 
134 
     | 
    
         
             
            	snprintf(tmp,TMP_STRLEN,"%i", height);
         
     | 
| 
       88 
135 
     | 
    
         
             
            	xmlSetProp( node, (const xmlChar *)"height", (const xmlChar *)&tmp );
         
     | 
| 
       89 
136 
     | 
    
         | 
| 
       90 
137 
     | 
    
         
             
            	// add data
         
     | 
| 
       91 
     | 
    
         
            -
            	unsigned char *data = NULL;
         
     | 
| 
       92 
138 
     | 
    
         
             
            	int size, ofs;
         
     | 
| 
       93 
139 
     | 
    
         
             
            	struct stat filestat;
         
     | 
| 
       94 
140 
     | 
    
         
             
            	if( stat( (const char *)filename, &filestat ) ) goto fail;
         
     |