131 P = strchr(str,
'P');
137 T = strchr(str,
'T');
138 X = strchr(str,
'Y');
140 duration->
years = (time_t) atoi(str+1);
144 X = strchr(str,
'M');
145 if (X && (!T || (
size_t) (X-P) < (
size_t) (T-P))) {
146 duration->
months = (time_t) atoi(str+1);
150 X = strchr(str,
'D');
152 duration->
days = (time_t) atoi(str+1);
160 X = strchr(str,
'H');
162 duration->
hours = (time_t) atoi(str+1);
166 X = strrchr(str,
'M');
167 if (X && T && (
size_t) (X-P) > (
size_t) (T-P)) {
168 duration->
minutes = (time_t) atoi(str+1);
172 X = strchr(str,
'S');
174 duration->
seconds = (time_t) atoi(str+1);
179 W = strchr(str,
'W');
185 duration->
weeks = (time_t) atoi(str+1);
197 digits_in_number(time_t duration)
199 unsigned int i = (
unsigned int) duration;
202 while (i >= 100000000) {
206 if (i >= 10000) { n += 4; i /= 10000; }
207 if (i >= 100 ) { n += 2; i /= 100; }
208 if (i >= 10 ) { n += 1; }
223 char num[
sizeof(
unsigned int) + 2];
229 if (duration->
years > 0) {
230 count = count + 1 + digits_in_number(duration->
years);
232 if (duration->
months > 0) {
233 count = count + 1 + digits_in_number(duration->
months);
235 if (duration->
weeks > 0) {
236 count = count + 1 + digits_in_number(duration->
weeks);
238 if (duration->
days > 0) {
239 count = count + 1 + digits_in_number(duration->
days);
241 if (duration->
hours > 0) {
242 count = count + 1 + digits_in_number(duration->
hours);
246 count = count + 1 + digits_in_number(duration->
minutes);
250 count = count + 1 + digits_in_number(duration->
seconds);
257 if (!(str = (
char*) calloc(count,
sizeof(
char))))
262 if (duration->
years > 0) {
263 count = digits_in_number(duration->
years);
264 assert(count <=
sizeof(num) - 2);
265 snprintf(num, count+2,
"%uY", (
unsigned int) duration->
years);
266 str = strncat(str, num, count+2);
268 if (duration->
months > 0) {
269 count = digits_in_number(duration->
months);
270 assert(count <=
sizeof(num) - 2);
271 snprintf(num, count+2,
"%uM", (
unsigned int) duration->
months);
272 str = strncat(str, num, count+2);
274 if (duration->
weeks > 0) {
275 count = digits_in_number(duration->
weeks);
276 assert(count <=
sizeof(num) - 2);
277 snprintf(num, count+2,
"%uW", (
unsigned int) duration->
weeks);
278 str = strncat(str, num, count+2);
280 if (duration->
days > 0) {
281 count = digits_in_number(duration->
days);
282 assert(count <=
sizeof(num) - 2);
283 snprintf(num, count+2,
"%uD", (
unsigned int) duration->
days);
284 str = strncat(str, num, count+2);
287 str = strcat(str,
"T");
289 if (duration->
hours > 0) {
290 count = digits_in_number(duration->
hours);
291 assert(count <=
sizeof(num) - 2);
292 snprintf(num, count+2,
"%uH", (
unsigned int) duration->
hours);
293 str = strncat(str, num, count+2);
296 count = digits_in_number(duration->
minutes);
297 assert(count <=
sizeof(num) - 2);
298 snprintf(num, count+2,
"%uM", (
unsigned int) duration->
minutes);
299 str = strncat(str, num, count+2);
302 count = digits_in_number(duration->
seconds);
303 assert(count <=
sizeof(num) - 2);
304 snprintf(num, count+2,
"%uS", (
unsigned int) duration->
seconds);
305 str = strncat(str, num, count+2);
322 period += (duration->
minutes)*60;
323 period += (duration->
hours)*3600;
324 period += (duration->
days)*86400;
325 period += (duration->
weeks)*86400*7;
326 period += (duration->
months)*86400*31;
327 period += (duration->
years)*86400*365;