lib/iec_std_lib.h
changeset 799 214c9dced257
parent 793 268bf4ca5fa1
parent 715 134f110060db
child 803 36ac3a58be39
equal deleted inserted replaced
798:d21e598b0b75 799:214c9dced257
   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 }