caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Joshua Smith <kognate@gmail.com>
To: caml-list@yquem.inria.fr
Subject: strftime/strptime and asctime
Date: Mon, 7 Nov 2005 23:09:23 -0500	[thread overview]
Message-ID: <d68fa980511072009g1461f0a4vf2687dddbae963de@mail.gmail.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 272 bytes --]

Well,

There was one person who expressed interested,  so I've attached the
patch to the 3.09 sources to add strptime, strftime, and asctime.  
It's a very simple addition (code-wise), and I tried to keep things
looking like the existing code.

Thank you.

-jbs

[-- Attachment #2: ocaml-3.09.patchfile --]
[-- Type: application/octet-stream, Size: 5918 bytes --]

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"

             reply	other threads:[~2005-11-08  4:09 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-11-08  4:09 Joshua Smith [this message]
  -- strict thread matches above, loose matches on Subject: below --
2005-11-06  0:30 Joshua Smith

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=d68fa980511072009g1461f0a4vf2687dddbae963de@mail.gmail.com \
    --to=kognate@gmail.com \
    --cc=caml-list@yquem.inria.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).