annotate lib/posixtm.c @ 17255:d81be792518a

update from texinfo
author Karl Berry <karl@freefriends.org>
date Tue, 01 Jan 2013 15:51:49 -0800
parents e542fd46ad6f
children 344018b6e5d7
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.
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4671
diff changeset
2
17249
e542fd46ad6f maint: update all copyright year number ranges
Eric Blake <eblake@redhat.com>
parents: 16235
diff changeset
3 Copyright (C) 1989-1991, 1998, 2000-2013 Free Software Foundation, Inc.
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
4
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 7897
diff changeset
5 This program is free software: you can redistribute it and/or modify
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
6 it under the terms of the GNU General Public License as published by
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 7897
diff changeset
7 the Free Software Foundation; either version 3 of the License, or
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 7897
diff changeset
8 (at your option) any later version.
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
9
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
10 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
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
13 GNU General Public License for more details.
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
14
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 7897
diff changeset
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
1486
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
7302
8a1a9361108c * _fpending.c: Include <config.h> unconditionally, since we no
Paul Eggert <eggert@cs.ucla.edu>
parents: 6932
diff changeset
21 #include <config.h>
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
22
7897
b7a83a69ac23 * MODULES.html.sh (Support for systems lacking POSIX:2001): New
Paul Eggert <eggert@cs.ucla.edu>
parents: 7302
diff changeset
23 #include "posixtm.h"
4342
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
24
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
25 #include <stdio.h>
4671
6505d2a987d6 Remove K&R cruft.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4356
diff changeset
26 #include <stdlib.h>
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
27 #include <sys/types.h>
4671
6505d2a987d6 Remove K&R cruft.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4356
diff changeset
28 #include <string.h>
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
29
5318
7c24a825b51d Remove dependencies on unlocked-io.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5159
diff changeset
30 #if USE_UNLOCKED_IO
7c24a825b51d Remove dependencies on unlocked-io.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5159
diff changeset
31 # include "unlocked-io.h"
7c24a825b51d Remove dependencies on unlocked-io.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5159
diff changeset
32 #endif
1490
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
33
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
34 /* ISDIGIT differs from isdigit, as follows:
6932
6aeb4d6c28d9 * lib/.cppi-disable: Add wcwidth.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6527
diff changeset
35 - Its arg may be any int or unsigned int; it need not be an unsigned char
6aeb4d6c28d9 * lib/.cppi-disable: Add wcwidth.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6527
diff changeset
36 or EOF.
1490
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
37 - It's typically faster.
3699
48781102544a (ISDIGIT): Comment fix.
Jim Meyering <jim@meyering.net>
parents: 3675
diff changeset
38 POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to
6932
6aeb4d6c28d9 * lib/.cppi-disable: Add wcwidth.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6527
diff changeset
39 isdigit unless it's important to use the locale's definition
16235
18a38c9615f0 In commentary, do not use ` to quote.
Paul Eggert <eggert@cs.ucla.edu>
parents: 16201
diff changeset
40 of "digit" even when the host does not conform to POSIX. */
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4671
diff changeset
41 #define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
1490
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
42
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
43 /*
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
44 POSIX requires:
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
45
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
46 touch -t [[CC]YY]mmddhhmm[.ss] FILE...
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
47 8, 10, or 12 digits, followed by optional .ss
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
48 (PDS_LEADING_YEAR | PDS_CENTURY | PDS_SECONDS)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
49
3699
48781102544a (ISDIGIT): Comment fix.
Jim Meyering <jim@meyering.net>
parents: 3675
diff changeset
50 touch mmddhhmm[YY] FILE... (obsoleted by POSIX 1003.1-2001)
6527
6b31c8787689 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6275
diff changeset
51 8 or 10 digits, YY (if present) must be in the range 69-99
6b31c8787689 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6275
diff changeset
52 (PDS_TRAILING_YEAR | PDS_PRE_2000)
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
53
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
54 date mmddhhmm[[CC]YY]
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
55 8, 10, or 12 digits
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
56 (PDS_TRAILING_YEAR | PDS_CENTURY)
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 */
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 static int
6527
6b31c8787689 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6275
diff changeset
61 year (struct tm *tm, const int *digit_pair, size_t n, unsigned int syntax_bits)
1486
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 switch (n)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
64 {
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
65 case 1:
4342
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
66 tm->tm_year = *digit_pair;
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
67 /* Deduce the century based on the year.
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
68 POSIX requires that 00-68 be interpreted as 2000-2068,
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
69 and that 69-99 be interpreted as 1969-1999. */
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
70 if (digit_pair[0] <= 68)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
71 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
72 if (syntax_bits & PDS_PRE_2000)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
73 return 1;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
74 tm->tm_year += 100;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
75 }
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
76 break;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
77
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
78 case 2:
6527
6b31c8787689 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6275
diff changeset
79 if (! (syntax_bits & PDS_CENTURY))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
80 return 1;
4342
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
81 tm->tm_year = digit_pair[0] * 100 + digit_pair[1] - 1900;
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
82 break;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
83
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
84 case 0:
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
85 {
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
86 time_t now;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
87 struct tm *tmp;
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
88
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
89 /* Use current year. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
90 time (&now);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
91 tmp = localtime (&now);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
92 if (! tmp)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
93 return 1;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
94 tm->tm_year = tmp->tm_year;
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
95 }
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
96 break;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
97
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
98 default:
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
99 abort ();
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
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
102 return 0;
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
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
105 static int
4342
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
106 posix_time_parse (struct tm *tm, const char *s, unsigned int syntax_bits)
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
107 {
1490
5134a2c5eaf1 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 1486
diff changeset
108 const char *dot = NULL;
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
109 int pair[6];
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
110 int *p;
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 4671
diff changeset
111 size_t i;
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
112
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
113 size_t s_len = strlen (s);
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
114 size_t len = (((syntax_bits & PDS_SECONDS) && (dot = strchr (s, '.')))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
115 ? (size_t) (dot - s)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
116 : s_len);
1486
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 if (len != 8 && len != 10 && len != 12)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
119 return 1;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
120
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
121 if (dot)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
122 {
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
123 if (!(syntax_bits & PDS_SECONDS))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
124 return 1;
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 if (s_len - len != 3)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
127 return 1;
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
128 }
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
129
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
130 for (i = 0; i < len; i++)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
131 if (!ISDIGIT (s[i]))
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 len /= 2;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
135 for (i = 0; i < len; i++)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
136 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
137
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
138 p = pair;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
139 if (syntax_bits & PDS_LEADING_YEAR)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
140 {
6527
6b31c8787689 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6275
diff changeset
141 if (year (tm, p, len - 4, syntax_bits))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
142 return 1;
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
143 p += len - 4;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
144 len = 4;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
145 }
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
146
16235
18a38c9615f0 In commentary, do not use ` to quote.
Paul Eggert <eggert@cs.ucla.edu>
parents: 16201
diff changeset
147 /* Handle 8 digits worth of 'MMDDhhmm'. */
4342
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
148 tm->tm_mon = *p++ - 1;
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
149 tm->tm_mday = *p++;
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
150 tm->tm_hour = *p++;
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
151 tm->tm_min = *p++;
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
152 len -= 4;
1486
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 /* Handle any trailing year. */
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
155 if (syntax_bits & PDS_TRAILING_YEAR)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
156 {
6527
6b31c8787689 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6275
diff changeset
157 if (year (tm, p, len, syntax_bits))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
158 return 1;
1486
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
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
161 /* Handle seconds. */
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
162 if (!dot)
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
163 {
4342
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
164 tm->tm_sec = 0;
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 else
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
167 {
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
168 int seconds;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
169
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
170 ++dot;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
171 if (!ISDIGIT (dot[0]) || !ISDIGIT (dot[1]))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
172 return 1;
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
173 seconds = 10 * (dot[0] - '0') + dot[1] - '0';
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
174
4342
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
175 tm->tm_sec = seconds;
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
176 }
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
177
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
178 return 0;
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
179 }
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
180
4342
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
181 /* Parse a POSIX-style date, returning true if successful. */
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
182
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
183 bool
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
184 posixtime (time_t *p, const char *s, unsigned int syntax_bits)
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
185 {
10856
f6d444835290 posixtm.c: avoid a warning
Jim Meyering <meyering@redhat.com>
parents: 9309
diff changeset
186 struct tm tm0;
4342
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
187 struct tm tm1;
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
188 struct tm const *tm;
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
189 time_t t;
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
190
4342
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
191 if (posix_time_parse (&tm0, s, syntax_bits))
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
192 return false;
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
193
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
194 tm1 = tm0;
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
195 tm1.tm_isdst = -1;
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
196 t = mktime (&tm1);
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
197
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
198 if (t != (time_t) -1)
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
199 tm = &tm1;
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
200 else
4342
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
201 {
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
202 /* mktime returns -1 for errors, but -1 is also a valid time_t
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
203 value. Check whether an error really occurred. */
4342
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
204 tm = localtime (&t);
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
205 if (! tm)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 12029
diff changeset
206 return false;
4342
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
207 }
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
208
11989
f40dff4e11c8 posixtm: don't reject a time with "60" as the number of seconds
Jim Meyering <meyering@redhat.com>
parents: 10860
diff changeset
209 /* Reject dates like "September 31" and times like "25:61".
f40dff4e11c8 posixtm: don't reject a time with "60" as the number of seconds
Jim Meyering <meyering@redhat.com>
parents: 10860
diff changeset
210 Do not reject times that specify "60" as the number of seconds. */
4342
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
211 if ((tm0.tm_year ^ tm->tm_year)
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
212 | (tm0.tm_mon ^ tm->tm_mon)
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
213 | (tm0.tm_mday ^ tm->tm_mday)
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
214 | (tm0.tm_hour ^ tm->tm_hour)
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
215 | (tm0.tm_min ^ tm->tm_min)
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
216 | (tm0.tm_sec ^ tm->tm_sec))
11989
f40dff4e11c8 posixtm: don't reject a time with "60" as the number of seconds
Jim Meyering <meyering@redhat.com>
parents: 10860
diff changeset
217 {
f40dff4e11c8 posixtm: don't reject a time with "60" as the number of seconds
Jim Meyering <meyering@redhat.com>
parents: 10860
diff changeset
218 /* Any mismatch without 60 in the tm_sec field is invalid. */
f40dff4e11c8 posixtm: don't reject a time with "60" as the number of seconds
Jim Meyering <meyering@redhat.com>
parents: 10860
diff changeset
219 if (tm0.tm_sec != 60)
f40dff4e11c8 posixtm: don't reject a time with "60" as the number of seconds
Jim Meyering <meyering@redhat.com>
parents: 10860
diff changeset
220 return false;
f40dff4e11c8 posixtm: don't reject a time with "60" as the number of seconds
Jim Meyering <meyering@redhat.com>
parents: 10860
diff changeset
221
f40dff4e11c8 posixtm: don't reject a time with "60" as the number of seconds
Jim Meyering <meyering@redhat.com>
parents: 10860
diff changeset
222 {
f40dff4e11c8 posixtm: don't reject a time with "60" as the number of seconds
Jim Meyering <meyering@redhat.com>
parents: 10860
diff changeset
223 /* Allow times like 01:35:60 or 23:59:60. */
f40dff4e11c8 posixtm: don't reject a time with "60" as the number of seconds
Jim Meyering <meyering@redhat.com>
parents: 10860
diff changeset
224 time_t dummy;
f40dff4e11c8 posixtm: don't reject a time with "60" as the number of seconds
Jim Meyering <meyering@redhat.com>
parents: 10860
diff changeset
225 char buf[16];
f40dff4e11c8 posixtm: don't reject a time with "60" as the number of seconds
Jim Meyering <meyering@redhat.com>
parents: 10860
diff changeset
226 char *b = stpcpy (buf, s);
f40dff4e11c8 posixtm: don't reject a time with "60" as the number of seconds
Jim Meyering <meyering@redhat.com>
parents: 10860
diff changeset
227 strcpy (b - 2, "59");
f40dff4e11c8 posixtm: don't reject a time with "60" as the number of seconds
Jim Meyering <meyering@redhat.com>
parents: 10860
diff changeset
228 if (!posixtime (&dummy, buf, syntax_bits))
f40dff4e11c8 posixtm: don't reject a time with "60" as the number of seconds
Jim Meyering <meyering@redhat.com>
parents: 10860
diff changeset
229 return false;
f40dff4e11c8 posixtm: don't reject a time with "60" as the number of seconds
Jim Meyering <meyering@redhat.com>
parents: 10860
diff changeset
230 }
f40dff4e11c8 posixtm: don't reject a time with "60" as the number of seconds
Jim Meyering <meyering@redhat.com>
parents: 10860
diff changeset
231 }
4342
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
232
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
233 *p = t;
16bad8d9422d Fix some minor time-related bugs with POSIX time arguments.
Jim Meyering <jim@meyering.net>
parents: 3699
diff changeset
234 return true;
1486
67065e70a10e rewrite from yacc-based version
Jim Meyering <jim@meyering.net>
parents:
diff changeset
235 }