From 40b88e261a44ecdc1dffce3901d612924c7c98d0 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Sun, 28 Jun 2009 23:39:32 +0200 Subject: [PATCH] jscript: Added Date_toTimeString implementation. --- dlls/jscript/date.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/dlls/jscript/date.c b/dlls/jscript/date.c index ce703a4a295..3996b7e310c 100644 --- a/dlls/jscript/date.c +++ b/dlls/jscript/date.c @@ -507,11 +507,68 @@ static HRESULT Date_toDateString(DispatchEx *dispex, LCID lcid, WORD flags, DISP return E_NOTIMPL; } +/* ECMA-262 3rd Edition 15.9.5.4 */ static HRESULT Date_toTimeString(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[] = { '%','0','2','d',':','%','0','2','d',':','%','0','2','d', + ' ','U','T','C','%','c','%','0','2','d','%','0','2','d',0 }; + static const WCHAR formatUTCW[] = { '%','0','2','d',':','%','0','2','d', + ':','%','0','2','d',' ','U','T','C',0 }; + DateInstance *date; + BSTR date_str; + DOUBLE time; + WCHAR sign; + int offset; + + 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) { + date_str = SysAllocStringLen(NULL, 17); + if(!date_str) + return E_OUTOFMEMORY; + + offset = date->bias + + daylight_saving_ta(time, date); + + if(offset < 0) { + sign = '+'; + offset = -offset; + } + else sign = '-'; + + if(offset) + sprintfW(date_str, formatW, (int)hour_from_time(time), + (int)min_from_time(time), (int)sec_from_time(time), + sign, offset/60, offset%60); + else + sprintfW(date_str, formatUTCW, (int)hour_from_time(time), + (int)min_from_time(time), (int)sec_from_time(time)); + + V_VT(retv) = VT_BSTR; + V_BSTR(retv) = date_str; + } + return S_OK; } /* ECMA-262 3rd Edition 15.9.5.6 */ -- 2.11.4.GIT