gnash-commit
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]