annotate lib/posixtm.c @ 3618:72422d1e9181

Include unlocked-io.h.
author Jim Meyering <jim@meyering.net>
date Sat, 17 Nov 2001 13:29:42 +0000
parents 40016a45f806
children 8a14e4553656
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1513
136765db2d16 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1512
diff changeset
1 /* Parse dates for touch and date.
3618
72422d1e9181 Include unlocked-io.h.
Jim Meyering <jim@meyering.net>
parents: 2656
diff changeset
2 Copyright (C) 1989, 1990, 1991, 1998, 2000, 2001 Free Software Foundation Inc.
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
3
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
4 This program is free software; you can redistribute it and/or modify
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
6 the Free Software Foundation; either version 2, or (at your option)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
7 any later version.
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
8
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
12 GNU General Public License for more details.
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
13
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
15 along with this program; if not, write to the Free Software Foundation,
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
17
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
18 /* Yacc-based version written by Jim Kingdon and David MacKenzie.
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
19 Rewritten by Jim Meyering. */
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
20
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
21 #ifdef HAVE_CONFIG_H
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
22 # include <config.h>
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
23 #endif
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
24
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
25 #include <stdio.h>
2656
40016a45f806 [HAVE_STDLIB_H]: Include stdlib.h.
Jim Meyering <jim@meyering.net>
parents: 1585
diff changeset
26 #if HAVE_STDLIB_H
40016a45f806 [HAVE_STDLIB_H]: Include stdlib.h.
Jim Meyering <jim@meyering.net>
parents: 1585
diff changeset
27 # include <stdlib.h>
40016a45f806 [HAVE_STDLIB_H]: Include stdlib.h.
Jim Meyering <jim@meyering.net>
parents: 1585
diff changeset
28 #endif
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
29 #include <sys/types.h>
1490
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
30 #if HAVE_STRING_H
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
31 # include <string.h>
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
32 #else
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
33 # include <strings.h>
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
34 #endif
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
35
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
36 #ifdef TM_IN_SYS_TIME
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
37 # include <sys/time.h>
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
38 #else
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
39 # include <time.h>
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
40 #endif
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
41
1490
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
42 #include "posixtm.h"
3618
72422d1e9181 Include unlocked-io.h.
Jim Meyering <jim@meyering.net>
parents: 2656
diff changeset
43 #include "unlocked-io.h"
1490
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
44
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
45 /* ISDIGIT differs from isdigit, as follows:
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
46 - Its arg may be any int or unsigned int; it need not be an unsigned char.
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
47 - It's guaranteed to evaluate its argument exactly once.
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
48 - It's typically faster.
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
49 Posix 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
50 only '0' through '9' are digits. Prefer ISDIGIT to isdigit unless
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
51 it's important to use the locale's definition of `digit' even when the
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
52 host does not conform to Posix. */
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
53 #define ISDIGIT(c) ((unsigned) (c) - '0' <= 9)
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
54
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
55 /* The return value. */
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
56 static struct tm t;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
57
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
58 time_t mktime ();
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
59
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
60 /*
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
61 POSIX requires:
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
62
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
63 touch -t [[CC]YY]mmddhhmm[.ss] FILE...
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
64 8, 10, or 12 digits, followed by optional .ss
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
65 (PDS_LEADING_YEAR | PDS_CENTURY | PDS_SECONDS)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
66
1491
01c94c29563f *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1490
diff changeset
67 touch mmddhhmm[YY] FILE... (obsolescent)
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
68 8 or 10 digits
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
69 (PDS_TRAILING_YEAR)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
70
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
71 date mmddhhmm[[CC]YY]
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
72 8, 10, or 12 digits
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
73 (PDS_TRAILING_YEAR | PDS_CENTURY)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
74
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
75 */
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
76
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
77 static int
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
78 year (const int *digit_pair, size_t n, int allow_century)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
79 {
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
80 switch (n)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
81 {
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
82 case 1:
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
83 t.tm_year = *digit_pair;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
84 /* Deduce the century based on the year.
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
85 See POSIX.2 section 4.63.3. */
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
86 if (digit_pair[0] <= 68)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
87 t.tm_year += 100;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
88 break;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
89
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
90 case 2:
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
91 if (!allow_century)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
92 return 1;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
93 t.tm_year = digit_pair[0] * 100 + digit_pair[1];
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
94 if (t.tm_year < 1900)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
95 return 1;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
96 t.tm_year -= 1900;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
97 break;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
98
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
99 case 0:
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
100 {
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
101 time_t now;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
102 struct tm *tmp;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
103
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
104 /* Use current year. */
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
105 time (&now);
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
106 tmp = localtime (&now);
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
107 t.tm_year = tmp->tm_year;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
108 }
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
109 break;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
110
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
111 default:
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
112 abort ();
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
113 }
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
114
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
115 return 0;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
116 }
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
117
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
118 static int
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
119 posix_time_parse (const char *s, unsigned int syntax_bits)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
120 {
1490
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
121 const char *dot = NULL;
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
122 int pair[6];
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
123 int *p;
1585
fe2f04f66a99 (posix_time_parse): Change type of index `i' from int to unsigned int.
Jim Meyering <jim@meyering.net>
parents: 1513
diff changeset
124 unsigned int i;
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
125
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
126 size_t s_len = strlen (s);
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
127 size_t len = (((syntax_bits & PDS_SECONDS) && (dot = strchr (s, '.')))
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
128 ? dot - s
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
129 : s_len);
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
130
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
131 if (len != 8 && len != 10 && len != 12)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
132 return 1;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
133
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
134 if (dot)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
135 {
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
136 if (!(syntax_bits & PDS_SECONDS))
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
137 return 1;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
138
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
139 if (s_len - len != 3)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
140 return 1;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
141 }
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
142
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
143 for (i = 0; i < len; i++)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
144 if (!ISDIGIT (s[i]))
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
145 return 1;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
146
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
147 len /= 2;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
148 for (i = 0; i < len; i++)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
149 pair[i] = 10 * (s[2*i] - '0') + s[2*i + 1] - '0';
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
150
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
151 p = pair;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
152 if (syntax_bits & PDS_LEADING_YEAR)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
153 {
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
154 if (year (p, len - 4, syntax_bits & PDS_CENTURY))
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
155 return 1;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
156 p += len - 4;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
157 len = 4;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
158 }
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
159
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
160 /* Handle 8 digits worth of `MMDDhhmm'. */
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
161 if (*p < 1 || *p > 12)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
162 return 1;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
163 t.tm_mon = *p - 1;
1492
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
164 ++p; --len;
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
165
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
166 if (*p < 1 || *p > 31)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
167 return 1;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
168 t.tm_mday = *p;
1492
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
169 ++p; --len;
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
170
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
171 if (*p < 0 || *p > 23)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
172 return 1;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
173 t.tm_hour = *p;
1492
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
174 ++p; --len;
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
175
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
176 if (*p < 0 || *p > 59)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
177 return 1;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
178 t.tm_min = *p;
1492
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
179 ++p; --len;
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
180
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
181 /* Handle any trailing year. */
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
182 if (syntax_bits & PDS_TRAILING_YEAR)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
183 {
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
184 if (year (p, len, syntax_bits & PDS_CENTURY))
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
185 return 1;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
186 }
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
187
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
188 /* Handle seconds. */
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
189 if (!dot)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
190 {
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
191 t.tm_sec = 0;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
192 }
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
193 else
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
194 {
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
195 int seconds;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
196
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
197 ++dot;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
198 if (!ISDIGIT (dot[0]) || !ISDIGIT (dot[1]))
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
199 return 1;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
200 seconds = 10 * (dot[0] - '0') + dot[1] - '0';
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
201
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
202 if (seconds < 0 || seconds > 61)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
203 return 1;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
204 t.tm_sec = seconds;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
205 }
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
206
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
207 return 0;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
208 }
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
209
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
210 /* Parse a POSIX-style date and return it, or (time_t)-1 for an error. */
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
211
1490
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
212 time_t
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
213 posixtime (const char *s, unsigned int syntax_bits)
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
214 {
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
215 t.tm_isdst = -1;
1490
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
216 if (posix_time_parse (s, syntax_bits))
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
217 return (time_t)-1;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
218 else
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
219 return mktime (&t);
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
220 }
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
221
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
222 /* Parse a POSIX-style date and return it, or NULL for an error. */
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
223
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
224 struct tm *
1490
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
225 posixtm (const char *s, unsigned int syntax_bits)
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
226 {
1490
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
227 if (posixtime (s, syntax_bits) == -1)
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
228 return NULL;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
229 return &t;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
230 }
1492
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
231
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
232 #ifdef TEST_POSIXTIME
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
233 /*
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
234 Test mainly with syntax_bits == 13
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
235 (aka: (PDS_LEADING_YEAR | PDS_CENTURY | PDS_SECONDS))
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
236
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
237 BEGIN-DATA
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
238 1112131415 13 1323807300 Tue Dec 13 14:15:00 2011
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
239 1112131415.16 13 1323807316 Tue Dec 13 14:15:16 2011
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
240 201112131415.16 13 1323807316 Tue Dec 13 14:15:16 2011
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
241 191112131415.16 13 -1 ***
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
242 203712131415.16 13 2144348116 Sun Dec 13 14:15:16 2037
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
243 3712131415.16 13 2144348116 Sun Dec 13 14:15:16 2037
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
244 6812131415.16 13 -1 ***
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
245 6912131415.16 13 -1 ***
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
246 7012131415.16 13 29967316 Sun Dec 13 14:15:16 1970
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
247 12131415.16 13 913580116 Sun Dec 13 14:15:16 1998
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
248
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
249 1213141599 2 945116100 Mon Dec 13 14:15:00 1999
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
250 1213141500 2 976738500 Wed Dec 13 14:15:00 2000
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
251 END-DATA
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
252
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
253 */
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
254
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
255 # define MAX_BUFF_LEN 1024
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
256
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
257 int
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
258 main ()
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
259 {
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
260 char buff[MAX_BUFF_LEN + 1];
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
261
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
262 buff[MAX_BUFF_LEN] = 0;
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
263 while (fgets (buff, MAX_BUFF_LEN, stdin) && buff[0])
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
264 {
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
265 char time_str[MAX_BUFF_LEN];
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
266 unsigned int syntax_bits;
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
267 time_t t;
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
268 char *result;
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
269 sscanf (buff, "%s %u", time_str, &syntax_bits);
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
270 t = posixtime (time_str, syntax_bits);
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
271 result = (t == (time_t) -1 ? "***" : ctime (&t));
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
272 printf ("%d %s\n", (int) t, result);
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
273 }
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
274 exit (0);
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
275
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
276 }
344a23067089 add test harness
Jim Meyering <jim@meyering.net>
parents: 1491
diff changeset
277 #endif