Parse a time with fractional seconds
authorArjen Baart <arjen@andromeda.nl>
Sat, 12 Sep 2020 08:03:09 +0000 (10:03 +0200)
committerArjen Baart <arjen@andromeda.nl>
Sat, 12 Sep 2020 08:03:09 +0000 (10:03 +0200)
12 files changed:
.gitignore
src/Makefile.am
src/date.h
src/datelex.c
src/dateyacc.c
src/dateyacc.h
src/dateyacc.y
src/utc.cpp
test/date_parse.cpp
test/date_parse.exp
test/utc_parse.cpp
test/utc_parse.exp

index 30b3419..e7fcd03 100644 (file)
@@ -1,3 +1,7 @@
+*.o
+*.lo
+*.log
+*.trs
 Makefile.in
 aclocal.m4
 autom4te.cache
index 47afd24..2062854 100644 (file)
@@ -10,3 +10,8 @@ libACL_la_SOURCES = string.cpp regex.cpp superstring.cpp date.cpp parsedate.c da
 libACL_la_LDFLAGS = -release 0.3.3
 
 include_HEADERS = String.h date.h Integer.h xml.h configuration.h
+
+dateyacc.h : dateyacc.y
+       bison -d dateyacc.y
+       mv dateyacc.tab.h dateyacc.h
+       rm -f dateyacc.tab.c
index aa1b1c4..11f58bf 100644 (file)
@@ -4,8 +4,8 @@
 ** MODULE INFORMATION *
 ***********************
 **      FILE NAME      : date.h
-**      SYSTEM NAME    : AXE - Andromeda X-windows Encapsulation
-**      VERSION NUMBER : $Revision: 1.3 $
+**      SYSTEM NAME    : ACL - Andromeda Class Library
+**      VERSION NUMBER : 0.3.4
 **
 **  DESCRIPTION      :  
 **
 ********************************
 **      ORIGINAL AUTHOR : Arjen Baart - arjen@andromeda.nl
 **      CREATION DATE   : Feb 06, 1998
-**      LAST UPDATE     : Oct 16, 1999
+**      LAST UPDATE     : Aug 08, 2020
 **      MODIFICATIONS   : 
 **************************************************************************/
 
-/*****************************
-   $Log: date.h,v $
-   Revision 1.3  2002-09-28 06:58:45  arjen
-   Bugfix: conversion of an empty string to a date or hour object
-   now makes the values of such an object 0 (null) instead of giving
-   a segmentation fault.
-   The class UTC combines the date and hour classes. The most basic
-   functions of the UTC class are now implemented.
-   These include constructors and conversion to and from String objects.
-   New functions: date::proper(), hour::proper() and UTC::proper().
-   Return true if the object holds a proper clock time and/or calendar
-   date; false if at least one value is out of range.
 
-   Revision 1.2  2002/09/02 06:18:20  arjen
-   Fixed some date and time conversion functions
-
-   Revision 1.1  2002/07/25 08:01:26  arjen
-   First checkin, AXE release 0.2
-
-*****************************/
-
-/* static const char *RCSID = "$Id: date.h,v 1.3 2002-09-28 06:58:45 arjen Exp $"; */
-
-#ifndef AXE_DATE_H
-#define AXE_DATE_H
+#ifndef ACL_DATE_H
+#define ACL_DATE_H
 
 #include "String.h"
 
@@ -467,10 +445,10 @@ public:
       }
    }
 
-   friend UTC operator+(UTC &, UTC &);
+   friend UTC operator+(UTC , UTC );
    UTC operator += (UTC h);
 
-   friend long operator-(UTC &, UTC &);
+   friend long operator-(UTC , UTC );
 
    friend std::ostream& operator<<(std::ostream &, const UTC &);
    friend std::istream& operator>>(std::istream &, UTC &);
@@ -480,4 +458,4 @@ public:
 
 UTC Now(bool localtime = true);
 
-#endif /* AXE_DATE_H */
+#endif /* ACL_DATE_H */
index 7cff26a..a01b193 100644 (file)
@@ -300,6 +300,7 @@ yylex ()
                     if ((((num % 10000) / 100) <= 12)  /* ajs */
                      &&  ((num % 100) <= 31))          /* ajs */
                         return NUM991231;              /* ajs */
+                    /*otherwise*/   return NUM999999;
                     goto error;
            case 8:  if ((((num % 10000) / 100) <= 12)  /* ajs */
                      &&  ((num % 100) <= 31))          /* ajs */
index 40fe98d..a7f10da 100644 (file)
@@ -120,10 +120,11 @@ extern int yydebug;
     NUM235959 = 266,
     NUM991231 = 267,
     NUM99991231 = 268,
-    AMPM = 269,
-    STD_ZONE = 270,
-    DST_ZONE = 271,
-    DST_SUFFIX = 272
+    NUM999999 = 269,
+    AMPM = 270,
+    STD_ZONE = 271,
+    DST_ZONE = 272,
+    DST_SUFFIX = 273
   };
 #endif
 /* Tokens.  */
@@ -138,10 +139,11 @@ extern int yydebug;
 #define NUM235959 266
 #define NUM991231 267
 #define NUM99991231 268
-#define AMPM 269
-#define STD_ZONE 270
-#define DST_ZONE 271
-#define DST_SUFFIX 272
+#define NUM999999 269
+#define AMPM 270
+#define STD_ZONE 271
+#define DST_ZONE 272
+#define DST_SUFFIX 273
 
 /* Value type.  */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
@@ -152,7 +154,7 @@ union YYSTYPE
 
     int IntVal;
 
-#line 156 "dateyacc.c" /* yacc.c:355  */
+#line 158 "dateyacc.c" /* yacc.c:355  */
 };
 
 typedef union YYSTYPE YYSTYPE;
@@ -169,7 +171,7 @@ int yyparse (void);
 
 /* Copy the second part of user declarations.  */
 
-#line 173 "dateyacc.c" /* yacc.c:358  */
+#line 175 "dateyacc.c" /* yacc.c:358  */
 
 #ifdef short
 # undef short
@@ -411,21 +413,21 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  43
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   366
+#define YYLAST   384
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  23
+#define YYNTOKENS  24
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  20
+#define YYNNTS  21
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  125
+#define YYNRULES  135
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  189
+#define YYNSTATES  200
 
 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
    by yylex, with out-of-bounds checking.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   272
+#define YYMAXUTOK   273
 
 #define YYTRANSLATE(YYX)                                                \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -438,8 +440,8 @@ static const yytype_uint8 yytranslate[] =
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,    22,     2,    19,    18,    20,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,    21,     2,
+       2,     2,     2,    23,     2,    20,    19,    21,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,    22,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -461,26 +463,27 @@ static const yytype_uint8 yytranslate[] =
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17
+      15,    16,    17,    18
 };
 
 #if YYDEBUG
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,    89,    89,    90,    94,    95,    99,   100,   101,   102,
-     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,
-     113,   114,   115,   116,   117,   118,   119,   120,   121,   122,
-     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,
-     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
-     143,   144,   145,   146,   147,   148,   149,   154,   155,   156,
-     157,   158,   165,   167,   172,   173,   174,   176,   180,   181,
-     182,   184,   185,   189,   195,   203,   205,   207,   212,   214,
-     219,   221,   223,   228,   230,   232,   234,   236,   241,   243,
-     248,   249,   250,   251,   255,   260,   264,   269,   274,   279,
-     284,   289,   294,   299,   304,   309,   314,   322,   332,   334,
-     336,   338,   340,   342,   344,   346,   348,   350,   355,   357,
-     359,   361,   363,   365,   367,   372
+       0,    91,    91,    92,    96,    97,   101,   102,   103,   104,
+     105,   106,   107,   108,   109,   113,   114,   115,   116,   117,
+     118,   119,   120,   121,   122,   123,   124,   125,   126,   127,
+     128,   129,   130,   131,   132,   133,   134,   135,   136,   137,
+     138,   139,   140,   141,   142,   143,   144,   145,   146,   147,
+     148,   149,   150,   151,   152,   153,   154,   155,   156,   157,
+     158,   159,   160,   161,   162,   163,   168,   169,   170,   171,
+     172,   179,   181,   186,   187,   188,   190,   194,   195,   196,
+     198,   199,   203,   209,   217,   219,   221,   226,   228,   233,
+     235,   237,   242,   244,   246,   248,   250,   255,   257,   262,
+     263,   264,   265,   269,   274,   278,   283,   288,   293,   298,
+     303,   308,   313,   318,   323,   328,   333,   341,   351,   353,
+     355,   357,   359,   361,   363,   365,   367,   369,   374,   376,
+     378,   380,   382,   384,   386,   391
 };
 #endif
 
