226 |
226 |
227 return ts; |
227 return ts; |
228 } |
228 } |
229 |
229 |
230 #define EPOCH_YEAR 1970 |
230 #define EPOCH_YEAR 1970 |
231 #define SECONDS_PER_HOUR (60 * 60) |
231 #define SECONDS_PER_MINUTE 60 |
|
232 #define SECONDS_PER_HOUR (60 * SECONDS_PER_MINUTE) |
232 #define SECONDS_PER_DAY (24 * SECONDS_PER_HOUR) |
233 #define SECONDS_PER_DAY (24 * SECONDS_PER_HOUR) |
233 #define __isleap(year) \ |
234 #define __isleap(year) \ |
234 ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) |
235 ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) |
235 static const unsigned short int __mon_yday[2][13] = |
236 static const unsigned short int __mon_yday[2][13] = |
236 { |
237 { |
547 static inline STRING __time_to_string(TIME IN){ |
548 static inline STRING __time_to_string(TIME IN){ |
548 STRING res; |
549 STRING res; |
549 div_t days; |
550 div_t days; |
550 /*t#5d14h12m18s3.5ms*/ |
551 /*t#5d14h12m18s3.5ms*/ |
551 res = __INIT_STRING; |
552 res = __INIT_STRING; |
552 days = div(IN.tv_sec ,86400); |
553 days = div(IN.tv_sec, SECONDS_PER_DAY); |
553 if(!days.rem && IN.tv_nsec == 0){ |
554 if(!days.rem && IN.tv_nsec == 0){ |
554 res.len = snprintf((char*)&res.body, STR_MAX_LEN, "T#%dd", days.quot); |
555 res.len = snprintf((char*)&res.body, STR_MAX_LEN, "T#%dd", days.quot); |
555 }else{ |
556 }else{ |
556 div_t hours = div(days.rem, 3600); |
557 div_t hours = div(days.rem, SECONDS_PER_HOUR); |
557 if(!hours.rem && IN.tv_nsec == 0){ |
558 if(!hours.rem && IN.tv_nsec == 0){ |
558 res.len = snprintf((char*)&res.body, STR_MAX_LEN, "T#%dd%dh", days.quot, hours.quot); |
559 res.len = snprintf((char*)&res.body, STR_MAX_LEN, "T#%dd%dh", days.quot, hours.quot); |
559 }else{ |
560 }else{ |
560 div_t minuts = div(hours.rem, 60); |
561 div_t minuts = div(hours.rem, SECONDS_PER_MINUTE); |
561 if(!minuts.rem && IN.tv_nsec == 0){ |
562 if(!minuts.rem && IN.tv_nsec == 0){ |
562 res.len = snprintf((char*)&res.body, STR_MAX_LEN, "T#%dd%dh%dm", days.quot, hours.quot, minuts.quot); |
563 res.len = snprintf((char*)&res.body, STR_MAX_LEN, "T#%dd%dh%dm", days.quot, hours.quot, minuts.quot); |
563 }else{ |
564 }else{ |
564 if(IN.tv_nsec == 0){ |
565 if(IN.tv_nsec == 0){ |
565 res.len = snprintf((char*)&res.body, STR_MAX_LEN, "T#%dd%dh%dm%ds", days.quot, hours.quot, minuts.quot, minuts.rem); |
566 res.len = snprintf((char*)&res.body, STR_MAX_LEN, "T#%dd%dh%dm%ds", days.quot, hours.quot, minuts.quot, minuts.rem); |
639 |
640 |
640 /**********************************************/ |
641 /**********************************************/ |
641 /* [ANY_DATE | TIME] _TO_ [ANY_DATE | TIME] */ |
642 /* [ANY_DATE | TIME] _TO_ [ANY_DATE | TIME] */ |
642 /**********************************************/ |
643 /**********************************************/ |
643 |
644 |
644 static inline TOD __date_and_time_to_time_of_day(DT IN) {return (TOD){IN.tv_sec % (24*60*60), IN.tv_nsec};} |
645 static inline TOD __date_and_time_to_time_of_day(DT IN) { |
645 static inline DATE __date_and_time_to_date(DT IN){return (DATE){IN.tv_sec - (IN.tv_sec % (24*60*60)), 0};} |
646 return (TOD){ |
|
647 IN.tv_sec % SECONDS_PER_DAY + (IN.tv_sec < 0 ? SECONDS_PER_DAY : 0), |
|
648 IN.tv_nsec}; |
|
649 } |
|
650 static inline DATE __date_and_time_to_date(DT IN){ |
|
651 return (DATE){ |
|
652 IN.tv_sec - IN.tv_sec % SECONDS_PER_DAY - (IN.tv_sec < 0 ? SECONDS_PER_DAY : 0), |
|
653 0}; |
|
654 } |
646 |
655 |
647 /*****************/ |
656 /*****************/ |
648 /* FROM/TO BCD */ |
657 /* FROM/TO BCD */ |
649 /*****************/ |
658 /*****************/ |
650 #define __bcd_digit(fac) |
659 |
|
660 static inline BOOL __test_bcd(LWORD IN) { |
|
661 while (IN) { |
|
662 if ((IN & 0xf) > 9) return 1; |
|
663 IN >>= 4; |
|
664 } |
|
665 return 0; |
|
666 } |
|
667 |
651 static inline ULINT __bcd_to_uint(LWORD IN){ |
668 static inline ULINT __bcd_to_uint(LWORD IN){ |
652 ULINT res; |
669 ULINT res = IN & 0xf; |
653 ULINT i; |
670 ULINT factor = 10ULL; |
654 |
671 |
655 res = IN & 0xf; |
672 while (IN >>= 4) { |
656 for(i = 10ULL; i <= 1000000000000000ULL; i *= 10){ |
673 res += (IN & 0xf) * factor; |
657 if(!(IN >>= 4)) |
674 factor *= 10; |
658 break; |
|
659 res += (IN & 0xf) * i; |
|
660 } |
675 } |
661 return res; |
676 return res; |
662 } |
677 } |
663 |
678 |
664 static inline LWORD __uint_to_bcd(ULINT IN){ |
679 static inline LWORD __uint_to_bcd(ULINT IN){ |
665 LWORD res; |
680 LWORD res = IN % 10; |
666 USINT i; |
681 USINT shift = 4; |
667 |
682 |
668 res = IN % 10; |
683 while (IN /= 10) { |
669 for(i = 4; i<=60; i += 4){ |
684 res |= (IN % 10) << shift; |
670 if(!(IN /= 10)) |
685 shift += 4; |
671 break; |
|
672 res |= (IN % 10) << i; |
|
673 } |
686 } |
674 return res; |
687 return res; |
675 } |
688 } |
676 |
689 |
677 |
690 |
975 |
988 |
976 |
989 |
977 /******** BCD_TO_ ************/ |
990 /******** BCD_TO_ ************/ |
978 #define __iec_(to_TYPENAME,from_TYPENAME) \ |
991 #define __iec_(to_TYPENAME,from_TYPENAME) \ |
979 static inline to_TYPENAME from_TYPENAME##_BCD_TO_##to_TYPENAME(EN_ENO_PARAMS, from_TYPENAME op){\ |
992 static inline to_TYPENAME from_TYPENAME##_BCD_TO_##to_TYPENAME(EN_ENO_PARAMS, from_TYPENAME op){\ |
980 TEST_EN(to_TYPENAME)\ |
993 TEST_EN_COND(to_TYPENAME, __test_bcd(op))\ |
981 return (to_TYPENAME)__bcd_to_uint(op);\ |
994 return (to_TYPENAME)__bcd_to_uint(op);\ |
982 }\ |
995 }\ |
983 static inline to_TYPENAME BCD_TO_##to_TYPENAME##__##to_TYPENAME##__##from_TYPENAME(EN_ENO_PARAMS, from_TYPENAME op){\ |
996 static inline to_TYPENAME BCD_TO_##to_TYPENAME##__##to_TYPENAME##__##from_TYPENAME(EN_ENO_PARAMS, from_TYPENAME op){\ |
984 return from_TYPENAME##_BCD_TO_##to_TYPENAME(EN_ENO, op);\ |
997 return from_TYPENAME##_BCD_TO_##to_TYPENAME(EN_ENO, op);\ |
985 } |
998 } |