Mercurial > hg > octave-shane > gnulib-hg
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 |
rev | line source |
---|---|
1513 | 1 /* Parse dates for touch and date. |
3618 | 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 | 30 #if HAVE_STRING_H |
31 # include <string.h> | |
32 #else | |
33 # include <strings.h> | |
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 | 42 #include "posixtm.h" |
3618 | 43 #include "unlocked-io.h" |
1490 | 44 |
45 /* ISDIGIT differs from isdigit, as follows: | |
46 - Its arg may be any int or unsigned int; it need not be an unsigned char. | |
47 - It's guaranteed to evaluate its argument exactly once. | |
48 - It's typically faster. | |
49 Posix 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that | |
50 only '0' through '9' are digits. Prefer ISDIGIT to isdigit unless | |
51 it's important to use the locale's definition of `digit' even when the | |
52 host does not conform to Posix. */ | |
53 #define ISDIGIT(c) ((unsigned) (c) - '0' <= 9) | |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 212 time_t |
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 | 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 | 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 | 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 | 231 |
232 #ifdef TEST_POSIXTIME | |
233 /* | |
234 Test mainly with syntax_bits == 13 | |
235 (aka: (PDS_LEADING_YEAR | PDS_CENTURY | PDS_SECONDS)) | |
236 | |
237 BEGIN-DATA | |
238 1112131415 13 1323807300 Tue Dec 13 14:15:00 2011 | |
239 1112131415.16 13 1323807316 Tue Dec 13 14:15:16 2011 | |
240 201112131415.16 13 1323807316 Tue Dec 13 14:15:16 2011 | |
241 191112131415.16 13 -1 *** | |
242 203712131415.16 13 2144348116 Sun Dec 13 14:15:16 2037 | |
243 3712131415.16 13 2144348116 Sun Dec 13 14:15:16 2037 | |
244 6812131415.16 13 -1 *** | |
245 6912131415.16 13 -1 *** | |
246 7012131415.16 13 29967316 Sun Dec 13 14:15:16 1970 | |
247 12131415.16 13 913580116 Sun Dec 13 14:15:16 1998 | |
248 | |
249 1213141599 2 945116100 Mon Dec 13 14:15:00 1999 | |
250 1213141500 2 976738500 Wed Dec 13 14:15:00 2000 | |
251 END-DATA | |
252 | |
253 */ | |
254 | |
255 # define MAX_BUFF_LEN 1024 | |
256 | |
257 int | |
258 main () | |
259 { | |
260 char buff[MAX_BUFF_LEN + 1]; | |
261 | |
262 buff[MAX_BUFF_LEN] = 0; | |
263 while (fgets (buff, MAX_BUFF_LEN, stdin) && buff[0]) | |
264 { | |
265 char time_str[MAX_BUFF_LEN]; | |
266 unsigned int syntax_bits; | |
267 time_t t; | |
268 char *result; | |
269 sscanf (buff, "%s %u", time_str, &syntax_bits); | |
270 t = posixtime (time_str, syntax_bits); | |
271 result = (t == (time_t) -1 ? "***" : ctime (&t)); | |
272 printf ("%d %s\n", (int) t, result); | |
273 } | |
274 exit (0); | |
275 | |
276 } | |
277 #endif |