Annotation of OpenXM_contrib/gnuplot/strftime.c, Revision 1.1.1.2
1.1 maekawa 1: #ifndef lint
1.1.1.2 ! maekawa 2: static char *RCSid="$Id: strftime.c,v 1.6 1998/12/07 22:08:49 lhecking Exp $";
1.1 maekawa 3: #endif
4:
5: /* GNUPLOT - strftime.c */
6:
7: /*[
8: * Copyright 1986 - 1993, 1998 Thomas Williams, Colin Kelley
9: *
10: * Permission to use, copy, and distribute this software and its
11: * documentation for any purpose with or without fee is hereby granted,
12: * provided that the above copyright notice appear in all copies and
13: * that both that copyright notice and this permission notice appear
14: * in supporting documentation.
15: *
16: * Permission to modify the software is granted, but not the right to
17: * distribute the complete modified source code. Modifications are to
18: * be distributed as patches to the released version. Permission to
19: * distribute binaries produced by compiling modified sources is granted,
20: * provided you
21: * 1. distribute the corresponding source modifications from the
22: * released version in the form of a patch file along with the binaries,
23: * 2. add special version identification to distinguish your version
24: * in addition to the base release version number,
25: * 3. provide your name and address as the primary contact for the
26: * support of your modified version, and
27: * 4. retain our contact information in regard to use of the base
28: * software.
29: * Permission to distribute the released version of the source code along
30: * with corresponding source modifications in the form of a patch file is
31: * granted with same provisions 2 through 4 for binary distributions.
32: *
33: * This software is provided "as is" without express or implied warranty
34: * to the extent permitted by applicable law.
35: ]*/
36:
37: /*
38: * Implementation of strftime for systems missing this (e.g. vaxctrl)
39: *
40: * This code was written based on the NeXT strftime man-page, sample output of
41: * the function and an ANSI-C quickreference chart. This code does not use
42: * parts of any existing strftime implementation.
43: *
44: * Apparently not all format chars are implemented, but this was all I had in
45: * my documentation.
46: *
47: * (written by Alexander Lehmann)
48: */
49:
50: #define NOTIMEZONE
51:
52: #include "plot.h" /* for MAX_LINE_LEN */
53: #include "setshow.h" /* for days/months */
54:
55: #ifdef TEST_STRFTIME /* test case; link with stdfn */
56: #define strftime _strftime
57:
58: #include "stdfn.h" /* for safe_strncpy */
59:
60: #include "national.h" /* language info for the following, */
61: /* extracted from set.c */
62:
63: char full_month_names[12][32] = { FMON01, FMON02, FMON03, FMON04, FMON05,
64: FMON06, FMON07, FMON08, FMON09, FMON10, FMON11, FMON12};
65: char abbrev_month_names[12][8] = { AMON01, AMON02, AMON03, AMON04, AMON05,
66: AMON06, AMON07, AMON08, AMON09, AMON10, AMON11, AMON12};
67:
68: char full_day_names[7][32] = { FDAY0, FDAY1, FDAY2, FDAY3, FDAY4, FDAY5, FDAY6 };
69: char abbrev_day_names[7][8] = { ADAY0, ADAY1, ADAY2, ADAY3, ADAY4, ADAY5, ADAY6 };
70:
71: #endif /* TEST_STRFTIME */
72:
73:
74: static void fill(from, pto, pmaxsize)
75: char *from;
76: char **pto;
77: size_t *pmaxsize;
78: {
79: safe_strncpy(*pto, from, *pmaxsize);
80: if(*pmaxsize<strlen(from)) {
81: (*pto) += *pmaxsize;
82: *pmaxsize = 0;
83: } else {
84: (*pto) += strlen(from);
85: (*pmaxsize) -= strlen(from);
86: }
87: }
88:
89: static void number(num, pad, pto, pmaxsize)
90: int num;
91: int pad;
92: char **pto;
93: size_t *pmaxsize;
94: {
95: char str[100];
96:
97: sprintf(str, "%0*d", pad, num);
98: fill(str, pto, pmaxsize);
99: }
100:
101: size_t strftime(s, max, format, tp)
102: char *s;
103: size_t max;
104: const char *format;
105: const struct tm *tp;
106: {
107: char *start = s;
108: size_t maxsize = max;
109:
110: if(max>0) {
111: while(*format && max>0) {
112: if(*format != '%') {
113: *s++ = *format++;
114: max--;
115: } else {
116: format++;
117: switch(*format++) {
118: case 'a': /* abbreviated weekday name */
119: if(tp->tm_wday >= 0 && tp->tm_wday <= 6)
120: fill(abbrev_day_names[tp->tm_wday], &s, &max);
121: break;
122: case 'A': /* full name of the weekday */
123: if(tp->tm_wday >= 0 && tp->tm_wday <= 6)
124: fill(full_day_names[tp->tm_wday], &s, &max);
125: break;
126: case 'b': /* abbreviated month name */
127: if(tp->tm_mon >= 0 && tp->tm_mon <= 11)
128: fill(abbrev_month_names[tp->tm_mon], &s, &max);
129: break;
130: case 'B': /* full name of month */
131: if(tp->tm_mon >= 0 && tp->tm_mon <= 11)
132: fill(full_month_names[tp->tm_mon], &s, &max);
133: break;
134: case 'c': /* locale's date and time reprensentation */
135: strftime(s, max, "%a %b %X %Y", tp);
136: max -= strlen(s);
137: s += strlen(s);
138: break;
139: case 'd': /* day of the month (01-31) */
140: number(tp->tm_mday, 2, &s, &max);
141: break;
142: case 'H': /* hour of the day (00-23) */
143: number(tp->tm_hour, 2, &s, &max);
144: break;
145: case 'I': /* hour of the day (01-12) */
146: number((tp->tm_hour+11)%12+1, 2, &s, &max);
147: break;
148: case 'j': /* day of the year (001-366) */
149: number(tp->tm_yday+1, 3, &s, &max);
150: break;
151: case 'm': /* month of the year (01-12) */
152: number(tp->tm_mon+1, 2,&s, &max);
153: break;
154: case 'M': /* minute (00-59) */
155: number(tp->tm_min, 2, &s, &max);
156: break;
157: case 'p': /* locale's version of AM or PM */
158: fill(tp->tm_hour >= 6 ? "PM" : "AM", &s, &max);
159: break;
160: case 'S': /* seconds (00-59) */
161: number(tp->tm_sec, 2, &s, &max);
162: break;
163: case 'U': /* week number of the year (00-53) with Sunday as the first day of the week */
164: number((tp->tm_yday-(tp->tm_yday-tp->tm_wday+7)%7+7)/7, 1, &s, &max);
165: break;
166: case 'w': /* weekday (Sunday = 0 to Saturday = 6) */
167: number(tp->tm_wday, 1, &s, &max);
168: break;
169: case 'W': /* week number of the year (00-53) with Monday as the first day of the week */
170: number((tp->tm_yday-(tp->tm_yday-tp->tm_wday+8)%7+7)/7, 2, &s, &max);
171: break;
172: case 'x': /* locale's date representation */
173: strftime(s, max, "%a %b %d %Y", tp);
174: max -= strlen(s);
175: s += strlen(s);
176: break;
177: case 'X': /* locale's time representation */
178: #ifndef NOTIMEZONE
179: strftime(s, max, "%H:%M:%S %Z", tp);
180: #else
181: strftime(s, max, "%H:%M:%S", tp);
182: #endif
183: max -= strlen(s);
184: s += strlen(s);
185: break;
186: case 'y': /* two-digit year representation (00-99) */
187: number(tp->tm_year%100, 2, &s, &max);
188: break;
189: case 'Y': /* four-digit year representation */
190: number(tp->tm_year+1900, 2, &s, &max);
191: break;
192: #ifndef NOTIMEZONE
193: case 'Z': /* time zone name */
194: fill(tp->tm_zone, &s, &max);
195: break;
196: #endif
197: case '%': /* percent sign */
198: default:
199: *s++ = *(format-1);
200: max--;
201: break;
202: }
203: }
204: }
205: if(s-start<maxsize) {
206: *s++ = '\0';
207: } else {
208: *(s-1) = '\0';
209: }
210: }
211:
212: return s-start;
213: }
214:
215: #ifdef TEST_STRFTIME
216:
217: #undef strftime
218: #define test(s) \
219: printf("%s -> ",s ); \
220: _strftime(str, 100, s, ts); \
221: printf("%s - ", str); \
222: strftime(str, 100, s, ts); \
223: printf("%s\n", str)
224:
225: int main()
226: {
227: char str[100];
228: struct tm *ts;
229: time_t t;
230: int i;
231:
232: t = time(NULL);
233:
234: ts = localtime(&t);
235:
236: test("%c");
237: test("test%%test");
238: test("%a %b %d %X %Y");
239: test("%x %X");
240: test("%A %B %U");
241: test("%I:%M %p %j %w");
242:
243: t -= 245*24*60*60;
244:
245: for(i = 0;i<366;i++) {
246: ts = localtime(&t);
247: printf("%03d: ", i);
248: test("%a %d %m %W");
249: t += 24*60*60;
250: }
251:
252: return 0;
253: }
254:
255: #endif
256:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>