Mantis Bug Tracker

View Issue Details Jump to Notes ] Issue History ] Print ]
IDProjectCategoryView StatusDate SubmittedLast Update
0003851OCamlOCaml generalpublic2005-11-09 00:322013-09-03 16:51
Reporteradministrator 
Assigned To 
PrioritynormalSeverityfeatureReproducibilityalways
StatusacknowledgedResolutionopen 
PlatformOSOS Version
Product Version 
Target VersionFixed in Version 
Summary0003851: strftime/strptime (followup to 0003849)
DescriptionFull_Name: Joshua Smith
Version: 3.09
OS: Linux
Submission from: dsl092-167-152.wdc2.dsl.speakeasy.net (66.92.167.152)


Here is a patch that adds these:

Index: otherlibs/unix/unix.mli
===================================================================
--- otherlibs/unix/unix.mli (revision 1)
+++ otherlibs/unix/unix.mli (revision 5)
@@ -733,15 +733,30 @@
 (** Convert a time in seconds, as returned by {!Unix.time}, into a date and
    a time. Assumes the local time zone. *)
 
+val strptime: string -> string -> tm
+ (** This function is the converse of the {!Unix.strftime} function.
+ [strptime fmt data] convert a string containing time information [data]
+ into a [tm] struct according to the format specified by [fmt]. *)
+
+val asctime: tm -> string
+ (** Return the ascii representation of a given [tm] argument. The
+ ascii time is returned in the form of a string like
+ 'Wed Jun 30, 21:21:21 2005\n' *)
+
+val strftime: string -> tm -> string
+ (** This functions is the converse of the {!Unix.strptime} function.
+ [strftime fmt data] convert a a [tm] structure [data] into a string
+ according to the format specified by [fmt]. *)
+
 val mktime : tm -> float * tm
-(** Convert a date and time, specified by the [tm] argument, into
- a time in seconds, as returned by {!Unix.time}. The [tm_isdst],
- [tm_wday] and [tm_yday] fields of [tm] are ignored. Also return a
- normalized copy of the given [tm] record, with the [tm_wday],
- [tm_yday], and [tm_isdst] fields recomputed from the other fields,
- and the other fields normalized (so that, e.g., 40 October is
- changed into 9 November). The [tm] argument is interpreted in the
- local time zone. *)
+ (** Convert a date and time, specified by the [tm] argument, into
+ a time in seconds, as returned by {!Unix.time}. The [tm_isdst],
+ [tm_wday] and [tm_yday] fields of [tm] are ignored. Also return a
+ normalized copy of the given [tm] record, with the [tm_wday],
+ [tm_yday], and [tm_isdst] fields recomputed from the other fields,
+ and the other fields normalized (so that, e.g., 40 October is
+ changed into 9 November). The [tm] argument is interpreted in the
+ local time zone. *)
 
 val alarm : int -> int
 (** Schedule a [SIGALRM] signal after the given number of seconds. *)
Index: otherlibs/unix/gmtime.c
===================================================================
--- otherlibs/unix/gmtime.c (revision 1)
+++ otherlibs/unix/gmtime.c (revision 5)
@@ -13,6 +13,7 @@
 
 /* $Id: gmtime.c,v 1.17 2005/03/24 17:20:53 doligez Exp $ */
 
+#define _XOPEN_SOURCE
 #include <mlvalues.h>
 #include <alloc.h>
 #include <fail.h>
@@ -20,7 +21,6 @@
 #include "unixsupport.h"
 #include <time.h>
 #include <errno.h>
