Piotr Caban : jscript: Added Date_toString implementation.

Alexandre Julliard julliard at winehq.org
Mon Jun 29 09:17:47 CDT 2009


Module: wine
Branch: master
Commit: 754513c800e58a9328c34543aa25e88197a0a04f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=754513c800e58a9328c34543aa25e88197a0a04f

Author: Piotr Caban <piotr.caban at gmail.com>
Date:   Sun Jun 28 23:39:51 2009 +0200

jscript: Added Date_toString implementation.

---

 dlls/jscript/date.c |  129 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 127 insertions(+), 2 deletions(-)

diff --git a/dlls/jscript/date.c b/dlls/jscript/date.c
index 8c3b41e..2fd5302 100644
--- a/dlls/jscript/date.c
+++ b/dlls/jscript/date.c
@@ -451,11 +451,136 @@ static SYSTEMTIME create_systemtime(DOUBLE time)
     return st;
 }
 
+/* ECMA-262 3rd Edition    15.9.1.2 */
 static HRESULT Date_toString(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    static const WCHAR NaNW[] = { 'N','a','N',0 };
+    static const WCHAR formatW[] = { '%','s',' ','%','s',' ','%','d',' ',
+        '%','0','2','d',':','%','0','2','d',':','%','0','2','d',' ',
+        'U','T','C','%','c','%','0','2','d','%','0','2','d',' ','%','d','%','s',0 };
+    static const WCHAR formatUTCW[] = { '%','s',' ','%','s',' ','%','d',' ',
+        '%','0','2','d',':','%','0','2','d',':','%','0','2','d',' ',
+        'U','T','C',' ','%','d','%','s',0 };
+    static const WCHAR ADW[] = { 0 };
+    static const WCHAR BCW[] = { ' ','B','.','C','.',0 };
+
+    static const DWORD week_ids[] = { LOCALE_SABBREVDAYNAME7, LOCALE_SABBREVDAYNAME1,
+        LOCALE_SABBREVDAYNAME2, LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4,
+        LOCALE_SABBREVDAYNAME5, LOCALE_SABBREVDAYNAME6 };
+    static const DWORD month_ids[] = { LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2,
+        LOCALE_SABBREVMONTHNAME3, LOCALE_SABBREVMONTHNAME4,
+        LOCALE_SABBREVMONTHNAME5, LOCALE_SABBREVMONTHNAME6,
+        LOCALE_SABBREVMONTHNAME7, LOCALE_SABBREVMONTHNAME8,
+        LOCALE_SABBREVMONTHNAME9, LOCALE_SABBREVMONTHNAME10,
+        LOCALE_SABBREVMONTHNAME11, LOCALE_SABBREVMONTHNAME12 };
+
+    BOOL formatAD = TRUE;
+    BSTR week, month;
+    DateInstance *date;
+    BSTR date_str;
+    DOUBLE time;
+    int len, size, year, day, offset;
+    DWORD lcid_en, week_id, month_id;
+    WCHAR sign = '-';
+
+    TRACE("\n");
+
+    if(!is_class(dispex, JSCLASS_DATE)) {
+        FIXME("throw TypeError\n");
+        return E_FAIL;
+    }
+
+    date = (DateInstance*)dispex;
+
+    if(isnan(date->time)) {
+        if(retv) {
+            V_VT(retv) = VT_BSTR;
+            V_BSTR(retv) = SysAllocString(NaNW);
+            if(!V_BSTR(retv))
+                return E_OUTOFMEMORY;
+        }
+        return S_OK;
+    }
+
+    time = local_time(date->time, date);
+
+    if(retv) {
+        len = 21;
+
+        lcid_en = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT);
+
+        week_id = week_ids[(int)week_day(time)];
+        size = GetLocaleInfoW(lcid_en, week_id, NULL, 0);
+        week = SysAllocStringLen(NULL, size);
+        if(!week)
+            return E_OUTOFMEMORY;
+        GetLocaleInfoW(lcid_en, week_id, week, size);
+        len += size-1;
+
+        month_id = month_ids[(int)month_from_time(time)];
+        size = GetLocaleInfoW(lcid_en, month_id, NULL, 0);
+        month = SysAllocStringLen(NULL, size);
+        if(!month) {
+            SysFreeString(week);
+            return E_OUTOFMEMORY;
+        }
+        GetLocaleInfoW(lcid_en, month_id, month, size);
+        len += size-1;
+
+        year = year_from_time(time)/10;
+        while(year) {
+            year /= 10;
+            len++;
+        }
+
+        year = year_from_time(time);
+        if(year<0) {
+            formatAD = FALSE;
+            year = -year+1;
+            len += 5;
+        }
+
+        day = date_from_time(time)/10;
+        while(day) {
+            day /= 10;
+            len++;
+        }
+        day = date_from_time(time);
+
+        offset = date->bias +
+            daylight_saving_ta(time, date);
+
+        if(offset == 0) len -= 5;
+        else if(offset < 0) {
+            sign = '+';
+            offset = -offset;
+        }
+
+        date_str = SysAllocStringLen(NULL, len);
+        if(!date_str) {
+            SysFreeString(week);
+            SysFreeString(month);
+            return E_OUTOFMEMORY;
+        }
+
+        if(offset)
+            sprintfW(date_str, formatW, week, month, day,
+                    (int)hour_from_time(time), (int)min_from_time(time),
+                    (int)sec_from_time(time), sign, offset/60, offset%60,
+                    year, formatAD?ADW:BCW);
+        else
+            sprintfW(date_str, formatUTCW, week, month, day,
+            (int)hour_from_time(time), (int)min_from_time(time),
+            (int)sec_from_time(time), year, formatAD?ADW:BCW);
+
+        SysFreeString(week);
+        SysFreeString(month);
+
+        V_VT(retv) = VT_BSTR;
+        V_BSTR(retv) = date_str;
+    }
+    return S_OK;
 }
 
 /* ECMA-262 3rd Edition    15.9.1.5 */




More information about the wine-cvs mailing list