@@ -491,11 +494,11 @@ static const char *const yytname[] =
 {
   "$end", "error", "$undefined", "DAY_NAME", "MONTH_NAME", "NUM9",
   "NUM23", "NUM59", "NUM99", "NUM2359", "NUM9999", "NUM235959",
-  "NUM991231", "NUM99991231", "AMPM", "STD_ZONE", "DST_ZONE", "DST_SUFFIX",
-  "'.'", "'-'", "'/'", "':'", "'+'", "$accept", "num59", "num", "goal",
-  "dayname", "date.year", "year.date", "yymmdd", "date", "hyphen.date",
-  "slash.date", "year", "month.name", "time", "hour", "hour.alone",
-  "am.pm", "zone", "zone.offset", "time2359", YY_NULLPTR
+  "NUM991231", "NUM99991231", "NUM999999", "AMPM", "STD_ZONE", "DST_ZONE",
+  "DST_SUFFIX", "'.'", "'-'", "'/'", "':'", "'+'", "$accept", "num59",
+  "num", "anynumber", "goal", "dayname", "date.year", "year.date",
+  "yymmdd", "date", "hyphen.date", "slash.date", "year", "month.name",
+  "time", "hour", "hour.alone", "am.pm", "zone", "zone.offset", "time2359", YY_NULLPTR
 };
 #endif
 
@@ -505,8 +508,8 @@ static const char *const yytname[] =
 static const yytype_uint16 yytoknum[] =
 {
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
-     265,   266,   267,   268,   269,   270,   271,   272,    46,    45,
-      47,    58,    43
+     265,   266,   267,   268,   269,   270,   271,   272,   273,    46,
+      45,    47,    58,    43
 };
 # endif
 
@@ -515,7 +518,7 @@ static const yytype_uint16 yytoknum[] =
 #define yypact_value_is_default(Yystate) \
   (!!((Yystate) == (-88)))
 
-#define YYTABLE_NINF -126
+#define YYTABLE_NINF -136
 
 #define yytable_value_is_error(Yytable_value) \
   0
