annotate src/strftime.c @ 5263:0d436a78c514

Add an implementation for #'the, cl-macs.el lisp/ChangeLog addition: 2010-09-16 Aidan Kehoe <kehoea@parhasard.net> * cl-macs.el (the): Add a docstring and an implementation for this macro. * bytecomp.el (byte-compile-initial-macro-environment): Add #'the to this, checking byte-compile-delete-errors to decide whether to make the type assertion. Change the initvalue to use backquote and preceding commas for the lambda expressions, to allow the latter to be compiled.
author Aidan Kehoe <kehoea@parhasard.net>
date Thu, 16 Sep 2010 13:36:03 +0100
parents 1537701f08a1
children 308d34e9f07d
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)
4203
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
61 %z time zone offset (e.g. +0530, -0800 etc)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 %Z time zone (EDT), or nothing if no time zone is determinable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 Date fields:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 %a locale's abbreviated weekday name (Sun..Sat)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 %A locale's full weekday name, variable length (Sunday..Saturday)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 %b locale's abbreviated month name (Jan..Dec)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 %B locale's full month name, variable length (January..December)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 %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
70 %C century (00..99)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 %d day of month (01..31)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 %e day of month ( 1..31)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 %D date (mm/dd/yy)
4203
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
74 %G year corresponding to the ISO 8601 week
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
75 %g Year of the ISO 8601 week within century (00 - 99)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 %h same as %b
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 %j day of year (001..366)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 %m month (01..12)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 %U week number of year with Sunday as first day of week (00..53)
4203
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
80 %V ISO 8601 week number (first week is the earliest one with Thu)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 %w day of week (0..6)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 %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
83 %x locale's date representation (mm/dd/yy)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 %y last two digits of year (00..99)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 %Y year (1970...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 David MacKenzie <djm@gnu.ai.mit.edu> */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 #ifdef HAVE_CONFIG_H
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 #include <stdio.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 #include <sys/types.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 #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
97 #include <sys/time.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 #include <time.h>
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 #ifndef STDC_HEADERS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 time_t mktime ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
106 #if defined(WIN32_NATIVE) || defined(CYGWIN)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 #include <time.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 #if defined(HAVE_TZNAME)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 extern char *tzname[2];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 #endif
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
112 #endif /* WIN32_NATIVE */
428
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 #ifdef emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 #define strftime emacs_strftime
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 /* Types of padding for numbers in date and time. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 enum padding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 none, blank, zero
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
124 static char const* const days[] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
129 static char const * const months[] =
428
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 "January", "February", "March", "April", "May", "June",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 "July", "August", "September", "October", "November", "December"
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
5254
1537701f08a1 Support Roman month numbers, #'format-time-string
Aidan Kehoe <kehoea@parhasard.net>
parents: 5016
diff changeset
135 static char const * const roman_upper[] =
1537701f08a1 Support Roman month numbers, #'format-time-string
Aidan Kehoe <kehoea@parhasard.net>
parents: 5016
diff changeset
136 {
1537701f08a1 Support Roman month numbers, #'format-time-string
Aidan Kehoe <kehoea@parhasard.net>
parents: 5016
diff changeset
137 "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII"
1537701f08a1 Support Roman month numbers, #'format-time-string
Aidan Kehoe <kehoea@parhasard.net>
parents: 5016
diff changeset
138 };
1537701f08a1 Support Roman month numbers, #'format-time-string
Aidan Kehoe <kehoea@parhasard.net>
parents: 5016
diff changeset
139
1537701f08a1 Support Roman month numbers, #'format-time-string
Aidan Kehoe <kehoea@parhasard.net>
parents: 5016
diff changeset
140 static char const * const roman_lower[] =
1537701f08a1 Support Roman month numbers, #'format-time-string
Aidan Kehoe <kehoea@parhasard.net>
parents: 5016
diff changeset
141 {
1537701f08a1 Support Roman month numbers, #'format-time-string
Aidan Kehoe <kehoea@parhasard.net>
parents: 5016
diff changeset
142 "i", "ii", "iii", "iv", "v", "vi", "vii", "viii", "ix", "x", "xi", "xii"
1537701f08a1 Support Roman month numbers, #'format-time-string
Aidan Kehoe <kehoea@parhasard.net>
parents: 5016
diff changeset
143 };
1537701f08a1 Support Roman month numbers, #'format-time-string
Aidan Kehoe <kehoea@parhasard.net>
parents: 5016
diff changeset
144
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 /* Add character C to STRING and increment LENGTH,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 unless LENGTH would exceed MAX. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 #define add_char(c) do \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 if (length + 1 <= max) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 string[length++] = (c); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 /* Add a 2 digit number to STRING, padding if specified.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 Return the number of characters added, up to MAX. */
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 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 add_num2 (char *string, int num, int max, enum padding pad)
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 int top = num / 10;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 int length = 0;
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 if (top == 0 && pad == blank)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 add_char (' ');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 else if (top != 0 || pad == zero)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 add_char (top + '0');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 add_char (num % 10 + '0');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 return length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 /* Add a 3 digit number to STRING, padding if specified.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 Return the number of characters added, up to MAX. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 add_num3 (char *string, int num, int max, enum padding pad)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 int top = num / 100;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 int mid = (num - top * 100) / 10;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 int length = 0;
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 if (top == 0 && pad == blank)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 add_char (' ');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 else if (top != 0 || pad == zero)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 add_char (top + '0');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 if (mid == 0 && top == 0 && pad == blank)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 add_char (' ');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 else if (mid != 0 || top != 0 || pad == zero)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 add_char (mid + '0');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 add_char (num % 10 + '0');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 return length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 /* Like strncpy except return the number of characters copied. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 static int
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
196 add_str (char *to, const char *from, int max)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 int i;
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 for (i = 0; from[i] && i <= max; ++i)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 to[i] = from[i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 return i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 add_num_time_t (char *string, int max, time_t num)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 /* This buffer is large enough to hold the character representation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 (including the trailing NUL) of any unsigned decimal quantity
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 whose binary representation fits in 128 bits. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 char buf[40];
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 if (sizeof (num) > 16)
2500
3d8143fc88e1 [xemacs-hg @ 2005-01-24 23:33:30 by ben]
ben
parents: 793
diff changeset
214 ABORT ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 sprintf (buf, "%lu", (unsigned long) num);
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
216 return add_str (string, buf, max);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 /* 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
220 starting on Sundays. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 static int
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
223 sun_week (const struct tm *tm)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 int dl;
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 /* 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
228 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
229 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
230 Otherwise, calculate the number of complete weeks before our week
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 (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
232 dl = tm->tm_yday - tm->tm_wday;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 return dl <= 0 ? 0 : dl / 7 + (dl % 7 != 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 /* 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
237 starting on Mondays. */
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 static int
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
240 mon_week (const struct tm *tm)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 int dl, wday;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 if (tm->tm_wday == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 wday = 6;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 wday = tm->tm_wday - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 dl = tm->tm_yday - wday;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 return dl <= 0 ? 0 : dl / 7 + (dl % 7 != 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251
4203
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
252 #ifndef __isleap
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
253 /* Nonzero if YEAR is a leap year (every 4 years,
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
254 except every 100th isn't, and every 400th is). */
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
255 # define __isleap(year) \
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
256 ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
257 #endif
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
258
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
259 /* The number of days from the first day of the first ISO week of this
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
260 year to the year day YDAY with week day WDAY. ISO weeks start on
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
261 Monday; the first ISO week has the year's first Thursday. YDAY may
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
262 be as small as YDAY_MINIMUM. */
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
263 #define ISO_WEEK_START_WDAY 1 /* Monday */
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
264 #define ISO_WEEK1_WDAY 4 /* Thursday */
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
265 #define YDAY_MINIMUM (-366)
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
266 static int
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
267 iso_week_days (int yday, int wday)
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
268 {
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
269 /* Add enough to the first operand of % to make it nonnegative. */
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
270 int big_enough_multiple_of_7 = (-YDAY_MINIMUM / 7 + 2) * 7;
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
271 return (yday
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
272 - (yday - wday + ISO_WEEK1_WDAY + big_enough_multiple_of_7) % 7
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
273 + ISO_WEEK1_WDAY - ISO_WEEK_START_WDAY);
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
274 }
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
275
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 #if !defined(HAVE_TM_ZONE) && !defined(HAVE_TZNAME)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
277 char *zone_name (const struct tm *tp);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 char *
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
279 zone_name (const struct tm *tp)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 char *timezone ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 struct timeval tv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 struct timezone tz;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 gettimeofday (&tv, &tz);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 return timezone (tz.tz_minuteswest, tp->tm_isdst);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 #endif
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 /* Format the time given in TM according to FORMAT, and put the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 results in STRING.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 Return the number of characters (not including terminating null)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 that were put into STRING, or 0 if the length would have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 exceeded MAX. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
296 size_t strftime (char *string, size_t max, const char *format,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
297 const struct tm *tm);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 size_t
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
300 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
301 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 enum padding pad; /* Type of padding to apply. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 size_t length = 0; /* Characters put in STRING so far. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 for (; *format && length < max; ++format)
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 if (*format != '%')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 add_char (*format);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 ++format;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 /* Modifiers: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 if (*format == '-')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 pad = none;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 ++format;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 else if (*format == '_')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 pad = blank;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 ++format;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 }
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 pad = zero;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 switch (*format)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 /* Literal character fields: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 case 0:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 case '%':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 add_char ('%');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 case 'n':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 add_char ('\n');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 case 't':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 add_char ('\t');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 add_char (*format);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 /* Time fields: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 case 'H':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 case 'k':
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 add_num2 (&string[length], tm->tm_hour, max - length,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 *format == 'H' ? pad : blank);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 case 'I':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 case 'l':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 int hour12;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 if (tm->tm_hour == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 hour12 = 12;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 else if (tm->tm_hour > 12)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 hour12 = tm->tm_hour - 12;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 hour12 = tm->tm_hour;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 add_num2 (&string[length], hour12, max - length,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 *format == 'I' ? pad : blank);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 case 'M':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 add_num2 (&string[length], tm->tm_min, max - length, pad);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 case 'p':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 if (tm->tm_hour < 12)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 add_char ('A');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 add_char ('P');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 add_char ('M');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 case 'r':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 strftime (&string[length], max - length, "%I:%M:%S %p", tm);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 case 'R':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 strftime (&string[length], max - length, "%H:%M", tm);
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 case 's':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 struct tm writable_tm;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 writable_tm = *tm;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 length += add_num_time_t (&string[length], max - length,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 mktime (&writable_tm));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 case 'S':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 add_num2 (&string[length], tm->tm_sec, max - length, pad);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 case 'T':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 strftime (&string[length], max - length, "%H:%M:%S", tm);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 break;
4203
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
403
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
404 case 'V':
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
405 case 'g':
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
406 case 'G':
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
407 {
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
408 int year = tm->tm_year + 1900;
5016
2ade80e8c640 enable more warnings and fix them
Ben Wing <ben@xemacs.org>
parents: 4203
diff changeset
409 int ndays = iso_week_days (tm->tm_yday, tm->tm_wday);
4203
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
410
5016
2ade80e8c640 enable more warnings and fix them
Ben Wing <ben@xemacs.org>
parents: 4203
diff changeset
411 if (ndays < 0)
4203
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
412 {
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
413 /* This ISO week belongs to the previous year. */
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
414 year--;
5016
2ade80e8c640 enable more warnings and fix them
Ben Wing <ben@xemacs.org>
parents: 4203
diff changeset
415 ndays =
4203
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
416 iso_week_days (tm->tm_yday + (365 + __isleap (year)),
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
417 tm->tm_wday);
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
418 }
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
419 else
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
420 {
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
421 int d =
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
422 iso_week_days (tm->tm_yday - (365 + __isleap (year)),
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
423 tm->tm_wday);
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
424 if (0 <= d)
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
425 {
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
426 /* This ISO week belongs to the next year. */
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
427 year++;
5016
2ade80e8c640 enable more warnings and fix them
Ben Wing <ben@xemacs.org>
parents: 4203
diff changeset
428 ndays = d;
4203
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
429 }
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
430 }
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
431
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
432 switch (*format)
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
433 {
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
434 /*
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
435 #### FIXME
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
436 We really can't assume 1000 <= year <= 9999
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
437 once time_t gets beyond 32 bits, but it's true
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
438 of the rest of the code here so get with the
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
439 program
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
440 */
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
441 case 'g':
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
442 length +=
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
443 add_num2 (&string[length], year % 100,
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
444 max - length, pad);
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
445 break;
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
446
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
447 case 'G':
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
448 add_char (year / 1000 + '0');
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
449 length += add_num3 (&string[length], year % 1000,
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
450 max - length, zero);
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
451 break;
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
452
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
453 default:
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
454 length +=
5016
2ade80e8c640 enable more warnings and fix them
Ben Wing <ben@xemacs.org>
parents: 4203
diff changeset
455 add_num2 (&string[length], ndays / 7 + 1,
4203
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
456 max - length, pad);
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
457 break;
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
458 }
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
459 }
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
460 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 case 'X':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 strftime (&string[length], max - length, "%H:%M:%S", tm);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 break;
4203
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
465 case 'z':
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
466 {
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
467 /*
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
468 #### FIXME: could use tm->tm_gmtoff if present. Since
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
469 the other code in xemacs does not do so we follow the
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
470 leaders (and don't add a autoconf macro to detect
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
471 its presence).
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
472 */
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
473 long int offset;
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
474 long int minutes;
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
475 struct tm lt, *ut;
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
476 time_t utc;
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
477
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
478 lt = *tm;
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
479 utc = mktime(&lt);
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
480 ut = gmtime(&utc);
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
481 /* assume that tm is valid so the others will be too! */
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
482 assert( utc != (time_t) -1 && ut != NULL );
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
483
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
484 /* tm diff code below is based on mktime.c, glibc 2.3.2 */
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
485 {
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
486 int lt4, ut4, lt100, ut100, lt400, ut400;
5016
2ade80e8c640 enable more warnings and fix them
Ben Wing <ben@xemacs.org>
parents: 4203
diff changeset
487 int intervening_leap_days, years, ndays;
4203
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
488
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
489 lt4 = (lt.tm_year >> 2) + (1900 >> 2) -
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
490 ! (lt.tm_year & 3);
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
491 ut4 = (ut->tm_year >> 2) + (1900 >> 2) -
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
492 ! (ut->tm_year & 3);
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
493 lt100 = lt4 / 25 - (lt4 % 25 < 0);
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
494 ut100 = ut4 / 25 - (ut4 % 25 < 0);
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
495 lt400 = lt100 >> 2;
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
496 ut400 = ut100 >> 2;
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
497 intervening_leap_days =
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
498 (lt4 - ut4) - (lt100 - ut100) + (lt400 - ut400);
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
499 years = lt.tm_year - ut->tm_year;
5016
2ade80e8c640 enable more warnings and fix them
Ben Wing <ben@xemacs.org>
parents: 4203
diff changeset
500 ndays = (365 * years + intervening_leap_days
4203
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
501 + (lt.tm_yday - ut->tm_yday));
5016
2ade80e8c640 enable more warnings and fix them
Ben Wing <ben@xemacs.org>
parents: 4203
diff changeset
502 offset = (60 * (60 * (24 * ndays
2ade80e8c640 enable more warnings and fix them
Ben Wing <ben@xemacs.org>
parents: 4203
diff changeset
503 + (lt.tm_hour - ut->tm_hour))
4203
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
504 + (lt.tm_min - ut->tm_min))
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
505 + (lt.tm_sec - ut->tm_sec));
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
506 }
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
507
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
508 minutes = offset / ( offset < 0 ? -60 : 60 );
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
509
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
510 add_char ((offset < 0 ? '-' : '+'));
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
511
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
512 if ( minutes / 600 != 0 )
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
513 add_char (minutes / 600 + '0');
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
514 else if ( pad != none )
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
515 add_char ((pad == zero ? '0' : ' '));
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
516
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
517 length +=
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
518 add_num3 (&string[length],
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
519 ((minutes / 60 ) % 10) * 100 + (minutes % 60),
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
520 max - length, pad);
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
521 break;
0a63e5de7bdc [xemacs-hg @ 2007-10-02 19:31:30 by aidan]
aidan
parents: 2500
diff changeset
522 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 case 'Z':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 #ifdef HAVE_TM_ZONE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 length += add_str (&string[length], tm->tm_zone, max - length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 #ifdef HAVE_TZNAME
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 if (tm->tm_isdst && tzname[1] && *tzname[1])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 length += add_str (&string[length], tzname[1], max - length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 length += add_str (&string[length], tzname[0], max - length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 length += add_str (&string[length], zone_name (tm), max - length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 /* Date fields: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 case 'a':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 add_char (days[tm->tm_wday][0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 add_char (days[tm->tm_wday][1]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 add_char (days[tm->tm_wday][2]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 case 'A':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 add_str (&string[length], days[tm->tm_wday], max - length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 case 'b':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 case 'h':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 add_char (months[tm->tm_mon][0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 add_char (months[tm->tm_mon][1]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 add_char (months[tm->tm_mon][2]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 case 'B':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 add_str (&string[length], months[tm->tm_mon], max - length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 case 'c':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 strftime (&string[length], max - length,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 "%a %b %d %H:%M:%S %Z %Y", tm);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 case 'C':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 add_num2 (&string[length], (tm->tm_year + 1900) / 100,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 max - length, pad);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 case 'd':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 add_num2 (&string[length], tm->tm_mday, max - length, pad);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 case 'e':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 add_num2 (&string[length], tm->tm_mday, max - length, blank);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 case 'D':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 strftime (&string[length], max - length, "%m/%d/%y", tm);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 case 'j':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 add_num3 (&string[length], tm->tm_yday + 1, max - length, pad);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 case 'm':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 add_num2 (&string[length], tm->tm_mon + 1, max - length, pad);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 case 'U':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 add_num2 (&string[length], sun_week (tm), max - length, pad);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 case 'w':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 add_char (tm->tm_wday + '0');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 case 'W':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 add_num2 (&string[length], mon_week (tm), max - length, pad);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 case 'x':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 strftime (&string[length], max - length, "%m/%d/%y", tm);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 case 'y':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 add_num2 (&string[length], tm->tm_year % 100,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 max - length, pad);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 case 'Y':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 add_char ((tm->tm_year + 1900) / 1000 + '0');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 length +=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 add_num3 (&string[length],
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 (1900 + tm->tm_year) % 1000, max - length, zero);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 break;
5254
1537701f08a1 Support Roman month numbers, #'format-time-string
Aidan Kehoe <kehoea@parhasard.net>
parents: 5016
diff changeset
614 case '\xe6':
1537701f08a1 Support Roman month numbers, #'format-time-string
Aidan Kehoe <kehoea@parhasard.net>
parents: 5016
diff changeset
615 length +=
1537701f08a1 Support Roman month numbers, #'format-time-string
Aidan Kehoe <kehoea@parhasard.net>
parents: 5016
diff changeset
616 add_str (&string[length], roman_lower[tm->tm_mon],
1537701f08a1 Support Roman month numbers, #'format-time-string
Aidan Kehoe <kehoea@parhasard.net>
parents: 5016
diff changeset
617 max - length);
1537701f08a1 Support Roman month numbers, #'format-time-string
Aidan Kehoe <kehoea@parhasard.net>
parents: 5016
diff changeset
618 break;
1537701f08a1 Support Roman month numbers, #'format-time-string
Aidan Kehoe <kehoea@parhasard.net>
parents: 5016
diff changeset
619 case '\xC6':
1537701f08a1 Support Roman month numbers, #'format-time-string
Aidan Kehoe <kehoea@parhasard.net>
parents: 5016
diff changeset
620 length +=
1537701f08a1 Support Roman month numbers, #'format-time-string
Aidan Kehoe <kehoea@parhasard.net>
parents: 5016
diff changeset
621 add_str (&string[length], roman_upper[tm->tm_mon],
1537701f08a1 Support Roman month numbers, #'format-time-string
Aidan Kehoe <kehoea@parhasard.net>
parents: 5016
diff changeset
622 max - length);
1537701f08a1 Support Roman month numbers, #'format-time-string
Aidan Kehoe <kehoea@parhasard.net>
parents: 5016
diff changeset
623 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 add_char (0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 return length - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 }