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