[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ...
From: |
Benjamin Wolsey |
Subject: |
[Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ... |
Date: |
Wed, 06 Feb 2008 15:20:59 +0000 |
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 <address@hidden>
+
+ * 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 <address@hidden>
* 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] gnash ChangeLog server/edit_text_character.cpp ..., Sandro Santilli, 2008/02/02
- [Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ..., Benjamin Wolsey, 2008/02/04
- [Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ..., Benjamin Wolsey, 2008/02/06
- [Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ...,
Benjamin Wolsey <=
- [Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ..., Sandro Santilli, 2008/02/07
- [Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ..., Sandro Santilli, 2008/02/07
- [Gnash-commit] gnash ChangeLog server/edit_text_character.cpp ..., Sandro Santilli, 2008/02/12