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);
198 digits_in_number(time_t duration)
200 uint32_t period = (uint32_t) duration;
218 char* str = NULL, *num = NULL;
226 if (duration->
years > 0) {
227 count = count + 1 + digits_in_number(duration->
years);
229 if (duration->
months > 0) {
230 count = count + 1 + digits_in_number(duration->
months);
232 if (duration->
weeks > 0) {
233 count = count + 1 + digits_in_number(duration->
weeks);
235 if (duration->
days > 0) {
236 count = count + 1 + digits_in_number(duration->
days);
238 if (duration->
hours > 0) {
239 count = count + 1 + digits_in_number(duration->
hours);
243 count = count + 1 + digits_in_number(duration->
minutes);
247 count = count + 1 + digits_in_number(duration->
seconds);
254 str = (
char*) calloc(count,
sizeof(
char));
258 if (duration->
years > 0) {
259 count = digits_in_number(duration->
years);
260 num = (
char*) calloc(count+2,
sizeof(
char));
261 snprintf(num, count+2,
"%uY", (
unsigned int) duration->
years);
262 str = strncat(str, num, count+2);
265 if (duration->
months > 0) {
266 count = digits_in_number(duration->
months);
267 num = (
char*) calloc(count+2,
sizeof(
char));
268 snprintf(num, count+2,
"%uM", (
unsigned int) duration->
months);
269 str = strncat(str, num, count+2);
272 if (duration->
weeks > 0) {
273 count = digits_in_number(duration->
weeks);
274 num = (
char*) calloc(count+2,
sizeof(
char));
275 snprintf(num, count+2,
"%uW", (
unsigned int) duration->
weeks);
276 str = strncat(str, num, count+2);
279 if (duration->
days > 0) {
280 count = digits_in_number(duration->
days);
281 num = (
char*) calloc(count+2,
sizeof(
char));
282 snprintf(num, count+2,
"%uD", (
unsigned int) duration->
days);
283 str = strncat(str, num, count+2);
287 str = strncat(str,
"T", 1);
289 if (duration->
hours > 0) {
290 count = digits_in_number(duration->
hours);
291 num = (
char*) calloc(count+2,
sizeof(
char));
292 snprintf(num, count+2,
"%uH", (
unsigned int) duration->
hours);
293 str = strncat(str, num, count+2);
297 count = digits_in_number(duration->
minutes);
298 num = (
char*) calloc(count+2,
sizeof(
char));
299 snprintf(num, count+2,
"%uM", (
unsigned int) duration->
minutes);
300 str = strncat(str, num, count+2);
304 count = digits_in_number(duration->
seconds);
305 num = (
char*) calloc(count+2,
sizeof(
char));
306 snprintf(num, count+2,
"%uS", (
unsigned int) duration->
seconds);
307 str = strncat(str, num, count+2);
325 period += (duration->
minutes)*60;
326 period += (duration->
hours)*3600;
327 period += (duration->
days)*86400;
328 period += (duration->
weeks)*86400*7;
329 period += (duration->
months)*86400*31;
330 period += (duration->
years)*86400*365;