lib/iec_std_lib.h
changeset 714 91fe96900800
parent 712 58aadb212976
child 715 134f110060db
equal deleted inserted replaced
713:e3ca0f4d47b3 714:91fe96900800
   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)