changeset 276:b6ae8963c3da

GNU file utilities
author Jim Meyering <jim@meyering.net>
date Sun, 06 Nov 1994 17:40:12 +0000
parents 971c9d3e51a6
children 368d06f0dc17
files lib/Makefile.in lib/makepath.c lib/obstack.h lib/posixtm.c
diffstat 4 files changed, 991 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/lib/Makefile.in
+++ b/lib/Makefile.in
@@ -153,6 +153,7 @@
 xgetcwd.o: pathmax.h
 euidaccess.o fsusage.o isdir.o makepath.o mkdir.o rename.o: safe-stat.h
 makepath.o: makepath.h
+obstack.o: obstack.h
 
 # Tell versions [3.59,3.63) of GNU make not to export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
--- a/lib/makepath.c
+++ b/lib/makepath.c
@@ -99,6 +99,16 @@
    Return 0 if ARGPATH exists as a directory with the proper
    ownership and permissions when done, otherwise 1.  */
 
+#if defined (__GNUC__) || (defined (__STDC__) && __STDC__)
+int
+make_path (const char *argpath,
+	   int mode,
+	   int parent_mode,
+	   uid_t owner,
+	   gid_t group,
+	   int preserve_existing,
+	   const char *verbose_fmt_string)
+#else
 int
 make_path (argpath, mode, parent_mode, owner, group, preserve_existing,
 	   verbose_fmt_string)
@@ -109,6 +119,7 @@
      gid_t group;
      int preserve_existing;
      const char *verbose_fmt_string;
