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();