gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] gnash ChangeLog server/asobj/string.cpp


From: Benjamin Wolsey
Subject: [Gnash-commit] gnash ChangeLog server/asobj/string.cpp
Date: Mon, 17 Mar 2008 12:05:16 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Benjamin Wolsey <bwy>   08/03/17 12:05:16

Modified files:
        .              : ChangeLog 
        server/asobj   : string.cpp 

Log message:
                * server/asobj/string.cpp: fix fromCharCode for SWF6+, sort
                  of fix it for SWF5. This would get more passes in the swfdec
                  testsuite if swfdec_gnash_tester could catch newlines in
                  trace output.
        
        Handling of SWF5's encoding is becoming a bit of a mess, and log output 
isn't
        utf-8, which is bad. It needs more attention.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.5944&r2=1.5945
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/string.cpp?cvsroot=gnash&r1=1.59&r2=1.60

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.5944
retrieving revision 1.5945
diff -u -b -r1.5944 -r1.5945
--- ChangeLog   17 Mar 2008 11:36:45 -0000      1.5944
+++ ChangeLog   17 Mar 2008 12:04:45 -0000      1.5945
@@ -1,3 +1,10 @@
+2008-03-17 Benjamin Wolsey <address@hidden>
+
+       * server/asobj/string.cpp: fix fromCharCode for SWF6+, sort
+         of fix it for SWF5. This would get more passes in the swfdec
+         testsuite if swfdec_gnash_tester could catch newlines in
+         trace output.
+
 2008-03-17 Sandro Santilli <address@hidden>
 
        * testsuite/actionscript.all/Inheritance.as: fixed bug in testcase

Index: server/asobj/string.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/string.cpp,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -b -r1.59 -r1.60
--- server/asobj/string.cpp     17 Mar 2008 08:06:47 -0000      1.59
+++ server/asobj/string.cpp     17 Mar 2008 12:05:16 -0000      1.60
@@ -488,14 +488,14 @@
 
     ENSURE_FN_ARGS(1, 2, -1);
 
-    as_value& tfarg = fn.arg(0); // to find arg
+    const as_value& tfarg = fn.arg(0); // to find arg
     const std::wstring& toFind = 
utf8::decodeCanonicalString(tfarg.to_string(), version);
 
     size_t start = 0;
 
     if (fn.nargs >= 2)
     {
-        as_value& saval = fn.arg(1); // start arg val
+        const as_value& saval = fn.arg(1); // start arg val
         int start_arg = saval.to_int();
         if ( start_arg > 0 ) start = (size_t) start_arg;
        else
@@ -520,21 +520,48 @@
     return as_value(pos);
 }
 
+// String.fromCharCode(code1[, code2[, code3[, code4[, ...]]]])
+// Makes a string out of any number of char codes.
+// The string is always UTF8, so SWF5 mangles it.
 static as_value
 string_from_char_code(const fn_call& fn)
 {
-    std::wstring result;
 
-    // isn't this function supposed to take one argument?
+    int version = VM::get().getSWFVersion();
+
+    if (version == 5)
+    {
+        std::string str;
+        for (unsigned int i = 0; i < fn.nargs; i++)
+        {
+            // Maximum 65535, as with all character codes.
+            boost::uint16_t c = 
static_cast<boost::uint16_t>(fn.arg(i).to_int());
 
-    for (unsigned int i = 0; i < fn.nargs; i++) {
-        boost::uint32_t c = fn.arg(i).to_number<boost::uint32_t>();
-        result += c;
+            // If more than 255, push 'overflow' byte.
+            if (c > 255)
+            {
+                str.push_back(static_cast<unsigned char>(c >> 8));
     }
 
-    int version = VM::get().getSWFVersion();
+            // 0 terminates the string, but mustn't be pushed or it
+            // will break concatenation.
+            if (static_cast<unsigned char>(c) == 0) break;
+            str.push_back(static_cast<unsigned char>(c));
+        }    
+        return as_value(str);
+    }
+
+    std::wstring wstr;
+
+    for (unsigned int i = 0; i < fn.nargs; i++)
+    {
+        boost::uint16_t c = static_cast<boost::uint16_t>(fn.arg(i).to_int());
+        if (c == 0) break;
+        wstr.push_back(c);
+    }
+    
+    return as_value(utf8::encodeCanonicalString(wstr, version));
 
-    return as_value(utf8::encodeCanonicalString(result, version));
 }
 
 static as_value




reply via email to

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