strftime.c - vx32 - Local 9vx git repository for patches.
(HTM) git clone git://r-36.net/vx32
(DIR) Log
(DIR) Files
(DIR) Refs
---
strftime.c (3852B)
---
1 #include <stdio.h>
2 #include <time.h>
3 #include <string.h>
4
5 static char *weekday[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
6 static char *wday[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
7 static char *month[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September",
8 "October", "November", "December" };
9 static char *mon[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
10
11
12 size_t strftime(char *buf, size_t maxsize, const char *fmt, const struct tm *tm)
13 {
14 char *ep = buf + maxsize - 1;
15 char *p = buf;
16 int c;
17 char tmp[40];
18
19 while (*fmt) {
20 if ((c = *fmt++) != '%') {
21 if (p >= ep)
22 return 0;
23 *p++ = c;
24 continue;
25 }
26
27 switch (c = *fmt++) {
28 case 0:
29 return 0;
30
31 default:
32 if (p+1 >= ep)
33 return 0;
34 *p++ = '%';
35 *p++ = c;
36 break;
37
38 case 'A':
39 strcpy(tmp, weekday[tm->tm_wday]);
40 break;
41 case 'a':
42 strcpy(tmp, wday[tm->tm_wday]);
43 break;
44 case 'B':
45 strcpy(tmp, month[tm->tm_mon]);
46 break;
47 case 'h':
48 case 'b':
49 strcpy(tmp, mon[tm->tm_mon]);
50 break;
51 case 'C':
52 sprintf(tmp, "%02d", (tm->tm_year+1900)/100);
53 break;
54 case 'c':
55 sprintf(tmp, "%02d:%02d:%02d %02d/%02d/%04d",
56 tm->tm_hour, tm->tm_min, tm->tm_sec,
57 tm->tm_mon+1, tm->tm_mday, tm->tm_year+1900);
58 break;
59 case 'D':
60 strftime(tmp, sizeof tmp, "%m/%d/%y", tm);
61 break;
62 case 'd':
63 sprintf(tmp, "%02d", tm->tm_mday);
64 break;
65 case 'e':
66 sprintf(tmp, "%2d", tm->tm_mday);
67 break;
68 case 'F':
69 strftime(tmp, sizeof tmp, "%Y-%m-%d", tm);
70 break;
71 case 'G':
72 // Not quite right - sometimes the previous or next year!
73 sprintf(tmp, "%04d", tm->tm_year + 1900);
74 break;
75 case 'g':
76 strftime(tmp, sizeof tmp, "%G", tm);
77 memmove(tmp, tmp+2, strlen(tmp+2)+1);
78 break;
79 case 'H':
80 sprintf(tmp, "%02d", tm->tm_hour);
81 break;
82 case 'I':
83 sprintf(tmp, "%02d", (tm->tm_hour+11) % 12 + 1);
84 break;
85 case 'j':
86 sprintf(tmp, "%03d", tm->tm_yday + 1);
87 break;
88 case 'k':
89 sprintf(tmp, "%2d", tm->tm_hour);
90 break;
91 case 'l':
92 sprintf(tmp, "%2d", (tm->tm_hour+11) % 12 + 1);
93 break;
94 case 'M':
95 sprintf(tmp, "%02d", tm->tm_min);
96 break;
97 case 'm':
98 sprintf(tmp, "%02d", tm->tm_mon+1);
99 break;
100 case 'n':
101 strcpy(tmp, "\n");
102 break;
103 case 'p':
104 if (tm->tm_hour < 12)
105 strcpy(tmp, "am");
106 else
107 strcpy(tmp, "pm");
108 break;
109 case 'R':
110 strftime(tmp, sizeof tmp, "%H:%M", tm);
111 break;
112 case 'r':
113 strftime(tmp, sizeof tmp, "%I:%M:%S %p", tm);
114 break;
115 case 'S':
116 sprintf(tmp, "%02d", tm->tm_sec);
117 break;
118 case 's':
119 sprintf(tmp, "%d", (int)mktime(tm));
120 break;
121 case 'T':
122 strftime(tmp, sizeof tmp, "%H:%M:%S", tm);
123 break;
124 case 't':
125 strcpy(tmp, "\t");
126 break;
127 case 'U':
128 sprintf(tmp, "%02d", tm->tm_yday/7); // not quite right
129 break;
130 case 'u':
131 sprintf(tmp, "%d", tm->tm_wday ? tm->tm_wday : 7);
132 break;
133 case 'V':
134 sprintf(tmp, "%02d", 1 + tm->tm_yday/7); // not quite right
135 break;
136 case 'v':
137 strftime(tmp, sizeof tmp, "%e-%b-%Y", tm);
138 break;
139 case 'W':
140 sprintf(tmp, "%02d", tm->tm_yday/7); // not quite right
141 break;
142 case 'w':
143 sprintf(tmp, "%d", tm->tm_wday);
144 break;
145 case 'X':
146 sprintf(tmp, "%02d:%02d:%02d",
147 tm->tm_hour, tm->tm_min, tm->tm_sec);
148 break;
149 case 'x':
150 sprintf(tmp, "%%02d/%02d/%04d",
151 tm->tm_mon+1, tm->tm_mday, tm->tm_year+1900);
152 break;
153 case 'Y':
154 sprintf(tmp, "%d", tm->tm_year+1900);
155 break;
156 case 'y':
157 sprintf(tmp, "%02d", tm->tm_year%100);
158 break;
159 case 'Z':
160 strcpy(tmp, "GMT");
161 break;
162 case 'z':
163 strcpy(tmp, "+0000");
164 break;
165 case '%':
166 strcpy(tmp, "%");
167 break;
168 }
169 if(p+strlen(tmp) > ep)
170 return 0;
171 strcpy(p, tmp);
172 p += strlen(p);
173 }
174 *p = 0;
175 return p - buf;
176 }
177