changeset 2380:ea964f5d3ce6 octave-forge

Changed the directory structure of time to match the package system
author hauberg
date Sun, 20 Aug 2006 14:26:40 +0000
parents 066694769f07
children edfc182214c3
files main/time/COPYING main/time/DESCRIPTION main/time/datesplit.m main/time/inst/datesplit.m
diffstat 4 files changed, 830 insertions(+), 480 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/time/COPYING	Sun Aug 20 14:26:40 2006 +0000
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                          675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/time/DESCRIPTION	Sun Aug 20 14:26:40 2006 +0000
@@ -0,0 +1,11 @@
+Name: time
+Version: 1.0.0
+Date: 2006-08-05
+Author: Bill Denney <bill@givebillmoney.com>
+Maintainer: Bill Denney <bill@givebillmoney.com>
+Title: Time and Dates.
+Description: Add a description to this package!
+Categories: Time
+Depends: octave (>= 2.9.7)
+License: GPL version 2 or later
+Url: http://octave.sf.net
--- a/main/time/datesplit.m	Sun Aug 20 14:23:56 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,480 +0,0 @@
-## Copyright (C) 2001 Bill Denney <bill@givebillmoney.com>
-##
-## This program is free software; you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation; either version 2 of the License, or
-## (at your option) any later version.
-##
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-## GNU General Public License for more details.
-##
-## You should have received a copy of the GNU General Public License
-## along with this program; if not, write to the Free Software
-## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-## -*- texinfo -*-
-## @deftypefn {Function File} {Y =} datesplit(date, P)
-## @deftypefnx {Function File} {[Y,M,D,h,m,s] =} datesplit(date, P)
-## Split a date string into the Year, Month, Day, hour, minute, and
-## second.  This routine tries to be as forgiving as possible to the
-## date input while requiring that the date is not ambiguous.
-##
-## Anywhere possible where it would not be ambiguous, efforts were made
-## to make times possible with seconds and AM/PM as optional.  Also,
-## along the same lines, where possible, commas were allowed with
-## spaces, and the year/month/day separators were allowed as period (.),
-## slash (/), and dash (-).  Not all format possibilities are shown in
-## the following table, but a date like @code{dd-mmm-yyyy HH:MM:SS} is
-## parsed just as well as @code{d/mmm.yyyy,  ,H:MM, AM}.
-##
-## Supported @code{date} formats include (the same as datestr):
-## @multitable @columnfractions 0.1 0.45 0.45
-## @item @strong{Code} @tab @strong{Format} @tab @strong{Example}
-## @item  0  @tab dd-mmm-yyyy HH:MM:SS    @tab 07-Sep-2000 15:38:09
-## @item  1  @tab dd-mmm-yyyy             @tab 07-Sep-2000 
-## @item  2  @tab mm/dd/yy                @tab 09/07/00 
-## @item  3  @tab mmm                     @tab Sep 
-## @item  6  @tab mm/dd                   @tab 09/13 
-## @item 10  @tab yyyy                    @tab 2000 
-## @item 12  @tab mmmyy                   @tab Sep00 
-## @item 13  @tab HH:MM:SS                @tab 15:38:09 
-## @item 14  @tab HH:MM:SS PM             @tab 03:38:09 PM
-## @item 15  @tab HH:MM                   @tab 15:38 
-## @item 16  @tab HH:MM PM                @tab 03:38 PM 
-## @item 17  @tab QQ-YY                   @tab Q3-00
-## @item 19  @tab dd/mm                   @tab 13/03
-## @item 20  @tab dd/mm/yy                @tab 13/03/95
-## @item 21  @tab mmm.dd.yyyy HH:MM:SS    @tab Mar.03.1962 13:53:06
-## @item 22  @tab mmm.dd.yyyy             @tab Mar.03.1962
-## @item 23  @tab mm/dd/yyyy              @tab 03/13/1962
-## @item 24  @tab dd/mm/yyyy              @tab 12/03/1962
-## @item 25  @tab yy/mm/dd                @tab 95/03/13
-## @item 26  @tab yyyy/mm/dd              @tab 1995/03/13
-## @item 27  @tab QQ-YYYY                 @tab Q4-2132
-## @item 28  @tab mmmyyyy                 @tab Mar2047
-## @item 29  @tab yyyymmdd                @tab 20470313
-## @item 30  @tab yyyymmddTHHMMSS         @tab 20470313T132603
-## @item 31  @tab yyyy-mm-dd HH:MM:SS     @tab 1047-03-13 13:26:03
-## @end multitable
-##
-## The parameter @code{P} is needed to convert date strings with 2 digit
-## years into dates with 4 digit years.  2 digit years are assumed to be
-## between @code{P} and @code{P+99}. If @code{P} is not given then the 
-## current year - 50 is used, so that dates are centered on the present.
-## For birthdates, you would want @code{P} to be current year - 99.  For
-## appointments, you would want @code{P} to be current year.
-##
-## This function makes no strong attempt to verify the accuracy of the
-## numbers that it returns in that it doesn't (currently) check to see
-## that you're not trying to use the date Feb 30.  When applicable, it
-## tries to make your input work, though.  It will try to determine if
-## you're using the date "03/13/95" that the date is "March 13, 1995",
-## but if there is doubt, datesplit will return an error instead of
-## trying to guess the wrong value.
-##
-## @seealso{date,clock,now,datestr,datenum,calendar,weekday} 
-## @end deftypefn
-
-## TODO:
-##  * Some formats are ambiguous.  Allow the user to specify the format
-##    to remove ambiguity.
-##  * Validate the dates.
-##  * Possible bug (after dates are validated): There are times where
-##    the year is assumed, Feb 29 may be a valid date, but with the
-##    assumed year, it may become invalid.
-##  * Internationalize.  Not all months use the English system.
-##  * Vectorize.  That requires vectorization of regexp though...
-
-## Author: Bill Denney <bill@givebillmoney.com>
-
-function [y, m, d, h, mi, s] = datesplit(ds, P)
-
-  if nargin < 2
-    P = [];
-  endif
-
-  today = datevec(now);
-
-  if (isempty(P))
-    P = today(1)-50;
-  endif
-
-  global __month_names = ["Jan";"Feb";"Mar";"Apr";"May";"Jun";...
-			  "Jul";"Aug";"Sep";"Oct";"Nov";"Dec"];
-  global __day_names   = ["Sun";"Mon";"Tue";"Wed";"Thu";"Fri";"Sat"];
-  global __time_names  = ["AM";"PM"];
-
-  if (iscellstr(ds))
-    ds = ds{1};
-  endif
-  ds = tolower(deblank(ds));
-
-  if (nargin < 1)
-    error("datesplit: no input arguments");
-  elseif (nargin == 1)
-    fmt = [];
-  endif
-  %% we have to determine the format, this could be error prone
-
-  ## format  0  dd-mmm-yyyy HH:MM:SS    e.g. 07-Sep-2000 15:38:09
-  [match, d, m, y, h, mi, s, ap] = \
-      of_regexp("^(3[01]|[0-2]?[0-9])[-./]([a-z]{3})[-./]([0-9]{4})[, ]+(2[0-3]|[01]?[0-9]):([0-5][0-9])(:[0-5][0-9]|)[, ]*([ap]m|)$", ds);
-
-  ## format 21  mmm.dd.yyyy HH:MM:SS    e.g. Mar.03.1962 13:53:06
-  if (isempty(match))
-    [match, m, d, y, h, mi, s, ap] = \
-	of_regexp("^([a-z]{3})[-./](3[01]|[0-2]?[0-9])[-./]([0-9]{4})[, ]+(2[0-3]|[01]?[0-9]):([0-5][0-9])(:[0-5][0-9]|)[, ]*([ap]m|)$", ds);
-  endif
-
-  ## format 31  yyyy-mm-dd HH:MM:SS     e.g. 2004-03-13 13:26:03
-  if (isempty(match))
-    [match, y, m, d, h, mi, s, ap] = \
-	of_regexp("^([0-9]{4})[-./](1[012]|0?[0-9])[-./](3[01]|[0-2]?[0-9])[, ]+(2[0-3]|[01]?[0-9]):([0-5][0-9])(:[0-5][0-9]|)[, ]*([ap]m|)$", ds);
-  endif
-
-  ## format 30  yyyymmddTHHMMSS         e.g. 20470313T132603
-  if (isempty(match))
-    [match, y, m, d, h, mi, s] = \
-	of_regexp("^([0-9]{4})(1[012]|0[0-9])(3[01]|[012][0-9])t(2[0-3]|[01][0-9])([0-5][0-9])([0-5][0-9])$", ds);
-    ap = "NA";
-  endif
-
-  ## format 13  HH:MM:SS                e.g. 15:38:09
-  ## format 14  HH:MM:SS PM             e.g. 03:38:09 PM
-  ## format 15  HH:MM                   e.g. 15:38
-  ## format 16  HH:MM PM                e.g. 03:38 PM
-  if (isempty(match))
-    [match, h, mi, s, ap] = \
-	of_regexp("^(2[0-3]|[01]?[0-9]):([0-5][0-9])(:[0-5][0-9]|)[, ]*([ap]m|)$", ds);
-
-    if (! isempty(match))
-      %% assume that it is as of today
-      y = today(1);
-      m = today(2);
-      d = today(3);
-    endif
-  endif
-
-  ## format  1  dd-mmm-yyyy             e.g. 07-Sep-2000
-  if (isempty(match))
-    [match, d, m, y] = \
-	of_regexp("^(3[01]|[012]?[0-9])[-./]([a-z]{3})[-./]([0-9]{4})$", ds);
-
-    if (! isempty(match))
-      %% assume the beginning of the day
-      h = 0;
-      mi = 0;
-      s = 0;
-      ap = "NA";
-    endif
-  endif
-
-  ## format 22  mmm.dd.yyyy             e.g. Mar.03.1962
-  if (isempty(match))
-    [match, m, d, y] = \
-	of_regexp("^([a-z]{3})[-./](3[01]|[012]?[0-9])[-./]([0-9]{4})$", ds);
-
-    if (! isempty(match))
-      %% assume the beginning of the day
-      h = 0;
-      mi = 0;
-      s = 0;
-      ap = "NA";
-    endif
-  endif
-
-  ## format  2  mm/dd/yy                e.g. 09/07/00
-  ## format 23  mm/dd/yyyy              e.g. 03/13/1962
-  ## format 20  dd/mm/yy                e.g. 13/03/95
-  ## format 24  dd/mm/yyyy              e.g. 12/03/1962
-  ## format 25  yy/mm/dd                e.g. 95/03/13
-  ## format 26  yyyy/mm/dd              e.g. 1995/03/13
-  if (isempty(match))
-    [match, d, m, y] = \
-	of_regexp("^([0-9]{1,2}|[0-9]{4})[-./](3[01]|[012]?[0-9])[-./]([0-9]{1,2}|[0-9]{4})$", ds);
-
-    if (! isempty(match))
-      %% we have to determine if the date is unambiguous
-      d = str2num(d);
-      m = str2num(m);
-      y = str2num(y);
-
-      if ((y == 0) || (y > 31))
-	%% we've got the year correct
-	if ((m > 12) && (d < 13))
-	  %% we're operating on mm/dd/yyyy
-	  tmp = m;
-	  m = d;
-	  d = tmp;
-	elseif ((m < 13) && (d > 12))
-	  %% it's fine
-	else
-	  %% it's ambiguous
-	  error(["datesplit: ambiguous date " ds]);
-	endif
-      elseif ((d == 0) || (d > 31))
-	%% the day and the year need to be switched
-	tmp = y;
-	y = d;
-	d = tmp;
-      else
-	%% it's ambiguous
-	error(["datesplit: ambiguous date " ds]);
-      endif
-
-      %% assume the beginning of the day
-      h = 0;
-      mi = 0;
-      s = 0;
-      ap = "NA";
-    endif
-
-  endif
-
-  ## format 29  yyyymmdd                e.g. 20470313
-  if (isempty(match))
-    [match, y, m, d] = \
-	of_regexp("^([0-9]{4})(1[012]|0?[0-9])(3[01]|[012][0-9])$", ds);
-    %% I've never seen a date that has the year first that was not
-    %% yyyy/mm/dd, so I'm going to assume that it's unambiguous.
-
-    if (! isempty(match))
-      %% assume the beginning of the day
-      h = 0;
-      mi = 0;
-      s = 0;
-      ap = "NA";
-    endif
-  endif
-
-  ## format 17  QQ-YY                   e.g. Q3-00
-  ## format 27  QQ-YYYY                 e.g. Q4-2132
-  if (isempty(match))
-    [match, q, y] = \
-	of_regexp("^q([1-4])[-./]([0-9]{2}|[0-9]{4})$", ds);
-    if (! isempty(match))
-      %% Assume that it's the end of the quarter
-      q = str2num(q);
-      m = 3*q;
-      dayopts = [31 30 30 31];
-      d = dayopts(q);
-    
-      %% assume the end of the day
-      h = 23;
-      mi = 59;
-      s = 59;
-      ap = "NA";
-    endif
-  endif
-
-  ## format 28  mmmyyyy                 e.g. Mar2047
-  ## format 12  mmmyy                   e.g. Sep00
-  if (isempty(match))
-    [match, m, y] = \
-	of_regexp("^([a-z]{3})([0-9]{2}|[0-9]{4})$", ds);
-    if (! isempty(match))
-      %% assume the beginning of the month
-      d = 1;
-      h = 0;
-      mi = 0;
-      s = 0;
-      ap = "NA";
-    endif
-  endif
-
-  ## format  6  mm/dd                   e.g. 09/07
-  ## format 19  dd/mm                   e.g. 13/03
-  if (isempty(match))
-    [match, m, d] = \
-	of_regexp("^(3[01]|[012]?[0-9])[-./](3[01]|[012][0-9])$", ds);
-
-    if (! isempty(match))
-      m = str2num(m);
-      d = str2num(d);
-
-      %% we have to determine if the date is unambiguous
-      if ((m > 12) && (d < 13))
-	%% we're operating on mm/dd/yyyy
-	tmp = m;
-	m = d;
-	d = tmp;
-      elseif ((m < 13) && (d > 12))
-	%% it's fine
-      else
-	%% it's ambiguous
-	error(["datesplit: ambiguous date " ds]);
-      endif
-      %% assume this year and the beginning of the day
-      y = today(1);
-      h = 0;
-      mi = 0;
-      s = 0;
-      ap = "NA";
-    endif
-  endif
-
-  ## format 10  yyyy                    e.g. 2000
-  if (isempty(match))
-    [match, y] = of_regexp("^([0-9]{4})$", ds);
-
-    if (! isempty(match))
-      %% assume the beginning of the year
-      m = 1;
-      d = 1;
-      h = 0;
-      mi = 0;
-      s = 0;
-      ap = "NA";
-    endif
-  endif
-
-  ## format  3  mmm                     e.g. Sep
-  if (isempty(match))
-    m = strmatch(ds, tolower(__month_names));
-
-    if (! isempty(m))
-      match = 1;
-      %% assuming the beginning of the month, this year
-      y = today(1);
-      d = 1;
-      h = 0;
-      mi = 0;
-      s = 0;
-      ap = "NA";
-    endif
-  endif
-
-  ## format  8  ddd                     e.g. Thu
-  %% People shouldn't use this function for something like this
-
-  if (isempty(match))
-    %% you mean I did all that work, and you still didn't use a valid
-    %% date?  Darn you!
-    error(["datesplit: Unknown date format " ds]);
-  endif
-
-  if (! isempty(match))
-    if isempty(s)
-      s = 0;
-    elseif (ischar(s) && (1 == findstr(s,":")))
-      s = s(2:3);
-    endif
-    if isempty(ap)
-      ap = "NA";
-    endif
-  endif
-
-  %% start converting the date from characters to numbers
-  if (ischar(y))
-    y = str2num(y);
-    if (isempty(y))
-      error(["datesplit: Invalid year specification " y]);
-    endif
-  endif
-  %% Handle Y2K issues...
-  if (y < 100)
-    y = y + 1900;
-    if (y < P)
-      y = y + 100;
-    endif
-  endif
-
-  if (ischar(m))
-    m_num = str2num(m);
-    if (isempty(m_num))
-      m = strmatch(m, tolower(__month_names));
-    else
-      m = m_num;
-    endif
-    if (isempty(m))
-      error(["datesplit: Invalid month specification"]);
-    endif
-  endif
-
-  if (ischar(d))
-    d = str2num(d);
-    if (isempty(d))
-      error(["datesplit: Invalid day specification " d]);
-    endif
-  endif
-
-  if (ischar(h))
-    h = str2num(h);
-    if (isempty(h))
-      error(["datesplit: Invalid hour specification " h]);
-    elseif ((ap(2) == "M") && (h > 12))
-      error(["datesplit: Invalid hour specification, AM or PM specified but"
-	     "hour is greater than 12."]);
-    endif
-    
-    if (strcmpi(ap, "PM") && (h < 12))
-      h = h + 12;
-    elseif (strcmpi(ap, "AM") && (h == 12))
-      h = 0;
-    endif
-  endif
-
-  if (ischar(mi))
-    mi = str2num(mi);
-    if (isempty(mi) || (mi > 59))
-      error(["datesplit: Invalid minute specification " mi]);
-    endif
-  endif
-
-  if (ischar(s))
-    s = str2num(s);
-    if (isempty(s) || (s > 59))
-      error(["datesplit: Invalid second specification " s]);
-    endif
-  endif
-
-  if (nargout <= 1)
-    y = [y, m, d, h, mi, s];
-  endif
-
-endfunction
-
-# wrapper around Octave's regexp
-# compatible with octave-forge's regexp
-
-function varargout = of_regexp(pattern,string)
-  [S, E, TE, M, T, NM]  = regexp(string,pattern);
-  varargout{1} = S;
-  
-  # return sub-strings if match
-  if (S)
-    for i=2:nargout
-      varargout{i} = T{1}{i-1};  
-    end    
-  else
-    for i=2:nargout
-      varargout{i} = [];
-    end        
-  end
-endfunction
-
-
-%!shared nowvec
-%! nowvec=datevec(now); % Some tests could fail around midnight!
-%!assert (datevec("07-Sep-2000 15:38:09"),[2000,9,7,15,38,9]);
-%!assert (datevec("07-Sep-2000"),[2000,9,7,0,0,0]);
-%!#ambiguous assert (datevec("09/07/00"),[2000,9,7,0,0,0]);
-%!assert (datevec("Sep"),[nowvec(1),9,1,0,0,0]);
-%!#ambiguous assert (datevec("09/13"),[nowvec(1),9,13,0,0,0]);
-%!assert (datevec("2000"),[2000,1,1,0,0,0]);
-%!assert (datevec("Sep00"),[2000,9,1,0,0,0]);
-%!assert (datevec("15:38:09"),[nowvec(1:3),15,38,9]);
-%!assert (datevec("03:38:09 PM"),[nowvec(1:3),15,38,9]);
-%!assert (datevec("15:38"),[nowvec(1:3),15,38,0]);
-%!assert (datevec("3:38 PM"),[nowvec(1:3),15,38,0]);
-%!assert (datevec("Q3-00"),[2000,9,30,23,59,59]);
-%!assert (datevec("Mar.03.1962 13:53:06"),[1962,3,3,13,53,6]);
-%!assert (datevec("03/13/1962"),[1962,3,13,0,0,0]);
-%!assert (datevec("1995/03/13"),[1995,3,13,0,0,0]);
-%!assert (datevec("Q4-2132"),[2132,12,31,23,59,59]);
-%!assert (datevec("Mar2047"),[2047,3,1,0,0,0]);
-%!assert (datevec("20470313"),[2047,3,13,0,0,0]);
-%!assert (datevec("20470313T132603"),[2047,3,13,13,26,3]);
-%!assert (datevec("1047-03-13 13:26:03"),[1047,3,13,13,26,3]);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/time/inst/datesplit.m	Sun Aug 20 14:26:40 2006 +0000
@@ -0,0 +1,480 @@
+## Copyright (C) 2001 Bill Denney <bill@givebillmoney.com>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {Y =} datesplit(date, P)
+## @deftypefnx {Function File} {[Y,M,D,h,m,s] =} datesplit(date, P)
+## Split a date string into the Year, Month, Day, hour, minute, and
+## second.  This routine tries to be as forgiving as possible to the
+## date input while requiring that the date is not ambiguous.
+##
+## Anywhere possible where it would not be ambiguous, efforts were made
+## to make times possible with seconds and AM/PM as optional.  Also,
+## along the same lines, where possible, commas were allowed with
+## spaces, and the year/month/day separators were allowed as period (.),
+## slash (/), and dash (-).  Not all format possibilities are shown in
+## the following table, but a date like @code{dd-mmm-yyyy HH:MM:SS} is
+## parsed just as well as @code{d/mmm.yyyy,  ,H:MM, AM}.
+##
+## Supported @code{date} formats include (the same as datestr):
+## @multitable @columnfractions 0.1 0.45 0.45
+## @item @strong{Code} @tab @strong{Format} @tab @strong{Example}
+## @item  0  @tab dd-mmm-yyyy HH:MM:SS    @tab 07-Sep-2000 15:38:09
+## @item  1  @tab dd-mmm-yyyy             @tab 07-Sep-2000 
+## @item  2  @tab mm/dd/yy                @tab 09/07/00 
+## @item  3  @tab mmm                     @tab Sep 
+## @item  6  @tab mm/dd                   @tab 09/13 
+## @item 10  @tab yyyy                    @tab 2000 
+## @item 12  @tab mmmyy                   @tab Sep00 
+## @item 13  @tab HH:MM:SS                @tab 15:38:09 
+## @item 14  @tab HH:MM:SS PM             @tab 03:38:09 PM
+## @item 15  @tab HH:MM                   @tab 15:38 
+## @item 16  @tab HH:MM PM                @tab 03:38 PM 
+## @item 17  @tab QQ-YY                   @tab Q3-00
+## @item 19  @tab dd/mm                   @tab 13/03
+## @item 20  @tab dd/mm/yy                @tab 13/03/95
+## @item 21  @tab mmm.dd.yyyy HH:MM:SS    @tab Mar.03.1962 13:53:06
+## @item 22  @tab mmm.dd.yyyy             @tab Mar.03.1962
+## @item 23  @tab mm/dd/yyyy              @tab 03/13/1962
+## @item 24  @tab dd/mm/yyyy              @tab 12/03/1962
+## @item 25  @tab yy/mm/dd                @tab 95/03/13
+## @item 26  @tab yyyy/mm/dd              @tab 1995/03/13
+## @item 27  @tab QQ-YYYY                 @tab Q4-2132
+## @item 28  @tab mmmyyyy                 @tab Mar2047
+## @item 29  @tab yyyymmdd                @tab 20470313
+## @item 30  @tab yyyymmddTHHMMSS         @tab 20470313T132603
+## @item 31  @tab yyyy-mm-dd HH:MM:SS     @tab 1047-03-13 13:26:03
+## @end multitable
+##
+## The parameter @code{P} is needed to convert date strings with 2 digit
+## years into dates with 4 digit years.  2 digit years are assumed to be
+## between @code{P} and @code{P+99}. If @code{P} is not given then the 
+## current year - 50 is used, so that dates are centered on the present.
+## For birthdates, you would want @code{P} to be current year - 99.  For
+## appointments, you would want @code{P} to be current year.
+##
+## This function makes no strong attempt to verify the accuracy of the
+## numbers that it returns in that it doesn't (currently) check to see
+## that you're not trying to use the date Feb 30.  When applicable, it
+## tries to make your input work, though.  It will try to determine if
+## you're using the date "03/13/95" that the date is "March 13, 1995",
+## but if there is doubt, datesplit will return an error instead of
+## trying to guess the wrong value.
+##
+## @seealso{date,clock,now,datestr,datenum,calendar,weekday} 
+## @end deftypefn
+
+## TODO:
+##  * Some formats are ambiguous.  Allow the user to specify the format
+##    to remove ambiguity.
+##  * Validate the dates.
+##  * Possible bug (after dates are validated): There are times where
+##    the year is assumed, Feb 29 may be a valid date, but with the
+##    assumed year, it may become invalid.
+##  * Internationalize.  Not all months use the English system.
+##  * Vectorize.  That requires vectorization of regexp though...
+
+## Author: Bill Denney <bill@givebillmoney.com>
+
+function [y, m, d, h, mi, s] = datesplit(ds, P)
+
+  if nargin < 2
+    P = [];
+  endif
+
+  today = datevec(now);
+
+  if (isempty(P))
+    P = today(1)-50;
+  endif
+
+  global __month_names = ["Jan";"Feb";"Mar";"Apr";"May";"Jun";...
+			  "Jul";"Aug";"Sep";"Oct";"Nov";"Dec"];
+  global __day_names   = ["Sun";"Mon";"Tue";"Wed";"Thu";"Fri";"Sat"];
+  global __time_names  = ["AM";"PM"];
+
+  if (iscellstr(ds))
+    ds = ds{1};
+  endif
+  ds = tolower(deblank(ds));
+
+  if (nargin < 1)
+    error("datesplit: no input arguments");
+  elseif (nargin == 1)
+    fmt = [];
+  endif
+  %% we have to determine the format, this could be error prone
+
+  ## format  0  dd-mmm-yyyy HH:MM:SS    e.g. 07-Sep-2000 15:38:09
+  [match, d, m, y, h, mi, s, ap] = \
+      of_regexp("^(3[01]|[0-2]?[0-9])[-./]([a-z]{3})[-./]([0-9]{4})[, ]+(2[0-3]|[01]?[0-9]):([0-5][0-9])(:[0-5][0-9]|)[, ]*([ap]m|)$", ds);
+
+  ## format 21  mmm.dd.yyyy HH:MM:SS    e.g. Mar.03.1962 13:53:06
+  if (isempty(match))
+    [match, m, d, y, h, mi, s, ap] = \
+	of_regexp("^([a-z]{3})[-./](3[01]|[0-2]?[0-9])[-./]([0-9]{4})[, ]+(2[0-3]|[01]?[0-9]):([0-5][0-9])(:[0-5][0-9]|)[, ]*([ap]m|)$", ds);
+  endif
+
+  ## format 31  yyyy-mm-dd HH:MM:SS     e.g. 2004-03-13 13:26:03
+  if (isempty(match))
+    [match, y, m, d, h, mi, s, ap] = \
+	of_regexp("^([0-9]{4})[-./](1[012]|0?[0-9])[-./](3[01]|[0-2]?[0-9])[, ]+(2[0-3]|[01]?[0-9]):([0-5][0-9])(:[0-5][0-9]|)[, ]*([ap]m|)$", ds);
+  endif
+
+  ## format 30  yyyymmddTHHMMSS         e.g. 20470313T132603
+  if (isempty(match))
+    [match, y, m, d, h, mi, s] = \
+	of_regexp("^([0-9]{4})(1[012]|0[0-9])(3[01]|[012][0-9])t(2[0-3]|[01][0-9])([0-5][0-9])([0-5][0-9])$", ds);
+    ap = "NA";
+  endif
+
+  ## format 13  HH:MM:SS                e.g. 15:38:09
+  ## format 14  HH:MM:SS PM             e.g. 03:38:09 PM
+  ## format 15  HH:MM                   e.g. 15:38
+  ## format 16  HH:MM PM                e.g. 03:38 PM
+  if (isempty(match))
+    [match, h, mi, s, ap] = \
+	of_regexp("^(2[0-3]|[01]?[0-9]):([0-5][0-9])(:[0-5][0-9]|)[, ]*([ap]m|)$", ds);
+
+    if (! isempty(match))
+      %% assume that it is as of today
+      y = today(1);
+      m = today(2);
+      d = today(3);
+    endif
+  endif
+
+  ## format  1  dd-mmm-yyyy             e.g. 07-Sep-2000
+  if (isempty(match))
+    [match, d, m, y] = \
+	of_regexp("^(3[01]|[012]?[0-9])[-./]([a-z]{3})[-./]([0-9]{4})$", ds);
+
+    if (! isempty(match))
+      %% assume the beginning of the day
+      h = 0;
+      mi = 0;
+      s = 0;
+      ap = "NA";
+    endif
+  endif
+
+  ## format 22  mmm.dd.yyyy             e.g. Mar.03.1962
+  if (isempty(match))
+    [match, m, d, y] = \
+	of_regexp("^([a-z]{3})[-./](3[01]|[012]?[0-9])[-./]([0-9]{4})$", ds);
+
+    if (! isempty(match))
+      %% assume the beginning of the day
+      h = 0;
+      mi = 0;
+      s = 0;
+      ap = "NA";
+    endif
+  endif
+
+  ## format  2  mm/dd/yy                e.g. 09/07/00
+  ## format 23  mm/dd/yyyy              e.g. 03/13/1962
+  ## format 20  dd/mm/yy                e.g. 13/03/95
+  ## format 24  dd/mm/yyyy              e.g. 12/03/1962
+  ## format 25  yy/mm/dd                e.g. 95/03/13
+  ## format 26  yyyy/mm/dd              e.g. 1995/03/13
+  if (isempty(match))
+    [match, d, m, y] = \
+	of_regexp("^([0-9]{1,2}|[0-9]{4})[-./](3[01]|[012]?[0-9])[-./]([0-9]{1,2}|[0-9]{4})$", ds);
+
+    if (! isempty(match))
+      %% we have to determine if the date is unambiguous
+      d = str2num(d);
+      m = str2num(m);
+      y = str2num(y);
+
+      if ((y == 0) || (y > 31))
+	%% we've got the year correct
+	if ((m > 12) && (d < 13))
+	  %% we're operating on mm/dd/yyyy
+	  tmp = m;
+	  m = d;
+	  d = tmp;
+	elseif ((m < 13) && (d > 12))
+	  %% it's fine
+	else
+	  %% it's ambiguous
+	  error(["datesplit: ambiguous date " ds]);
+	endif
+      elseif ((d == 0) || (d > 31))
+	%% the day and the year need to be switched
+	tmp = y;
+	y = d;
+	d = tmp;
+      else
+	%% it's ambiguous
+	error(["datesplit: ambiguous date " ds]);
+      endif
+
+      %% assume the beginning of the day
+      h = 0;
+      mi = 0;
+      s = 0;
+      ap = "NA";
+    endif
+
+  endif
+
+  ## format 29  yyyymmdd                e.g. 20470313
+  if (isempty(match))
+    [match, y, m, d] = \
+	of_regexp("^([0-9]{4})(1[012]|0?[0-9])(3[01]|[012][0-9])$", ds);
+    %% I've never seen a date that has the year first that was not
+    %% yyyy/mm/dd, so I'm going to assume that it's unambiguous.
+
+    if (! isempty(match))
+      %% assume the beginning of the day
+      h = 0;
+      mi = 0;
+      s = 0;
+      ap = "NA";
+    endif
+  endif
+
+  ## format 17  QQ-YY                   e.g. Q3-00
+  ## format 27  QQ-YYYY                 e.g. Q4-2132
+  if (isempty(match))
+    [match, q, y] = \
+	of_regexp("^q([1-4])[-./]([0-9]{2}|[0-9]{4})$", ds);
+    if (! isempty(match))
+      %% Assume that it's the end of the quarter
+      q = str2num(q);
+      m = 3*q;
+      dayopts = [31 30 30 31];
+      d = dayopts(q);
+    
+      %% assume the end of the day
+      h = 23;
+      mi = 59;
+      s = 59;
+      ap = "NA";
+    endif
+  endif
+
+  ## format 28  mmmyyyy                 e.g. Mar2047
+  ## format 12  mmmyy                   e.g. Sep00
+  if (isempty(match))
+    [match, m, y] = \
+	of_regexp("^([a-z]{3})([0-9]{2}|[0-9]{4})$", ds);
+    if (! isempty(match))
+      %% assume the beginning of the month
+      d = 1;
+      h = 0;
+      mi = 0;
+      s = 0;
+      ap = "NA";
+    endif
+  endif
+
+  ## format  6  mm/dd                   e.g. 09/07
+  ## format 19  dd/mm                   e.g. 13/03
+  if (isempty(match))
+    [match, m, d] = \
+	of_regexp("^(3[01]|[012]?[0-9])[-./](3[01]|[012][0-9])$", ds);
+
+    if (! isempty(match))
+      m = str2num(m);
+      d = str2num(d);
+
+      %% we have to determine if the date is unambiguous
+      if ((m > 12) && (d < 13))
+	%% we're operating on mm/dd/yyyy
+	tmp = m;
+	m = d;
+	d = tmp;
+      elseif ((m < 13) && (d > 12))
+	%% it's fine
+      else
+	%% it's ambiguous
+	error(["datesplit: ambiguous date " ds]);
+      endif
+      %% assume this year and the beginning of the day
+      y = today(1);
+      h = 0;
+      mi = 0;
+      s = 0;
+      ap = "NA";
+    endif
+  endif
+
+  ## format 10  yyyy                    e.g. 2000
+  if (isempty(match))
+    [match, y] = of_regexp("^([0-9]{4})$", ds);
+
+    if (! isempty(match))
+      %% assume the beginning of the year
+      m = 1;
+      d = 1;
+      h = 0;
+      mi = 0;
+      s = 0;
+      ap = "NA";
+    endif
+  endif
+
+  ## format  3  mmm                     e.g. Sep
+  if (isempty(match))
+    m = strmatch(ds, tolower(__month_names));
+
+    if (! isempty(m))
+      match = 1;
+      %% assuming the beginning of the month, this year
+      y = today(1);
+      d = 1;
+      h = 0;
+      mi = 0;
+      s = 0;
+      ap = "NA";
+    endif
+  endif
+
+  ## format  8  ddd                     e.g. Thu
+  %% People shouldn't use this function for something like this
+
+  if (isempty(match))
+    %% you mean I did all that work, and you still didn't use a valid
+    %% date?  Darn you!
+    error(["datesplit: Unknown date format " ds]);
+  endif
+
+  if (! isempty(match))
+    if isempty(s)
+      s = 0;
+    elseif (ischar(s) && (1 == findstr(s,":")))
+      s = s(2:3);
+    endif
+    if isempty(ap)
+      ap = "NA";
+    endif
+  endif
+
+  %% start converting the date from characters to numbers
+  if (ischar(y))
+    y = str2num(y);
+    if (isempty(y))
+      error(["datesplit: Invalid year specification " y]);
+    endif
+  endif
+  %% Handle Y2K issues...
+  if (y < 100)
+    y = y + 1900;
+    if (y < P)
+      y = y + 100;
+    endif
+  endif
+
+  if (ischar(m))
+    m_num = str2num(m);
+    if (isempty(m_num))
+      m = strmatch(m, tolower(__month_names));
+    else
+      m = m_num;
+    endif
+    if (isempty(m))
+      error(["datesplit: Invalid month specification"]);
+    endif
+  endif
+
+  if (ischar(d))
+    d = str2num(d);
+    if (isempty(d))
+      error(["datesplit: Invalid day specification " d]);
+    endif
+  endif
+
+  if (ischar(h))
+    h = str2num(h);
+    if (isempty(h))
+      error(["datesplit: Invalid hour specification " h]);
+    elseif ((ap(2) == "M") && (h > 12))
+      error(["datesplit: Invalid hour specification, AM or PM specified but"
+	     "hour is greater than 12."]);
+    endif
+    
+    if (strcmpi(ap, "PM") && (h < 12))
+      h = h + 12;
+    elseif (strcmpi(ap, "AM") && (h == 12))
+      h = 0;
+    endif
+  endif
+
+  if (ischar(mi))
+    mi = str2num(mi);
+    if (isempty(mi) || (mi > 59))
+      error(["datesplit: Invalid minute specification " mi]);
+    endif
+  endif
+
+  if (ischar(s))
+    s = str2num(s);
+    if (isempty(s) || (s > 59))
+      error(["datesplit: Invalid second specification " s]);
+    endif
+  endif
+
+  if (nargout <= 1)
+    y = [y, m, d, h, mi, s];
+  endif
+
+endfunction
+
+# wrapper around Octave's regexp
+# compatible with octave-forge's regexp
+
+function varargout = of_regexp(pattern,string)
+  [S, E, TE, M, T, NM]  = regexp(string,pattern);
+  varargout{1} = S;
+  
+  # return sub-strings if match
+  if (S)
+    for i=2:nargout
+      varargout{i} = T{1}{i-1};  
+    end    
+  else
+    for i=2:nargout
+      varargout{i} = [];
+    end        
+  end
+endfunction
+
+
+%!shared nowvec
+%! nowvec=datevec(now); % Some tests could fail around midnight!
+%!assert (datevec("07-Sep-2000 15:38:09"),[2000,9,7,15,38,9]);
+%!assert (datevec("07-Sep-2000"),[2000,9,7,0,0,0]);
+%!#ambiguous assert (datevec("09/07/00"),[2000,9,7,0,0,0]);
+%!assert (datevec("Sep"),[nowvec(1),9,1,0,0,0]);
+%!#ambiguous assert (datevec("09/13"),[nowvec(1),9,13,0,0,0]);
+%!assert (datevec("2000"),[2000,1,1,0,0,0]);
+%!assert (datevec("Sep00"),[2000,9,1,0,0,0]);
+%!assert (datevec("15:38:09"),[nowvec(1:3),15,38,9]);
+%!assert (datevec("03:38:09 PM"),[nowvec(1:3),15,38,9]);
+%!assert (datevec("15:38"),[nowvec(1:3),15,38,0]);
+%!assert (datevec("3:38 PM"),[nowvec(1:3),15,38,0]);
+%!assert (datevec("Q3-00"),[2000,9,30,23,59,59]);
+%!assert (datevec("Mar.03.1962 13:53:06"),[1962,3,3,13,53,6]);
+%!assert (datevec("03/13/1962"),[1962,3,13,0,0,0]);
+%!assert (datevec("1995/03/13"),[1995,3,13,0,0,0]);
+%!assert (datevec("Q4-2132"),[2132,12,31,23,59,59]);
+%!assert (datevec("Mar2047"),[2047,3,1,0,0,0]);
+%!assert (datevec("20470313"),[2047,3,13,0,0,0]);
+%!assert (datevec("20470313T132603"),[2047,3,13,13,26,3]);
+%!assert (datevec("1047-03-13 13:26:03"),[1047,3,13,13,26,3]);