annotate src/strftime.c @ 771:943eaba38521

[xemacs-hg @ 2002-03-13 08:51:24 by ben] The big ben-mule-21-5 check-in! Various files were added and deleted. See CHANGES-ben-mule. There are still some test suite failures. No crashes, though. Many of the failures have to do with problems in the test suite itself rather than in the actual code. I'll be addressing these in the next day or so -- none of the test suite failures are at all critical. Meanwhile I'll be trying to address the biggest issues -- i.e. build or run failures, which will almost certainly happen on various platforms. All comments should be sent to ben@xemacs.org -- use a Cc: if necessary when sending to mailing lists. There will be pre- and post- tags, something like pre-ben-mule-21-5-merge-in, and post-ben-mule-21-5-merge-in.
author ben
date Wed, 13 Mar 2002 08:54:06 +0000
parents abe6d1db359e
children e38acbeb1cae
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* strftime - custom formatting of date and/or time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1989, 1991, 1992 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 This program is free software; you can redistribute it and/or modify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 the Free Software Foundation; either version 2, or (at your option)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 any later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 GNU General Public License for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 along with this program; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 /* Synched up with: FSF 19.30. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 442
diff changeset
21 /* This file has been ... uhhhhh ... Mule-ized. Yeah.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 442
diff changeset
22
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 442
diff changeset
23 (Everything here is external format. This is DANGEROUS and
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 442
diff changeset
24 data-lossy, but fixing it is too much of a bother now.) --ben */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 442
diff changeset
25
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 /* Note: this version of strftime lacks locale support,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 but it is standalone.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 Performs `%' substitutions similar to those in printf. Except
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 where noted, substituted fields have a fixed size; numeric fields are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 padded if necessary. Padding is with zeros by default; for fields
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 that display a single number, padding can be changed or inhibited by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 following the `%' with one of the modifiers described below. Unknown
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 field specifiers are copied as normal characters. All other
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 characters are copied to the output without change.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 Supports a superset of the ANSI C field specifiers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 Literal character fields:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 % %
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 n newline
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 t tab
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 Numeric modifiers (a nonstandard extension):
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 - do not pad the field
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 _ pad the field with spaces
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 Time fields:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 %H hour (00..23)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 %I hour (01..12)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 %k hour ( 0..23)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 %l hour ( 1..12)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 %M minute (00..59)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 %p locale's AM or PM
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 %r time, 12-hour (hh:mm:ss [AP]M)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 %R time, 24-hour (hh:mm)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 %s time in seconds since 00:00:00, Jan 1, 1970 (a nonstandard extension)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 %S second (00..61)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 %T time, 24-hour (hh:mm:ss)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 %X locale's time representation (%H:%M:%S)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 %Z time zone (EDT), or nothing if no time zone is determinable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 Date fields:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 %a locale's abbreviated weekday name (Sun..Sat)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 %A locale's full weekday name, variable length (Sunday..Saturday)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 %b locale's abbreviated month name (Jan..Dec)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 %B locale's full month name, variable length (January..December)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 %c locale's date and time (Sat Nov 04 12:02:33 EST 1989)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 %C century (00..99)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 %d day of month (01..31)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 %e day of month ( 1..31)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 %D date (mm/dd/yy)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 %h same as %b
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 %j day of year (001..366)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 %m month (01..12)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 %U week number of year with Sunday as first day of week (00..53)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 %w day of week (0..6)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 %W week number of year with Monday as first day of week (00..53)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 %x locale's date representation (mm/dd/yy)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 %y last two digits of year (00..99)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 %Y year (1970...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 David MacKenzie <djm@gnu.ai.mit.edu> */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 #ifdef HAVE_CONFIG_H
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 #include <stdio.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 #include <sys/types.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 #if defined(TM_IN_SYS_TIME) || (!defined(HAVE_TM_ZONE) && !defined(HAVE_TZNAME))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 #include <sys/time.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 #include <time.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 #ifndef STDC_HEADERS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 time_t mktime ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
102 #if defined(WIN32_NATIVE) || defined(CYGWIN)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 #include <time.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 #if defined(HAVE_TZNAME)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 extern char *tzname[2];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 #endif
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
108 #endif /* WIN32_NATIVE */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 #ifdef emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 #define strftime emacs_strftime
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 /* Types of padding for numbers in date and time. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 enum padding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 none, blank, zero
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
120 static char const* const days[] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
125 static char const * const months[] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 "January", "February", "March", "April", "May", "June",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 "July", "August", "September", "October", "November", "December"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 /* Add character C to STRING and increment LENGTH,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 unless LENGTH would exceed MAX. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 #define add_char(c) do \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 if (length + 1 <= max) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 string[length++] = (c); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 /* Add a 2 digit number to STRING, padding if specified.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 Return the number of characters added, up to MAX. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 add_num2 (char *string, int num, int max, enum padding pad)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 int top = num / 10;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 int length = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 if (top == 0 && pad == blank)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 add_char (' ');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 else if (top != 0 || pad == zero)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 add_char (top + '0');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 add_char (num % 10 + '0');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 return length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 /* Add a 3 digit number to STRING, padding if specified.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 Return the number of characters added, up to MAX. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 add_num3 (char *string, int num, int max, enum padding pad)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 int top = num / 100;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 int mid = (num - top * 100) / 10;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 int length = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 if (top == 0 && pad == blank)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 add_char (' ');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 else if (top != 0 || pad == zero)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 add_char (top + '0');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 if (mid == 0 && top == 0 && pad == blank)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 add_char (' ');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 else if (mid != 0 || top != 0 || pad == zero)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 add_char (mid + '0');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 add_char (num % 10 + '0');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 return length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 /* Like strncpy except return the number of characters copied. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 static int
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
182 add_str (char *to, const char *from, int max)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 for (i = 0; from[i] && i <= max; ++i)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 to[i] = from[i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 return i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 add_num_time_t (char *string, int max, time_t num)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 /* This buffer is large enough to hold the character representation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 (including the trailing NUL) of any unsigned decimal quantity
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 whose binary representation fits in 128 bits. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 char buf[40];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 int length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 if (sizeof (num) > 16)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 sprintf (buf, "%lu", (unsigned long) num);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 length = add_str (string, buf, max);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 return length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 /* Return the week in the year of the time in TM, with the weeks
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 starting on Sundays. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 static int
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
211 sun_week (const struct tm *tm)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 int dl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 /* Set `dl' to the day in the year of the last day of the week previous
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 to the one containing the day specified in TM. If the day specified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 in TM is in the first week of the year, `dl' will be negative or 0.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 Otherwise, calculate the number of complete weeks before our week
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 (dl / 7) and add any partial week at the start of the year (dl % 7). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 dl = tm->tm_yday - tm->tm_wday;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 return dl <= 0 ? 0 : dl / 7 + (dl % 7 != 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 /* Return the week in the year of the time in TM, with the weeks
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 starting on Mondays. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 static int
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
228 mon_week (const struct tm *tm)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 int dl, wday;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 if (tm->tm_wday == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 wday = 6;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 wday = tm->tm_wday - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 dl = tm->tm_yday - wday;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 return dl <= 0 ? 0 : dl / 7 + (dl % 7 != 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 #if !defined(HAVE_TM_ZONE) && !defined(HAVE_TZNAME)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
241 char *zone_name (const struct tm *tp);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 char *
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
243 zone_name (const struct tm *tp)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 char *timezone ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 struct timeval tv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 struct timezone tz;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 gettimeofday (&tv, &tz);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 return timezone (tz.tz_minuteswest, tp->tm_isdst);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 /* Format the time given in TM according to FORMAT, and put the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 results in STRING.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 Return the number of characters (not including terminating null)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 that were put into STRING, or 0 if the length would have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 exceeded MAX. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
260 size_t strftime (char *string, size_t max, const char *format,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
261 const struct tm *tm);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 size_t
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
264 strftime (char *string, size_t max, const char *format, const struct tm *tm)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 enum padding pad; /* Type of padding to apply. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 size_t length = 0; /* Characters put in STRING so far. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 for (; *format && length < max; ++format)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 if (*format != '%')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 add_char (*format);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 ++format;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 /* Modifiers: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 if (*format == '-')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 pad = none;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 ++format;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 else if (*format == '_')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 pad = blank;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 ++format;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 pad = zero;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 switch (*format)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 /* Literal character fields: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 case 0:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 case '%':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 add_char ('%');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 case 'n':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 add_char ('\n');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 case 't':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 add_char ('\t');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 add_char (*format);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 /* Time fields: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 case 'H':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 case 'k':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 add_num2 (&string[length], tm->tm_hour, max - length,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 *format == 'H' ? pad : blank);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 case 'I':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 case 'l':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 int hour12;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 if (tm->tm_hour == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 hour12 = 12;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 else if (tm->tm_hour > 12)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 hour12 = tm->tm_hour - 12;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 hour12 = tm->tm_hour;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 add_num2 (&string[length], hour12, max - length,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 *format == 'I' ? pad : blank);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 case 'M':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 add_num2 (&string[length], tm->tm_min, max - length, pad);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 case 'p':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 if (tm->tm_hour < 12)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 add_char ('A');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 add_char ('P');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 add_char ('M');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 case 'r':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 strftime (&string[length], max - length, "%I:%M:%S %p", tm);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 case 'R':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 strftime (&string[length], max - length, "%H:%M", tm);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 case 's':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 struct tm writable_tm;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 writable_tm = *tm;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 length += add_num_time_t (&string[length], max - length,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 mktime (&writable_tm));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 case 'S':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 add_num2 (&string[length], tm->tm_sec, max - length, pad);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 case 'T':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 strftime (&string[length], max - length, "%H:%M:%S", tm);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 case 'X':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 strftime (&string[length], max - length, "%H:%M:%S", tm);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 case 'Z':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 #ifdef HAVE_TM_ZONE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 length += add_str (&string[length], tm->tm_zone, max - length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 #ifdef HAVE_TZNAME
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 if (tm->tm_isdst && tzname[1] && *tzname[1])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 length += add_str (&string[length], tzname[1], max - length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 length += add_str (&string[length], tzname[0], max - length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 length += add_str (&string[length], zone_name (tm), max - length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 /* Date fields: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 case 'a':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 add_char (days[tm->tm_wday][0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 add_char (days[tm->tm_wday][1]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 add_char (days[tm->tm_wday][2]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 case 'A':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 add_str (&string[length], days[tm->tm_wday], max - length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 case 'b':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 case 'h':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 add_char (months[tm->tm_mon][0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 add_char (months[tm->tm_mon][1]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 add_char (months[tm->tm_mon][2]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 case 'B':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 add_str (&string[length], months[tm->tm_mon], max - length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 case 'c':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 strftime (&string[length], max - length,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 "%a %b %d %H:%M:%S %Z %Y", tm);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 case 'C':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 add_num2 (&string[length], (tm->tm_year + 1900) / 100,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 max - length, pad);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 case 'd':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 add_num2 (&string[length], tm->tm_mday, max - length, pad);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 case 'e':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 add_num2 (&string[length], tm->tm_mday, max - length, blank);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 case 'D':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 strftime (&string[length], max - length, "%m/%d/%y", tm);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 case 'j':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 add_num3 (&string[length], tm->tm_yday + 1, max - length, pad);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 case 'm':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 add_num2 (&string[length], tm->tm_mon + 1, max - length, pad);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 case 'U':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 add_num2 (&string[length], sun_week (tm), max - length, pad);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 case 'w':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 add_char (tm->tm_wday + '0');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 case 'W':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 add_num2 (&string[length], mon_week (tm), max - length, pad);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 case 'x':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 strftime (&string[length], max - length, "%m/%d/%y", tm);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 case 'y':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 add_num2 (&string[length], tm->tm_year % 100,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 max - length, pad);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 case 'Y':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 add_char ((tm->tm_year + 1900) / 1000 + '0');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 add_num3 (&string[length],
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 (1900 + tm->tm_year) % 1000, max - length, zero);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 add_char (0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 return length - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 }