-
 static value alloc_tm(struct tm *tm)
 {
   value res;
@@ -59,6 +59,56 @@
 
 #ifdef HAS_MKTIME
 
+CAMLprim value unix_strptime(value f,value d) {
+
+ char *fmt = String_val(f);
+ char *data = String_val(d);
+ char *err;
+ struct tm tm;
+ err = strptime(data,fmt,&tm);
+ if (err == NULL) unix_error(EINVAL, "strptime", Nothing);
+ return alloc_tm(&tm);
+}
+
+CAMLprim value unix_asctime(value t) {
+ struct tm tm;
+ char *res;
+
+ tm.tm_sec = Int_val(Field(t, 0));
+ tm.tm_min = Int_val(Field(t, 1));
+ tm.tm_hour = Int_val(Field(t, 2));
+ tm.tm_mday = Int_val(Field(t, 3));
+ tm.tm_mon = Int_val(Field(t, 4));
+ tm.tm_year = Int_val(Field(t, 5));
+ tm.tm_wday = Int_val(Field(t, 6));
+ tm.tm_yday = Int_val(Field(t, 7));
+ tm.tm_isdst = tm.tm_isdst = Bool_val(Field(t, 8));
+ res = asctime(&tm);
+ if (res == NULL) unix_error(EINVAL, "asctime", Nothing);
+ return caml_copy_string(asctime(&tm));
+
+}
+
+CAMLprim value unix_strftime(value f,value t) {
+
+ char *fmt = String_val(f);
+ struct tm tm;
+ char *output = (char *)caml_alloc_string(255);
+
+ tm.tm_sec = Int_val(Field(t, 0));
+ tm.tm_min = Int_val(Field(t, 1));
+ tm.tm_hour = Int_val(Field(t, 2));
+ tm.tm_mday = Int_val(Field(t, 3));
+ tm.tm_mon = Int_val(Field(t, 4));
+ tm.tm_year = Int_val(Field(t, 5));
+ tm.tm_wday = Int_val(Field(t, 6));
+ tm.tm_yday = Int_val(Field(t, 7));
+ tm.tm_isdst = tm.tm_isdst = Bool_val(Field(t, 8));
+ strftime(output,255,fmt,&tm);
+ return caml_copy_string(output);
+
+}
+
 CAMLprim value unix_mktime(value t)
 {
   struct tm tm;
@@ -89,6 +139,15 @@
 
 #else
 
+CAMLprim value unix_strptime(value f,value d)
+{ invalid_argument("strptime not implemented"); }
+
+CAMLprim value unix_asctime(value t) {
+{ invalid_argument("asctime not implemented"); }
+
+CAMLprim value unix_strftime(value f,value t) {
+{ invalid_argument("strftime not implemented"); }
+
 CAMLprim value unix_mktime(value t)
 { invalid_argument("mktime not implemented"); }
 
Index: otherlibs/unix/unix.ml
===================================================================
--- otherlibs/unix/unix.ml (revision 1)
+++ otherlibs/unix/unix.ml (revision 5)
@@ -337,6 +337,9 @@
 external gettimeofday : unit -> float = "unix_gettimeofday"
 external gmtime : float -> tm = "unix_gmtime"
 external localtime : float -> tm = "unix_localtime"
+external strptime : string -> string -> tm = "unix_strptime"
+external asctime : tm -> string = "unix_asctime"
+external strftime : string -> tm -> string = "unix_strftime"
 external mktime : tm -> float * tm = "unix_mktime"
 external alarm : int -> int = "unix_alarm"
 external sleep : int -> unit = "unix_sleep"
Index: otherlibs/threads/unix.ml
===================================================================
--- otherlibs/threads/unix.ml (revision 1)
+++ otherlibs/threads/unix.ml (revision 5)
@@ -457,6 +457,9 @@
 external gettimeofday : unit -> float = "unix_gettimeofday"
 external gmtime : float -> tm = "unix_gmtime"
 external localtime : float -> tm = "unix_localtime"
+external strptime : string -> string -> tm = "unix_strptime"
+external asctime : tm -> string = "unix_asctime"
+external strftime : string -> tm -> string = "unix_strftime"
 external mktime : tm -> float * tm = "unix_mktime"
 external alarm : int -> int = "unix_alarm"


Tagspatch
Attached Files

- Relationships
child of 0003849acknowledged strftime/strptime and asctime 

-  Notes
(0000277)
administrator (administrator)
2005-11-16 17:18

see also PR#3849

- Issue History
Date Modified Username Field Change
2005-11-18 10:13 administrator New Issue
2005-11-29 13:11 doligez Relationship added child of 0003849
2013-09-03 16:51 doligez Tag Attached: patch


Copyright © 2000 - 2011 MantisBT Group
Powered by Mantis Bugtracker