Mercurial > hg > octave-shane > gnulib-hg
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 |
rev | line source |
---|---|
1513 | 1 /* Parse dates for touch and date. |
5159 | 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 | 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 | 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 | 33 |
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 | 37 - It's typically faster. |
3699 | 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 | 41 #define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9) |
1490 | 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 | 50 touch mmddhhmm[YY] FILE... (obsoleted by POSIX 1003.1-2001) |
6527 | 51 8 or 10 digits, YY (if present) must be in the range 69-99 |
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 | 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 | 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 | 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 | 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 | 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 | 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 } |