[MLton-user] Strange date behaviour
Matthew Fluet
fluet at tti-c.org
Fri Jul 6 16:01:15 PDT 2007
On Thu, 5 Jul 2007, Matthew Fluet wrote:
> On 7/5/07, Joe Hurd <joe at gilith.com> wrote:
>> Am I being stupid here, or is Date.fmt throwing a bogus exception?
>>
>> I'm experiencing this on both Mac OS X (i386) and Linux (i386).
>>
>> Joe
>>
>> fel-hurd:~$ mlton
>> MLton MLTONVERSION (built Mon Oct 30 23:08:10 2006 on frogbat.local)
>> fel-hurd:~$ cat t.sml
>> print (Date.fmt
>> "%d/%m/%Y"
>> (Date.date
>> {year = 1876, month = Date.Apr, day = 19,
>> hour = 0, minute = 0, second = 0,
>> offset = NONE}));
>> fel-hurd:~$ mlton t.sml
>> fel-hurd:~$ ./t
>> unhandled exception: Date
>
> There appears to be a check in $(SML_LIB)/basis/system/date.sml that
> raises Date when the year is <= 1900 and converting a date to a struct
> tm (defined in <time.h>). The comment claims to check whether the
> date may be passed to ISO/ANSI C functions. The documentation for
> <time.h> [1] says that the struct tm includes the component:
> int tm_year Years since 1900.
> That seems to be the origin of the check. However, later in the
> documentation, it says:
> tm_year is a signed value; therefore, years before 1900 may be represented.
> Hence, it seems that the check can safely be removed.
>
> [1] http://www.opengroup.org/onlinepubs/009695399/basedefs/time.h.html
I've checked in a fix for this bug. As noted above, for those not wishing
to recompile mlton for this bug, it suffices to effect the following
patch:
Index: system/date.sml
===================================================================
--- system/date.sml (revision 5731)
+++ system/date.sml (revision 5732)
@@ -160,8 +160,7 @@
(* Check whether date may be passed to ISO/ANSI C functions: *)
fun okDate (T {year, month, day, hour, minute, second, ...}) =
- 1900 <= year
- andalso 1 <= day andalso day <= monthdays year month
+ 1 <= day andalso day <= monthdays year month
andalso 0 <= hour andalso hour <= 23
andalso 0 <= minute andalso minute <= 59
andalso 0 <= second andalso second <= 61 (* leap seconds *)
The location of system/date.sml depends on your installation. If mlton
has been installed system-wide, it is in /usr/local/lib/mlton/sml/basis.
If mlton has been built from source, it is in <src>/build/lib/sml/basis.
More information about the MLton-user
mailing list