caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* strftime/strptime and asctime
@ 2005-11-08  4:09 Joshua Smith
  0 siblings, 0 replies; 2+ messages in thread
From: Joshua Smith @ 2005-11-08  4:09 UTC (permalink / raw)
  To: caml-list

[-- 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"

^ permalink raw reply	[flat|nested] 2+ messages in thread

* strftime/strptime and asctime
@ 2005-11-06  0:30 Joshua Smith
  0 siblings, 0 replies; 2+ messages in thread
From: Joshua Smith @ 2005-11-06  0:30 UTC (permalink / raw)
  To: caml-list

This has come up on the list before (even by me once), but
I'm was wondering if anyone (like the maintainers) would have any
interest in a patch to the 3.09 codebase to add strptime, strftime and
asctime?  It would probably work in the 3.08 code, too, but I figure
the most current version is the place to start.

The gmtime.c file seems like the logical place to put this, and I
don't think it would be a whole lot of work to do.  If there is
interest, I'll do it.  If this would be
wrong/problematic/foolish/duplicitive or anything
else then I would appreciate knowing that, too.

Thank you.

-jbs


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2005-11-08  4:09 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-11-08  4:09 strftime/strptime and asctime Joshua Smith
  -- strict thread matches above, loose matches on Subject: below --
2005-11-06  0:30 Joshua Smith

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).