222 |
222 |
223 return ts; |
223 return ts; |
224 } |
224 } |
225 |
225 |
226 #define EPOCH_YEAR 1970 |
226 #define EPOCH_YEAR 1970 |
227 #define SECONDS_PER_HOUR (60 * 60) |
227 #define SECONDS_PER_MINUTE 60 |
|
228 #define SECONDS_PER_HOUR (60 * SECONDS_PER_MINUTE) |
228 #define SECONDS_PER_DAY (24 * SECONDS_PER_HOUR) |
229 #define SECONDS_PER_DAY (24 * SECONDS_PER_HOUR) |
229 #define __isleap(year) \ |
230 #define __isleap(year) \ |
230 ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) |
231 ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) |
231 static const unsigned short int __mon_yday[2][13] = |
232 static const unsigned short int __mon_yday[2][13] = |
232 { |
233 { |
543 static inline STRING __time_to_string(TIME IN){ |
544 static inline STRING __time_to_string(TIME IN){ |
544 STRING res; |
545 STRING res; |
545 div_t days; |
546 div_t days; |
546 /*t#5d14h12m18s3.5ms*/ |
547 /*t#5d14h12m18s3.5ms*/ |
547 res = __INIT_STRING; |
548 res = __INIT_STRING; |
548 days = div(IN.tv_sec ,86400); |
549 days = div(IN.tv_sec, SECONDS_PER_DAY); |
549 if(!days.rem && IN.tv_nsec == 0){ |
550 if(!days.rem && IN.tv_nsec == 0){ |
550 res.len = snprintf((char*)&res.body, STR_MAX_LEN, "T#%dd", days.quot); |
551 res.len = snprintf((char*)&res.body, STR_MAX_LEN, "T#%dd", days.quot); |
551 }else{ |
552 }else{ |
552 div_t hours = div(days.rem, 3600); |
553 div_t hours = div(days.rem, SECONDS_PER_HOUR); |
553 if(!hours.rem && IN.tv_nsec == 0){ |
554 if(!hours.rem && IN.tv_nsec == 0){ |
554 res.len = snprintf((char*)&res.body, STR_MAX_LEN, "T#%dd%dh", days.quot, hours.quot); |
555 res.len = snprintf((char*)&res.body, STR_MAX_LEN, "T#%dd%dh", days.quot, hours.quot); |
555 }else{ |
556 }else{ |
556 div_t minuts = div(hours.rem, 60); |
557 div_t minuts = div(hours.rem, SECONDS_PER_MINUTE); |
557 if(!minuts.rem && IN.tv_nsec == 0){ |
558 if(!minuts.rem && IN.tv_nsec == 0){ |
558 res.len = snprintf((char*)&res.body, STR_MAX_LEN, "T#%dd%dh%dm", days.quot, hours.quot, minuts.quot); |
559 res.len = snprintf((char*)&res.body, STR_MAX_LEN, "T#%dd%dh%dm", days.quot, hours.quot, minuts.quot); |
559 }else{ |
560 }else{ |
560 if(IN.tv_nsec == 0){ |
561 if(IN.tv_nsec == 0){ |
561 res.len = snprintf((char*)&res.body, STR_MAX_LEN, "T#%dd%dh%dm%ds", days.quot, hours.quot, minuts.quot, minuts.rem); |
562 res.len = snprintf((char*)&res.body, STR_MAX_LEN, "T#%dd%dh%dm%ds", days.quot, hours.quot, minuts.quot, minuts.rem); |
635 |
636 |
636 /**********************************************/ |
637 /**********************************************/ |
637 /* [ANY_DATE | TIME] _TO_ [ANY_DATE | TIME] */ |
638 /* [ANY_DATE | TIME] _TO_ [ANY_DATE | TIME] */ |
638 /**********************************************/ |
639 /**********************************************/ |
639 |
640 |
640 static inline TOD __date_and_time_to_time_of_day(DT IN) {return (TOD){IN.tv_sec % (24*60*60), IN.tv_nsec};} |
641 static inline TOD __date_and_time_to_time_of_day(DT IN) { |
641 static inline DATE __date_and_time_to_date(DT IN){return (DATE){IN.tv_sec - (IN.tv_sec % (24*60*60)), 0};} |
642 return (TOD){ |
|
643 IN.tv_sec % SECONDS_PER_DAY + (IN.tv_sec < 0 ? SECONDS_PER_DAY : 0), |
|
644 IN.tv_nsec}; |
|
645 } |
|
646 static inline DATE __date_and_time_to_date(DT IN){ |
|
647 return (DATE){ |
|
648 IN.tv_sec - IN.tv_sec % SECONDS_PER_DAY - (IN.tv_sec < 0 ? SECONDS_PER_DAY : 0), |
|
649 0}; |
|
650 } |
642 |
651 |
643 /*****************/ |
652 /*****************/ |
644 /* FROM/TO BCD */ |
653 /* FROM/TO BCD */ |
645 /*****************/ |
654 /*****************/ |
646 #define __bcd_digit(fac) |
655 #define __bcd_digit(fac) |