Piotr Caban : jscript: Added Date_toUTCString implementation.
Alexandre Julliard
julliard at winehq.org
Mon Jun 29 09:17:47 CDT 2009
Module: wine
Branch: master
Commit: 5be6deb844e471dfba2bf8dcdcee1472e975f014
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5be6deb844e471dfba2bf8dcdcee1472e975f014
Author: Piotr Caban <piotr.caban at gmail.com>
Date: Sun Jun 28 23:39:40 2009 +0200
jscript: Added Date_toUTCString implementation.
---
dlls/jscript/date.c | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 103 insertions(+), 2 deletions(-)
diff --git a/dlls/jscript/date.c b/dlls/jscript/date.c
index 8bf811f..ae91c64 100644
--- a/dlls/jscript/date.c
+++ b/dlls/jscript/date.c
@@ -493,11 +493,112 @@ static HRESULT Date_valueOf(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM
return E_NOTIMPL;
}
+/* ECMA-262 3rd Edition 15.9.5.42 */
static HRESULT Date_toUTCString(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 formatADW[] = { '%','s',',',' ','%','d',' ','%','s',' ','%','d',' ',
+ '%','0','2','d',':','%','0','2','d',':','%','0','2','d',' ','U','T','C',0 };
+ static const WCHAR formatBCW[] = { '%','s',',',' ','%','d',' ','%','s',' ','%','d',' ','B','.','C','.',' ',
+ '%','0','2','d',':','%','0','2','d',':','%','0','2','d',' ','U','T','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;
+ int len, size, year, day;
+ DWORD lcid_en, week_id, month_id;
+
+ 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;
+ }
+
+ if(retv) {
+ len = 17;
+
+ lcid_en = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT);
+
+ week_id = week_ids[(int)week_day(date->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(date->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(date->time)/10;
+ while(year) {
+ year /= 10;
+ len++;
+ }
+
+ year = year_from_time(date->time);
+ if(year<0) {
+ formatAD = FALSE;
+ year = -year+1;
+ len += 5;
+ }
+
+ day = date_from_time(date->time)/10;
+ while(day) {
+ day /= 10;
+ len++;
+ }
+ day = date_from_time(date->time);
+
+ date_str = SysAllocStringLen(NULL, len);
+ if(!date_str) {
+ SysFreeString(week);
+ SysFreeString(month);
+ return E_OUTOFMEMORY;
+ }
+ sprintfW(date_str, formatAD?formatADW:formatBCW, week, day, month, year,
+ (int)hour_from_time(date->time), (int)min_from_time(date->time),
+ (int)sec_from_time(date->time));
+
+ SysFreeString(week);
+ SysFreeString(month);
+
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = date_str;
+ }
+ return S_OK;
}
/* ECMA-262 3rd Edition 15.9.5.3 */
More information about the wine-cvs
mailing list