diff -r 890008de2d33 src/SWFFile.cpp --- a/src/SWFFile.cpp Fri Jan 18 19:29:31 2008 +0900 +++ b/src/SWFFile.cpp Mon Jan 21 21:24:57 2008 +0900 @@ -205,7 +205,7 @@ int File::saveXML( FILE *fp, Context *ct xmlDocPtr doc = getXML( ctx ); if( !doc ) goto fail; - xmlDocDumpFormatMemory( doc, (xmlChar**)&data, &size, 1 ); + xmlDocDumpFormatMemoryEnc( doc, (xmlChar**)&data, &size, "UTF-8", 1 ); if( size ) fwrite( data, size, 1, fp ); diff -r 890008de2d33 src/SWFReader.cpp --- a/src/SWFReader.cpp Fri Jan 18 19:29:31 2008 +0900 +++ b/src/SWFReader.cpp Mon Jan 21 21:24:57 2008 +0900 @@ -199,9 +199,12 @@ double Reader::getFixed( int bytesize, i char *Reader::getString() { byteAlign(); - int len = strlen((const char *)&data[pos]); - pos += len+1; - return strdup( (const char *)&data[pos-(len+1)] ); + const char *src = (const char*)&data[pos]; + size_t len = strlen(src) + 1; + char *dst = new char[len]; + memcpy( dst, src, len ); + pos += len; + return( dst ); } char *Reader::getPString() { diff -r 890008de2d33 src/codegen/basics.xsl --- a/src/codegen/basics.xsl Fri Jan 18 19:29:31 2008 +0900 +++ b/src/codegen/basics.xsl Mon Jan 21 21:24:57 2008 +0900 @@ -14,7 +14,7 @@ - if( ) delete ; + if( ) delete[] ; @@ -57,7 +57,7 @@ namespace } diff -r 890008de2d33 src/codegen/header.xsl --- a/src/codegen/header.xsl Fri Jan 18 19:29:31 2008 +0900 +++ b/src/codegen/header.xsl Mon Jan 21 21:24:57 2008 +0900 @@ -31,6 +31,9 @@ struct Context { char tagVersion; bool alpha; bool many_shapes; + + bool convertEncoding; + const char *swf_encoding; diff -r 890008de2d33 src/codegen/parsexml.xsl --- a/src/codegen/parsexml.xsl Fri Jan 18 19:29:31 2008 +0900 +++ b/src/codegen/parsexml.xsl Mon Jan 21 21:24:57 2008 +0900 @@ -7,8 +7,58 @@ #include <string.h> #include <ctype.h> #include "base64.h" +#include <errno.h> +#include <iconv.h> namespace { +char *fromXmlChar(const Context *ctx, const xmlChar *from_str) { + if (ctx->convertEncoding) { + size_t len = strlen((const char *)from_str); + iconv_t cd = iconv_open(ctx->swf_encoding, "UTF-8"); + if (cd < 0) { + fprintf(stderr, "iconv_open failed.\n"); + char *buf = new char[1]; + buf[0] = '\0'; + return buf; + } + size_t buf_size = (len + 1) * 2; + for (;;) { + char * const dst = new char[buf_size]; + size_t inbytesleft = len; + size_t outbytesleft = buf_size - 1; // reserve 1 byte for '\0' + char *pin = (char*)from_str; + char *pout = dst; + bool expandbuf = false; + + while (inbytesleft > 0) { + size_t r = iconv(cd, &pin, &inbytesleft, &pout, &outbytesleft); + if (r == (size_t)-1) { + if (errno == E2BIG) { + expandbuf = true; + } else { + // bad input charctor + fprintf(stderr, "iconv failed: %s\n", from_str); + } + break; + } + } + if (expandbuf) { + iconv(cd, 0, 0, 0, 0); + delete[] dst; + buf_size *= 2; + continue; + } + *pout = '\0'; + iconv_close(cd); + return dst; + } + } else { + size_t len = strlen((const char *)from_str) + 1; + char *buf = new char[len]; + strcpy(buf, (const char *)from_str); + return buf; + } +} void ::parseXML( xmlNodePtr node, Context *ctx ) { @@ -166,7 +216,8 @@ void ::par tmp = xmlGetProp( node, (const xmlChar *)"" ); if( tmp ) { - = strdup((const char *)tmp); + char *val = fromXmlChar(ctx, (const xmlChar*)tmp); + = val; } else { fprintf(stderr,"WARNING: no property in %s element\n", (const char *)node->name ); = strdup("[undefined]"); diff -r 890008de2d33 src/codegen/writexml.xsl --- a/src/codegen/writexml.xsl Fri Jan 18 19:29:31 2008 +0900 +++ b/src/codegen/writexml.xsl Mon Jan 21 21:24:57 2008 +0900 @@ -6,8 +6,60 @@ #include ".h" #include "base64.h" #include "string.h" +#include <errno.h> +#include <iconv.h> namespace { + +xmlChar *toXmlChar(const Context *ctx, const char *from_str) { + if (ctx->convertEncoding) { + size_t len = strlen(from_str); + iconv_t cd = iconv_open("UTF-8", ctx->swf_encoding); + if (cd < 0) { + fprintf(stderr, "iconv_open failed.\n"); + return xmlCharStrdup(""); + } + + size_t buf_size = (len + 1) * 2; + char *dst; + for (;;) { + dst = new char[buf_size]; + size_t inbytesleft = len; + size_t outbytesleft = buf_size - 1; + char *pin = (char*)from_str; + char *pout = dst; + bool expandbuf = false; + + while (inbytesleft > 0) { + size_t r = iconv(cd, &pin, &inbytesleft, &pout, &outbytesleft); + if (r == (size_t)-1) { + if (errno == E2BIG) { + // buf_size shorten + expandbuf = true; + } else { + //bad input charctor + fprintf(stderr, "iconv failed: %s\n", from_str); + } + break; + } + } + if (expandbuf) { + delete[] dst; + iconv(cd, 0, 0, 0, 0); + buf_size *= 2; + continue; + } + *pout = '\0'; + break; + } + iconv_close(cd); + xmlChar *ret = xmlCharStrdup(dst); + delete[] dst; + return ret; + } else { + return xmlCharStrdup(from_str); + } +} #define TMP_STRLEN 0xFF @@ -72,7 +124,8 @@ void ::wri if( ) { - xmlSetProp( node, (const xmlChar *)"", (const xmlChar *) ); + xmlChar *xmlstr = toXmlChar(ctx, ); + xmlSetProp(node, (const xmlChar *)"", xmlstr); } diff -r 890008de2d33 src/swfmill.cpp --- a/src/swfmill.cpp Fri Jan 18 19:29:31 2008 +0900 +++ b/src/swfmill.cpp Mon Jan 21 21:24:57 2008 +0900 @@ -17,6 +17,7 @@ bool verbose = false; bool verbose = false; bool dump = false; bool nonet = false; +const char *swf_encoding = "UTF-8"; const char *internal_stylesheet = NULL; void usage() { @@ -60,6 +61,7 @@ void usage() { " -v verbose output\n" " -V extra-verbose debugging output\n" " -d dump SWF data when loaded (for debugging)\n" + " -e specify text encoding in swf file. (default: UTF-8).\n" " -n deactivate libxml network access" "\n" "E-mail bug reports to "PACKAGE_BUGREPORT"\n\n" @@ -119,6 +121,12 @@ int swfmill_swf2xml( int argc, char *arg ctx.debugTrace = verbose; ctx.quiet = quiet; +// setup encoding convertion. + if (strcmp(swf_encoding, "UTF-8")) { + ctx.convertEncoding = true; + ctx.swf_encoding = swf_encoding; + } + // treat input as SWF, produce XML if( (size = input.load( in_fp, &ctx, filesize )) != 0 ) { if( dump ) input.dump(); @@ -176,7 +184,13 @@ int swfmill_xml2swf( int argc, char *arg // setup context ctx.debugTrace = verbose; ctx.quiet = quiet; - + +// setup encoding convertion. + if (strcmp(swf_encoding, "UTF-8")) { + ctx.convertEncoding = true; + ctx.swf_encoding = swf_encoding; + } + { filename = std_in ? "-" : infile ; doc = xmlParseFile( filename ); @@ -212,7 +226,7 @@ int swfmill_xml2swf( int argc, char *arg } // treat input as XML, produce SWF - input.setXML( doc->xmlRootNode, NULL ); + input.setXML( doc->xmlRootNode, &ctx ); if( dump ) input.dump(); out_fp = std_out ? stdout : fopen( outfile, "wb" ); if( !out_fp ) { @@ -437,6 +451,15 @@ int main( int argc, char *argv[] ) { usage(); goto fail; break; + case 'e': + ++swallow; + if (i+swallow < argc) { + swf_encoding = argv[i+swallow]; + } else { + usage(); + goto fail; + } + break; default: fprintf(stderr,"ERROR: unknown option %c\n",argv[i][j]); usage();