gnash-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnash-commit] gnash ChangeLog server/vm/ASHandlers.cpp


From: Benjamin Wolsey
Subject: [Gnash-commit] gnash ChangeLog server/vm/ASHandlers.cpp
Date: Thu, 06 Mar 2008 11:11:50 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Benjamin Wolsey <bwy>   08/03/06 11:11:49

Modified files:
        .              : ChangeLog 
        server/vm      : ASHandlers.cpp 

Log message:
                * server/vm/ASHandlers.cpp: fix mbchr to return a UTF-8 string;
                  make sure both mbchr and chr handle characters only up to
                  65535. Fixes behaviour for SWF6, 7, and 8.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.5814&r2=1.5815
http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/ASHandlers.cpp?cvsroot=gnash&r1=1.203&r2=1.204

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.5814
retrieving revision 1.5815
diff -u -b -r1.5814 -r1.5815
--- ChangeLog   6 Mar 2008 05:22:49 -0000       1.5814
+++ ChangeLog   6 Mar 2008 11:11:48 -0000       1.5815
@@ -1,3 +1,9 @@
+2008-03-06 Benjamin Wolsey <address@hidden>
+
+       * server/vm/ASHandlers.cpp: fix mbchr to return a UTF-8 string;
+         make sure both mbchr and chr handle characters only up to
+         65535. Fixes behaviour for SWF6, 7, and 8.
+
 2008-03-04 Bastiaan Jacques <address@hidden>
 
        * libamf/{amf.h, element.h, lcshm.h, sol.h},

Index: server/vm/ASHandlers.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/vm/ASHandlers.cpp,v
retrieving revision 1.203
retrieving revision 1.204
diff -u -b -r1.203 -r1.204
--- server/vm/ASHandlers.cpp    5 Mar 2008 11:54:32 -0000       1.203
+++ server/vm/ASHandlers.cpp    6 Mar 2008 11:11:49 -0000       1.204
@@ -1667,7 +1667,8 @@
     as_environment& env = thread.env;
     thread.ensureStack(1);
     
-    boost::uint32_t c = env.top(0).to_int();
+    // Only handles values up to 65535
+    boost::uint16_t c = static_cast<boost::uint16_t>(env.top(0).to_int());
 
     // If the argument to chr() is '0', we return
     // nothing, not NULL
@@ -1799,25 +1800,21 @@
 void
 SWFHandlers::ActionMbChr(ActionExec& thread)
 {
-//    GNASH_REPORT_FUNCTION;
-//    The correctness of this depends on the locale being correct,
-//    which it should be far more often than not, by choosing UTF8.
+    /// This only generates UTF-8 characters. No idea
+    /// what difference user locale might make, but UTF-8
+    /// is generally GOOD.
     as_environment& env = thread.env;
 
     thread.ensureStack(1);
 
-    wchar_t i = static_cast<wchar_t> (env.top(0).to_int());
-    boost::scoped_array<char> strng(new char [MB_CUR_MAX + 1]);
-    char *str = strng.get();
-    memset(str, '\0', MB_CUR_MAX + 1);
-    if (wctomb(str, i) == -1)
-    {
-        env.top(0).set_undefined();
-    }
-    else
-    {
-        env.top(0).set_string(str);
-    }
+    // Cut to uint16, as characters above 65535 'wrap around'
+    const boost::uint16_t i = static_cast<boost::uint16_t> 
(env.top(0).to_int());
+    
+    std::string out = utf8::encodeUnicodeCharacter(i);
+    
+    /// Always valid, or can it be undefined?
+    env.top(0).set_string(out);
+
 }
 
 // also known as WaitForFrame2




reply via email to

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