+#endif
 {
   char *dirpath;		/* A copy we can scribble NULs on.  */
   struct stat stats;
--- a/lib/obstack.h
+++ b/lib/obstack.h
@@ -272,7 +272,7 @@
 /* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
    does not implement __extension__.  But that compiler doesn't define
    __GNUC_MINOR__.  */
-#if __GNUC__ < 2 || (NeXt && !__GNUC_MINOR__)
+#if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__)
 #define __extension__
 #endif
 
new file mode 100644
--- /dev/null
+++ b/lib/posixtm.c
@@ -0,0 +1,978 @@
+
+/*  A Bison parser, made from ./posixtm.y with Bison version GNU Bison version 1.22
+  */
+
+#define YYBISON 1  /* Identify Bison output.  */
+
+#define	DIGIT	258
+
+#line 19 "./posixtm.y"
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+/* The following block of alloca-related preprocessor directives is here
+   solely to allow compilation by non GNU-C compilers of the C parser
+   produced from this file by old versions of bison.  Newer versions of
+   bison include a block similar to this one in bison.simple.  */
+   
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else
+#ifdef HAVE_ALLOCA_H
+#include <alloca.h>
+#else
+#ifdef _AIX
+ #pragma alloca
+#else
+void *alloca ();
+#endif
+#endif
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+
+#ifdef TM_IN_SYS_TIME
+#include <sys/time.h>
+#else
+#include <time.h>
+#endif
+
+/* Some old versions of bison generate parsers that use bcopy.
+   That loses on systems that don't provide the function, so we have
+   to redefine it here.  */
+#if !defined (HAVE_BCOPY) && defined (HAVE_MEMCPY) && !defined (bcopy)
+#define bcopy(from, to, len) memcpy ((to), (from), (len))
+#endif
+
+#define YYDEBUG 1
+
+/* Lexical analyzer's current scan position in the input string. */
+static char *curpos;
+
+/* The return value. */
+static struct tm t;
+
+time_t mktime ();
+
+#define zzparse posixtime_zzparse
+static int zzlex ();
+static int zzerror ();
+
+#ifndef YYLTYPE
+typedef
+  struct zzltype
+    {
+      int timestamp;
+      int first_line;
+      int first_column;
+      int last_line;
+      int last_column;
+      char *text;
+   }
+  zzltype;
+
+#define YYLTYPE zzltype
+#endif
+
+#ifndef YYSTYPE
+#define YYSTYPE int
+#endif
+#include <stdio.h>
+
+#ifndef __cplusplus
+#ifndef __STDC__
+#define const
+#endif
+#endif
+
+
+
+#define	YYFINAL		15
+#define	YYFLAG		-32768
+#define	YYNTBASE	5
+
+#define YYTRANSLATE(x) ((unsigned)(x) <= 258 ? zztranslate[x] : 9)
+
+static const char zztranslate[] = {     0,
+     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,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     4,     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,     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,     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,     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,     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,     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,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     1,     2,     3
+};
+
+#if YYDEBUG != 0
+static const short zzprhs[] = {     0,
+     0,     7,     9,    12,    13,    14,    17
+};
+
+static const short zzrhs[] = {     8,
+     8,     8,     8,     6,     7,     0,     8,     0,     8,     8,
+     0,     0,     0,     4,     8,     0,     3,     3,     0
+};
+
+#endif
+
+#if YYDEBUG != 0
+static const short zzrline[] = { 0,
+    78,   107,   114,   121,   132,   135,   144
+};
+
+static const char * const zztname[] = {   "$","error","$illegal.","DIGIT","'.'",
+"date","year","seconds","digitpair",""
+};
+#endif
+
+static const short zzr1[] = {     0,
+     5,     6,     6,     6,     7,     7,     8
+};
+
+static const short zzr2[] = {     0,
+     6,     1,     2,     0,     0,     2,     2
+};
+
+static const short zzdefact[] = {     0,
+     0,     0,     7,     0,     0,     4,     5,     2,     0,     1,
+     3,     6,     0,     0,     0
+};
+
+static const short zzdefgoto[] = {    13,
+     7,    10,     2
+};
+
+static const short zzpact[] = {     2,
+     5,     2,-32768,     2,     2,     2,    -3,     2,     2,-32768,
+-32768,-32768,     9,    10,-32768
+};
+
+static const short zzpgoto[] = {-32768,
+-32768,-32768,    -2
+};
+
+
+#define	YYLAST		10
+
+
+static const short zztable[] = {     4,
+     9,     5,     6,     8,     1,    11,    12,     3,    14,    15
+};
+
+static const short zzcheck[] = {     2,
+     4,     4,     5,     6,     3,     8,     9,     3,     0,     0
+};
+/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
+#line 3 "/usr/local/lib/bison.simple"
+
+/* Skeleton output parser for bison,
+   Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman
+
+   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 1, 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.  */
+
+
+#ifndef alloca
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else /* not GNU C.  */
+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
+#include <alloca.h>
+#else /* not sparc */
+#if defined (MSDOS) && !defined (__TURBOC__)
+#include <malloc.h>
+#else /* not MSDOS, or __TURBOC__ */
+#if defined(_AIX)
+#include <malloc.h>
+ #pragma alloca
+#else /* not MSDOS, __TURBOC__, or _AIX */
+#ifdef __hpux
+#ifdef __cplusplus
+extern "C" {
+void *alloca (unsigned int);
+};
+#else /* not __cplusplus */
+void *alloca ();
+#endif /* not __cplusplus */
+#endif /* __hpux */
+#endif /* not _AIX */
+#endif /* not MSDOS, or __TURBOC__ */
+#endif /* not sparc.  */
+#endif /* not GNU C.  */
+#endif /* alloca not defined.  */
+
+/* This is the parser code that is written into each bison parser
+  when the %semantic_parser declaration is not specified in the grammar.
+  It was written by Richard Stallman by simplifying the hairy parser
+  used when %semantic_parser is specified.  */
+
+/* Note: there must be only one dollar sign in this file.
+   It is replaced by the list of actions, each action
+   as one case of the switch.  */
+
+#define zzerrok		(zzerrstatus = 0)
+#define zzclearin	(zzchar = YYEMPTY)
+#define YYEMPTY		-2
+#define YYEOF		0
+#define YYACCEPT	return(0)
+#define YYABORT 	return(1)
+#define YYERROR		goto zzerrlab1
+/* Like YYERROR except do call zzerror.
+   This remains here temporarily to ease the
+   transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+#define YYFAIL		goto zzerrlab
+#define YYRECOVERING()  (!!zzerrstatus)
+#define YYBACKUP(token, value) \
+do								\
+  if (zzchar == YYEMPTY && zzlen == 1)				\
+    { zzchar = (token), zzlval = (value);			\
+      zzchar1 = YYTRANSLATE (zzchar);				\
+      YYPOPSTACK;						\
+      goto zzbackup;						\
+    }								\
+  else								\
+    { zzerror ("syntax error: cannot back up"); YYERROR; }	\
+while (0)
+
+#define YYTERROR	1
+#define YYERRCODE	256
+
+#ifndef YYPURE
+#define YYLEX		zzlex()
+#endif
+
+#ifdef YYPURE
+#ifdef YYLSP_NEEDED
+#define YYLEX		zzlex(&zzlval, &zzlloc)
+#else
+#define YYLEX		zzlex(&zzlval)
+#endif
+#endif
+
+/* If nonreentrant, generate the variables here */
+
+#ifndef YYPURE
+
+int	zzchar;			/*  the lookahead symbol		*/
+YYSTYPE	zzlval;			/*  the semantic value of the		*/
+				/*  lookahead symbol			*/
+
+#ifdef YYLSP_NEEDED
+YYLTYPE zzlloc;			/*  location data for the lookahead	*/
+				/*  symbol				*/
+#endif
+
+int zznerrs;			/*  number of parse errors so far       */
+#endif  /* not YYPURE */
+
+#if YYDEBUG != 0
+int zzdebug;			/*  nonzero means print parse trace	*/
+/* Since this is uninitialized, it does not stop multiple parsers
+   from coexisting.  */
+#endif
+
+/*  YYINITDEPTH indicates the initial size of the parser's stacks	*/
+
+#ifndef	YYINITDEPTH
+#define YYINITDEPTH 200
+#endif
+
+/*  YYMAXDEPTH is the maximum size the stacks can grow to
+    (effective only if the built-in stack extension method is used).  */
+
+#if YYMAXDEPTH == 0
+#undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH 10000
+#endif
+
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+int zzparse (void);
+#endif
+
+#if __GNUC__ > 1		/* GNU C and GNU C++ define this.  */
+#define __zz_bcopy(FROM,TO,COUNT)	__builtin_memcpy(TO,FROM,COUNT)
+#else				/* not GNU C or C++ */
+#ifndef __cplusplus
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__zz_bcopy (from, to, count)
+     char *from;
+     char *to;
+     int count;
+{
+  register char *f = from;
+  register char *t = to;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#else /* __cplusplus */
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__zz_bcopy (char *from, char *to, int count)
+{
+  register char *f = from;
+  register char *t = to;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#endif
+#endif
+
+#line 184 "/usr/local/lib/bison.simple"
+int
+zzparse()
+{
+  register int zzstate;
+  register int zzn;
+  register short *zzssp;
+  register YYSTYPE *zzvsp;
+  int zzerrstatus;	/*  number of tokens to shift before error messages enabled */
+  int zzchar1 = 0;		/*  lookahead token as an internal (translated) token number */
+
+  short	zzssa[YYINITDEPTH];	/*  the state stack			*/
+  YYSTYPE zzvsa[YYINITDEPTH];	/*  the semantic value stack		*/
+
+  short *zzss = zzssa;		/*  refer to the stacks thru separate pointers */
+  YYSTYPE *zzvs = zzvsa;	/*  to allow zzoverflow to reallocate them elsewhere */
+
+#ifdef YYLSP_NEEDED
+  YYLTYPE zzlsa[YYINITDEPTH];	/*  the location stack			*/
+  YYLTYPE *zzls = zzlsa;
+  YYLTYPE *zzlsp;
+
+#define YYPOPSTACK   (zzvsp--, zzssp--, zzlsp--)
+#else
+#define YYPOPSTACK   (zzvsp--, zzssp--)
+#endif
+
+  int zzstacksize = YYINITDEPTH;
+
+#ifdef YYPURE
+  int zzchar;
+  YYSTYPE zzlval;
+  int zznerrs;
+#ifdef YYLSP_NEEDED
+  YYLTYPE zzlloc;
+#endif
+#endif
+
+  YYSTYPE zzval;		/*  the variable used to return		*/
+				/*  semantic values from the action	*/
+				/*  routines				*/
+
+  int zzlen;
+
+#if YYDEBUG != 0
+  if (zzdebug)
+    fprintf(stderr, "Starting parse\n");
+#endif
+
+  zzstate = 0;
+  zzerrstatus = 0;
+  zznerrs = 0;
+  zzchar = YYEMPTY;		/* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  zzssp = zzss - 1;
+  zzvsp = zzvs;
+#ifdef YYLSP_NEEDED
+  zzlsp = zzls;
+#endif
+
+/* Push a new state, which is found in  zzstate  .  */
+/* In all cases, when you get here, the value and location stacks
+   have just been pushed. so pushing a state here evens the stacks.  */
+zznewstate:
+
+  *++zzssp = zzstate;
+
+  if (zzssp >= zzss + zzstacksize - 1)
+    {
+      /* Give user a chance to reallocate the stack */
+      /* Use copies of these so that the &'s don't force the real ones into memory. */
+      YYSTYPE *zzvs1 = zzvs;
+      short *zzss1 = zzss;
+#ifdef YYLSP_NEEDED
+      YYLTYPE *zzls1 = zzls;
+#endif
+
+      /* Get the current used size of the three stacks, in elements.  */
+      int size = zzssp - zzss + 1;
+
+#ifdef zzoverflow
+      /* Each stack pointer address is followed by the size of
+	 the data in use in that stack, in bytes.  */
+#ifdef YYLSP_NEEDED
+      /* This used to be a conditional around just the two extra args,
+	 but that might be undefined if zzoverflow is a macro.  */
+      zzoverflow("parser stack overflow",
+		 &zzss1, size * sizeof (*zzssp),
+		 &zzvs1, size * sizeof (*zzvsp),
+		 &zzls1, size * sizeof (*zzlsp),
+		 &zzstacksize);
+#else
+      zzoverflow("parser stack overflow",
+		 &zzss1, size * sizeof (*zzssp),
+		 &zzvs1, size * sizeof (*zzvsp),
+		 &zzstacksize);
+#endif
+
+      zzss = zzss1; zzvs = zzvs1;
+#ifdef YYLSP_NEEDED
+      zzls = zzls1;
+#endif
+#else /* no zzoverflow */
+      /* Extend the stack our own way.  */
+      if (zzstacksize >= YYMAXDEPTH)
+	{
+	  zzerror("parser stack overflow");
+	  return 2;
+	}
+      zzstacksize *= 2;
+      if (zzstacksize > YYMAXDEPTH)
+	zzstacksize = YYMAXDEPTH;
+      zzss = (short *) alloca (zzstacksize * sizeof (*zzssp));
+      __zz_bcopy ((char *)zzss1, (char *)zzss, size * sizeof (*zzssp));
+      zzvs = (YYSTYPE *) alloca (zzstacksize * sizeof (*zzvsp));
+      __zz_bcopy ((char *)zzvs1, (char *)zzvs, size * sizeof (*zzvsp));
+#ifdef YYLSP_NEEDED
+      zzls = (YYLTYPE *) alloca (zzstacksize * sizeof (*zzlsp));
+      __zz_bcopy ((char *)zzls1, (char *)zzls, size * sizeof (*zzlsp));
+#endif
+#endif /* no zzoverflow */
+
+      zzssp = zzss + size - 1;
+      zzvsp = zzvs + size - 1;
+#ifdef YYLSP_NEEDED
+      zzlsp = zzls + size - 1;
+#endif
+
+#if YYDEBUG != 0
+      if (zzdebug)
+	fprintf(stderr, "Stack size increased to %d\n", zzstacksize);
+#endif
+
+      if (zzssp >= zzss + zzstacksize - 1)
+	YYABORT;
+    }
+
+#if YYDEBUG != 0
+  if (zzdebug)
+    fprintf(stderr, "Entering state %d\n", zzstate);
+#endif
+
+  goto zzbackup;
+ zzbackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* zzresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  zzn = zzpact[zzstate];
+  if (zzn == YYFLAG)
+    goto zzdefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* zzchar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (zzchar == YYEMPTY)
+    {
+#if YYDEBUG != 0
+      if (zzdebug)
+	fprintf(stderr, "Reading a token: ");
+#endif
+      zzchar = YYLEX;
+    }
+
+  /* Convert token to internal form (in zzchar1) for indexing tables with */
+
+  if (zzchar <= 0)		/* This means end of input. */
+    {
+      zzchar1 = 0;
+      zzchar = YYEOF;		/* Don't call YYLEX any more */
+
+#if YYDEBUG != 0
+      if (zzdebug)
+	fprintf(stderr, "Now at end of input.\n");
+#endif
+    }
+  else
+    {
+      zzchar1 = YYTRANSLATE(zzchar);
+
+#if YYDEBUG != 0
+      if (zzdebug)
+	{
+	  fprintf (stderr, "Next token is %d (%s", zzchar, zztname[zzchar1]);
+	  /* Give the individual parser a way to print the precise meaning
+	     of a token, for further debugging info.  */
+#ifdef YYPRINT
+	  YYPRINT (stderr, zzchar, zzlval);
+#endif
+	  fprintf (stderr, ")\n");
+	}
+#endif
+    }
+
+  zzn += zzchar1;
+  if (zzn < 0 || zzn > YYLAST || zzcheck[zzn] != zzchar1)
+    goto zzdefault;
+
+  zzn = zztable[zzn];
+
+  /* zzn is what to do for this token type in this state.
+     Negative => reduce, -zzn is rule number.
+     Positive => shift, zzn is new state.
+       New state is final state => don't bother to shift,
+       just return success.
+     0, or most negative number => error.  */
+
+  if (zzn < 0)
+    {
+      if (zzn == YYFLAG)
+	goto zzerrlab;
+      zzn = -zzn;
+      goto zzreduce;
+    }
+  else if (zzn == 0)
+    goto zzerrlab;
+
+  if (zzn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+
+#if YYDEBUG != 0
+  if (zzdebug)
+    fprintf(stderr, "Shifting token %d (%s), ", zzchar, zztname[zzchar1]);
+#endif
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (zzchar != YYEOF)
+    zzchar = YYEMPTY;
+
+  *++zzvsp = zzlval;
+#ifdef YYLSP_NEEDED
+  *++zzlsp = zzlloc;
+#endif
+
+  /* count tokens shifted since error; after three, turn off error status.  */
+  if (zzerrstatus) zzerrstatus--;
+
+  zzstate = zzn;
+  goto zznewstate;
+
+/* Do the default action for the current state.  */
+zzdefault:
+
+  zzn = zzdefact[zzstate];
+  if (zzn == 0)
+    goto zzerrlab;
+
+/* Do a reduction.  zzn is the number of a rule to reduce with.  */
+zzreduce:
+  zzlen = zzr2[zzn];
+  if (zzlen > 0)
+    zzval = zzvsp[1-zzlen]; /* implement default value of the action */
+
+#if YYDEBUG != 0
+  if (zzdebug)
+    {
+      int i;
+
+      fprintf (stderr, "Reducing via rule %d (line %d), ",
+	       zzn, zzrline[zzn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (i = zzprhs[zzn]; zzrhs[i] > 0; i++)
+	fprintf (stderr, "%s ", zztname[zzrhs[i]]);
+      fprintf (stderr, " -> %s\n", zztname[zzr1[zzn]]);
+    }
+#endif
+
+
+  switch (zzn) {
+
+case 1:
+#line 84 "./posixtm.y"
+{
+	         if (zzvsp[-5] >= 1 && zzvsp[-5] <= 12)
+		   t.tm_mon = zzvsp[-5] - 1;
+		 else {
+		   YYABORT;
+		 }
+		 if (zzvsp[-4] >= 1 && zzvsp[-4] <= 31)
+		   t.tm_mday = zzvsp[-4];
+		 else {
+		   YYABORT;
+		 }
+		 if (zzvsp[-3] >= 0 && zzvsp[-3] <= 23)
+		   t.tm_hour = zzvsp[-3];
+		 else {
+		   YYABORT;
+		 }
+		 if (zzvsp[-2] >= 0 && zzvsp[-2] <= 59)
+		   t.tm_min = zzvsp[-2];
+		 else {
+		   YYABORT;
+		 }
+	       ;
+    break;}
+case 2:
+#line 107 "./posixtm.y"
+{
+                   t.tm_year = zzvsp[0];
+		   /* Deduce the century based on the year.
+		      See POSIX.2 section 4.63.3.  */
+		   if (zzvsp[0] <= 68)
+		     t.tm_year += 100;
+		 ;
+    break;}
+case 3:
+#line 114 "./posixtm.y"
+{
+                            t.tm_year = zzvsp[-1] * 100 + zzvsp[0];
+			    if (t.tm_year < 1900) {
+			      YYABORT;
+			    } else
+			      t.tm_year -= 1900;
+			  ;
+    break;}
+case 4:
+#line 121 "./posixtm.y"
+{
+                    time_t now;
+		    struct tm *tmp;
+
+                    /* Use current year.  */
+                    time (&now);
+		    tmp = localtime (&now);
+		    t.tm_year = tmp->tm_year;
+		  ;
+    break;}
+case 5:
+#line 132 "./posixtm.y"
+{
+                        t.tm_sec = 0;
+		      ;
+    break;}
+case 6:
+#line 135 "./posixtm.y"
+{
+	                  if (zzvsp[0] >= 0 && zzvsp[0] <= 61)
+			    t.tm_sec = zzvsp[0];
+			  else {
+			    YYABORT;
+			  }
+			;
+    break;}
+case 7:
+#line 144 "./posixtm.y"
+{
+                          zzval = zzvsp[-1] * 10 + zzvsp[0];
+			;
+    break;}
+}
+   /* the action file gets copied in in place of this dollarsign */
+#line 465 "/usr/local/lib/bison.simple"
+
+  zzvsp -= zzlen;
+  zzssp -= zzlen;
+#ifdef YYLSP_NEEDED
+  zzlsp -= zzlen;
+#endif
+
+#if YYDEBUG != 0
+  if (zzdebug)
+    {
+      short *ssp1 = zzss - 1;
+      fprintf (stderr, "state stack now");
+      while (ssp1 != zzssp)
+	fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+  *++zzvsp = zzval;
+
+#ifdef YYLSP_NEEDED
+  zzlsp++;
+  if (zzlen == 0)
+    {
+      zzlsp->first_line = zzlloc.first_line;
+      zzlsp->first_column = zzlloc.first_column;
+      zzlsp->last_line = (zzlsp-1)->last_line;
+      zzlsp->last_column = (zzlsp-1)->last_column;
+      zzlsp->text = 0;
+    }
+  else
+    {
+      zzlsp->last_line = (zzlsp+zzlen-1)->last_line;
+      zzlsp->last_column = (zzlsp+zzlen-1)->last_column;
+    }
+#endif
+
+  /* Now "shift" the result of the reduction.
+     Determine what state that goes to,
+     based on the state we popped back to
+     and the rule number reduced by.  */
+
+  zzn = zzr1[zzn];
+
+  zzstate = zzpgoto[zzn - YYNTBASE] + *zzssp;
+  if (zzstate >= 0 && zzstate <= YYLAST && zzcheck[zzstate] == *zzssp)
+    zzstate = zztable[zzstate];
+  else
+    zzstate = zzdefgoto[zzn - YYNTBASE];
+
+  goto zznewstate;
+
+zzerrlab:   /* here on detecting error */
+
+  if (! zzerrstatus)
+    /* If not already recovering from an error, report this error.  */
+    {
+      ++zznerrs;
+
+#ifdef YYERROR_VERBOSE
+      zzn = zzpact[zzstate];
+
+      if (zzn > YYFLAG && zzn < YYLAST)
+	{
+	  int size = 0;
+	  char *msg;
+	  int x, count;
+
+	  count = 0;
+	  /* Start X at -zzn if nec to avoid negative indexes in zzcheck.  */
+	  for (x = (zzn < 0 ? -zzn : 0);
+	       x < (sizeof(zztname) / sizeof(char *)); x++)
+	    if (zzcheck[x + zzn] == x)
+	      size += strlen(zztname[x]) + 15, count++;
+	  msg = (char *) malloc(size + 15);
+	  if (msg != 0)
+	    {
+	      strcpy(msg, "parse error");
+
+	      if (count < 5)
+		{
+		  count = 0;
+		  for (x = (zzn < 0 ? -zzn : 0);
+		       x < (sizeof(zztname) / sizeof(char *)); x++)
+		    if (zzcheck[x + zzn] == x)
+		      {
+			strcat(msg, count == 0 ? ", expecting `" : " or `");
+			strcat(msg, zztname[x]);
+			strcat(msg, "'");
+			count++;
+		      }
+		}
+	      zzerror(msg);
+	      free(msg);
+	    }
+	  else
+	    zzerror ("parse error; also virtual memory exceeded");
+	}
+      else
+#endif /* YYERROR_VERBOSE */
+	zzerror("parse error");
+    }
+
+  goto zzerrlab1;
+zzerrlab1:   /* here on error raised explicitly by an action */
+
+  if (zzerrstatus == 3)
+    {
+      /* if just tried and failed to reuse lookahead token after an error, discard it.  */
+
+      /* return failure if at end of input */
+      if (zzchar == YYEOF)
+	YYABORT;
+
+#if YYDEBUG != 0
+      if (zzdebug)
+	fprintf(stderr, "Discarding token %d (%s).\n", zzchar, zztname[zzchar1]);
+#endif
+
+      zzchar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token
+     after shifting the error token.  */
+
+  zzerrstatus = 3;		/* Each real token shifted decrements this */
+
+  goto zzerrhandle;
+
+zzerrdefault:  /* current state does not do anything special for the error token. */
+
+#if 0
+  /* This is wrong; only states that explicitly want error tokens
+     should shift them.  */
+  zzn = zzdefact[zzstate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
+  if (zzn) goto zzdefault;
+#endif
+
+zzerrpop:   /* pop the current state because it cannot handle the error token */
+
+  if (zzssp == zzss) YYABORT;
+  zzvsp--;
+  zzstate = *--zzssp;
+#ifdef YYLSP_NEEDED
+  zzlsp--;
+#endif
+
+#if YYDEBUG != 0
+  if (zzdebug)
+    {
+      short *ssp1 = zzss - 1;
+      fprintf (stderr, "Error: state stack now");
+      while (ssp1 != zzssp)
+	fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+zzerrhandle:
+
+  zzn = zzpact[zzstate];
+  if (zzn == YYFLAG)
+    goto zzerrdefault;
+
+  zzn += YYTERROR;
+  if (zzn < 0 || zzn > YYLAST || zzcheck[zzn] != YYTERROR)
+    goto zzerrdefault;
+
+  zzn = zztable[zzn];
+  if (zzn < 0)
+    {
+      if (zzn == YYFLAG)
+	goto zzerrpop;
+      zzn = -zzn;
+      goto zzreduce;
+    }
+  else if (zzn == 0)
+    goto zzerrpop;
+
+  if (zzn == YYFINAL)
+    YYACCEPT;
+
+#if YYDEBUG != 0
+  if (zzdebug)
+    fprintf(stderr, "Shifting error token, ");
+#endif
+
+  *++zzvsp = zzlval;
+#ifdef YYLSP_NEEDED
+  *++zzlsp = zzlloc;
+#endif
+
+  zzstate = zzn;
+  goto zznewstate;
+}
+#line 148 "./posixtm.y"
+
+static int
+zzlex ()
+{
+  char ch = *curpos++;
+
+  if (ch >= '0' && ch <= '9')
+    {
+      zzlval = ch - '0';
+      return DIGIT;
+    }
+  else if (ch == '.' || ch == 0)
+    return ch;
+  else
+    return '?';			/* Cause an error.  */
+}
+
+static int
+zzerror ()
+{
+  return 0;
+}
+
+/* Parse a POSIX-style date and return it, or (time_t)-1 for an error.  */
+
+time_t
+posixtime (s)
+     char *s;
+{
+  curpos = s;
+  /* Let mktime decide whether it is daylight savings time.  */
+  t.tm_isdst = -1;
+  if (zzparse ())
+    return (time_t)-1;
+  else
+    return mktime (&t);
+}
+
+/* Parse a POSIX-style date and return it, or NULL for an error.  */
+
+struct tm *
+posixtm (s)
+     char *s;
+{
+  if (posixtime (s) == -1)
+    return NULL;
+  return &t;
+}