CVSROOT: /sources/gnash Module name: gnash Changes by: Benjamin Wolsey <bwy> 08/02/06 15:20:58
Modified files: . : ChangeLog server : edit_text_character.cpp server/asobj : string.cpp server/vm : ASHandlers.cpp Log message: /home/benjamin/tmp/cvsuxpk2e CVSWeb URLs: http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.5575&r2=1.5576 http://cvs.savannah.gnu.org/viewcvs/gnash/server/edit_text_character.cpp?cvsroot=gnash&r1=1.147&r2=1.148 http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/string.cpp?cvsroot=gnash&r1=1.52&r2=1.53 http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/ASHandlers.cpp?cvsroot=gnash&r1=1.193&r2=1.194 Patches: Index: ChangeLog =================================================================== RCS file: /sources/gnash/gnash/ChangeLog,v retrieving revision 1.5575 retrieving revision 1.5576 diff -u -b -r1.5575 -r1.5576 --- ChangeLog 6 Feb 2008 15:08:20 -0000 1.5575 +++ ChangeLog 6 Feb 2008 15:20:56 -0000 1.5576 @@ -1,3 +1,13 @@ +2008-02-06 Benjamin Wolsey <[EMAIL PROTECTED]> + + * libbase/utf8.{cpp,h}: take SWF version argument, use ISO-8859 + encoding for SWF5 and below. + * server/asobj/string.cpp: pass version information to utf encoding + functions. + * server/vm/ASHandlers.cpp: pass version information, use ISO-8859 + encoding for SWF5 and below. Restores SWF5's inability to cope with + UTF-8, passes swfdec testsuite again. + 2008-02-06 Sandro Santilli <[EMAIL PROTECTED]> * testsuite/actionscript.all/array.as: add more crazy calls, in Index: server/edit_text_character.cpp =================================================================== RCS file: /sources/gnash/gnash/server/edit_text_character.cpp,v retrieving revision 1.147 retrieving revision 1.148 diff -u -b -r1.147 -r1.148 --- server/edit_text_character.cpp 6 Feb 2008 12:00:38 -0000 1.147 +++ server/edit_text_character.cpp 6 Feb 2008 15:20:57 -0000 1.148 @@ -408,7 +408,9 @@ // (if the textvariable already exist and has a value // the text will be replaced with it) - setTextValue(utf8::decodeCanonicalString(m_def->get_default_text())); + int version = VM::get().getSWFVersion(); + + setTextValue(utf8::decodeCanonicalString(m_def->get_default_text(), version)); m_dummy_style.push_back(fill_style()); @@ -697,7 +699,8 @@ void edit_text_character::updateText(const std::string& str) { - const std::wstring& wstr = utf8::decodeCanonicalString(str); + int version = VM::get().getSWFVersion(); + const std::wstring& wstr = utf8::decodeCanonicalString(str, version); updateText(wstr); } @@ -740,7 +743,9 @@ as_object* tgt = ref.first; if ( tgt ) { - tgt->set_member(ref.second, utf8::encodeCanonicalString(wstr)); // we shouldn't truncate, right ? + int version = VM::get().getSWFVersion(); + // we shouldn't truncate, right? + tgt->set_member(ref.second, utf8::encodeCanonicalString(wstr, version)); } else { @@ -761,7 +766,9 @@ // with a pre-existing value. const_cast<edit_text_character*>(this)->registerTextVariable(); - return utf8::encodeCanonicalString(_text); + int version = VM::get().getSWFVersion(); + + return utf8::encodeCanonicalString(_text, version); } void @@ -782,14 +789,14 @@ //if (name == "text") { int version = get_parent()->get_movie_definition()->get_version(); - setTextValue(utf8::decodeCanonicalString(val.to_string_versioned(version))); + setTextValue(utf8::decodeCanonicalString(val.to_string_versioned(version), version)); return; } case NSV::PROP_HTML_TEXT: //if (name == "htmlText") { int version = get_parent()->get_movie_definition()->get_version(); - setTextValue(utf8::decodeCanonicalString(val.to_string_versioned(version))); + setTextValue(utf8::decodeCanonicalString(val.to_string_versioned(version), version)); format_text(); return; } @@ -1583,6 +1590,9 @@ // check if the VariableName already has a value, // in that case update text value as_value val; + + int version = VM::get().getSWFVersion(); + if (target->get_member(key, &val) ) { #ifdef DEBUG_DYNTEXT_VARIABLES @@ -1590,14 +1600,14 @@ #endif // TODO: pass environment to to_string ? // as_environment& env = get_environment(); - setTextValue(utf8::decodeCanonicalString(val.to_string())); + setTextValue(utf8::decodeCanonicalString(val.to_string(), version)); } else { #ifdef DEBUG_DYNTEXT_VARIABLES log_msg(_("target sprite (%p) does NOT have a member named %s (no problem, we'll add it)"), (void*)sprite, _vm.getStringTable().value(key).c_str()); #endif - target->set_member(key, as_value(utf8::encodeCanonicalString(_text))); + target->set_member(key, as_value(utf8::encodeCanonicalString(_text, version))); } sprite_instance* sprite = target->to_movie(); Index: server/asobj/string.cpp =================================================================== RCS file: /sources/gnash/gnash/server/asobj/string.cpp,v retrieving revision 1.52 retrieving revision 1.53 diff -u -b -r1.52 -r1.53 --- server/asobj/string.cpp 5 Feb 2008 15:34:41 -0000 1.52 +++ server/asobj/string.cpp 6 Feb 2008 15:20:58 -0000 1.53 @@ -16,7 +16,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -/* $Id: string.cpp,v 1.52 2008/02/05 15:34:41 bwy Exp $ */ +/* $Id: string.cpp,v 1.53 2008/02/06 15:20:58 bwy Exp $ */ #ifdef HAVE_CONFIG_H #include "gnashconfig.h" @@ -194,7 +194,9 @@ { boost::intrusive_ptr<string_as_object> obj = ensureType<string_as_object>(fn.this_ptr); - std::wstring wstr = utf8::decodeCanonicalString(obj->str()); + int version = VM::get().getSWFVersion(); + + std::wstring wstr = utf8::decodeCanonicalString(obj->str(), version); return as_value(wstr.size()); } @@ -236,8 +238,10 @@ { boost::intrusive_ptr<string_as_object> obj = ensureType<string_as_object>(fn.this_ptr); + int version = VM::get().getSWFVersion(); + // Make a copy. - std::wstring wstr = utf8::decodeCanonicalString(obj->str()); + std::wstring wstr = utf8::decodeCanonicalString(obj->str(), version); ENSURE_FN_ARGS(1, 2, as_value()); @@ -261,7 +265,7 @@ log_msg("start: "SIZET_FMT", end: "SIZET_FMT", retlen: "SIZET_FMT, start, end, retlen); - return as_value(utf8::encodeCanonicalString(wstr.substr(start, retlen))); + return as_value(utf8::encodeCanonicalString(wstr.substr(start, retlen), version)); } static as_value @@ -270,7 +274,9 @@ boost::intrusive_ptr<string_as_object> obj = ensureType<string_as_object>(fn.this_ptr); - std::wstring wstr = utf8::decodeCanonicalString(obj->str()); + int version = VM::get().getSWFVersion(); + + std::wstring wstr = utf8::decodeCanonicalString(obj->str(), version); as_value val; @@ -286,7 +292,7 @@ return as_value(array.get()); } - const std::wstring& delim = utf8::decodeCanonicalString(fn.arg(0).to_string()); + const std::wstring& delim = utf8::decodeCanonicalString(fn.arg(0).to_string(), version); // SWF5 didn't support multichar or empty delimiter if ( SWFVersion < 6 ) @@ -322,7 +328,7 @@ if ( delim.empty() ) { for (unsigned i=0; i <max; i++) { - val.set_std_string(utf8::encodeCanonicalString(wstr.substr(i, 1))); + val.set_std_string(utf8::encodeCanonicalString(wstr.substr(i, 1), version)); array->push(val); } @@ -337,13 +343,17 @@ pos = wstr.find(delim, pos); if (pos != std::wstring::npos) { - val.set_std_string(utf8::encodeCanonicalString(wstr.substr(prevpos, pos - prevpos))); + val.set_std_string(utf8::encodeCanonicalString( + wstr.substr(prevpos, pos - prevpos), + version)); array->push(val); num++; prevpos = pos + delim.size(); pos++; } else { - val.set_std_string(utf8::encodeCanonicalString(wstr.substr(prevpos))); + val.set_std_string(utf8::encodeCanonicalString( + wstr.substr(prevpos), + version)); array->push(val); break; } @@ -384,8 +394,9 @@ { boost::intrusive_ptr<string_as_object> obj = ensureType<string_as_object>(fn.this_ptr); + int version = VM::get().getSWFVersion(); // Make a copy. - std::wstring wstr = utf8::decodeCanonicalString(obj->str()); + std::wstring wstr = utf8::decodeCanonicalString(obj->str(), version); ENSURE_FN_ARGS(1, 2, obj->str()); @@ -407,7 +418,7 @@ } } - return as_value(utf8::encodeCanonicalString(wstr.substr(start, num))); + return as_value(utf8::encodeCanonicalString(wstr.substr(start, num), version)); } // 1st param: start_index, 2nd param: end_index @@ -417,7 +428,9 @@ { boost::intrusive_ptr<string_as_object> obj = ensureType<string_as_object>(fn.this_ptr); - const std::wstring& wstr = utf8::decodeCanonicalString(obj->str()); + int version = VM::get().getSWFVersion(); + + const std::wstring& wstr = utf8::decodeCanonicalString(obj->str(), version); ENSURE_FN_ARGS(1, 2, obj->str()); @@ -457,7 +470,7 @@ //log_debug("Start: %d, End: %d", start, end); - return as_value(utf8::encodeCanonicalString(wstr.substr(start, end))); + return as_value(utf8::encodeCanonicalString(wstr.substr(start, end), version)); } static as_value @@ -465,12 +478,14 @@ { boost::intrusive_ptr<string_as_object> obj = ensureType<string_as_object>(fn.this_ptr); - const std::wstring& wstr = utf8::decodeCanonicalString(obj->str()); + int version = VM::get().getSWFVersion(); + + const std::wstring& wstr = utf8::decodeCanonicalString(obj->str(), version); ENSURE_FN_ARGS(1, 2, -1); as_value& tfarg = fn.arg(0); // to find arg - const std::wstring& toFind = utf8::decodeCanonicalString(tfarg.to_string()); + const std::wstring& toFind = utf8::decodeCanonicalString(tfarg.to_string(), version); size_t start = 0; @@ -513,7 +528,9 @@ result += c; } - return as_value(utf8::encodeCanonicalString(result)); + int version = VM::get().getSWFVersion(); + + return as_value(utf8::encodeCanonicalString(result, version)); } static as_value @@ -521,7 +538,9 @@ { boost::intrusive_ptr<string_as_object> obj = ensureType<string_as_object>(fn.this_ptr); - const std::wstring& wstr = utf8::decodeCanonicalString(obj->str()); + int version = VM::get().getSWFVersion(); + + const std::wstring& wstr = utf8::decodeCanonicalString(obj->str(), version); if (fn.nargs == 0) { IF_VERBOSE_ASCODING_ERRORS( @@ -553,7 +572,10 @@ string_char_at(const fn_call& fn) { boost::intrusive_ptr<string_as_object> obj = ensureType<string_as_object>(fn.this_ptr); - const std::wstring& wstr = utf8::decodeCanonicalString(obj->str()); + + int version = VM::get().getSWFVersion(); + + const std::wstring& wstr = utf8::decodeCanonicalString(obj->str(), version); ENSURE_FN_ARGS(1, 1, ""); @@ -567,7 +589,7 @@ std::string rv; - rv.append(utf8::encodeCanonicalString(wstr.substr(index, 1))); + rv.append(utf8::encodeCanonicalString(wstr.substr(index, 1), version)); return as_value(rv); } Index: server/vm/ASHandlers.cpp =================================================================== RCS file: /sources/gnash/gnash/server/vm/ASHandlers.cpp,v retrieving revision 1.193 retrieving revision 1.194 diff -u -b -r1.193 -r1.194 --- server/vm/ASHandlers.cpp 6 Feb 2008 12:00:38 -0000 1.193 +++ server/vm/ASHandlers.cpp 6 Feb 2008 15:20:58 -0000 1.194 @@ -17,7 +17,7 @@ // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA // -/* $Id: ASHandlers.cpp,v 1.193 2008/02/06 12:00:38 bwy Exp $ */ +/* $Id: ASHandlers.cpp,v 1.194 2008/02/06 15:20:58 bwy Exp $ */ #ifdef HAVE_CONFIG_H #include "gnashconfig.h" @@ -1638,25 +1638,19 @@ // Should return 0 - if (env.get_version() <= 5) - { - // SWF4-5 return the unsigned value of the first char of a - // multi-byte character. - const std::string& str = env.top(0).to_string(); - env.top(0).set_int(static_cast<unsigned char>(str[0])); - } - else - { - // SWF6+ handles multi-byte unicode characters. - const std::wstring& wstr = utf8::decodeCanonicalString(env.top(0).to_string()); + int version = env.get_version(); + + const std::wstring& wstr = utf8::decodeCanonicalString(env.top(0).to_string(), version); + + // decodeCanonicalString should correctly work out what the first character + // is according to version. env.top(0).set_int(wstr[0]); - } } void SWFHandlers::ActionChr(ActionExec& thread) { -// GNASH_REPORT_FUNCTION; + as_environment& env = thread.env; thread.ensureStack(1); @@ -1668,24 +1662,34 @@ else { - // SWF5 returns the unsigned value of the last byte. - if (env.get_version() <= 5) - { - std::string ret = ""; - // This adds an unsigned char to a string, giving - // IS0-8859 8-bit characters. + + int version = env.get_version(); + + std::wstring ret = L""; + + if (version > 5) ret.push_back(static_cast<wchar_t>(c)); + + // This casts to unsigned char to a string, giving + // IS0-8859-1 8-bit characters. // Values above 256 evaluate to value % 256, // which is expected behaviour. - ret.push_back(static_cast<unsigned char>(c)); - env.top(0).set_string(ret); + else + { + unsigned char uc = static_cast<unsigned char>(c); + if (uc == 0) + { + env.top(0).set_string(""); + return; } else { - std::wstring ret = L""; - ret.push_back(static_cast<wchar_t>(c)); - env.top(0).set_string(utf8::encodeCanonicalString(ret)); + ret.push_back(uc); } } + + env.top(0).set_string(utf8::encodeCanonicalString(ret, version)); + + } } void _______________________________________________ Gnash-commit mailing list Gnash-commit@gnu.org http://lists.gnu.org/mailman/listinfo/gnash-commit