ReactOS 0.4.17-dev-357-ga8f14ff
date.c
Go to the documentation of this file.
1/*
2 * Copyright 2008 Jacek Caban for CodeWeavers
3 * Copyright 2009 Piotr Caban
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18 */
19
20#ifdef __REACTOS__
21#include <wine/config.h>
22#include <wine/port.h>
23#endif
24
25#include <limits.h>
26#include <math.h>
27#include <assert.h>
28
29#include "jscript.h"
30
31#include "wine/debug.h"
32
34
35typedef struct {
37
38 /* ECMA-262 3rd Edition 15.9.1.1 */
40
47
48static inline DateInstance *date_from_jsdisp(jsdisp_t *jsdisp)
49{
50 return CONTAINING_RECORD(jsdisp, DateInstance, dispex);
51}
52
53static inline DateInstance *date_this(jsval_t vthis)
54{
55 jsdisp_t *jsdisp = is_object_instance(vthis) ? to_jsdisp(get_object(vthis)) : NULL;
56 return (jsdisp && is_class(jsdisp, JSCLASS_DATE)) ? date_from_jsdisp(jsdisp) : NULL;
57}
58
59static inline double file_time_to_date_time(const FILETIME *ftime)
60{
61 /* 1601 to 1970 is 369 years plus 89 leap days */
62 const LONGLONG time_epoch = (LONGLONG)(369 * 365 + 89) * 86400 * 1000;
63
64 LONGLONG time = (((ULONGLONG)ftime->dwHighDateTime << 32) | ftime->dwLowDateTime) / 10000;
65
66 return time - time_epoch;
67}
68
69/*ECMA-262 3rd Edition 15.9.1.2 */
70#define MS_PER_DAY 86400000
71#define MS_PER_HOUR 3600000
72#define MS_PER_MINUTE 60000
73
74/* ECMA-262 3rd Edition 15.9.1.2 */
75static inline DOUBLE day(DOUBLE time)
76{
77 return floor(time / MS_PER_DAY);
78}
79
80/* ECMA-262 3rd Edition 15.9.1.2 */
82{
83 DOUBLE ret;
84
86 if(ret < 0)
87 ret += MS_PER_DAY;
88
89 return ret;
90}
91
92/* ECMA-262 3rd Edition 15.9.1.3 */
93static inline DOUBLE days_in_year(DOUBLE year)
94{
95 int y;
96
97 if(year != (int)year)
98 return NAN;
99
100 y = year;
101 if(y%4 != 0) return 365;
102 if(y%100 != 0) return 366;
103 if(y%400 != 0) return 365;
104 return 366;
105}
106
107/* ECMA-262 3rd Edition 15.9.1.3 */
108static inline DOUBLE day_from_year(DOUBLE year)
109{
110 if(year != (int)year)
111 return NAN;
112
113 return floor(365.0*(year-1970) + floor((year-1969)/4)
114 - floor((year-1901)/100) + floor((year-1601)/400));
115}
116
117static inline int day_from_month(int month, int in_leap_year)
118{
119 switch(month)
120 {
121 case 0:
122 return 0;
123 case 1:
124 return 31;
125 case 2:
126 return 59+in_leap_year;
127 case 3:
128 return 90+in_leap_year;
129 case 4:
130 return 120+in_leap_year;
131 case 5:
132 return 151+in_leap_year;
133 case 6:
134 return 181+in_leap_year;
135 case 7:
136 return 212+in_leap_year;
137 case 8:
138 return 243+in_leap_year;
139 case 9:
140 return 273+in_leap_year;
141 case 10:
142 return 304+in_leap_year;
143 default:
144 return 334+in_leap_year;
145 }
146}
147
148/* ECMA-262 3rd Edition 15.9.1.3 */
149static inline DOUBLE time_from_year(DOUBLE year)
150{
151 return MS_PER_DAY*day_from_year(year);
152}
153
154/* ECMA-262 3rd Edition 15.9.1.3 */
156{
157 int y;
158
159 if(isnan(time))
160 return NAN;
161
162 y = 1970 + time/365.25/MS_PER_DAY;
163
164 if(time_from_year(y) > time)
165 while(time_from_year(y) > time) y--;
166 else
167 while(time_from_year(y+1)<=time) y++;
168
169 return y;
170}
171
172/* ECMA-262 3rd Edition 15.9.1.3 */
173static inline int in_leap_year(DOUBLE time)
174{
176 return 1;
177 return 0;
178}
179
180/* ECMA-262 3rd Edition 15.9.1.4 */
181static inline int day_within_year(DOUBLE time)
182{
184}
185
186/* ECMA-262 3rd Edition 15.9.1.4 */
188{
189 int ily = in_leap_year(time);
190 int dwy = day_within_year(time);
191
192 if(isnan(time))
193 return NAN;
194
195 if(0<=dwy && dwy<31) return 0;
196 if(dwy < 59+ily) return 1;
197 if(dwy < 90+ily) return 2;
198 if(dwy < 120+ily) return 3;
199 if(dwy < 151+ily) return 4;
200 if(dwy < 181+ily) return 5;
201 if(dwy < 212+ily) return 6;
202 if(dwy < 243+ily) return 7;
203 if(dwy < 273+ily) return 8;
204 if(dwy < 304+ily) return 9;
205 if(dwy < 334+ily) return 10;
206 return 11;
207}
208
209/* ECMA-262 3rd Edition 15.9.1.5 */
211{
212 int dwy = day_within_year(time);
213 int ily = in_leap_year(time);
214 int mft = month_from_time(time);
215
216 if(isnan(time))
217 return NAN;
218
219 if(mft==0) return dwy+1;
220 if(mft==1) return dwy-30;
221 if(mft==2) return dwy-58-ily;
222 if(mft==3) return dwy-89-ily;
223 if(mft==4) return dwy-119-ily;
224 if(mft==5) return dwy-150-ily;
225 if(mft==6) return dwy-180-ily;
226 if(mft==7) return dwy-211-ily;
227 if(mft==8) return dwy-242-ily;
228 if(mft==9) return dwy-272-ily;
229 if(mft==10) return dwy-303-ily;
230 return dwy-333-ily;
231}
232
233/* ECMA-262 3rd Edition 15.9.1.6 */
235{
236 DOUBLE ret;
237
238 if(isnan(time))
239 return NAN;
240
241 ret = fmod(day(time)+4, 7);
242 if(ret<0) ret += 7;
243
244 return ret;
245}
246
247static inline DOUBLE convert_time(int year, SYSTEMTIME st)
248{
249 DOUBLE time;
250 int set_week_day;
251
252 if(st.wMonth == 0)
253 return NAN;
254
255 if(st.wYear != 0)
256 year = st.wYear;
257
258 time = time_from_year(year);
260
261 if(st.wYear == 0) {
262 set_week_day = st.wDayOfWeek-week_day(time);
263 if(set_week_day < 0)
264 set_week_day += 7;
265 time += set_week_day * MS_PER_DAY;
266
267 time += (DOUBLE)(st.wDay-1) * 7 * MS_PER_DAY;
268 if(month_from_time(time) != st.wMonth-1)
269 time -= 7 * MS_PER_DAY;
270 }
271 else
272 time += st.wDay * MS_PER_DAY;
273
274 time += st.wHour * MS_PER_HOUR;
275 time += st.wMinute * MS_PER_MINUTE;
276
277 return time;
278}
279
280/* ECMA-262 3rd Edition 15.9.1.9 */
282{
283 int year = year_from_time(time);
284 DOUBLE standardTime, daylightTime;
285
286 if(isnan(time))
287 return 0;
288
289 standardTime = convert_time(year, date->standardDate);
290 daylightTime = convert_time(year, date->daylightDate);
291
292 if(isnan(standardTime) || isnan(daylightTime))
293 return 0;
294 else if(standardTime > daylightTime) {
295 if(daylightTime <= time && time < standardTime)
296 return date->daylightBias;
297
298 return date->standardBias;
299 }
300 else {
301 if(standardTime <= time && time < daylightTime)
302 return date->standardBias;
303
304 return date->daylightBias;
305 }
306}
307
308/* ECMA-262 3rd Edition 15.9.1.9 */
310{
312}
313
314/* ECMA-262 3rd Edition 15.9.1.9 */
316{
317 time += date->bias * MS_PER_MINUTE;
319}
320
321/* ECMA-262 3rd Edition 15.9.1.10 */
323{
324 DOUBLE ret;
325
326 if(isnan(time))
327 return NAN;
328
329 ret = fmod(floor(time/MS_PER_HOUR), 24);
330 if(ret<0) ret += 24;
331
332 return ret;
333}
334
335/* ECMA-262 3rd Edition 15.9.1.10 */
337{
338 DOUBLE ret;
339
340 if(isnan(time))
341 return NAN;
342
344 if(ret<0) ret += 60;
345
346 return ret;
347}
348
349/* ECMA-262 3rd Edition 15.9.1.10 */
351{
352 DOUBLE ret;
353
354 if(isnan(time))
355 return NAN;
356
357 ret = fmod(floor(time/1000), 60);
358 if(ret<0) ret += 60;
359
360 return ret;
361}
362
363/* ECMA-262 3rd Edition 15.9.1.10 */
365{
366 DOUBLE ret;
367
368 if(isnan(time))
369 return NAN;
370
371 ret = fmod(time, 1000);
372 if(ret<0) ret += 1000;
373
374 return ret;
375}
376
377/* ECMA-262 3rd Edition 15.9.1.11 */
378static inline DOUBLE make_time(DOUBLE hour, DOUBLE min, DOUBLE sec, DOUBLE ms)
379{
380 return hour*MS_PER_HOUR + min*MS_PER_MINUTE + sec*1000 + ms;
381}
382
383/* ECMA-262 3rd Edition 15.9.1.12 */
385{
386 DOUBLE time;
387
388 year += floor(month/12);
389
390 month = fmod(month, 12);
391 if(month<0) month += 12;
392
393 time = time_from_year(year);
394
395 day += floor(time / MS_PER_DAY);
397
398 return day-1;
399}
400
401/* ECMA-262 3rd Edition 15.9.1.13 */
403{
404 return day*MS_PER_DAY + time;
405}
406
407/* ECMA-262 3rd Edition 15.9.1.14 */
409{
410 if(8.64e15 < time || time < -8.64e15) {
411 return NAN;
412 }
413
414 return floor(time);
415}
416
417static double date_now(void)
418{
420
423}
424
426{
427 SYSTEMTIME st;
428
430 st.wMonth = month_from_time(time) + 1;
437
438 return st;
439}
440
441static inline HRESULT date_to_string(DOUBLE time, BOOL show_offset, int offset, jsval_t *r)
442{
443 static const DWORD week_ids[] = { LOCALE_SABBREVDAYNAME7, LOCALE_SABBREVDAYNAME1,
446 static const DWORD month_ids[] = { LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2,
452
453 const WCHAR *formatEra = L"";
454 WCHAR week[64], month[64];
455 WCHAR buf[192];
456 jsstr_t *date_jsstr;
457 int year, day;
458 DWORD lcid_en;
459 WCHAR sign = '-';
460
461 if(isnan(time)) {
462 if(r)
464 return S_OK;
465 }
466
467 if(r) {
469
470 week[0] = 0;
471 GetLocaleInfoW(lcid_en, week_ids[(int)week_day(time)], week, ARRAY_SIZE(week));
472
473 month[0] = 0;
474 GetLocaleInfoW(lcid_en, month_ids[(int)month_from_time(time)], month, ARRAY_SIZE(month));
475
476 year = year_from_time(time);
477 if(year<0) {
478 formatEra = L" B.C.";
479 year = -year+1;
480 }
481
483
484 if(offset < 0) {
485 sign = '+';
486 offset = -offset;
487 }
488
489 if(!show_offset)
490 swprintf(buf, ARRAY_SIZE(buf), L"%s %s %d %02d:%02d:%02d %d%s", week, month, day,
492 (int)sec_from_time(time), year, formatEra);
493 else if(offset)
494 swprintf(buf, ARRAY_SIZE(buf), L"%s %s %d %02d:%02d:%02d UTC%c%02d%02d %d%s", week, month, day,
496 (int)sec_from_time(time), sign, offset/60, offset%60,
497 year, formatEra);
498 else
499 swprintf(buf, ARRAY_SIZE(buf), L"%s %s %d %02d:%02d:%02d UTC %d%s", week, month, day,
501 (int)sec_from_time(time), year, formatEra);
502
503 date_jsstr = jsstr_alloc(buf);
504 if(!date_jsstr)
505 return E_OUTOFMEMORY;
506
507 *r = jsval_string(date_jsstr);
508 }
509 return S_OK;
510}
511
512/* ECMA-262 3rd Edition 15.9.1.2 */
514{
515 DOUBLE time;
516 int offset;
517
518 time = local_time(date->time, date);
519 offset = date->bias +
521
522 return date_to_string(time, TRUE, offset, r);
523}
524
526{
528
529 TRACE("\n");
530
531 if(!(date = date_this(vthis)))
532 return JS_E_DATE_EXPECTED;
533
534 return dateobj_to_string(date, r);
535}
536
537/* ECMA-262 3rd Edition 15.9.1.5 */
539 jsval_t *r)
540{
541 SYSTEMTIME st;
543 jsstr_t *date_str;
544 int date_len, time_len;
545
546 TRACE("\n");
547
548 if(!(date = date_this(vthis)))
549 return JS_E_DATE_EXPECTED;
550
551 if(isnan(date->time)) {
552 if(r)
554 return S_OK;
555 }
556
558
559 if(st.wYear<1601 || st.wYear>9999)
560 return dateobj_to_string(date, r);
561
562 if(r) {
563 WCHAR *ptr;
564
565 date_len = GetDateFormatW(ctx->lcid, DATE_LONGDATE, &st, NULL, NULL, 0);
566 time_len = GetTimeFormatW(ctx->lcid, 0, &st, NULL, NULL, 0);
567
568 date_str = jsstr_alloc_buf(date_len+time_len-1, &ptr);
569 if(!date_str)
570 return E_OUTOFMEMORY;
571
572 GetDateFormatW(ctx->lcid, DATE_LONGDATE, &st, NULL, ptr, date_len);
573 GetTimeFormatW(ctx->lcid, 0, &st, NULL, ptr+date_len, time_len);
574 ptr[date_len-1] = ' ';
575
576 *r = jsval_string(date_str);
577 }
578 return S_OK;
579}
580
582 jsval_t *r)
583{
585 WCHAR buf[64], *p = buf;
586 double year;
587
588 TRACE("\n");
589
590 if(!(date = date_this(vthis)))
591 return JS_E_DATE_EXPECTED;
592
593 year = year_from_time(date->time);
594 if(isnan(year) || year > 999999 || year < -999999) {
595 FIXME("year %lf should throw an exception\n", year);
596 return E_FAIL;
597 }
598
599 if(year < 0) {
600 *p++ = '-';
601 p += swprintf(p, ARRAY_SIZE(buf) - 1, L"%06d", -(int)year);
602 }else if(year > 9999) {
603 *p++ = '+';
604 p += swprintf(p, ARRAY_SIZE(buf) - 1, L"%06d", (int)year);
605 }else {
606 p += swprintf(p, ARRAY_SIZE(buf), L"%04d", (int)year);
607 }
608
609 swprintf(p, ARRAY_SIZE(buf) - (p - buf), L"-%02d-%02dT%02d:%02d:%02d.%03dZ",
610 (int)month_from_time(date->time) + 1, (int)date_from_time(date->time),
611 (int)hour_from_time(date->time), (int)min_from_time(date->time),
612 (int)sec_from_time(date->time), (int)ms_from_time(date->time));
613
614 if(r) {
615 jsstr_t *ret;
616 if(!(ret = jsstr_alloc(buf)))
617 return E_OUTOFMEMORY;
618 *r = jsval_string(ret);
619 }
620 return S_OK;
621}
622
624 jsval_t *r)
625{
627
628 TRACE("\n");
629
630 if(!(date = date_this(vthis)))
631 return JS_E_DATE_EXPECTED;
632
633 if(r)
634 *r = jsval_number(date->time);
635 return S_OK;
636}
637
639{
640 static const DWORD week_ids[] = { LOCALE_SABBREVDAYNAME7, LOCALE_SABBREVDAYNAME1,
643 static const DWORD month_ids[] = { LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2,
649
650 const WCHAR *formatEra = L"";
651 WCHAR week[64], month[64];
652 WCHAR buf[192];
654 jsstr_t *date_str;
655 int year, day;
656 DWORD lcid_en;
657
658 if(!(date = date_this(vthis)))
659 return JS_E_DATE_EXPECTED;
660
661 if(isnan(date->time)) {
662 if(r)
664 return S_OK;
665 }
666
667 if(r) {
669
670 week[0] = 0;
671 GetLocaleInfoW(lcid_en, week_ids[(int)week_day(date->time)], week, ARRAY_SIZE(week));
672
673 month[0] = 0;
674 GetLocaleInfoW(lcid_en, month_ids[(int)month_from_time(date->time)], month, ARRAY_SIZE(month));
675
676 year = year_from_time(date->time);
677 if(year<0) {
678 formatEra = L" B.C.";
679 year = -year+1;
680 }
681
682 day = date_from_time(date->time);
683
685 L"%s, %d %s %d%s %02d:%02d:%02d UTC", week, day, month, year, formatEra,
686 (int)hour_from_time(date->time), (int)min_from_time(date->time),
687 (int)sec_from_time(date->time));
688
689 date_str = jsstr_alloc(buf);
690 if(!date_str)
691 return E_OUTOFMEMORY;
692
693 *r = jsval_string(date_str);
694 }
695 return S_OK;
696}
697
698/* ECMA-262 3rd Edition 15.9.5.42 */
700 jsval_t *r)
701{
702 TRACE("\n");
703 return create_utc_string(ctx, vthis, r);
704}
705
707 jsval_t *r)
708{
709 TRACE("\n");
710 return create_utc_string(ctx, vthis, r);
711}
712
713/* ECMA-262 3rd Edition 15.9.5.3 */
715{
716 static const DWORD week_ids[] = { LOCALE_SABBREVDAYNAME7, LOCALE_SABBREVDAYNAME1,
719 static const DWORD month_ids[] = { LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2,
725
726 const WCHAR *formatEra = L"";
727 WCHAR week[64], month[64];
728 WCHAR buf[192];
729 jsstr_t *date_str;
730 DOUBLE time;
731 int year, day;
732 DWORD lcid_en;
733
734 if(isnan(date->time)) {
735 if(r)
737 return S_OK;
738 }
739
740 time = local_time(date->time, date);
741
742 if(r) {
744
745 week[0] = 0;
746 GetLocaleInfoW(lcid_en, week_ids[(int)week_day(time)], week, ARRAY_SIZE(week));
747
748 month[0] = 0;
749 GetLocaleInfoW(lcid_en, month_ids[(int)month_from_time(time)], month, ARRAY_SIZE(month));
750
751 year = year_from_time(time);
752 if(year<0) {
753 formatEra = L" B.C.";
754 year = -year+1;
755 }
756
758
759 swprintf(buf, ARRAY_SIZE(buf), L"%s %s %d %d%s", week, month, day, year, formatEra);
760
761 date_str = jsstr_alloc(buf);
762 if(!date_str)
763 return E_OUTOFMEMORY;
764
765 *r = jsval_string(date_str);
766 }
767 return S_OK;
768}
769
771 jsval_t *r)
772{
774
775 if(!(date = date_this(vthis)))
776 return JS_E_DATE_EXPECTED;
777
779}
780
781/* ECMA-262 3rd Edition 15.9.5.4 */
783 jsval_t *r)
784{
786 jsstr_t *date_str;
787 WCHAR buf[32];
788 DOUBLE time;
789 WCHAR sign;
790 int offset;
791
792 TRACE("\n");
793
794 if(!(date = date_this(vthis)))
795 return JS_E_DATE_EXPECTED;
796
797 if(isnan(date->time)) {
798 if(r)
800 return S_OK;
801 }
802
803 time = local_time(date->time, date);
804
805 if(r) {
806 offset = date->bias +
808
809 if(offset < 0) {
810 sign = '+';
811 offset = -offset;
812 }
813 else sign = '-';
814
815 if(offset)
816 swprintf(buf, ARRAY_SIZE(buf), L"%02d:%02d:%02d UTC%c%02d%02d", (int)hour_from_time(time),
818 sign, offset/60, offset%60);
819 else
820 swprintf(buf, ARRAY_SIZE(buf), L"%02d:%02d:%02d UTC", (int)hour_from_time(time),
821 (int)min_from_time(time), (int)sec_from_time(time));
822
823 date_str = jsstr_alloc(buf);
824 if(!date_str)
825 return E_OUTOFMEMORY;
826
827 *r = jsval_string(date_str);
828 }
829 return S_OK;
830}
831
832/* ECMA-262 3rd Edition 15.9.5.6 */
834 jsval_t *r)
835{
836 SYSTEMTIME st;
838 jsstr_t *date_str;
839 int len;
840
841 TRACE("\n");
842
843 if(!(date = date_this(vthis)))
844 return JS_E_DATE_EXPECTED;
845
846 if(isnan(date->time)) {
847 if(r)
849 return S_OK;
850 }
851
853
854 if(st.wYear<1601 || st.wYear>9999)
856
857 if(r) {
858 WCHAR *ptr;
859
860 len = GetDateFormatW(ctx->lcid, DATE_LONGDATE, &st, NULL, NULL, 0);
861 date_str = jsstr_alloc_buf(len-1, &ptr);
862 if(!date_str)
863 return E_OUTOFMEMORY;
864 GetDateFormatW(ctx->lcid, DATE_LONGDATE, &st, NULL, ptr, len);
865
866 *r = jsval_string(date_str);
867 }
868 return S_OK;
869}
870
871/* ECMA-262 3rd Edition 15.9.5.7 */
873 jsval_t *r)
874{
875 SYSTEMTIME st;
877 jsstr_t *date_str;
878 int len;
879
880 TRACE("\n");
881
882 if(!(date = date_this(vthis)))
883 return JS_E_DATE_EXPECTED;
884
885 if(isnan(date->time)) {
886 if(r)
888 return S_OK;
889 }
890
892
893 if(st.wYear<1601 || st.wYear>9999)
894 return Date_toTimeString(ctx, vthis, flags, argc, argv, r);
895
896 if(r) {
897 WCHAR *ptr;
898
899 len = GetTimeFormatW(ctx->lcid, 0, &st, NULL, NULL, 0);
900 date_str = jsstr_alloc_buf(len-1, &ptr);
901 if(!date_str)
902 return E_OUTOFMEMORY;
903 GetTimeFormatW(ctx->lcid, 0, &st, NULL, ptr, len);
904
905 *r = jsval_string(date_str);
906 }
907 return S_OK;
908}
909
910/* ECMA-262 3rd Edition 15.9.5.9 */
912 jsval_t *r)
913{
915
916 TRACE("\n");
917
918 if(!(date = date_this(vthis)))
919 return JS_E_DATE_EXPECTED;
920
921 if(r)
922 *r = jsval_number(date->time);
923 return S_OK;
924}
925
926/* ECMA-262 3rd Edition 15.9.5.10 */
928 jsval_t *r)
929{
931
932 TRACE("\n");
933
934 if(!(date = date_this(vthis)))
935 return JS_E_DATE_EXPECTED;
936
937 if(r) {
938 DOUBLE time = local_time(date->time, date);
939
941 }
942 return S_OK;
943}
944
945/* ECMA-262 3rd Edition 15.9.5.11 */
947 jsval_t *r)
948{
950
951 TRACE("\n");
952
953 if(!(date = date_this(vthis)))
954 return JS_E_DATE_EXPECTED;
955
956 if(r)
958 return S_OK;
959}
960
961/* ECMA-262 3rd Edition 15.9.5.12 */
963{
965
966 TRACE("\n");
967
968 if(!(date = date_this(vthis)))
969 return JS_E_DATE_EXPECTED;
970
971 if(r)
973 return S_OK;
974}
975
976/* ECMA-262 3rd Edition 15.9.5.13 */
978 jsval_t *r)
979{
981
982 TRACE("\n");
983
984 if(!(date = date_this(vthis)))
985 return JS_E_DATE_EXPECTED;
986
987 if(r)
989 return S_OK;
990}
991
992/* ECMA-262 3rd Edition 15.9.5.14 */
994{
996
997 TRACE("\n");
998
999 if(!(date = date_this(vthis)))
1000 return JS_E_DATE_EXPECTED;
1001
1002 if(r)
1004 return S_OK;
1005}
1006
1007/* ECMA-262 3rd Edition 15.9.5.15 */
1009 jsval_t *r)
1010{
1012
1013 TRACE("\n");
1014
1015 if(!(date = date_this(vthis)))
1016 return JS_E_DATE_EXPECTED;
1017
1018 if(r)
1019 *r = jsval_number(date_from_time(date->time));
1020 return S_OK;
1021}
1022
1023/* ECMA-262 3rd Edition 15.9.5.16 */
1025 jsval_t *r)
1026{
1028
1029 TRACE("\n");
1030
1031 if(!(date = date_this(vthis)))
1032 return JS_E_DATE_EXPECTED;
1033
1034 if(r)
1036 return S_OK;
1037}
1038
1039/* ECMA-262 3rd Edition 15.9.5.17 */
1041 jsval_t *r)
1042{
1044
1045 TRACE("\n");
1046
1047 if(!(date = date_this(vthis)))
1048 return JS_E_DATE_EXPECTED;
1049
1050 if(r)
1051 *r = jsval_number(week_day(date->time));
1052 return S_OK;
1053}
1054
1055/* ECMA-262 3rd Edition 15.9.5.18 */
1057 jsval_t *r)
1058{
1060
1061 TRACE("\n");
1062
1063 if(!(date = date_this(vthis)))
1064 return JS_E_DATE_EXPECTED;
1065
1066 if(r)
1068 return S_OK;
1069}
1070
1071/* ECMA-262 3rd Edition 15.9.5.19 */
1073 jsval_t *r)
1074{
1076
1077 TRACE("\n");
1078
1079 if(!(date = date_this(vthis)))
1080 return JS_E_DATE_EXPECTED;
1081
1082 if(r)
1083 *r = jsval_number(hour_from_time(date->time));
1084 return S_OK;
1085}
1086
1087/* ECMA-262 3rd Edition 15.9.5.20 */
1089 jsval_t *r)
1090{
1092
1093 TRACE("\n");
1094
1095 if(!(date = date_this(vthis)))
1096 return JS_E_DATE_EXPECTED;
1097
1098 if(r)
1100 return S_OK;
1101}
1102
1103/* ECMA-262 3rd Edition 15.9.5.21 */
1105 jsval_t *r)
1106{
1108
1109 TRACE("\n");
1110
1111 if(!(date = date_this(vthis)))
1112 return JS_E_DATE_EXPECTED;
1113
1114 if(r)
1115 *r = jsval_number(min_from_time(date->time));
1116 return S_OK;
1117}
1118
1119/* ECMA-262 3rd Edition 15.9.5.22 */
1121{
1123
1124 TRACE("\n");
1125
1126 if(!(date = date_this(vthis)))
1127 return JS_E_DATE_EXPECTED;
1128
1129 if(r)
1131 return S_OK;
1132}
1133
1134/* ECMA-262 3rd Edition 15.9.5.23 */
1136 jsval_t *r)
1137{
1139
1140 TRACE("\n");
1141
1142 if(!(date = date_this(vthis)))
1143 return JS_E_DATE_EXPECTED;
1144
1145 if(r)
1146 *r = jsval_number(sec_from_time(date->time));
1147 return S_OK;
1148}
1149
1150/* ECMA-262 3rd Edition 15.9.5.24 */
1152 jsval_t *r)
1153{
1155
1156 TRACE("\n");
1157
1158 if(!(date = date_this(vthis)))
1159 return JS_E_DATE_EXPECTED;
1160
1161 if(r)
1163 return S_OK;
1164}
1165
1166/* ECMA-262 3rd Edition 15.9.5.25 */
1168 jsval_t *r)
1169{
1171
1172 TRACE("\n");
1173
1174 if(!(date = date_this(vthis)))
1175 return JS_E_DATE_EXPECTED;
1176
1177 if(r)
1178 *r = jsval_number(ms_from_time(date->time));
1179 return S_OK;
1180}
1181
1182/* ECMA-262 3rd Edition 15.9.5.26 */
1184 jsval_t *r)
1185{
1187
1188 TRACE("\n");
1189
1190 if(!(date = date_this(vthis)))
1191 return JS_E_DATE_EXPECTED;
1192
1193 if(r)
1195 return S_OK;
1196}
1197
1198/* ECMA-262 3rd Edition 15.9.5.27 */
1200 jsval_t *r)
1201{
1202 double n;
1203 HRESULT hres;
1205
1206 TRACE("\n");
1207
1208 if(!(date = date_this(vthis)))
1209 return JS_E_DATE_EXPECTED;
1210
1211 if(!argc)
1212 return JS_E_MISSING_ARG;
1213
1214 hres = to_number(ctx, argv[0], &n);
1215 if(FAILED(hres))
1216 return hres;
1217
1218 date->time = time_clip(n);
1219
1220 if(r)
1221 *r = jsval_number(date->time);
1222 return S_OK;
1223}
1224
1225/* ECMA-262 3rd Edition 15.9.5.28 */
1227 jsval_t *r)
1228{
1230 double n, t;
1231 HRESULT hres;
1232
1233 TRACE("\n");
1234
1235 if(!(date = date_this(vthis)))
1236 return JS_E_DATE_EXPECTED;
1237
1238 if(!argc)
1239 return JS_E_MISSING_ARG;
1240
1241 hres = to_number(ctx, argv[0], &n);
1242 if(FAILED(hres))
1243 return hres;
1244
1245 t = local_time(date->time, date);
1247 sec_from_time(t), n));
1248 date->time = time_clip(utc(t, date));
1249
1250 if(r)
1251 *r = jsval_number(date->time);
1252 return S_OK;
1253}
1254
1255/* ECMA-262 3rd Edition 15.9.5.29 */
1257 jsval_t *r)
1258{
1260 double n, t;
1261 HRESULT hres;
1262
1263 TRACE("\n");
1264
1265 if(!(date = date_this(vthis)))
1266 return JS_E_DATE_EXPECTED;
1267
1268 if(!argc)
1269 return JS_E_MISSING_ARG;
1270
1271 hres = to_number(ctx, argv[0], &n);
1272 if(FAILED(hres))
1273 return hres;
1274
1275 t = date->time;
1277 sec_from_time(t), n));
1278 date->time = time_clip(t);
1279
1280 if(r)
1281 *r = jsval_number(date->time);
1282 return S_OK;
1283}
1284
1285/* ECMA-262 3rd Edition 15.9.5.30 */
1287 jsval_t *r)
1288{
1290 double t, sec, ms;
1291 HRESULT hres;
1292
1293 TRACE("\n");
1294
1295 if(!(date = date_this(vthis)))
1296 return JS_E_DATE_EXPECTED;
1297
1298 if(!argc)
1299 return JS_E_MISSING_ARG;
1300
1301 t = local_time(date->time, date);
1302
1303 hres = to_number(ctx, argv[0], &sec);
1304 if(FAILED(hres))
1305 return hres;
1306
1307 if(argc > 1) {
1308 hres = to_number(ctx, argv[1], &ms);
1309 if(FAILED(hres))
1310 return hres;
1311 }else {
1312 ms = ms_from_time(t);
1313 }
1314
1316 min_from_time(t), sec, ms));
1317 date->time = time_clip(utc(t, date));
1318
1319 if(r)
1320 *r = jsval_number(date->time);
1321 return S_OK;
1322}
1323
1324/* ECMA-262 3rd Edition 15.9.5.31 */
1326 jsval_t *r)
1327{
1329 double t, sec, ms;
1330 HRESULT hres;
1331
1332 TRACE("\n");
1333
1334 if(!(date = date_this(vthis)))
1335 return JS_E_DATE_EXPECTED;
1336
1337 if(!argc)
1338 return JS_E_MISSING_ARG;
1339
1340 t = date->time;
1341
1342 hres = to_number(ctx, argv[0], &sec);
1343 if(FAILED(hres))
1344 return hres;
1345
1346 if(argc > 1) {
1347 hres = to_number(ctx, argv[1], &ms);
1348 if(FAILED(hres))
1349 return hres;
1350 }else {
1351 ms = ms_from_time(t);
1352 }
1353
1355 min_from_time(t), sec, ms));
1356 date->time = time_clip(t);
1357
1358 if(r)
1359 *r = jsval_number(date->time);
1360 return S_OK;
1361}
1362
1363/* ECMA-262 3rd Edition 15.9.5.33 */
1365 jsval_t *r)
1366{
1368 double t, min, sec, ms;
1369 HRESULT hres;
1370
1371 TRACE("\n");
1372
1373 if(!(date = date_this(vthis)))
1374 return JS_E_DATE_EXPECTED;
1375
1376 if(!argc)
1377 return JS_E_MISSING_ARG;
1378
1379 t = local_time(date->time, date);
1380
1381 hres = to_number(ctx, argv[0], &min);
1382 if(FAILED(hres))
1383 return hres;
1384
1385 if(argc > 1) {
1386 hres = to_number(ctx, argv[1], &sec);
1387 if(FAILED(hres))
1388 return hres;
1389 }else {
1390 sec = sec_from_time(t);
1391 }
1392
1393 if(argc > 2) {
1394 hres = to_number(ctx, argv[2], &ms);
1395 if(FAILED(hres))
1396 return hres;
1397 }else {
1398 ms = ms_from_time(t);
1399 }
1400
1402 min, sec, ms));
1403 date->time = time_clip(utc(t, date));
1404
1405 if(r)
1406 *r = jsval_number(date->time);
1407 return S_OK;
1408}
1409
1410/* ECMA-262 3rd Edition 15.9.5.34 */
1412 jsval_t *r)
1413{
1415 double t, min, sec, ms;
1416 HRESULT hres;
1417
1418 TRACE("\n");
1419
1420 if(!(date = date_this(vthis)))
1421 return JS_E_DATE_EXPECTED;
1422
1423 if(!argc)
1424 return JS_E_MISSING_ARG;
1425
1426 t = date->time;
1427
1428 hres = to_number(ctx, argv[0], &min);
1429 if(FAILED(hres))
1430 return hres;
1431
1432 if(argc > 1) {
1433 hres = to_number(ctx, argv[1], &sec);
1434 if(FAILED(hres))
1435 return hres;
1436 }else {
1437 sec = sec_from_time(t);
1438 }
1439
1440 if(argc > 2) {
1441 hres = to_number(ctx, argv[2], &ms);
1442 if(FAILED(hres))
1443 return hres;
1444 }else {
1445 ms = ms_from_time(t);
1446 }
1447
1449 min, sec, ms));
1450 date->time = time_clip(t);
1451
1452 if(r)
1453 *r = jsval_number(date->time);
1454 return S_OK;
1455}
1456
1457/* ECMA-262 3rd Edition 15.9.5.35 */
1459 jsval_t *r)
1460{
1462 double t, hour, min, sec, ms;
1463 HRESULT hres;
1464
1465 TRACE("\n");
1466
1467 if(!(date = date_this(vthis)))
1468 return JS_E_DATE_EXPECTED;
1469
1470 if(!argc)
1471 return JS_E_MISSING_ARG;
1472
1473 t = local_time(date->time, date);
1474
1475 hres = to_number(ctx, argv[0], &hour);
1476 if(FAILED(hres))
1477 return hres;
1478
1479 if(argc > 1) {
1480 hres = to_number(ctx, argv[1], &min);
1481 if(FAILED(hres))
1482 return hres;
1483 }else {
1484 min = min_from_time(t);
1485 }
1486
1487 if(argc > 2) {
1488 hres = to_number(ctx, argv[2], &sec);
1489 if(FAILED(hres))
1490 return hres;
1491 }else {
1492 sec = sec_from_time(t);
1493 }
1494
1495 if(argc > 3) {
1496 hres = to_number(ctx, argv[3], &ms);
1497 if(FAILED(hres))
1498 return hres;
1499 }else {
1500 ms = ms_from_time(t);
1501 }
1502
1503 t = make_date(day(t), make_time(hour, min, sec, ms));
1504 date->time = time_clip(utc(t, date));
1505
1506 if(r)
1507 *r = jsval_number(date->time);
1508 return S_OK;
1509}
1510
1511/* ECMA-262 3rd Edition 15.9.5.36 */
1513 jsval_t *r)
1514{
1516 double t, hour, min, sec, ms;
1517 HRESULT hres;
1518
1519 TRACE("\n");
1520
1521 if(!(date = date_this(vthis)))
1522 return JS_E_DATE_EXPECTED;
1523
1524 if(!argc)
1525 return JS_E_MISSING_ARG;
1526
1527 t = date->time;
1528
1529 hres = to_number(ctx, argv[0], &hour);
1530 if(FAILED(hres))
1531 return hres;
1532
1533 if(argc > 1) {
1534 hres = to_number(ctx, argv[1], &min);
1535 if(FAILED(hres))
1536 return hres;
1537 }else {
1538 min = min_from_time(t);
1539 }
1540
1541 if(argc > 2) {
1542 hres = to_number(ctx, argv[2], &sec);
1543 if(FAILED(hres))
1544 return hres;
1545 }else {
1546 sec = sec_from_time(t);
1547 }
1548
1549 if(argc > 3) {
1550 hres = to_number(ctx, argv[3], &ms);
1551 if(FAILED(hres))
1552 return hres;
1553 }else {
1554 ms = ms_from_time(t);
1555 }
1556
1557 t = make_date(day(t), make_time(hour, min, sec, ms));
1558 date->time = time_clip(t);
1559
1560 if(r)
1561 *r = jsval_number(date->time);
1562 return S_OK;
1563}
1564
1565/* ECMA-262 3rd Edition 15.9.5.36 */
1567 jsval_t *r)
1568{
1570 double t, n;
1571 HRESULT hres;
1572
1573 TRACE("\n");
1574
1575 if(!(date = date_this(vthis)))
1576 return JS_E_DATE_EXPECTED;
1577
1578 if(!argc)
1579 return JS_E_MISSING_ARG;
1580
1581 hres = to_number(ctx, argv[0], &n);
1582 if(FAILED(hres))
1583 return hres;
1584
1585 t = local_time(date->time, date);
1587 date->time = time_clip(utc(t, date));
1588
1589 if(r)
1590 *r = jsval_number(date->time);
1591 return S_OK;
1592}
1593
1594/* ECMA-262 3rd Edition 15.9.5.37 */
1596 jsval_t *r)
1597{
1599 double t, n;
1600 HRESULT hres;
1601
1602 TRACE("\n");
1603
1604 if(!(date = date_this(vthis)))
1605 return JS_E_DATE_EXPECTED;
1606
1607 if(!argc)
1608 return JS_E_MISSING_ARG;
1609
1610 hres = to_number(ctx, argv[0], &n);
1611 if(FAILED(hres))
1612 return hres;
1613
1614 t = date->time;
1616 date->time = time_clip(t);
1617
1618 if(r)
1619 *r = jsval_number(date->time);
1620 return S_OK;
1621}
1622
1623/* ECMA-262 3rd Edition 15.9.5.38 */
1625 jsval_t *r)
1626{
1628 DOUBLE t, month, ddate;
1629 HRESULT hres;
1630
1631 TRACE("\n");
1632
1633 if(!(date = date_this(vthis)))
1634 return JS_E_DATE_EXPECTED;
1635
1636 if(!argc)
1637 return JS_E_MISSING_ARG;
1638
1639 t = local_time(date->time, date);
1640
1641 hres = to_number(ctx, argv[0], &month);
1642 if(FAILED(hres))
1643 return hres;
1644
1645 if(argc > 1) {
1646 hres = to_number(ctx, argv[1], &ddate);
1647 if(FAILED(hres))
1648 return hres;
1649 }else {
1650 ddate = date_from_time(t);
1651 }
1652
1655 date->time = time_clip(utc(t, date));
1656
1657 if(r)
1658 *r = jsval_number(date->time);
1659 return S_OK;
1660}
1661
1662/* ECMA-262 3rd Edition 15.9.5.39 */
1664 jsval_t *r)
1665{
1667 double t, month, ddate;
1668 HRESULT hres;
1669
1670 TRACE("\n");
1671
1672 if(!(date = date_this(vthis)))
1673 return JS_E_DATE_EXPECTED;
1674
1675 if(!argc)
1676 return JS_E_MISSING_ARG;
1677
1678 t = date->time;
1679
1680 hres = to_number(ctx, argv[0], &month);
1681 if(FAILED(hres))
1682 return hres;
1683
1684 if(argc > 1) {
1685 hres = to_number(ctx, argv[1], &ddate);
1686 if(FAILED(hres))
1687 return hres;
1688 }else {
1689 ddate = date_from_time(t);
1690 }
1691
1694 date->time = time_clip(t);
1695
1696 if(r)
1697 *r = jsval_number(date->time);
1698 return S_OK;
1699}
1700
1701/* ECMA-262 3rd Edition 15.9.5.40 */
1703 jsval_t *r)
1704{
1706 double t, year, month, ddate;
1707 HRESULT hres;
1708
1709 TRACE("\n");
1710
1711 if(!(date = date_this(vthis)))
1712 return JS_E_DATE_EXPECTED;
1713
1714 if(!argc)
1715 return JS_E_MISSING_ARG;
1716
1717 t = local_time(date->time, date);
1718
1719 hres = to_number(ctx, argv[0], &year);
1720 if(FAILED(hres))
1721 return hres;
1722
1723 if(argc > 1) {
1724 hres = to_number(ctx, argv[1], &month);
1725 if(FAILED(hres))
1726 return hres;
1727 }else {
1729 }
1730
1731 if(argc > 2) {
1732 hres = to_number(ctx, argv[2], &ddate);
1733 if(FAILED(hres))
1734 return hres;
1735 }else {
1736 ddate = date_from_time(t);
1737 }
1738
1739 t = make_date(make_day(year, month, ddate), time_within_day(t));
1740 date->time = time_clip(utc(t, date));
1741
1742 if(r)
1743 *r = jsval_number(date->time);
1744 return S_OK;
1745}
1746
1747/* ECMA-262 3rd Edition 15.9.5.41 */
1749 jsval_t *r)
1750{
1752 double t, year, month, ddate;
1753 HRESULT hres;
1754
1755 TRACE("\n");
1756
1757 if(!(date = date_this(vthis)))
1758 return JS_E_DATE_EXPECTED;
1759
1760 if(!argc)
1761 return JS_E_MISSING_ARG;
1762
1763 t = date->time;
1764
1765 hres = to_number(ctx, argv[0], &year);
1766 if(FAILED(hres))
1767 return hres;
1768
1769 if(argc > 1) {
1770 hres = to_number(ctx, argv[1], &month);
1771 if(FAILED(hres))
1772 return hres;
1773 }else {
1775 }
1776
1777 if(argc > 2) {
1778 hres = to_number(ctx, argv[2], &ddate);
1779 if(FAILED(hres))
1780 return hres;
1781 }else {
1782 ddate = date_from_time(t);
1783 }
1784
1785 t = make_date(make_day(year, month, ddate), time_within_day(t));
1786 date->time = time_clip(t);
1787
1788 if(r)
1789 *r = jsval_number(date->time);
1790 return S_OK;
1791}
1792
1793/* ECMA-262 3rd Edition B2.4 */
1795 jsval_t *r)
1796{
1798 DOUBLE t, year;
1799
1800 TRACE("\n");
1801
1802 if(!(date = date_this(vthis)))
1803 return JS_E_DATE_EXPECTED;
1804
1805 t = local_time(date->time, date);
1806 if(isnan(t)) {
1807 if(r)
1808 *r = jsval_number(NAN);
1809 return S_OK;
1810 }
1811
1812 year = year_from_time(t);
1813 if(r)
1814 *r = jsval_number((1900<=year && year<2000)?year-1900:year);
1815 return S_OK;
1816}
1817
1818/* ECMA-262 3rd Edition B2.5 */
1820 jsval_t *r)
1821{
1823 DOUBLE t, year;
1824 HRESULT hres;
1825
1826 TRACE("\n");
1827
1828 if(!(date = date_this(vthis)))
1829 return JS_E_DATE_EXPECTED;
1830
1831 if(!argc)
1832 return JS_E_MISSING_ARG;
1833
1834 t = local_time(date->time, date);
1835
1836 hres = to_number(ctx, argv[0], &year);
1837 if(FAILED(hres))
1838 return hres;
1839
1840 if(isnan(year)) {
1841 date->time = year;
1842 if(r)
1843 *r = jsval_number(NAN);
1844 return S_OK;
1845 }
1846
1847 year = year >= 0.0 ? floor(year) : -floor(-year);
1848 if(-1.0 < year && year < 100.0)
1849 year += 1900.0;
1850
1852
1853 if(r)
1854 *r = jsval_number(date->time);
1855 return S_OK;
1856}
1857
1858static const builtin_prop_t Date_props[] = {
1859 {L"getDate", Date_getDate, PROPF_METHOD},
1860 {L"getDay", Date_getDay, PROPF_METHOD},
1861 {L"getFullYear", Date_getFullYear, PROPF_METHOD},
1862 {L"getHours", Date_getHours, PROPF_METHOD},
1863 {L"getMilliseconds", Date_getMilliseconds, PROPF_METHOD},
1864 {L"getMinutes", Date_getMinutes, PROPF_METHOD},
1865 {L"getMonth", Date_getMonth, PROPF_METHOD},
1866 {L"getSeconds", Date_getSeconds, PROPF_METHOD},
1867 {L"getTime", Date_getTime, PROPF_METHOD},
1868 {L"getTimezoneOffset", Date_getTimezoneOffset, PROPF_METHOD},
1869 {L"getUTCDate", Date_getUTCDate, PROPF_METHOD},
1870 {L"getUTCDay", Date_getUTCDay, PROPF_METHOD},
1871 {L"getUTCFullYear", Date_getUTCFullYear, PROPF_METHOD},
1872 {L"getUTCHours", Date_getUTCHours, PROPF_METHOD},
1873 {L"getUTCMilliseconds", Date_getUTCMilliseconds, PROPF_METHOD},
1874 {L"getUTCMinutes", Date_getUTCMinutes, PROPF_METHOD},
1875 {L"getUTCMonth", Date_getUTCMonth, PROPF_METHOD},
1876 {L"getUTCSeconds", Date_getUTCSeconds, PROPF_METHOD},
1877 {L"getYear", Date_getYear, PROPF_METHOD},
1878 {L"setDate", Date_setDate, PROPF_METHOD|1},
1879 {L"setFullYear", Date_setFullYear, PROPF_METHOD|3},
1880 {L"setHours", Date_setHours, PROPF_METHOD|4},
1881 {L"setMilliseconds", Date_setMilliseconds, PROPF_METHOD|1},
1882 {L"setMinutes", Date_setMinutes, PROPF_METHOD|3},
1883 {L"setMonth", Date_setMonth, PROPF_METHOD|2},
1884 {L"setSeconds", Date_setSeconds, PROPF_METHOD|2},
1885 {L"setTime", Date_setTime, PROPF_METHOD|1},
1886 {L"setUTCDate", Date_setUTCDate, PROPF_METHOD|1},
1887 {L"setUTCFullYear", Date_setUTCFullYear, PROPF_METHOD|3},
1888 {L"setUTCHours", Date_setUTCHours, PROPF_METHOD|4},
1889 {L"setUTCMilliseconds", Date_setUTCMilliseconds, PROPF_METHOD|1},
1890 {L"setUTCMinutes", Date_setUTCMinutes, PROPF_METHOD|3},
1891 {L"setUTCMonth", Date_setUTCMonth, PROPF_METHOD|2},
1892 {L"setUTCSeconds", Date_setUTCSeconds, PROPF_METHOD|2},
1893 {L"setYear", Date_setYear, PROPF_METHOD|1},
1894 {L"toDateString", Date_toDateString, PROPF_METHOD},
1895 {L"toGMTString", Date_toGMTString, PROPF_METHOD},
1896 {L"toISOString", Date_toISOString, PROPF_METHOD|PROPF_ES5},
1897 {L"toLocaleDateString", Date_toLocaleDateString, PROPF_METHOD},
1898 {L"toLocaleString", Date_toLocaleString, PROPF_METHOD},
1899 {L"toLocaleTimeString", Date_toLocaleTimeString, PROPF_METHOD},
1900 {L"toString", Date_toString, PROPF_METHOD},
1901 {L"toTimeString", Date_toTimeString, PROPF_METHOD},
1902 {L"toUTCString", Date_toUTCString, PROPF_METHOD},
1903 {L"valueOf", Date_valueOf, PROPF_METHOD},
1904};
1905
1908 .props_cnt = ARRAY_SIZE(Date_props),
1909 .props = Date_props,
1910};
1911
1914};
1915
1917{
1919 HRESULT hres;
1921
1923
1924 date = calloc(1, sizeof(DateInstance));
1925 if(!date)
1926 return E_OUTOFMEMORY;
1927
1928 if(object_prototype)
1929 hres = init_dispex(&date->dispex, ctx, &Date_info, object_prototype);
1930 else
1931 hres = init_dispex_from_constr(&date->dispex, ctx, &DateInst_info, ctx->date_constr);
1932 if(FAILED(hres)) {
1933 free(date);
1934 return hres;
1935 }
1936
1937 date->time = time;
1938 date->bias = tzi.Bias;
1939 date->standardDate = tzi.StandardDate;
1940 date->standardBias = tzi.StandardBias;
1941 date->daylightDate = tzi.DaylightDate;
1942 date->daylightBias = tzi.DaylightBias;
1943
1944 *ret = date;
1945 return S_OK;
1946}
1947
1948static inline HRESULT date_parse(jsstr_t *input_str, double *ret) {
1949 static const DWORD string_ids[] = { LOCALE_SMONTHNAME12, LOCALE_SMONTHNAME11,
1956 WCHAR *strings[ARRAY_SIZE(string_ids)];
1957 WCHAR *parse;
1958 int input_len, parse_len = 0, nest_level = 0, i, size;
1959 int year = 0, month = 0, day = 0, hour = 0, min = 0, sec = 0;
1960 int ms = 0, offset = 0, hour_adjust = 0;
1961 BOOL set_year = FALSE, set_month = FALSE, set_day = FALSE, set_hour = FALSE;
1962 BOOL set_offset = FALSE, set_era = FALSE, ad = TRUE, set_am = FALSE, am = TRUE;
1963 BOOL set_hour_adjust = TRUE;
1965 const WCHAR *input;
1966 DateInstance di;
1967 DWORD lcid_en;
1968
1969 input_len = jsstr_length(input_str);
1970 input = jsstr_flatten(input_str);
1971 if(!input)
1972 return E_OUTOFMEMORY;
1973
1974 for(i=0; i<input_len; i++) {
1975 if(input[i] == '(') nest_level++;
1976 else if(input[i] == ')') {
1977 nest_level--;
1978 if(nest_level<0) {
1979 *ret = NAN;
1980 return S_OK;
1981 }
1982 }
1983 else if(!nest_level) parse_len++;
1984 }
1985
1986 parse = malloc((parse_len+1)*sizeof(WCHAR));
1987 if(!parse)
1988 return E_OUTOFMEMORY;
1989 nest_level = 0;
1990 parse_len = 0;
1991 for(i=0; i<input_len; i++) {
1992 if(input[i] == '(') nest_level++;
1993 else if(input[i] == ')') nest_level--;
1994 else if(!nest_level) parse[parse_len++] = towupper(input[i]);
1995 }
1996 parse[parse_len] = 0;
1997
1999 di.bias = tzi.Bias;
2004
2005 /* FIXME: Cache strings */
2007 for(i=0; i<ARRAY_SIZE(string_ids); i++) {
2008 size = GetLocaleInfoW(lcid_en, string_ids[i], NULL, 0);
2009 strings[i] = malloc((size+1)*sizeof(WCHAR));
2010 if(!strings[i]) {
2011 i--;
2012 while(i-- >= 0)
2013 free(strings[i]);
2014 free(parse);
2015 return E_OUTOFMEMORY;
2016 }
2017 GetLocaleInfoW(lcid_en, string_ids[i], strings[i], size);
2018 }
2019
2020 for(i=0; i<parse_len;) {
2021 while(iswspace(parse[i])) i++;
2022 if(parse[i] == ',') {
2023 while(parse[i] == ',') i++;
2024 continue;
2025 }
2026
2027 if(parse[i]>='0' && parse[i]<='9') {
2028 int tmp = wcstol(&parse[i], NULL, 10);
2029 while(parse[i]>='0' && parse[i]<='9') i++;
2030 while(iswspace(parse[i])) i++;
2031
2032 if(parse[i] == ':') {
2033 /* Time */
2034 if(set_hour) break;
2035 set_hour = TRUE;
2036
2037 hour = tmp;
2038
2039 while(parse[i] == ':') i++;
2040 while(iswspace(parse[i])) i++;
2041 if(parse[i]>='0' && parse[i]<='9') {
2042 min = wcstol(&parse[i], NULL, 10);
2043 while(parse[i]>='0' && parse[i]<='9') i++;
2044 }
2045
2046 while(iswspace(parse[i])) i++;
2047 while(parse[i] == ':') i++;
2048 while(iswspace(parse[i])) i++;
2049 if(parse[i]>='0' && parse[i]<='9') {
2050 sec = wcstol(&parse[i], NULL, 10);
2051 while(parse[i]>='0' && parse[i]<='9') i++;
2052 }
2053 }
2054 else if(parse[i]=='-' || parse[i]=='/') {
2055 /* Short or long date */
2056 if(set_day || set_month || set_year) break;
2057 set_day = TRUE;
2058 set_month = TRUE;
2059 set_year = TRUE;
2060
2061 month = tmp-1;
2062
2063 while(iswspace(parse[i])) i++;
2064 while(parse[i]=='-' || parse[i]=='/') i++;
2065 while(iswspace(parse[i])) i++;
2066 if(parse[i]<'0' || parse[i]>'9') break;
2067 day = wcstol(&parse[i], NULL, 10);
2068 while(parse[i]>='0' && parse[i]<='9') i++;
2069
2070 while(parse[i]=='-' || parse[i]=='/') i++;
2071 while(iswspace(parse[i])) i++;
2072 if(parse[i]<'0' || parse[i]>'9') break;
2073 year = wcstol(&parse[i], NULL, 10);
2074 while(parse[i]>='0' && parse[i]<='9') i++;
2075
2076 if(tmp >= 70){
2077 /* long date */
2078 month = day - 1;
2079 day = year;
2080 year = tmp;
2081 }
2082 }
2083 else if(tmp<0) break;
2084 else if(tmp<70) {
2085 /* Day */
2086 if(set_day) break;
2087 set_day = TRUE;
2088 day = tmp;
2089 }
2090 else {
2091 /* Year */
2092 if(set_year) break;
2093 set_year = TRUE;
2094 year = tmp;
2095 }
2096 }
2097 else if(parse[i]=='+' || parse[i]=='-') {
2098 /* Timezone offset */
2099 BOOL positive = TRUE;
2100
2101 if(set_offset && set_hour_adjust) break;
2102 set_offset = TRUE;
2103 set_hour_adjust = FALSE;
2104
2105 if(parse[i] == '-') positive = FALSE;
2106
2107 i++;
2108 while(iswspace(parse[i])) i++;
2109 if(parse[i]<'0' || parse[i]>'9') break;
2110 offset = wcstol(&parse[i], NULL, 10);
2111 while(parse[i]>='0' && parse[i]<='9') i++;
2112
2113 if(offset<24) offset *= 60;
2114 else offset = (offset/100)*60 + offset%100;
2115
2116 if(positive) offset = -offset;
2117
2118 }
2119 else {
2120 if(parse[i]<'A' || parse[i]>'Z') break;
2121 else if(parse[i]=='B' && (parse[i+1]=='C' ||
2122 (parse[i+1]=='.' && parse[i+2]=='C'))) {
2123 /* AD/BC */
2124 if(set_era) break;
2125 set_era = TRUE;
2126 ad = FALSE;
2127
2128 i++;
2129 if(parse[i] == '.') i++;
2130 i++;
2131 if(parse[i] == '.') i++;
2132 }
2133 else if(parse[i]=='A' && (parse[i+1]=='D' ||
2134 (parse[i+1]=='.' && parse[i+2]=='D'))) {
2135 /* AD/BC */
2136 if(set_era) break;
2137 set_era = TRUE;
2138
2139 i++;
2140 if(parse[i] == '.') i++;
2141 i++;
2142 if(parse[i] == '.') i++;
2143 }
2144 else if(parse[i+1]<'A' || parse[i+1]>'Z') {
2145 /* Timezone */
2146 if(set_offset) break;
2147 set_offset = TRUE;
2148
2149 if(parse[i] <= 'I') hour_adjust = parse[i]-'A'+2;
2150 else if(parse[i] == 'J') break;
2151 else if(parse[i] <= 'M') hour_adjust = parse[i]-'K'+11;
2152 else if(parse[i] <= 'Y') hour_adjust = parse[i]-'N';
2153 else hour_adjust = 1;
2154
2155 i++;
2156 if(parse[i] == '.') i++;
2157 }
2158 else if(parse[i]=='A' && parse[i+1]=='M') {
2159 /* AM/PM */
2160 if(set_am) break;
2161 set_am = TRUE;
2162 am = TRUE;
2163 i += 2;
2164 }
2165 else if(parse[i]=='P' && parse[i+1]=='M') {
2166 /* AM/PM */
2167 if(set_am) break;
2168 set_am = TRUE;
2169 am = FALSE;
2170 i += 2;
2171 }
2172 else if((parse[i]=='U' && parse[i+1]=='T' && parse[i+2]=='C')
2173 || (parse[i]=='G' && parse[i+1]=='M' && parse[i+2]=='T')) {
2174 /* Timezone */
2175 if(set_offset) break;
2176 set_offset = TRUE;
2177 set_hour_adjust = FALSE;
2178
2179 i += 3;
2180 }
2181 else {
2182 /* Month or garbage */
2183 unsigned int j;
2184
2185 for(size=i; parse[size]>='A' && parse[size]<='Z'; size++);
2186 size -= i;
2187
2188 for(j=0; j<ARRAY_SIZE(string_ids); j++)
2189 if(!wcsnicmp(&parse[i], strings[j], size)) break;
2190
2191 if(j < 12) {
2192 if(set_month) break;
2193 set_month = TRUE;
2194 month = 11-j;
2195 }
2196 else if(j == ARRAY_SIZE(string_ids)) break;
2197
2198 i += size;
2199 }
2200 }
2201 }
2202
2203 if(i == parse_len && set_year && set_month && set_day && (!set_am || hour<13)) {
2204 if(set_am) {
2205 if(hour == 12) hour = 0;
2206 if(!am) hour += 12;
2207 }
2208
2209 if(!ad) year = -year+1;
2210 else if(year<100) year += 1900;
2211
2213 make_time(hour+hour_adjust, min, sec, ms)) + offset*MS_PER_MINUTE);
2214
2215 if(set_hour_adjust)
2216 *ret = utc(*ret, &di);
2217 }else {
2218 *ret = NAN;
2219 }
2220
2221 for(i=0; i<ARRAY_SIZE(string_ids); i++)
2222 free(strings[i]);
2223 free(parse);
2224
2225 return S_OK;
2226}
2227
2229 jsval_t *r)
2230{
2231 jsstr_t *parse_str;
2232 double n;
2233 HRESULT hres;
2234
2235 TRACE("\n");
2236
2237 if(!argc) {
2238 if(r)
2239 *r = jsval_number(NAN);
2240 return S_OK;
2241 }
2242
2243 hres = to_string(ctx, argv[0], &parse_str);
2244 if(FAILED(hres))
2245 return hres;
2246
2247 hres = date_parse(parse_str, &n);
2248 jsstr_release(parse_str);
2249 if(FAILED(hres))
2250 return hres;
2251
2252 if(r)
2253 *r = jsval_number(n);
2254 return S_OK;
2255}
2256
2257static HRESULT date_utc(script_ctx_t *ctx, unsigned argc, jsval_t *argv, double *ret)
2258{
2259 double year, month, vdate, hours, minutes, seconds, ms;
2260 HRESULT hres;
2261
2262 TRACE("\n");
2263
2264 if(argc) {
2265 hres = to_number(ctx, argv[0], &year);
2266 if(FAILED(hres))
2267 return hres;
2268 if(0 <= year && year <= 99)
2269 year += 1900;
2270 }else {
2271 year = 1900;
2272 }
2273
2274 if(argc>1) {
2275 hres = to_number(ctx, argv[1], &month);
2276 if(FAILED(hres))
2277 return hres;
2278 }else {
2279 month = 0;
2280 }
2281
2282 if(argc>2) {
2283 hres = to_number(ctx, argv[2], &vdate);
2284 if(FAILED(hres))
2285 return hres;
2286 }else {
2287 vdate = 1;
2288 }
2289
2290 if(argc>3) {
2291 hres = to_number(ctx, argv[3], &hours);
2292 if(FAILED(hres))
2293 return hres;
2294 }else {
2295 hours = 0;
2296 }
2297
2298 if(argc>4) {
2299 hres = to_number(ctx, argv[4], &minutes);
2300 if(FAILED(hres))
2301 return hres;
2302 }else {
2303 minutes = 0;
2304 }
2305
2306 if(argc>5) {
2307 hres = to_number(ctx, argv[5], &seconds);
2308 if(FAILED(hres))
2309 return hres;
2310 }else {
2311 seconds = 0;
2312 }
2313
2314 if(argc>6) {
2315 hres = to_number(ctx, argv[6], &ms);
2316 if(FAILED(hres))
2317 return hres;
2318 } else {
2319 ms = 0;
2320 }
2321
2322 *ret = time_clip(make_date(make_day(year, month, vdate),
2323 make_time(hours, minutes,seconds, ms)));
2324 return S_OK;
2325}
2326
2328 jsval_t *r)
2329{
2330 double n;
2331 HRESULT hres;
2332
2333 TRACE("\n");
2334
2335 hres = date_utc(ctx, argc, argv, &n);
2336 if(SUCCEEDED(hres) && r)
2337 *r = jsval_number(n);
2338 return hres;
2339}
2340
2341/* ECMA-262 5.1 Edition 15.9.4.4 */
2343{
2344 TRACE("\n");
2345
2346 if(r) *r = jsval_number(date_now());
2347 return S_OK;
2348}
2349
2351 jsval_t *r)
2352{
2354 HRESULT hres;
2355
2356 TRACE("\n");
2357
2358 switch(flags) {
2359 case DISPATCH_CONSTRUCT:
2360 switch(argc) {
2361 /* ECMA-262 3rd Edition 15.9.3.3 */
2362 case 0:
2364 if(FAILED(hres))
2365 return hres;
2366 break;
2367
2368 /* ECMA-262 3rd Edition 15.9.3.2 */
2369 case 1: {
2370 jsval_t prim;
2371 double n;
2372
2374 if(FAILED(hres))
2375 return hres;
2376
2377 if(is_string(prim))
2379 else
2380 hres = to_number(ctx, prim, &n);
2381
2383 if(FAILED(hres))
2384 return hres;
2385
2387 if(FAILED(hres))
2388 return hres;
2389 break;
2390 }
2391
2392 /* ECMA-262 3rd Edition 15.9.3.1 */
2393 default: {
2394 double ret_date;
2395
2396 hres = date_utc(ctx, argc, argv, &ret_date);
2397 if(FAILED(hres))
2398 return hres;
2399
2400 hres = create_date(ctx, NULL, ret_date, &date);
2401 if(FAILED(hres))
2402 return hres;
2403
2404 date->time = utc(date->time, date);
2405 }
2406 }
2407
2408 if(r) *r = jsval_obj(&date->dispex);
2409 else jsdisp_release(&date->dispex);
2410 return S_OK;
2411
2412 case INVOKE_FUNC: {
2413 FILETIME system_time, local_time;
2414
2415 GetSystemTimeAsFileTime(&system_time);
2416 FileTimeToLocalFileTime(&system_time, &local_time);
2417
2419 }
2420
2421 default:
2422 FIXME("unimplemented flags %x\n", flags);
2423 return E_NOTIMPL;
2424 }
2425
2426 return S_OK;
2427}
2428
2430 {L"UTC", DateConstr_UTC, PROPF_METHOD},
2433};
2434
2437 .call = Function_value,
2438 .props_cnt = ARRAY_SIZE(DateConstr_props),
2439 .props = DateConstr_props,
2440};
2441
2443{
2445 HRESULT hres;
2446
2447 hres = create_date(ctx, object_prototype, 0.0, &date);
2448 if(FAILED(hres))
2449 return hres;
2450
2452 PROPF_CONSTR|7, &date->dispex, ret);
2453
2454 jsdisp_release(&date->dispex);
2455 return hres;
2456}
2457
2459{
2460 SYSTEMTIME st;
2461 UDATE udate;
2462 HRESULT hres;
2463
2464 hres = VarUdateFromDate(date, 0, &udate);
2465 if(FAILED(hres))
2466 return hres;
2467
2468 if(!TzSpecificLocalTimeToSystemTime(NULL, &udate.st, &st))
2469 return E_FAIL;
2470
2471 TRACE("%uy %um %u %ud %uh %um %u.%us\n", st.wYear, st.wMonth, st.wDayOfWeek, st.wDay, st.wHour, st.wMinute,
2472 st.wSecond, st.wMilliseconds);
2473
2474 *ret = make_date(make_day(st.wYear, st.wMonth - 1, st.wDay),
2475 make_time(st.wHour, st.wMinute, st.wSecond, st.wMilliseconds));
2476 return S_OK;
2477}
2478
2480{
2481 DateInstance *date_obj;
2482 jsval_t val;
2483 double time;
2484 HRESULT hres;
2485
2487 if(FAILED(hres))
2488 return hres;
2489
2490 hres = create_date(ctx, NULL, time, &date_obj);
2491 if(FAILED(hres))
2492 return hres;
2493
2494 hres = dateobj_to_string(date_obj, &val);
2495 jsdisp_release(&date_obj->dispex);
2496 if(FAILED(hres))
2497 return hres;
2498
2500 *r = get_string(val);
2501 return hres;
2502}
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define wcsnicmp
Definition: compat.h:14
static HRESULT Date_getYear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1794
static HRESULT Date_setSeconds(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1286
static HRESULT Date_getTimezoneOffset(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1183
static const builtin_prop_t DateConstr_props[]
Definition: date.c:2429
static HRESULT dateobj_to_string(DateInstance *date, jsval_t *r)
Definition: date.c:513
static const builtin_info_t Date_info
Definition: date.c:1906
static HRESULT Date_getFullYear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:927
HRESULT create_date_constr(script_ctx_t *ctx, jsdisp_t *object_prototype, jsdisp_t **ret)
Definition: date.c:2442
static DOUBLE utc(DOUBLE time, DateInstance *date)
Definition: date.c:315
static HRESULT Date_setDate(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1566
static DOUBLE min_from_time(DOUBLE time)
Definition: date.c:336
static HRESULT Date_setUTCMinutes(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1411
static DateInstance * date_this(jsval_t vthis)
Definition: date.c:53
static HRESULT Date_setFullYear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1702
#define MS_PER_DAY
Definition: date.c:70
static HRESULT Date_toString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:525
static HRESULT create_utc_string(script_ctx_t *ctx, jsval_t vthis, jsval_t *r)
Definition: date.c:638
static const builtin_info_t DateInst_info
Definition: date.c:1912
static HRESULT Date_getTime(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:911
static DOUBLE days_in_year(DOUBLE year)
Definition: date.c:93
static DOUBLE make_date(DOUBLE day, DOUBLE time)
Definition: date.c:402
static HRESULT Date_valueOf(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:623
static int in_leap_year(DOUBLE time)
Definition: date.c:173
static const builtin_info_t DateConstr_info
Definition: date.c:2435
static DOUBLE make_day(DOUBLE year, DOUBLE month, DOUBLE day)
Definition: date.c:384
HRESULT variant_date_to_string(script_ctx_t *ctx, double date, jsstr_t **r)
Definition: date.c:2479
static HRESULT DateConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:2350
static DOUBLE time_from_year(DOUBLE year)
Definition: date.c:149
static HRESULT Date_getSeconds(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1120
HRESULT variant_date_to_number(double date, double *ret)
Definition: date.c:2458
static DateInstance * date_from_jsdisp(jsdisp_t *jsdisp)
Definition: date.c:48
static HRESULT Date_toDateString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:770
static HRESULT Date_getUTCMonth(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:977
static HRESULT dateobj_to_date_string(DateInstance *date, jsval_t *r)
Definition: date.c:714
static DOUBLE day_from_year(DOUBLE year)
Definition: date.c:108
static HRESULT Date_getMinutes(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1088
static int day_within_year(DOUBLE time)
Definition: date.c:181
static DOUBLE local_time(DOUBLE time, DateInstance *date)
Definition: date.c:309
static HRESULT Date_setMinutes(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1364
static DOUBLE month_from_time(DOUBLE time)
Definition: date.c:187
static HRESULT Date_toUTCString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:699
static HRESULT Date_getUTCMinutes(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1104
static DOUBLE time_clip(DOUBLE time)
Definition: date.c:408
static HRESULT Date_getMonth(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:962
static HRESULT Date_getDate(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:993
static HRESULT Date_toLocaleTimeString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:872
static HRESULT Date_toGMTString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:706
static DOUBLE convert_time(int year, SYSTEMTIME st)
Definition: date.c:247
static HRESULT Date_setYear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1819
static HRESULT Date_toTimeString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:782
static HRESULT DateConstr_parse(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:2228
static HRESULT Date_toLocaleDateString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:833
static HRESULT Date_getUTCDay(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1040
static SYSTEMTIME create_systemtime(DOUBLE time)
Definition: date.c:425
static HRESULT DateConstr_now(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:2342
static HRESULT Date_setUTCDate(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1595
static HRESULT Date_getUTCMilliseconds(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1167
static HRESULT Date_setTime(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1199
static HRESULT Date_getUTCHours(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1072
static HRESULT Date_getUTCFullYear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:946
static DOUBLE daylight_saving_ta(DOUBLE time, DateInstance *date)
Definition: date.c:281
static const builtin_prop_t Date_props[]
Definition: date.c:1858
static HRESULT Date_setMilliseconds(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1226
static HRESULT Date_getHours(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1056
static HRESULT Date_toLocaleString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:538
#define MS_PER_HOUR
Definition: date.c:71
static HRESULT Date_setMonth(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1624
static HRESULT date_utc(script_ctx_t *ctx, unsigned argc, jsval_t *argv, double *ret)
Definition: date.c:2257
static HRESULT Date_getUTCSeconds(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1135
static DOUBLE date_from_time(DOUBLE time)
Definition: date.c:210
static HRESULT Date_getUTCDate(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1008
static HRESULT create_date(script_ctx_t *ctx, jsdisp_t *object_prototype, DOUBLE time, DateInstance **ret)
Definition: date.c:1916
static DOUBLE hour_from_time(DOUBLE time)
Definition: date.c:322
static HRESULT date_to_string(DOUBLE time, BOOL show_offset, int offset, jsval_t *r)
Definition: date.c:441
static HRESULT date_parse(jsstr_t *input_str, double *ret)
Definition: date.c:1948
static DOUBLE ms_from_time(DOUBLE time)
Definition: date.c:364
static DOUBLE sec_from_time(DOUBLE time)
Definition: date.c:350
#define MS_PER_MINUTE
Definition: date.c:72
static HRESULT Date_setUTCHours(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1512
static DOUBLE week_day(DOUBLE time)
Definition: date.c:234
static DOUBLE time_within_day(DOUBLE time)
Definition: date.c:81
static HRESULT Date_setUTCSeconds(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1325
static double file_time_to_date_time(const FILETIME *ftime)
Definition: date.c:59
static DOUBLE make_time(DOUBLE hour, DOUBLE min, DOUBLE sec, DOUBLE ms)
Definition: date.c:378
static DOUBLE year_from_time(DOUBLE time)
Definition: date.c:155
static double date_now(void)
Definition: date.c:417
static HRESULT Date_setUTCMilliseconds(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1256
static HRESULT Date_setHours(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1458
static HRESULT Date_getDay(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1024
static HRESULT Date_setUTCFullYear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1748
static HRESULT Date_setUTCMonth(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1663
static HRESULT Date_getMilliseconds(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:1151
static DOUBLE day(DOUBLE time)
Definition: date.c:75
static HRESULT DateConstr_UTC(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:2327
static HRESULT Date_toISOString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: date.c:581
static int day_from_month(int month, int in_leap_year)
Definition: date.c:117
HRESULT create_builtin_constructor(script_ctx_t *ctx, builtin_invoke_t value_proc, const WCHAR *name, const builtin_info_t *builtin_info, DWORD flags, jsdisp_t *prototype, jsdisp_t **ret)
Definition: function.c:809
HRESULT Function_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: function.c:600
VOID WINAPI GetSystemTimeAsFileTime(OUT PFILETIME lpFileTime)
Definition: time.c:128
BOOL WINAPI FileTimeToLocalFileTime(IN CONST FILETIME *lpFileTime, OUT LPFILETIME lpLocalFileTime)
Definition: time.c:216
BOOL WINAPI TzSpecificLocalTimeToSystemTime(CONST TIME_ZONE_INFORMATION *lpTimeZoneInformation, CONST SYSTEMTIME *lpLocalTime, LPSYSTEMTIME lpUniversalTime)
Definition: timezone.c:421
DWORD WINAPI GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation)
Definition: timezone.c:262
INT WINAPI GetLocaleInfoW(LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len)
Definition: locale.c:1675
MonoAssembly int argc
Definition: metahost.c:107
#define assert(_expr)
Definition: assert.h:32
_ACRTIMP __msvcrt_long __cdecl wcstol(const wchar_t *, wchar_t **, int)
Definition: wcs.c:2752
#define isnan(x)
Definition: math.h:360
#define NAN
Definition: math.h:273
_ACRTIMP double __cdecl fmod(double, double)
_ACRTIMP double __cdecl floor(double)
Definition: floor.c:18
static void ftime(struct _timeb *ptr)
Definition: timeb.h:72
static TIME_ZONE_INFORMATION tzi
Definition: time.c:123
static const WCHAR month[12][4]
Definition: session.c:2528
#define swprintf
Definition: precomp.h:40
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLdouble GLdouble t
Definition: gl.h:2047
GLdouble n
Definition: glext.h:7729
GLsizei const GLchar *const * strings
Definition: glext.h:7622
GLsizeiptr size
Definition: glext.h:5919
GLintptr offset
Definition: glext.h:5920
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLbitfield flags
Definition: glext.h:7161
GLuint GLfloat * val
Definition: glext.h:7180
GLfloat GLfloat p
Definition: glext.h:8902
GLenum GLsizei len
Definition: glext.h:6722
GLenum GLenum GLenum input
Definition: glext.h:9031
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
static HRESULT to_string(VARIANT *src, BSTR *dst)
Definition: host.c:46
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
HRESULT init_dispex_from_constr(jsdisp_t *dispex, script_ctx_t *ctx, const builtin_info_t *builtin_info, jsdisp_t *constr)
Definition: dispex.c:2512
ULONG jsdisp_release(jsdisp_t *obj)
Definition: dispex.c:1911
HRESULT init_dispex(jsdisp_t *dispex, script_ctx_t *ctx, const builtin_info_t *builtin_info, jsdisp_t *prototype)
Definition: dispex.c:2454
jsdisp_t * to_jsdisp(IDispatch *disp)
Definition: dispex.c:2447
#define JS_E_MISSING_ARG
Definition: jscript.h:534
#define PROPF_ES5
Definition: jscript.h:90
@ NO_HINT
Definition: jscript.h:309
HRESULT to_primitive(script_ctx_t *, jsval_t, jsval_t *, hint_t)
Definition: jsutils.c:423
HRESULT to_number(script_ctx_t *, jsval_t, double *)
Definition: jsutils.c:630
@ JSCLASS_FUNCTION
Definition: jscript.h:109
@ JSCLASS_DATE
Definition: jscript.h:106
#define JS_E_DATE_EXPECTED
Definition: jscript.h:553
#define PROPF_HTML
Definition: jscript.h:89
static BOOL is_class(jsdisp_t *jsdisp, jsclass_t class)
Definition: jscript.h:503
const unsigned int PROPF_METHOD
Definition: jsdisp.idl:33
const unsigned int PROPF_CONSTR
Definition: jsdisp.idl:34
jsstr_t * jsstr_nan(void)
Definition: jsstr.c:286
jsstr_t * jsstr_alloc_buf(unsigned len, WCHAR **buf)
Definition: jsstr.c:69
static const WCHAR * jsstr_flatten(jsstr_t *str)
Definition: jsstr.h:136
static void jsstr_release(jsstr_t *str)
Definition: jsstr.h:107
static unsigned jsstr_length(jsstr_t *str)
Definition: jsstr.h:55
static jsstr_t * jsstr_alloc(const WCHAR *str)
Definition: jsstr.h:100
void jsval_release(jsval_t val)
Definition: jsutils.c:186
static jsval_t jsval_string(jsstr_t *str)
Definition: jsval.h:109
static jsval_t jsval_obj(jsdisp_t *obj)
Definition: jsval.h:125
static jsstr_t * get_string(jsval_t v)
Definition: jsval.h:238
static IDispatch * get_object(jsval_t v)
Definition: jsval.h:228
static BOOL is_object_instance(jsval_t v)
Definition: jsval.h:175
static jsval_t jsval_number(double n)
Definition: jsval.h:153
INT WINAPI GetTimeFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpTimeStr, INT cchOut)
Definition: lcformat.c:1101
INT WINAPI GetDateFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpDateStr, INT cchOut)
Definition: lcformat.c:1001
#define sign(x)
Definition: mapdesc.cc:613
__u16 date
Definition: mkdosfs.c:8
__u16 time
Definition: mkdosfs.c:8
LOCAL int prim(arg_t *ap)
Definition: match.c:440
static PVOID ptr
Definition: dispmode.c:27
HRESULT hres
Definition: protocol.c:465
#define DOUBLE(x)
Definition: atom.c:30
#define min(a, b)
Definition: monoChain.cc:55
#define argv
Definition: mplay32.c:18
#define SORT_DEFAULT
#define MAKELCID(lgid, srtid)
static BOOL is_string(parse_buffer *buf)
Definition: parsing.c:600
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
#define calloc
Definition: rosglue.h:14
#define iswspace(_c)
Definition: ctype.h:669
#define MAKELANGID(p, s)
Definition: nls.h:15
#define LANG_ENGLISH
Definition: nls.h:52
#define SUBLANG_ENGLISH_US
Definition: nls.h:222
#define towupper(c)
Definition: wctype.h:99
#define TRACE(s)
Definition: solgame.cpp:4
LONG standardBias
Definition: date.c:43
SYSTEMTIME daylightDate
Definition: date.c:44
jsdisp_t dispex
Definition: date.c:36
SYSTEMTIME standardDate
Definition: date.c:42
DOUBLE time
Definition: date.c:39
LONG daylightBias
Definition: date.c:45
LONG bias
Definition: date.c:41
Definition: oleauto.h:720
SYSTEMTIME st
Definition: oleauto.h:721
WORD wMilliseconds
Definition: minwinbase.h:263
WORD wSecond
Definition: minwinbase.h:262
WORD wMinute
Definition: minwinbase.h:261
WORD wDayOfWeek
Definition: minwinbase.h:258
SYSTEMTIME DaylightDate
Definition: timezoneapi.h:30
SYSTEMTIME StandardDate
Definition: timezoneapi.h:27
Definition: jsstr.h:36
Definition: jsval.h:54
jsclass_t class
Definition: jscript.h:183
Definition: unary.h:15
int64_t LONGLONG
Definition: typedefs.h:68
uint64_t ULONGLONG
Definition: typedefs.h:67
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
double DOUBLE
Definition: typedefs.h:70
HRESULT WINAPI VarUdateFromDate(DATE dateIn, ULONG dwFlags, UDATE *lpUdate)
Definition: variant.c:1427
#define LOCALE_SABBREVMONTHNAME10
Definition: winnls.h:123
#define LOCALE_SMONTHNAME12
Definition: winnls.h:112
#define LOCALE_SMONTHNAME5
Definition: winnls.h:105
#define LOCALE_SDAYNAME5
Definition: winnls.h:91
#define LOCALE_SABBREVMONTHNAME9
Definition: winnls.h:122
#define LOCALE_SABBREVMONTHNAME11
Definition: winnls.h:124
#define LOCALE_SABBREVDAYNAME5
Definition: winnls.h:98
#define LOCALE_SABBREVDAYNAME2
Definition: winnls.h:95
#define LOCALE_SABBREVMONTHNAME2
Definition: winnls.h:115
#define LOCALE_SMONTHNAME3
Definition: winnls.h:103
#define LOCALE_SMONTHNAME11
Definition: winnls.h:111
#define LOCALE_SMONTHNAME8
Definition: winnls.h:108
#define LOCALE_SMONTHNAME4
Definition: winnls.h:104
#define LOCALE_SDAYNAME1
Definition: winnls.h:87
#define LOCALE_SMONTHNAME7
Definition: winnls.h:107
#define LOCALE_SABBREVMONTHNAME4
Definition: winnls.h:117
#define LOCALE_SABBREVDAYNAME4
Definition: winnls.h:97
#define LOCALE_SMONTHNAME1
Definition: winnls.h:101
#define LOCALE_SABBREVMONTHNAME3
Definition: winnls.h:116
#define LOCALE_SDAYNAME7
Definition: winnls.h:93
#define LOCALE_SDAYNAME2
Definition: winnls.h:88
#define LOCALE_SABBREVMONTHNAME1
Definition: winnls.h:114
#define LOCALE_SABBREVDAYNAME6
Definition: winnls.h:99
#define LOCALE_SMONTHNAME2
Definition: winnls.h:102
#define LOCALE_SABBREVDAYNAME1
Definition: winnls.h:94
#define LOCALE_SABBREVMONTHNAME6
Definition: winnls.h:119
#define LOCALE_SMONTHNAME6
Definition: winnls.h:106
#define LOCALE_SDAYNAME3
Definition: winnls.h:89
#define LOCALE_SABBREVDAYNAME3
Definition: winnls.h:96
#define LOCALE_SABBREVMONTHNAME5
Definition: winnls.h:118
#define LOCALE_SABBREVMONTHNAME7
Definition: winnls.h:120
#define LOCALE_SABBREVMONTHNAME8
Definition: winnls.h:121
#define LOCALE_SDAYNAME4
Definition: winnls.h:90
#define LOCALE_SMONTHNAME10
Definition: winnls.h:110
#define LOCALE_SMONTHNAME9
Definition: winnls.h:109
#define DATE_LONGDATE
Definition: winnls.h:217
#define LOCALE_SABBREVMONTHNAME12
Definition: winnls.h:125
#define LOCALE_SDAYNAME6
Definition: winnls.h:92
#define LOCALE_SABBREVDAYNAME7
Definition: winnls.h:100