@@ -524,25 +527,26 @@ static const yytype_uint16 yytoknum[] =
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-     250,   -88,    -3,    19,    14,    25,    62,   -88,    86,   -88,
-     -88,   -88,   -88,   -88,    -1,    17,   279,   133,   133,    23,
-     237,    28,    44,   184,   141,   267,   299,   308,   -88,   -88,
-      53,    53,    53,    53,    53,    53,   -88,   -88,   -88,   359,
-     359,   -88,   -88,   -88,   290,   109,   109,   -88,   339,   230,
-     289,    14,    36,   137,   109,    63,   109,    63,   346,    36,
-     -88,   339,   -88,   325,   258,   258,    36,   359,   359,   359,
-     332,   -88,   179,   355,   179,   179,   -88,    67,   -88,   289,
-      63,    63,   325,    90,   -88,    60,   -88,   211,    39,   206,
-     -88,    70,    57,    80,    78,   -88,   -88,    92,   -88,   -88,
-     -88,   -88,   -88,   258,   359,   -88,   -88,   258,   121,   -88,
-     -88,   -88,   -88,     2,    63,   -88,   109,   258,   -88,   258,
-      63,   -88,   -88,    94,   -88,   102,   103,   -88,   114,   109,
-     359,   359,    63,   -88,   -88,   -88,   -88,   258,   -88,   -88,
-     258,   359,   -88,   176,   187,   -88,   118,   -88,    39,    39,
-     -88,   -88,   -88,    53,    53,    53,    53,   258,   -88,   -88,
-     -88,   -88,   -88,   -88,   -88,   359,   -88,   -88,   -88,   -88,
-     -88,   -88,    53,    53,    53,    53,   -88,   -88,   -88,   -88,
-     -88,   -88,   -88,   -88,   -88,   -88,   -88,   -88,   -88
+     267,   -88,     4,     9,    35,   104,    62,   -88,    78,   -88,
+     -88,   -88,   -88,   -88,    39,    32,   290,    93,    93,    16,
+     319,    21,    27,   183,   243,   280,   210,   239,   -88,   -88,
+      11,    11,    11,    11,    11,    11,   -88,   -88,   -88,   377,
+     377,   -88,   -88,   -88,   119,   357,   357,   -88,   350,   232,
+     300,    35,   106,   125,   357,    44,   357,    44,   364,   106,
+     -88,   350,   -88,   328,   151,   151,   106,   377,   377,   377,
+     335,   -88,   260,   373,   260,   260,   -88,    61,   -88,   300,
+      44,    44,   328,    -1,   -88,    18,   -88,   212,   105,   331,
+     -88,    47,    48,    58,    64,   -88,   -88,    68,   -88,   -88,
+     -88,   -88,   -88,   151,   377,   -88,   -88,   151,   240,   -88,
+     -88,   -88,   -88,    15,    44,   -88,   357,   151,   -88,   151,
+      44,   -88,   -88,    88,   -88,    89,    97,   -88,   100,   357,
+     377,   377,    44,   -88,   -88,   -88,   -88,   151,   -88,   -88,
+     151,   377,   -88,   174,   178,   -88,   102,   -88,   105,   105,
+     -88,   -88,   -88,    11,    11,    11,    11,   151,   -88,   -88,
+     -88,   -88,   -88,   -88,   -88,   377,   -88,   -88,   -88,   -88,
+     -88,   -88,    11,    11,    11,    11,   -88,   -88,   -88,   -88,
+     -88,   -88,   108,   -88,   -88,   -88,   -88,   -88,   -88,   309,
+     -88,   -88,   -88,   -88,   -88,   -88,   -88,   -88,   -88,   -88
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -550,39 +554,42 @@ static const yytype_int16 yypact[] =
      means the default is an error.  */
 static const yytype_uint8 yydefact[] =
 {
-       0,    61,    62,    88,     4,     2,     3,    85,    86,    87,
-     106,    73,    74,     5,     0,     0,    57,    17,    45,    72,
-       6,     0,     0,     0,     0,    33,     0,    90,    63,    89,
+       0,    70,    71,    97,     4,     2,     3,    94,    95,    96,
+     116,    82,    83,     5,     0,     0,    66,    26,    54,    81,
+      15,     0,     0,     0,     0,    42,     0,    99,    72,    98,
        0,     0,     0,     0,     0,     0,     4,     2,     3,     0,
-       0,    77,    75,     1,    86,    25,    30,    72,    22,     0,
-       0,     0,     0,    94,    18,    20,    46,    48,     0,    84,
-      83,     7,    64,    12,     0,     0,     2,     0,     0,     0,
-       0,    68,     0,     0,     0,     0,    76,     2,    86,     0,
-      37,    42,    34,     0,   107,   108,   112,     0,     0,    91,
-      92,    97,    96,   101,   100,   105,   104,     0,    78,    82,
-      80,    26,    31,    23,     0,    28,    29,    27,     0,    19,
-      21,    47,    49,    94,    59,    58,    10,     8,    84,    13,
-      15,    65,    67,     0,    69,     0,     0,    71,     0,    50,
-       0,     0,    53,    79,    81,    40,    41,    39,    38,    43,
-      35,     0,   109,   118,   121,   124,   110,   113,     0,     0,
-     116,   114,    93,     0,     0,     0,     0,     0,    24,    32,
-      60,    11,     9,    14,    16,     0,    51,    52,    55,    54,
-      36,    44,     0,     0,     0,     0,   111,   117,   115,    99,
-      98,   103,   102,    66,    70,   120,   119,   123,   122
+       0,    86,    84,     1,    95,    34,    39,    81,    31,     0,
+       0,     0,     0,   103,    27,    29,    55,    57,     0,    93,
+      92,    16,    73,    21,     0,     0,     2,     0,     0,     0,
+       0,    77,     0,     0,     0,     0,    85,     2,    95,     0,
+      46,    51,    43,     0,   117,   118,   122,     0,     0,   100,
+     101,   106,   105,   110,   109,   115,   114,     0,    87,    91,
+      89,    35,    40,    32,     0,    37,    38,    36,     0,    28,
+      30,    56,    58,   103,    68,    67,    19,    17,    93,    22,
+      24,    74,    76,     0,    78,     0,     0,    80,     0,    59,
+       0,     0,    62,    88,    90,    49,    50,    48,    47,    52,
+      44,     0,   119,   128,   131,   134,   120,   123,     0,     0,
+     126,   124,   102,     0,     0,     0,     0,     0,    33,    41,
+      69,    20,    18,    23,    25,     0,    60,    61,    64,    63,
+      45,    53,     0,     0,     0,     0,   121,   127,   125,   108,
+     107,   113,   111,    75,    79,   130,   129,   133,   132,     0,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,   112
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-     -88,   -23,     0,   -88,    99,     5,     6,   157,    33,   100,
-      85,    26,    13,   153,   -88,   -88,   -88,    79,   -87,   -88
+     -88,   -23,     0,   -88,   -88,    99,     5,     6,   139,    33,
+      73,    80,    26,    13,   153,   -88,   -88,   -88,    57,   -87,
+     -88
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,    13,    69,    15,    16,    17,    18,    47,    71,    21,
-      22,    62,    72,    25,    26,    27,    89,    90,   150,   115
+      -1,    13,    69,   199,    15,    16,    17,    18,    47,    71,
+      21,    22,    62,    72,    25,    26,    27,    89,    90,   150,
+     115
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -590,84 +597,88 @@ static const yytype_int16 yydefgoto[] =
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-      14,   151,  -125,     3,    36,    37,    38,    91,    92,    93,
-      94,    95,    96,    24,    41,    28,    14,    43,    39,    40,
-      34,    45,    46,    35,    76,    14,    23,    42,   -84,    24,
-      80,    81,    30,    20,   -84,    31,   -84,    29,    24,    97,
-      99,    58,    49,    32,   143,   144,    33,    64,   145,    48,
-      14,    83,    98,   100,    32,   105,   106,    33,    82,    37,
-      38,   177,   178,    24,    65,   -83,     2,   123,   126,    41,
-     -84,   -83,    76,   -83,   133,   134,   108,   142,   154,    14,
-     125,   128,    42,   107,   135,   136,   -56,   116,   153,   120,
-     121,   122,    24,     2,     3,    36,    37,    38,   155,   156,
-     -94,   -94,   -94,   129,    34,   108,   132,    35,   -94,    67,
-      68,   157,   137,   165,    51,    52,    54,    56,    53,    61,
-      10,    74,    70,    40,    79,     3,    36,    37,    38,   158,
-     179,   180,   181,   182,    75,   176,     2,   159,    51,    52,
-      67,    68,    53,   162,    10,   163,    36,    37,    38,   185,
-     186,   187,   188,   127,   110,    34,   112,    19,    35,     0,
-      74,    75,   119,   167,   168,   184,   170,   124,   152,    50,
+      14,   151,     2,     3,    36,    37,    38,    91,    92,    93,
+      94,    95,    96,    24,    41,  -135,    14,    37,    38,    67,
+      68,    45,    46,    28,    76,    14,    23,    42,    29,    24,
+      80,    81,    43,    20,    34,    58,   142,    35,    24,    97,
+      99,    64,    49,     3,    36,    37,    38,     2,    65,    48,
+      14,    83,    98,   100,    30,   105,   106,    31,    82,    39,
+      40,   177,   178,    24,   -93,   -92,   153,   123,   126,    41,
+     154,   -92,    76,   -92,   133,   134,   108,   155,   -65,    14,
+     125,   128,    42,   107,   135,   136,   156,   116,   157,   120,
+     121,   122,    24,  -103,  -103,  -103,     2,    34,    51,    52,
+      35,  -103,    53,   129,    10,   108,   132,   -93,   165,    74,
+     143,   144,   137,   -93,   145,   -93,    54,    56,    40,    61,
+     176,    75,    70,    32,    79,    32,    33,   189,    33,   158,
+     179,   180,   181,   182,  -103,  -103,  -103,   159,    34,    19,
+     124,    35,  -103,   162,    34,   163,   152,    35,   127,   185,
+     186,   187,   188,     0,   110,     0,   112,   118,    60,     7,
+      78,     9,   119,   167,   168,   184,   170,     0,     0,    50,
       55,    57,   131,    63,   171,     0,    73,     0,    98,   138,
-     139,   140,   141,   183,    36,    37,    38,     2,     3,     4,
-      66,    38,     0,    53,   172,    10,     0,   173,   101,   102,
-       0,   103,   104,    67,    68,   174,     0,   109,   175,   111,
-       0,   114,     0,   160,   117,     0,   143,   144,     0,   164,
-     145,    85,    86,   130,     0,    87,   146,   147,    88,     0,
-     148,   169,     0,   149,     3,     4,    66,    38,     0,    53,
-       2,    10,    51,    59,    60,     7,    44,     9,    10,    67,
-      68,     1,     0,     2,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,   118,    60,     7,    78,     9,   161,
-       2,     3,    36,    77,     6,     7,    78,     9,     0,    11,
-      12,     0,   166,     3,     4,     5,     6,     7,    44,     9,
-      10,    11,    12,     3,    36,    77,     6,     7,    78,     9,
-       0,    11,    12,     0,   -94,   -94,   -94,     0,    34,     0,
-       0,    35,   -94,    84,    85,    86,     0,     0,    87,     0,
-       0,    88,   -95,   -95,   -95,     0,     0,   -95,     2,     0,
-     -95,   118,    60,     7,    78,     9,     3,     4,    66,    38,
-       0,    53,     0,    10,    51,    59,    60,     7,    44,     9,
-      10,    51,    52,     0,     0,   113,     0,    10,     2,     3,
-      36,    37,    38,     3,    36,    37,    38
+     139,   140,   141,   183,     0,     0,     2,     3,     4,    66,
+      38,     0,    53,   172,    10,     0,   173,   174,   101,   102,
+     175,   103,   104,    67,    68,     0,     0,   109,     0,   111,
+       0,   114,     0,   160,   117,     0,     0,   143,   144,   164,
+       0,   145,     0,   130,     0,    84,    85,    86,   146,   147,
+      87,   169,   148,    88,     0,   149,     3,     4,    66,    38,
+       0,    53,     0,    10,     3,    36,    37,    38,    36,    37,
+      38,     0,    67,    68,  -104,  -104,  -104,     0,     0,  -104,
+      67,    68,  -104,    74,    75,    36,    37,    38,     1,   161,
+       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,     0,   166,     2,     3,    36,    77,     6,     7,    78,
+       9,     0,    11,    12,     3,     4,     5,     6,     7,    44,
+       9,    10,    11,    12,     3,    36,    77,     6,     7,    78,
+       9,     0,    11,    12,   190,   191,   192,   193,   194,   195,
+     196,   197,     2,   198,    51,    59,    60,     7,    44,     9,
+      10,     2,     0,     0,   118,    60,     7,    78,     9,     3,
+       4,    66,    38,     0,    53,     0,    10,    85,    86,     0,
+       0,    87,     0,     0,    88,    51,    59,    60,     7,    44,
+       9,    10,    51,    52,     0,     0,    53,     0,    10,    51,
+      52,     0,     0,   113,     0,    10,     2,     3,    36,    37,
+      38,     3,    36,    37,    38
 };
 
 static const yytype_int16 yycheck[] =
 {
-       0,    88,     0,     4,     5,     6,     7,    30,    31,    32,
-      33,    34,    35,     0,    14,    18,    16,     0,    19,    20,
-      18,    16,    16,    21,    24,    25,     0,    14,     3,    16,
-      25,    25,    18,     0,     9,    21,    11,    18,    25,    39,
-      40,    18,    16,    18,     5,     6,    21,    19,     9,    16,
-      50,    25,    39,    40,    18,    50,    50,    21,    25,     6,
-       7,   148,   149,    50,    20,     3,     3,    67,    68,    69,
-       3,     9,    72,    11,    74,    75,    50,    17,    21,    79,
-      67,    68,    69,    50,    79,    79,     0,    61,    18,    63,
-      64,    65,    79,     3,     4,     5,     6,     7,    18,    21,
-      14,    15,    16,    70,    18,    79,    73,    21,    22,    19,
-      20,    19,    79,    19,     5,     6,    17,    18,     9,    20,
-      11,    19,    23,    20,    25,     4,     5,     6,     7,   103,
-     153,   154,   155,   156,    20,    17,     3,   104,     5,     6,
-      19,    20,     9,   117,    11,   119,     5,     6,     7,   172,
-     173,   174,   175,    68,    55,    18,    57,     0,    21,    -1,
-      19,    20,    63,   130,   131,   165,   140,    67,    89,    16,
+       0,    88,     3,     4,     5,     6,     7,    30,    31,    32,
+      33,    34,    35,     0,    14,     0,    16,     6,     7,    20,
+      21,    16,    16,    19,    24,    25,     0,    14,    19,    16,
+      25,    25,     0,     0,    19,    19,    18,    22,    25,    39,
+      40,    20,    16,     4,     5,     6,     7,     3,    21,    16,
+      50,    25,    39,    40,    19,    50,    50,    22,    25,    20,
+      21,   148,   149,    50,     3,     3,    19,    67,    68,    69,
+      22,     9,    72,    11,    74,    75,    50,    19,     0,    79,
+      67,    68,    69,    50,    79,    79,    22,    61,    20,    63,
+      64,    65,    79,    15,    16,    17,     3,    19,     5,     6,
+      22,    23,     9,    70,    11,    79,    73,     3,    20,    20,
+       5,     6,    79,     9,     9,    11,    17,    18,    21,    20,
+      18,    21,    23,    19,    25,    19,    22,    19,    22,   103,
+     153,   154,   155,   156,    15,    16,    17,   104,    19,     0,
+      67,    22,    23,   117,    19,   119,    89,    22,    68,   172,
+     173,   174,   175,    -1,    55,    -1,    57,     6,     7,     8,
+       9,    10,    63,   130,   131,   165,   140,    -1,    -1,    16,
       17,    18,    73,    20,   141,    -1,    23,    -1,   165,    80,
-      81,    82,    83,   157,     5,     6,     7,     3,     4,     5,
-       6,     7,    -1,     9,    18,    11,    -1,    21,    45,    46,
-      -1,    48,    49,    19,    20,    18,    -1,    54,    21,    56,
-      -1,    58,    -1,   114,    61,    -1,     5,     6,    -1,   120,
-       9,    15,    16,    70,    -1,    19,    15,    16,    22,    -1,
-      19,   132,    -1,    22,     4,     5,     6,     7,    -1,     9,
-       3,    11,     5,     6,     7,     8,     9,    10,    11,    19,
-      20,     1,    -1,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,     6,     7,     8,     9,    10,   116,
-       3,     4,     5,     6,     7,     8,     9,    10,    -1,    12,
-      13,    -1,   129,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,     4,     5,     6,     7,     8,     9,    10,
-      -1,    12,    13,    -1,    14,    15,    16,    -1,    18,    -1,
-      -1,    21,    22,    14,    15,    16,    -1,    -1,    19,    -1,
-      -1,    22,    14,    15,    16,    -1,    -1,    19,     3,    -1,
-      22,     6,     7,     8,     9,    10,     4,     5,     6,     7,
-      -1,     9,    -1,    11,     5,     6,     7,     8,     9,    10,
-      11,     5,     6,    -1,    -1,     9,    -1,    11,     3,     4,
-       5,     6,     7,     4,     5,     6,     7
+      81,    82,    83,   157,    -1,    -1,     3,     4,     5,     6,
+       7,    -1,     9,    19,    11,    -1,    22,    19,    45,    46,
+      22,    48,    49,    20,    21,    -1,    -1,    54,    -1,    56,
+      -1,    58,    -1,   114,    61,    -1,    -1,     5,     6,   120,
+      -1,     9,    -1,    70,    -1,    15,    16,    17,    16,    17,
+      20,   132,    20,    23,    -1,    23,     4,     5,     6,     7,
+      -1,     9,    -1,    11,     4,     5,     6,     7,     5,     6,
+       7,    -1,    20,    21,    15,    16,    17,    -1,    -1,    20,
+      20,    21,    23,    20,    21,     5,     6,     7,     1,   116,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    -1,   129,     3,     4,     5,     6,     7,     8,     9,
+      10,    -1,    12,    13,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,     4,     5,     6,     7,     8,     9,
+      10,    -1,    12,    13,     5,     6,     7,     8,     9,    10,
+      11,    12,     3,    14,     5,     6,     7,     8,     9,    10,
+      11,     3,    -1,    -1,     6,     7,     8,     9,    10,     4,
+       5,     6,     7,    -1,     9,    -1,    11,    16,    17,    -1,
+      -1,    20,    -1,    -1,    23,     5,     6,     7,     8,     9,
+      10,    11,     5,     6,    -1,    -1,     9,    -1,    11,     5,
+       6,    -1,    -1,     9,    -1,    11,     3,     4,     5,     6,
+       7,     4,     5,     6,     7
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -675,58 +686,61 @@ static const yytype_int16 yycheck[] =
 static const yytype_uint8 yystos[] =
 {
        0,     1,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    18,    18,
-      18,    21,    18,    21,    18,    21,     5,     6,     7,    19,
-      20,    25,    35,     0,     9,    28,    29,    30,    31,    34,
-      36,     5,     6,     9,    27,    36,    27,    36,    18,     6,
-       7,    27,    34,    36,    19,    20,     6,    19,    20,    25,
-      27,    31,    35,    36,    19,    20,    25,     6,     9,    27,
-      28,    29,    31,    34,    14,    15,    16,    19,    22,    39,
-      40,    24,    24,    24,    24,    24,    24,    25,    35,    25,
-      35,    36,    36,    36,    36,    28,    29,    31,    34,    36,
-      27,    36,    27,     9,    36,    42,    34,    36,     6,    27,
-      34,    34,    34,    25,    32,    35,    25,    33,    35,    31,
-      36,    27,    31,    25,    25,    28,    29,    31,    27,    27,
-      27,    27,    17,     5,     6,     9,    15,    16,    19,    22,
-      41,    41,    40,    18,    21,    18,    21,    19,    34,    31,
-      27,    36,    34,    34,    27,    19,    36,    31,    31,    27,
-      34,    31,    18,    21,    18,    21,    17,    41,    41,    24,
-      24,    24,    24,    34,    25,    24,    24,    24,    24
+      11,    12,    13,    25,    26,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    19,    19,
+      19,    22,    19,    22,    19,    22,     5,     6,     7,    20,
+      21,    26,    37,     0,     9,    30,    31,    32,    33,    36,
+      38,     5,     6,     9,    29,    38,    29,    38,    19,     6,
+       7,    29,    36,    38,    20,    21,     6,    20,    21,    26,
+      29,    33,    37,    38,    20,    21,    26,     6,     9,    29,
+      30,    31,    33,    36,    15,    16,    17,    20,    23,    41,
+      42,    25,    25,    25,    25,    25,    25,    26,    37,    26,
+      37,    38,    38,    38,    38,    30,    31,    33,    36,    38,
+      29,    38,    29,     9,    38,    44,    36,    38,     6,    29,
+      36,    36,    36,    26,    34,    37,    26,    35,    37,    33,
+      38,    29,    33,    26,    26,    30,    31,    33,    29,    29,
+      29,    29,    18,     5,     6,     9,    16,    17,    20,    23,
+      43,    43,    42,    19,    22,    19,    22,    20,    36,    33,
+      29,    38,    36,    36,    29,    20,    38,    33,    33,    29,
+      36,    33,    19,    22,    19,    22,    18,    43,    43,    25,
+      25,    25,    25,    36,    26,    25,    25,    25,    25,    19,
+       5,     6,     7,     8,     9,    10,    11,    12,    14,    27
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] =
 {
-       0,    23,    24,    24,    25,    25,    26,    26,    26,    26,
-      26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
-      26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
-      26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
-      26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
-      26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
-      26,    26,    27,    27,    28,    28,    28,    28,    29,    29,
-      29,    29,    29,    30,    30,    31,    31,    31,    32,    32,
-      33,    33,    33,    34,    34,    34,    34,    34,    35,    35,
-      36,    36,    36,    36,    37,    37,    38,    38,    38,    38,
-      38,    38,    38,    38,    38,    38,    38,    39,    40,    40,
-      40,    40,    40,    40,    40,    40,    40,    40,    41,    41,
-      41,    41,    41,    41,    41,    42
+       0,    24,    25,    25,    26,    26,    27,    27,    27,    27,
+      27,    27,    27,    27,    27,    28,    28,    28,    28,    28,
+      28,    28,    28,    28,    28,    28,    28,    28,    28,    28,
+      28,    28,    28,    28,    28,    28,    28,    28,    28,    28,
+      28,    28,    28,    28,    28,    28,    28,    28,    28,    28,
+      28,    28,    28,    28,    28,    28,    28,    28,    28,    28,
+      28,    28,    28,    28,    28,    28,    28,    28,    28,    28,
+      28,    29,    29,    30,    30,    30,    30,    31,    31,    31,
+      31,    31,    32,    32,    33,    33,    33,    34,    34,    35,
+      35,    35,    36,    36,    36,    36,    36,    37,    37,    38,
+      38,    38,    38,    39,    39,    40,    40,    40,    40,    40,
+      40,    40,    40,    40,    40,    40,    40,    41,    42,    42,
+      42,    42,    42,    42,    42,    42,    42,    42,    43,    43,
+      43,    43,    43,    43,    43,    44
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
 static const yytype_uint8 yyr2[] =
 {
-       0,     2,     1,     1,     1,     1,     1,     2,     3,     4,
-       3,     4,     2,     3,     4,     3,     4,     1,     2,     3,
-       2,     3,     2,     3,     4,     2,     3,     3,     3,     3,
-       2,     3,     4,     1,     2,     3,     4,     2,     3,     3,
-       3,     3,     2,     3,     4,     1,     2,     3,     2,     3,
-       3,     4,     4,     3,     4,     4,     1,     1,     3,     3,
-       4,     1,     1,     2,     2,     3,     5,     3,     2,     3,
-       5,     3,     1,     1,     1,     2,     2,     2,     3,     3,
-       3,     3,     3,     1,     1,     1,     1,     1,     1,     2,
-       1,     2,     2,     3,     1,     1,     3,     3,     5,     5,
-       3,     3,     5,     5,     3,     3,     1,     1,     1,     2,
+       0,     2,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     2,     3,     4,     3,
+       4,     2,     3,     4,     3,     4,     1,     2,     3,     2,
+       3,     2,     3,     4,     2,     3,     3,     3,     3,     2,
+       3,     4,     1,     2,     3,     4,     2,     3,     3,     3,
+       3,     2,     3,     4,     1,     2,     3,     2,     3,     3,
+       4,     4,     3,     4,     4,     1,     1,     3,     3,     4,
+       1,     1,     2,     2,     3,     5,     3,     2,     3,     5,
+       3,     1,     1,     1,     2,     2,     2,     3,     3,     3,
+       3,     3,     1,     1,     1,     1,     1,     1,     2,     1,
+       2,     2,     3,     1,     1,     3,     3,     5,     5,     3,
+       3,     5,     7,     5,     3,     3,     1,     1,     1,     2,
        2,     3,     1,     2,     2,     3,     2,     3,     1,     3,
        3,     1,     3,     3,     1,     1
 };
@@ -1404,387 +1418,396 @@ yyreduce:
   YY_REDUCE_PRINT (yyn);
   switch (yyn)
     {
-        case 56:
-#line 150 "dateyacc.y" /* yacc.c:1646  */
+        case 65:
+#line 164 "dateyacc.y" /* yacc.c:1646  */
     { yyans.hour   = (yyvsp[0].IntVal) / 100;
          yyans.minute = (yyvsp[0].IntVal) % 100;
          yyans.second = -1;            /* unspecified */
        }
-#line 1414 "dateyacc.c" /* yacc.c:1646  */
+#line 1428 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 61:
-#line 159 "dateyacc.y" /* yacc.c:1646  */
+  case 70:
+#line 173 "dateyacc.y" /* yacc.c:1646  */
     { extern char *yyinbuf;
          if (yyans.error == NULL) yyans.error = yyinbuf;
        }
-#line 1422 "dateyacc.c" /* yacc.c:1646  */
+#line 1436 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 62:
-#line 166 "dateyacc.y" /* yacc.c:1646  */
+  case 71:
+#line 180 "dateyacc.y" /* yacc.c:1646  */
     { yyans.c_weekday = (yyvsp[0].IntVal); }
-#line 1428 "dateyacc.c" /* yacc.c:1646  */
+#line 1442 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 63:
-#line 168 "dateyacc.y" /* yacc.c:1646  */
+  case 72:
+#line 182 "dateyacc.y" /* yacc.c:1646  */
     { yyans.c_weekday = (yyvsp[-1].IntVal); }
-#line 1434 "dateyacc.c" /* yacc.c:1646  */
+#line 1448 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 66:
-#line 175 "dateyacc.y" /* yacc.c:1646  */
+  case 75:
+#line 189 "dateyacc.y" /* yacc.c:1646  */
     { yyans.day = (yyvsp[-4].IntVal); yyans.month = (yyvsp[-2].IntVal); }
-#line 1440 "dateyacc.c" /* yacc.c:1646  */
+#line 1454 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 70:
-#line 183 "dateyacc.y" /* yacc.c:1646  */
+  case 79:
+#line 197 "dateyacc.y" /* yacc.c:1646  */
     { yyans.day = (yyvsp[0].IntVal); yyans.month = (yyvsp[-2].IntVal); }
-#line 1446 "dateyacc.c" /* yacc.c:1646  */
+#line 1460 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 73:
-#line 190 "dateyacc.y" /* yacc.c:1646  */
+  case 82:
+#line 204 "dateyacc.y" /* yacc.c:1646  */
     { yyans.year  = ((yyvsp[0].IntVal) / 10000) + 1900;        /* ajs */
          yyans.month = ((yyvsp[0].IntVal) % 10000) / 100;      /* ajs */
          yyans.day   = ((yyvsp[0].IntVal) % 100);              /* ajs */
        }
-#line 1455 "dateyacc.c" /* yacc.c:1646  */
+#line 1469 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 74:
-#line 196 "dateyacc.y" /* yacc.c:1646  */
+  case 83:
+#line 210 "dateyacc.y" /* yacc.c:1646  */
     { yyans.year  = ((yyvsp[0].IntVal) / 10000);               /* ajs */
          yyans.month = ((yyvsp[0].IntVal) % 10000) / 100;      /* ajs */
          yyans.day   = ((yyvsp[0].IntVal) % 100);              /* ajs */
        }
-#line 1464 "dateyacc.c" /* yacc.c:1646  */
+#line 1478 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 75:
-#line 204 "dateyacc.y" /* yacc.c:1646  */
+  case 84:
+#line 218 "dateyacc.y" /* yacc.c:1646  */
     { yyans.day = (yyvsp[-1].IntVal); }
-#line 1470 "dateyacc.c" /* yacc.c:1646  */
+#line 1484 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 76:
-#line 206 "dateyacc.y" /* yacc.c:1646  */
+  case 85:
+#line 220 "dateyacc.y" /* yacc.c:1646  */
     { yyans.day = (yyvsp[0].IntVal); }
-#line 1476 "dateyacc.c" /* yacc.c:1646  */
+#line 1490 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 77:
-#line 208 "dateyacc.y" /* yacc.c:1646  */
+  case 86:
+#line 222 "dateyacc.y" /* yacc.c:1646  */
     { yyans.month = (yyvsp[-1].IntVal); yyans.day = (yyvsp[0].IntVal); }
-#line 1482 "dateyacc.c" /* yacc.c:1646  */
+#line 1496 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 78:
-#line 213 "dateyacc.y" /* yacc.c:1646  */
+  case 87:
+#line 227 "dateyacc.y" /* yacc.c:1646  */
     { yyans.day = (yyvsp[-2].IntVal); }
-#line 1488 "dateyacc.c" /* yacc.c:1646  */
+#line 1502 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 79:
-#line 215 "dateyacc.y" /* yacc.c:1646  */
+  case 88:
+#line 229 "dateyacc.y" /* yacc.c:1646  */
     { yyans.day = (yyvsp[0].IntVal); }
-#line 1494 "dateyacc.c" /* yacc.c:1646  */
+#line 1508 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 80:
-#line 220 "dateyacc.y" /* yacc.c:1646  */
+  case 89:
+#line 234 "dateyacc.y" /* yacc.c:1646  */
     { yyans.day = (yyvsp[-2].IntVal); }
-#line 1500 "dateyacc.c" /* yacc.c:1646  */
+#line 1514 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 81:
-#line 222 "dateyacc.y" /* yacc.c:1646  */
+  case 90:
+#line 236 "dateyacc.y" /* yacc.c:1646  */
     { yyans.day = (yyvsp[0].IntVal); }
-#line 1506 "dateyacc.c" /* yacc.c:1646  */
+#line 1520 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 82:
-#line 224 "dateyacc.y" /* yacc.c:1646  */
+  case 91:
+#line 238 "dateyacc.y" /* yacc.c:1646  */
     { yyans.month = (yyvsp[-2].IntVal); yyans.day = (yyvsp[0].IntVal); }
-#line 1512 "dateyacc.c" /* yacc.c:1646  */
+#line 1526 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 83:
-#line 229 "dateyacc.y" /* yacc.c:1646  */
+  case 92:
+#line 243 "dateyacc.y" /* yacc.c:1646  */
     { yyans.year = 2000 + (yyvsp[0].IntVal); }
-#line 1518 "dateyacc.c" /* yacc.c:1646  */
+#line 1532 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 84:
-#line 231 "dateyacc.y" /* yacc.c:1646  */
+  case 93:
+#line 245 "dateyacc.y" /* yacc.c:1646  */
     { yyans.year = 2000 + (yyvsp[0].IntVal); }
-#line 1524 "dateyacc.c" /* yacc.c:1646  */
+#line 1538 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 85:
-#line 233 "dateyacc.y" /* yacc.c:1646  */
+  case 94:
+#line 247 "dateyacc.y" /* yacc.c:1646  */
     { yyans.year = 1900 + (yyvsp[0].IntVal); }
-#line 1530 "dateyacc.c" /* yacc.c:1646  */
+#line 1544 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 86:
-#line 235 "dateyacc.y" /* yacc.c:1646  */
+  case 95:
+#line 249 "dateyacc.y" /* yacc.c:1646  */
     { yyans.year = (yyvsp[0].IntVal); }
-#line 1536 "dateyacc.c" /* yacc.c:1646  */
+#line 1550 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 87:
-#line 237 "dateyacc.y" /* yacc.c:1646  */
+  case 96:
+#line 251 "dateyacc.y" /* yacc.c:1646  */
     { yyans.year = (yyvsp[0].IntVal); }
-#line 1542 "dateyacc.c" /* yacc.c:1646  */
+#line 1556 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 88:
-#line 242 "dateyacc.y" /* yacc.c:1646  */
+  case 97:
+#line 256 "dateyacc.y" /* yacc.c:1646  */
     { yyans.month = (yyvsp[0].IntVal); }
-#line 1548 "dateyacc.c" /* yacc.c:1646  */
+#line 1562 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 89:
-#line 244 "dateyacc.y" /* yacc.c:1646  */
+  case 98:
+#line 258 "dateyacc.y" /* yacc.c:1646  */
     { yyans.month = (yyvsp[-1].IntVal); }
-#line 1554 "dateyacc.c" /* yacc.c:1646  */
+#line 1568 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 94:
-#line 256 "dateyacc.y" /* yacc.c:1646  */
+  case 103:
+#line 270 "dateyacc.y" /* yacc.c:1646  */
     { yyans.hour   = (yyvsp[0].IntVal) / 100;
          yyans.minute = (yyvsp[0].IntVal) % 100;
          yyans.second = -1;            /* unspecified */
        }
-#line 1563 "dateyacc.c" /* yacc.c:1646  */
+#line 1577 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 96:
-#line 265 "dateyacc.y" /* yacc.c:1646  */
+  case 105:
+#line 279 "dateyacc.y" /* yacc.c:1646  */
     { yyans.hour   = (yyvsp[-2].IntVal);
          yyans.minute = (yyvsp[0].IntVal);
          yyans.second = -1;            /* unspecified */
        }
-#line 1572 "dateyacc.c" /* yacc.c:1646  */
+#line 1586 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 97:
-#line 270 "dateyacc.y" /* yacc.c:1646  */
+  case 106:
+#line 284 "dateyacc.y" /* yacc.c:1646  */
     { yyans.hour   = (yyvsp[-2].IntVal);
          yyans.minute = (yyvsp[0].IntVal);
          yyans.second = -1;            /* unspecified */
        }
-#line 1581 "dateyacc.c" /* yacc.c:1646  */
+#line 1595 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 98:
-#line 275 "dateyacc.y" /* yacc.c:1646  */
+  case 107:
+#line 289 "dateyacc.y" /* yacc.c:1646  */
     { yyans.hour   = (yyvsp[-4].IntVal);
          yyans.minute = (yyvsp[-2].IntVal);
          yyans.second = (yyvsp[0].IntVal);
        }
-#line 1590 "dateyacc.c" /* yacc.c:1646  */
+#line 1604 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 99:
-#line 280 "dateyacc.y" /* yacc.c:1646  */
+  case 108:
+#line 294 "dateyacc.y" /* yacc.c:1646  */
     { yyans.hour   = (yyvsp[-4].IntVal);
          yyans.minute = (yyvsp[-2].IntVal);
          yyans.second = (yyvsp[0].IntVal);
        }
-#line 1599 "dateyacc.c" /* yacc.c:1646  */
+#line 1613 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 100:
-#line 285 "dateyacc.y" /* yacc.c:1646  */
+  case 109:
+#line 299 "dateyacc.y" /* yacc.c:1646  */
     { yyans.hour   = (yyvsp[-2].IntVal);
          yyans.minute = (yyvsp[0].IntVal);
          yyans.second = -1;            /* unspecified */
        }
-#line 1608 "dateyacc.c" /* yacc.c:1646  */
+#line 1622 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 101:
-#line 290 "dateyacc.y" /* yacc.c:1646  */
+  case 110:
+#line 304 "dateyacc.y" /* yacc.c:1646  */
     { yyans.hour   = (yyvsp[-2].IntVal);
          yyans.minute = (yyvsp[0].IntVal);
          yyans.second = -1;            /* unspecified */
        }
-#line 1617 "dateyacc.c" /* yacc.c:1646  */
+#line 1631 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 102:
-#line 295 "dateyacc.y" /* yacc.c:1646  */
+  case 111:
+#line 309 "dateyacc.y" /* yacc.c:1646  */
     { yyans.hour   = (yyvsp[-4].IntVal);
          yyans.minute = (yyvsp[-2].IntVal);
          yyans.second = (yyvsp[0].IntVal);
        }
-#line 1626 "dateyacc.c" /* yacc.c:1646  */
+#line 1640 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 103:
-#line 300 "dateyacc.y" /* yacc.c:1646  */
+  case 112:
+#line 314 "dateyacc.y" /* yacc.c:1646  */
+    { yyans.hour   = (yyvsp[-6].IntVal);
+         yyans.minute = (yyvsp[-4].IntVal);
+         yyans.second = (yyvsp[-2].IntVal);
+       }
+#line 1649 "dateyacc.c" /* yacc.c:1646  */
+    break;
+
+  case 113:
+#line 319 "dateyacc.y" /* yacc.c:1646  */
     { yyans.hour   = (yyvsp[-4].IntVal);
          yyans.minute = (yyvsp[-2].IntVal);
          yyans.second = (yyvsp[0].IntVal);
        }
-#line 1635 "dateyacc.c" /* yacc.c:1646  */
+#line 1658 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 104:
-#line 305 "dateyacc.y" /* yacc.c:1646  */
+  case 114:
+#line 324 "dateyacc.y" /* yacc.c:1646  */
     { yyans.hour   = (yyvsp[-2].IntVal) / 100;
          yyans.minute = (yyvsp[-2].IntVal) % 100;
          yyans.second = (yyvsp[0].IntVal);
        }
-#line 1644 "dateyacc.c" /* yacc.c:1646  */
+#line 1667 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 105:
-#line 310 "dateyacc.y" /* yacc.c:1646  */
+  case 115:
+#line 329 "dateyacc.y" /* yacc.c:1646  */
     { yyans.hour   = (yyvsp[-2].IntVal) / 100;
          yyans.minute = (yyvsp[-2].IntVal) % 100;
          yyans.second = (yyvsp[0].IntVal);
        }
-#line 1653 "dateyacc.c" /* yacc.c:1646  */
+#line 1676 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 106:
-#line 315 "dateyacc.y" /* yacc.c:1646  */
+  case 116:
+#line 334 "dateyacc.y" /* yacc.c:1646  */
     { yyans.hour   = (yyvsp[0].IntVal) / 10000;
          yyans.minute = ((yyvsp[0].IntVal) % 10000) / 100;
          yyans.second = (yyvsp[0].IntVal) % 100;
        }
-#line 1662 "dateyacc.c" /* yacc.c:1646  */
+#line 1685 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 107:
-#line 323 "dateyacc.y" /* yacc.c:1646  */
+  case 117:
+#line 342 "dateyacc.y" /* yacc.c:1646  */
     { if (yyans.hour < 1 || yyans.hour > 12)
            yyans.hour = -1;            /* invalid */
          else
          { if (yyans.hour == 12) yyans.hour = 0;
            yyans.hour += (yyvsp[0].IntVal);            /* 0 for AM, 12 for PM */
        } }
-#line 1673 "dateyacc.c" /* yacc.c:1646  */
+#line 1696 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 108:
-#line 333 "dateyacc.y" /* yacc.c:1646  */
+  case 118:
+#line 352 "dateyacc.y" /* yacc.c:1646  */
     { yyans.zone = (yyvsp[0].IntVal); yyans.dst = 0; }
-#line 1679 "dateyacc.c" /* yacc.c:1646  */
+#line 1702 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 109:
-#line 335 "dateyacc.y" /* yacc.c:1646  */
+  case 119:
+#line 354 "dateyacc.y" /* yacc.c:1646  */
     { yyans.zone = (yyvsp[-1].IntVal) + 60; yyans.dst = 1; }
-#line 1685 "dateyacc.c" /* yacc.c:1646  */
+#line 1708 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 110:
-#line 337 "dateyacc.y" /* yacc.c:1646  */
+  case 120:
+#line 356 "dateyacc.y" /* yacc.c:1646  */
     { yyans.zone = (yyvsp[0].IntVal); yyans.dst = 0; }
-#line 1691 "dateyacc.c" /* yacc.c:1646  */
+#line 1714 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 111:
-#line 339 "dateyacc.y" /* yacc.c:1646  */
+  case 121:
+#line 358 "dateyacc.y" /* yacc.c:1646  */
     { yyans.zone = (yyvsp[-1].IntVal) + 60; yyans.dst = 1; }
-#line 1697 "dateyacc.c" /* yacc.c:1646  */
+#line 1720 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 112:
-#line 341 "dateyacc.y" /* yacc.c:1646  */
+  case 122:
+#line 360 "dateyacc.y" /* yacc.c:1646  */
     { yyans.zone = (yyvsp[0].IntVal); yyans.dst = 1; }
-#line 1703 "dateyacc.c" /* yacc.c:1646  */
+#line 1726 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 113:
-#line 343 "dateyacc.y" /* yacc.c:1646  */
+  case 123:
+#line 362 "dateyacc.y" /* yacc.c:1646  */
     { yyans.zone = (yyvsp[0].IntVal); yyans.dst = 1; }
-#line 1709 "dateyacc.c" /* yacc.c:1646  */
+#line 1732 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 114:
-#line 345 "dateyacc.y" /* yacc.c:1646  */
+  case 124:
+#line 364 "dateyacc.y" /* yacc.c:1646  */
     { yyans.zone = (yyvsp[0].IntVal); yyans.dst = 0; }
-#line 1715 "dateyacc.c" /* yacc.c:1646  */
+#line 1738 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 115:
-#line 347 "dateyacc.y" /* yacc.c:1646  */
+  case 125:
+#line 366 "dateyacc.y" /* yacc.c:1646  */
     { yyans.zone = (yyvsp[0].IntVal); yyans.dst = 0; }
-#line 1721 "dateyacc.c" /* yacc.c:1646  */
+#line 1744 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 116:
-#line 349 "dateyacc.y" /* yacc.c:1646  */
+  case 126:
+#line 368 "dateyacc.y" /* yacc.c:1646  */
     { yyans.zone = - (yyvsp[0].IntVal); yyans.dst = 0; }
-#line 1727 "dateyacc.c" /* yacc.c:1646  */
+#line 1750 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 117:
-#line 351 "dateyacc.y" /* yacc.c:1646  */
+  case 127:
+#line 370 "dateyacc.y" /* yacc.c:1646  */
     { yyans.zone = - (yyvsp[0].IntVal); yyans.dst = 0; }
-#line 1733 "dateyacc.c" /* yacc.c:1646  */
+#line 1756 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 118:
-#line 356 "dateyacc.y" /* yacc.c:1646  */
+  case 128:
+#line 375 "dateyacc.y" /* yacc.c:1646  */
     { (yyval.IntVal) = 60 * (yyvsp[0].IntVal); }
-#line 1739 "dateyacc.c" /* yacc.c:1646  */
+#line 1762 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 119:
-#line 358 "dateyacc.y" /* yacc.c:1646  */
+  case 129:
+#line 377 "dateyacc.y" /* yacc.c:1646  */
     { (yyval.IntVal) = 60 * (yyvsp[-2].IntVal) + (yyvsp[0].IntVal); }
-#line 1745 "dateyacc.c" /* yacc.c:1646  */
+#line 1768 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 120:
-#line 360 "dateyacc.y" /* yacc.c:1646  */
+  case 130:
+#line 379 "dateyacc.y" /* yacc.c:1646  */
     { (yyval.IntVal) = 60 * (yyvsp[-2].IntVal) + (yyvsp[0].IntVal); }
-#line 1751 "dateyacc.c" /* yacc.c:1646  */
+#line 1774 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 121:
-#line 362 "dateyacc.y" /* yacc.c:1646  */
+  case 131:
+#line 381 "dateyacc.y" /* yacc.c:1646  */
     { (yyval.IntVal) = 60 * (yyvsp[0].IntVal); }
-#line 1757 "dateyacc.c" /* yacc.c:1646  */
+#line 1780 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 122:
-#line 364 "dateyacc.y" /* yacc.c:1646  */
+  case 132:
+#line 383 "dateyacc.y" /* yacc.c:1646  */
     { (yyval.IntVal) = 60 * (yyvsp[-2].IntVal) + (yyvsp[0].IntVal); }
-#line 1763 "dateyacc.c" /* yacc.c:1646  */
+#line 1786 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 123:
-#line 366 "dateyacc.y" /* yacc.c:1646  */
+  case 133:
+#line 385 "dateyacc.y" /* yacc.c:1646  */
     { (yyval.IntVal) = 60 * (yyvsp[-2].IntVal) + (yyvsp[0].IntVal); }
-#line 1769 "dateyacc.c" /* yacc.c:1646  */
+#line 1792 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 124:
-#line 368 "dateyacc.y" /* yacc.c:1646  */
+  case 134:
+#line 387 "dateyacc.y" /* yacc.c:1646  */
     { (yyval.IntVal) = 60 * ((yyvsp[0].IntVal) / 100) | ((yyvsp[0].IntVal) % 100); }
-#line 1775 "dateyacc.c" /* yacc.c:1646  */
+#line 1798 "dateyacc.c" /* yacc.c:1646  */
     break;
 
-  case 125:
-#line 373 "dateyacc.y" /* yacc.c:1646  */
+  case 135:
+#line 392 "dateyacc.y" /* yacc.c:1646  */
     { yyans.hour   = (yyvsp[0].IntVal) / 100;  /* ajs */
          yyans.minute = (yyvsp[0].IntVal) % 100;       /* ajs */
          yyans.second = -1;            /* ajs */
        }
-#line 1784 "dateyacc.c" /* yacc.c:1646  */
+#line 1807 "dateyacc.c" /* yacc.c:1646  */
     break;
 
 
-#line 1788 "dateyacc.c" /* yacc.c:1646  */
+#line 1811 "dateyacc.c" /* yacc.c:1646  */
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -2012,5 +2035,5 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 379 "dateyacc.y" /* yacc.c:1906  */
+#line 398 "dateyacc.y" /* yacc.c:1906  */
 
index 7298827..676e6cc 100644 (file)
@@ -1,21 +1,19 @@
+/* A Bison parser, made by GNU Bison 3.0.4.  */
 
-/* A Bison parser, made by GNU Bison 2.4.1.  */
+/* Bison interface for Yacc-like parsers in C
+
+   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
 
-/* Skeleton interface for Bison's Yacc-like parsers in C
-   
-      Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-   Free Software Foundation, Inc.
-   
    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 3 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, see <http://www.gnu.org/licenses/>.  */
 
    special exception, which will cause the skeleton and the resulting
    Bison output files to be licensed under the GNU General Public
    License without this special exception.
-   
+
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
+#ifndef YY_YY_DATEYACC_TAB_H_INCLUDED
+# define YY_YY_DATEYACC_TAB_H_INCLUDED
+/* Debug traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int yydebug;
+#endif
 
-/* Tokens.  */
+/* Token type.  */
 #ifndef YYTOKENTYPE
 # define YYTOKENTYPE
-   /* Put the tokens into the symbol table, so that GDB and other debuggers
-      know about them.  */
-   enum yytokentype {
-     DAY_NAME = 258,
-     MONTH_NAME = 259,
-     NUM9 = 260,
-     NUM23 = 261,
-     NUM59 = 262,
-     NUM99 = 263,
-     NUM2359 = 264,
-     NUM9999 = 265,
-     NUM235959 = 266,
-     NUM991231 = 267,
-     NUM99991231 = 268,
-     AMPM = 269,
-     STD_ZONE = 270,
-     DST_ZONE = 271,
-     DST_SUFFIX = 272
-   };
+  enum yytokentype
+  {
+    DAY_NAME = 258,
+    MONTH_NAME = 259,
+    NUM9 = 260,
+    NUM23 = 261,
+    NUM59 = 262,
+    NUM99 = 263,
+    NUM2359 = 264,
+    NUM9999 = 265,
+    NUM235959 = 266,
+    NUM991231 = 267,
+    NUM99991231 = 268,
+    NUM999999 = 269,
+    AMPM = 270,
+    STD_ZONE = 271,
+    DST_ZONE = 272,
+    DST_SUFFIX = 273
+  };
 #endif
 
-
-
+/* Value type.  */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-{
 
-/* Line 1676 of yacc.c  */
-#line 64 "dateyacc.y"
+union YYSTYPE
+{
+#line 66 "dateyacc.y" /* yacc.c:1909  */
 
     int IntVal;
 
+#line 77 "dateyacc.tab.h" /* yacc.c:1909  */
+};
 
-
-/* Line 1676 of yacc.c  */
-#line 75 "dateyacc.h"
-} YYSTYPE;
+typedef union YYSTYPE YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 #endif
 
+
 extern YYSTYPE yylval;
 
+int yyparse (void);
 
+#endif /* !YY_YY_DATEYACC_TAB_H_INCLUDED  */
index 1a7555f..b851aa8 100644 (file)
@@ -71,6 +71,7 @@ int yylex();
 %token MONTH_NAME
 %token NUM9 NUM23 NUM59 NUM99 NUM2359 NUM9999 NUM235959
 %token NUM991231 NUM99991231                           /* ajs */
+%token  NUM999999
 %token AMPM
 %token STD_ZONE DST_ZONE DST_SUFFIX
 
@@ -78,6 +79,7 @@ int yylex();
 %type  <IntVal>        MONTH_NAME
 %type  <IntVal>        NUM9 NUM23 NUM59 NUM99 NUM2359 NUM9999 NUM235959
 %type  <IntVal>        NUM991231 NUM99991231           /* ajs */
+%type  <IntVal>        NUM999999
 %type  <IntVal>        AMPM
 %type  <IntVal>        STD_ZONE DST_ZONE
 %type  <IntVal>        num59 num zone.offset
@@ -95,6 +97,18 @@ num:
   | num59
   ;
 
+anynumber:
+    NUM9
+  | NUM23
+  | NUM59
+  | NUM99
+  | NUM2359
+  | NUM9999
+  | NUM235959
+  | NUM991231
+  | NUM999999
+  ;
+
 goal:
     date
   | date dayname
@@ -296,6 +310,11 @@ hour.alone:
          yyans.minute = $3;
          yyans.second = $5;
        }
+  | NUM23 ':' num59 ':' num59 '.' anynumber
+       { yyans.hour   = $1;
+         yyans.minute = $3;
+         yyans.second = $5;
+       }
   | NUM23 '.' num59 '.' num59
        { yyans.hour   = $1;
          yyans.minute = $3;
index 69b109b..65aced8 100644 (file)
@@ -4,8 +4,8 @@
 ** MODULE INFORMATION *
 ***********************
 **      FILE NAME      : utc.cpp
-**      SYSTEM NAME    : AXE - Andromeda X-windows Encapsulation
-**      VERSION NUMBER : $Revision: 1.1 $
+**      SYSTEM NAME    : ACL - Andromeda Class Library
+**      VERSION NUMBER : 0.3.4
 **
 **  DESCRIPTION      :  
 **
 ********************************
 **      ORIGINAL AUTHOR : Arjen Baart - arjen@andromeda.nl
 **      CREATION DATE   : Sep 16, 2002
-**      LAST UPDATE     : Sep 16, 2002
+**      LAST UPDATE     : Aug 08, 2020
 **************************************************************************/
 
-/*****************************
-   $Log: utc.cpp,v $
-   Revision 1.1  2002-09-28 06:58:45  arjen
-   Bugfix: conversion of an empty string to a date or hour object
-   now makes the values of such an object 0 (null) instead of giving
-   a segmentation fault.
-   The class UTC combines the date and hour classes. The most basic
-   functions of the UTC class are now implemented.
-   These include constructors and conversion to and from String objects.
-   New functions: date::proper(), hour::proper() and UTC::proper().
-   Return true if the object holds a proper clock time and/or calendar
-   date; false if at least one value is out of range.
-
-
-*****************************/
 
 #include <time.h>
 
@@ -123,7 +108,7 @@ UTC Now(bool local)
    return UTC(d, t);
 }
 
-UTC operator+(UTC &t1, UTC &t2)
+UTC operator+(UTC t1, UTC t2)
 {
    UTC t = t1;
 
@@ -141,7 +126,7 @@ UTC UTC::operator+=(UTC u)
    return *this;
 }
 
-long operator-(UTC &u1, UTC &u2)
+long operator-(UTC u1, UTC u2)
 {
    long   days;
    long   seconds;
index 23d344b..c8b6d91 100644 (file)
@@ -70,6 +70,11 @@ int main()
    std::cout << "String \"" << the_date << "\" converts to: \"" << d0 << "\"\n";
    assert(d0 == date(16, 6, 2019));
 
+   the_date = "Wed Sep 09 16:40:03.634357 2020";   // A UNIX date string with fractional seconds
+   d0 = date(the_date);
+   std::cout << "String \"" << the_date << "\" converts to: \"" << d0 << "\"\n";
+   assert(d0 == date(9, 9, 2020));
+
    //  Without a year: year = -1
    the_date = "8 February";
    d0 = date(the_date);
index d7d025d..15314ce 100644 (file)
@@ -9,5 +9,6 @@ String "8 FEB 2012" converts to: "08-02-2012"
 String "2012 8 feb" converts to: "08-02-2012"
 String "8 February 2012" converts to: "08-02-2012"
 String "Sun Jun 16 13:02:56 CEST 2019" converts to: "16-06-2019"
+String "Wed Sep 09 16:40:03.634357 2020" converts to: "09-09-2020"
 String "8 February" converts to: "08-02--1"
 PASS date_parse (exit status: 0)
index 8a4b4f3..0163210 100644 (file)
@@ -87,6 +87,12 @@ int main()
    assert(date(u0) == date(16, 6, 2019));
    assert(hour(u0) == hour(13, 2, 56));
 
+   the_date = "Wed Sep 09 16:40:03.634357 2020";   // A UNIX date string with fractional seconds
+   u0 = UTC(the_date);
+   std::cout << "String \"" << the_date << "\" converts to: \"" << u0 << "\"\n";
+   assert(date(u0) == date(9, 9, 2020));
+   assert(hour(u0) == hour(16, 40, 3));
+
    //  Without a year: year = -1
    the_date = "8 February";
    u0 = UTC(the_date);
index cb07c6b..45bedc2 100644 (file)
@@ -11,5 +11,6 @@ String "8 FEB 2012" converts to: "08-02-2012 00:00:00"
 String "2012 8 feb" converts to: "08-02-2012 00:00:00"
 String "8 February 2012 15:00" converts to: "08-02-2012 15:00:00"
 String "Sun Jun 16 13:02:56 CEST 2019" converts to: "16-06-2019 13:02:56"
+String "Wed Sep 09 16:40:03.634357 2020" converts to: "09-09-2020 16:40:03"
 String "8 February" converts to: "08-02--1 00:00:00"
 PASS utc_parse (exit status: 0)