annotate lib/strftime.c @ 672:d4a380613840

Update from GNU libc -- this adds back %z and %s formats and reverts to old behavior where unrecognized format like %E is treated as eqivalent to `E'.
author Jim Meyering <jim@meyering.net>
date Sat, 17 Aug 1996 05:15:44 +0000
parents 78245dd88de4
children 8a8967d6be38
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
1 /* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
2
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
3 NOTE: The canonical source of this file is maintained with the GNU C Library.
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
4 Bugs can be reported to bug-glibc@prep.ai.mit.edu.
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
5
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
6 This program is free software; you can redistribute it and/or modify it
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
7 under the terms of the GNU General Public License as published by the
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
8 Free Software Foundation; either version 2, or (at your option) any
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
9 later version.
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
10
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
11 This program is distributed in the hope that it will be useful,
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
14 GNU General Public License for more details.
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
15
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
16 You should have received a copy of the GNU General Public License
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
17 along with this program; if not, write to the Free Software
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
19 USA. */
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
20
125
539738c0b6c2 merge with 1.8.1d
Jim Meyering <jim@meyering.net>
parents: 101
diff changeset
21 #ifdef HAVE_CONFIG_H
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
22 # include <config.h>
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
23 #endif
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
24
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
25 #ifdef _LIBC
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
26 # define HAVE_LIMITS_H 1
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
27 # define HAVE_MBLEN 1
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
28 # define HAVE_TM_ZONE 1
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
29 # define STDC_HEADERS 1
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
30 # include <ansidecl.h>
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
31 # include "../locale/localeinfo.h"
125
539738c0b6c2 merge with 1.8.1d
Jim Meyering <jim@meyering.net>
parents: 101
diff changeset
32 #endif
539738c0b6c2 merge with 1.8.1d
Jim Meyering <jim@meyering.net>
parents: 101
diff changeset
33
176
Jim Meyering <jim@meyering.net>
parents: 125
diff changeset
34 #include <stdio.h>
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
35 #include <sys/types.h> /* Some systems define `time_t' here. */
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
36
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
37 #ifdef TIME_WITH_SYS_TIME
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
38 # include <sys/time.h>
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
39 # include <time.h>
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
40 #else
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
41 # ifdef HAVE_SYS_TIME_H
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
42 # include <sys/time.h>
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
43 # else
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
44 # include <time.h>
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
45 # endif
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
46 #endif
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
47
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
48 #if HAVE_MBLEN
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
49 # include <ctype.h>
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
50 #endif
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
51
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
52 #if HAVE_LIMITS_H
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
53 # include <limits.h>
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
54 #endif
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
55
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
56 #if STDC_HEADERS
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
57 # include <stddef.h>
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
58 # include <stdlib.h>
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
59 # include <string.h>
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
60 #else
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
61 # define memcpy(d, s, n) bcopy (s, d, n)
176
Jim Meyering <jim@meyering.net>
parents: 125
diff changeset
62 #endif
Jim Meyering <jim@meyering.net>
parents: 125
diff changeset
63
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
64 #ifndef __P
657
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
65 #if defined (__GNUC__) || (defined (__STDC__) && __STDC__)
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
66 #define __P(args) args
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
67 #else
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
68 #define __P(args) ()
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
69 #endif /* GCC. */
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
70 #endif /* Not __P. */
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
71
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
72 #ifndef PTR
657
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
73 #ifdef __STDC__
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
74 #define PTR void *
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
75 #else
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
76 #define PTR char *
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
77 #endif
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
78 #endif
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
79
672
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
80 /* Uncomment following line in the production version. */
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
81 /* #define NDEBUG */
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
82 #include <assert.h>
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
83
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
84 static unsigned int week __P ((const struct tm *const, int, int));
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
85
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
86
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
87 #define add(n, f) \
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
88 do \
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
89 { \
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
90 i += (n); \
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
91 if (i >= maxsize) \
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
92 return 0; \
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
93 else \
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
94 if (p) \
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
95 { \
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
96 f; \
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
97 p += (n); \
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
98 } \
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
99 } while (0)
672
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
100 #define cpy(n, s) add ((n), memcpy((PTR) p, (PTR) (s), (n)))
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
101
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
102 #ifdef _LIBC
657
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
103 #define fmt(n, args) add((n), if (sprintf args != (n)) return 0)
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
104 #else
657
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
105 #define fmt(n, args) add((n), sprintf args; if (strlen (p) != (n)) return 0)
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
106 #endif
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
107
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
108
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
109
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
110 /* Return the week in the year specified by TP,
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
111 with weeks starting on STARTING_DAY. */
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
112 #ifdef __GNUC__
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
113 inline
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
114 #endif
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
115 static unsigned int
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
116 week (tp, starting_day, max_preceding)
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
117 const struct tm *const tp;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
118 int starting_day;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
119 int max_preceding;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
120 {
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
121 int wday, dl, base;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
122
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
123 wday = tp->tm_wday - starting_day;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
124 if (wday < 0)
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
125 wday += 7;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
126
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
127 /* Set DL to the day in the year of the first day of the week
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
128 containing the day specified in TP. */
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
129 dl = tp->tm_yday - wday;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
130
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
131 /* For the computation following ISO 8601:1988 we set the number of
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
132 the week containing January 1st to 1 if this week has more than
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
133 MAX_PRECEDING days in the new year. For ISO 8601 this number is
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
134 3, for the other representation it is 7 (i.e., not to be
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
135 fulfilled). */
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
136 base = ((dl + 7) % 7) > max_preceding ? 1 : 0;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
137
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
138 /* If DL is negative we compute the result as 0 unless we have to
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
139 compute it according ISO 8601. In this case we have to return 53
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
140 or 1 if the week containing January 1st has less than 4 days in
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
141 the new year or not. If DL is not negative we calculate the
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
142 number of complete weeks for our week (DL / 7) plus 1 (because
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
143 only for DL < 0 we are in week 0/53 and plus the number of the
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
144 first week computed in the last step. */
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
145 return dl < 0 ? (dl < -max_preceding ? 53 : base)
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
146 : base + 1 + dl / 7;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
147 }
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
148
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
149 #ifndef _NL_CURRENT
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
150 static char const weekday_name[][10] =
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
151 {
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
152 "Sunday", "Monday", "Tuesday", "Wednesday",
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
153 "Thursday", "Friday", "Saturday"
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
154 };
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
155 static char const month_name[][10] =
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
156 {
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
157 "January", "February", "March", "April", "May", "June",
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
158 "July", "August", "September", "October", "November", "December"
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
159 };
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
160 #endif
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
161
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
162 /* Write information from TP into S according to the format
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
163 string FORMAT, writing no more that MAXSIZE characters
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
164 (including the terminating '\0') and returning number of
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
165 characters written. If S is NULL, nothing will be written
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
166 anywhere, so to determine how many characters would be
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
167 written, use NULL for S and (size_t) UINT_MAX for MAXSIZE. */
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
168 size_t
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
169 strftime (s, maxsize, format, tp)
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
170 char *s;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
171 size_t maxsize;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
172 const char *format;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
173 register const struct tm *tp;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
174 {
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
175 int hour12 = tp->tm_hour;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
176 #ifdef _NL_CURRENT
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
177 const char *const a_wkday = _NL_CURRENT (LC_TIME, ABDAY_1 + tp->tm_wday);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
178 const char *const f_wkday = _NL_CURRENT (LC_TIME, DAY_1 + tp->tm_wday);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
179 const char *const a_month = _NL_CURRENT (LC_TIME, ABMON_1 + tp->tm_mon);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
180 const char *const f_month = _NL_CURRENT (LC_TIME, MON_1 + tp->tm_mon);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
181 const char *const ampm = _NL_CURRENT (LC_TIME,
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
182 hour12 > 11 ? PM_STR : AM_STR);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
183 size_t aw_len = strlen(a_wkday);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
184 size_t am_len = strlen(a_month);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
185 size_t ap_len = strlen (ampm);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
186 #else
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
187 const char *const f_wkday = weekday_name[tp->tm_wday];
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
188 const char *const f_month = month_name[tp->tm_mon];
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
189 const char *const a_wkday = f_wkday;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
190 const char *const a_month = f_month;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
191 const char *const ampm = "AMPM" + 2 * (hour12 > 11);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
192 size_t aw_len = 3;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
193 size_t am_len = 3;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
194 size_t ap_len = 2;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
195 #endif
672
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
196 size_t wkday_len = strlen (f_wkday);
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
197 size_t month_len = strlen (f_month);
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
198 const unsigned int y_week0 = week (tp, 0, 7);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
199 const unsigned int y_week1 = week (tp, 1, 7);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
200 const unsigned int y_week2 = week (tp, 1, 3);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
201 const char *zone;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
202 size_t zonelen;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
203 register size_t i = 0;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
204 register char *p = s;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
205 register const char *f;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
206 char number_fmt[5];
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
207
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
208 /* Initialize the buffer we will use for the sprintf format for numbers. */
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
209 number_fmt[0] = '%';
582
3ec26150a8d6 (mon_week_ISO): New function to implement new %V format.
Jim Meyering <jim@meyering.net>
parents: 581
diff changeset
210
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
211 zone = 0;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
212 #if HAVE_TM_ZONE
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
213 zone = (const char *) tp->tm_zone;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
214 #endif
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
215 #if HAVE_TZNAME
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
216 if (!(zone && *zone) && tp->tm_isdst >= 0)
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
217 zone = tzname[tp->tm_isdst];
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
218 #endif
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
219 if (!(zone && *zone))
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
220 zone = "???";
582
3ec26150a8d6 (mon_week_ISO): New function to implement new %V format.
Jim Meyering <jim@meyering.net>
parents: 581
diff changeset
221
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
222 zonelen = strlen (zone);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
223
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
224 if (hour12 > 12)
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
225 hour12 -= 12;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
226 else
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
227 if (hour12 == 0) hour12 = 12;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
228
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
229 for (f = format; *f != '\0'; ++f)
582
3ec26150a8d6 (mon_week_ISO): New function to implement new %V format.
Jim Meyering <jim@meyering.net>
parents: 581
diff changeset
230 {
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
231 enum { pad_zero, pad_space, pad_none } pad; /* Padding for number. */
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
232 unsigned int maxdigits; /* Max digits for numeric format. */
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
233 unsigned int number_value; /* Numeric value to be printed. */
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
234 const char *subfmt;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
235
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
236 #if HAVE_MBLEN
672
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
237 if (!isascii (*f))
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
238 {
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
239 /* Non-ASCII, may be a multibyte. */
672
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
240 int len = mblen (f, strlen (f));
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
241 if (len > 0)
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
242 {
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
243 cpy(len, f);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
244 continue;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
245 }
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
246 }
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
247 #endif
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
248
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
249 if (*f != '%')
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
250 {
672
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
251 add (1, *p = *f);
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
252 continue;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
253 }
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
254
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
255 /* Check for flags that can modify a number format. */
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
256 ++f;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
257 switch (*f)
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
258 {
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
259 case '_':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
260 pad = pad_space;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
261 ++f;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
262 break;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
263 case '-':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
264 pad = pad_none;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
265 ++f;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
266 break;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
267 default:
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
268 pad = pad_zero;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
269 break;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
270 }
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
271
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
272 /* Now do the specified format. */
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
273 switch (*f)
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
274 {
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
275 case '\0':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
276 case '%':
672
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
277 add (1, *p = *f);
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
278 break;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
279
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
280 case 'a':
672
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
281 cpy (aw_len, a_wkday);
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
282 break;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
283
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
284 case 'A':
672
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
285 cpy (wkday_len, f_wkday);
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
286 break;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
287
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
288 case 'b':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
289 case 'h': /* GNU extension. */
672
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
290 cpy (am_len, a_month);
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
291 break;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
292
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
293 case 'B':
672
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
294 cpy (month_len, f_month);
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
295 break;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
296
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
297 case 'c':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
298 #ifdef _NL_CURRENT
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
299 subfmt = _NL_CURRENT (LC_TIME, D_T_FMT);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
300 #else
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
301 subfmt = "%a %b %d %H:%M:%S %Z %Y";
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
302 #endif
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
303 subformat:
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
304 {
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
305 size_t len = strftime (p, maxsize - i, subfmt, tp);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
306 if (len == 0 && *subfmt)
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
307 return 0;
659
3573b0b5ed38 Use `;' instead of (void)0.
Jim Meyering <jim@meyering.net>
parents: 658
diff changeset
308 add (len, ;);
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
309 }
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
310 break;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
311
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
312 #define DO_NUMBER(digits, value) \
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
313 maxdigits = digits; number_value = value; goto do_number
657
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
314 #define DO_NUMBER_SPACEPAD(digits, value) \
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
315 maxdigits = digits; number_value = value; goto do_number_spacepad
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
316
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
317 case 'C':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
318 DO_NUMBER (2, (1900 + tp->tm_year) / 100);
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
319
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
320 case 'x':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
321 #ifdef _NL_CURRENT
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
322 subfmt = _NL_CURRENT (LC_TIME, D_FMT);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
323 goto subformat;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
324 #endif
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
325 /* Fall through. */
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
326 case 'D': /* GNU extension. */
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
327 subfmt = "%m/%d/%y";
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
328 goto subformat;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
329
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
330 case 'd':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
331 DO_NUMBER (2, tp->tm_mday);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
332
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
333 case 'e': /* GNU extension: %d, but blank-padded. */
657
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
334 DO_NUMBER_SPACEPAD (2, tp->tm_mday);
176
Jim Meyering <jim@meyering.net>
parents: 125
diff changeset
335
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
336 /* All numeric formats set MAXDIGITS and NUMBER_VALUE and then
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
337 jump to one of these two labels. */
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
338
657
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
339 do_number_spacepad:
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
340 /* Force `_' flag. */
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
341 pad = pad_space;
176
Jim Meyering <jim@meyering.net>
parents: 125
diff changeset
342
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
343 do_number:
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
344 {
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
345 /* Format the number according to the PAD flag. */
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
346
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
347 register char *nf = &number_fmt[1];
668
78245dd88de4 Update from GNU libc master.
Jim Meyering <jim@meyering.net>
parents: 659
diff changeset
348 int printed = maxdigits;
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
349
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
350 switch (pad)
546
baaeb11e50e5 (add_num_tz): New function.
Jim Meyering <jim@meyering.net>
parents: 307
diff changeset
351 {
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
352 case pad_zero:
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
353 *nf++ = '0';
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
354 case pad_space:
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
355 *nf++ = '0' + maxdigits;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
356 case pad_none:
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
357 *nf++ = 'u';
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
358 *nf = '\0';
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
359 }
546
baaeb11e50e5 (add_num_tz): New function.
Jim Meyering <jim@meyering.net>
parents: 307
diff changeset
360
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
361 #ifdef _LIBC
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
362 add (maxdigits, printed = sprintf (p, number_fmt, number_value));
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
363 #else
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
364 add (maxdigits, sprintf (p, number_fmt, number_value);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
365 printed = strlen (p));
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
366 #endif
657
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
367 /* Back up if fewer than MAXDIGITS chars written for pad_none. */
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
368 p -= maxdigits - printed;
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
369 i -= maxdigits - printed;
546
baaeb11e50e5 (add_num_tz): New function.
Jim Meyering <jim@meyering.net>
parents: 307
diff changeset
370
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
371 break;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
372 }
546
baaeb11e50e5 (add_num_tz): New function.
Jim Meyering <jim@meyering.net>
parents: 307
diff changeset
373
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
374
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
375 case 'H':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
376 DO_NUMBER (2, tp->tm_hour);
546
baaeb11e50e5 (add_num_tz): New function.
Jim Meyering <jim@meyering.net>
parents: 307
diff changeset
377
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
378 case 'I':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
379 DO_NUMBER (2, hour12);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
380
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
381 case 'k': /* GNU extension. */
657
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
382 DO_NUMBER_SPACEPAD (2, tp->tm_hour);
546
baaeb11e50e5 (add_num_tz): New function.
Jim Meyering <jim@meyering.net>
parents: 307
diff changeset
383
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
384 case 'l': /* GNU extension. */
657
603fe5f2b1d9 Update from FSF.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
385 DO_NUMBER_SPACEPAD (2, hour12);
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
386
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
387 case 'j':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
388 DO_NUMBER (3, 1 + tp->tm_yday);
546
baaeb11e50e5 (add_num_tz): New function.
Jim Meyering <jim@meyering.net>
parents: 307
diff changeset
389
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
390 case 'M':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
391 DO_NUMBER (2, tp->tm_min);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
392
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
393 case 'm':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
394 DO_NUMBER (2, tp->tm_mon + 1);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
395
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
396 case 'n': /* GNU extension. */
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
397 add (1, *p = '\n');
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
398 break;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
399
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
400 case 'p':
672
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
401 cpy (ap_len, ampm);
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
402 break;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
403
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
404 case 'R': /* GNU extension. */
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
405 subfmt = "%H:%M";
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
406 goto subformat;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
407
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
408 case 'r': /* GNU extension. */
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
409 subfmt = "%I:%M:%S %p";
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
410 goto subformat;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
411
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
412 case 'S':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
413 DO_NUMBER (2, tp->tm_sec);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
414
672
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
415 case 's': /* GNU extension. */
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
416 {
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
417 struct tm writable_tm = *tp;
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
418 unsigned long int num = (unsigned long int) mktime (&writable_tm);
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
419 /* `3 * sizeof (unsigned long int)' is an approximation of
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
420 the size of the decimal representation of NUM, valid
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
421 for sizes <= 16. */
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
422 int printed = 3 * sizeof (unsigned long int);
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
423 maxdigits = printed;
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
424 assert (sizeof (unsigned long int) <= 16);
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
425 #ifdef _LIBC
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
426 add (maxdigits, printed = sprintf (p, "%lu", num));
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
427 #else
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
428 add (maxdigits, sprintf (p, "%lu", num); printed = strlen (p));
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
429 #endif
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
430 /* Back up if fewer than MAXDIGITS chars written for pad_none. */
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
431 p -= maxdigits - printed;
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
432 i -= maxdigits - printed;
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
433 }
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
434 break;
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
435
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
436 case 'X':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
437 #ifdef _NL_CURRENT
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
438 subfmt = _NL_CURRENT (LC_TIME, T_FMT);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
439 goto subformat;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
440 #endif
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
441 /* Fall through. */
672
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
442 case 'T': /* GNU extension. */
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
443 subfmt = "%H:%M:%S";
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
444 goto subformat;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
445
672
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
446 case 't': /* GNU extension. */
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
447 add (1, *p = '\t');
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
448 break;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
449
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
450 case 'U':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
451 DO_NUMBER (2, y_week0);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
452
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
453 case 'V':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
454 DO_NUMBER (2, y_week2);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
455
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
456 case 'W':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
457 DO_NUMBER (2, y_week1);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
458
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
459 case 'w':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
460 DO_NUMBER (2, tp->tm_wday);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
461
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
462 case 'Y':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
463 DO_NUMBER (4, 1900 + tp->tm_year);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
464
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
465 case 'y':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
466 DO_NUMBER (2, tp->tm_year % 100);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
467
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
468 case 'Z':
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
469 cpy(zonelen, zone);
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
470 break;
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
471
672
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
472 case 'z':
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
473 {
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
474 struct tm tml = *tp;
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
475 time_t t = mktime (&tml);
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
476 struct tm tmg;
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
477 int diff;
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
478
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
479 tml = *localtime (&t); /* Canonicalize the local time. */
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
480 tmg = *gmtime (&t);
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
481
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
482 /* Compute the difference. */
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
483 diff = tml.tm_min - tmg.tm_min;
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
484 diff += 60 * (tml.tm_hour - tmg.tm_hour);
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
485
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
486 if (tml.tm_mon != tmg.tm_mon)
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
487 {
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
488 /* We assume no timezone differs from UTC by more than
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
489 +- 23 hours. This should be safe. */
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
490 if (tmg.tm_mday == 1)
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
491 tml.tm_mday = 0;
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
492 else /* tml.tm_mday == 1 */
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
493 tmg.tm_mday = 0;
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
494 }
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
495 diff += 1440 * (tml.tm_mday - tmg.tm_mday);
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
496
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
497 if (diff < 0)
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
498 {
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
499 add (1, *p = '-');
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
500 diff = -diff;
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
501 }
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
502 else
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
503 add (1, *p = '+');
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
504
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
505 pad = pad_zero;
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
506 DO_NUMBER (4, ((diff / 60) % 24) * 100 + diff % 60);
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
507 }
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
508
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
509 default:
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
510 /* Bad format. */
672
d4a380613840 Update from GNU libc -- this adds back %z and %s
Jim Meyering <jim@meyering.net>
parents: 668
diff changeset
511 add (1, *p = *f);
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
512 break;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
513 }
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
514 }
604
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
515
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
516 if (p)
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
517 *p = '\0';
e54f6bf3d960 Update from GNU libc.
Jim Meyering <jim@meyering.net>
parents: 582
diff changeset
518 return i;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
519 }