lib/iec_std_lib.h
changeset 398 f1f3facc59e7
parent 393 f09a5ffe1edc
child 494 bcd737ad27f7
equal deleted inserted replaced
397:85151b2f35ca 398:f1f3facc59e7
   723 static inline to_TYPENAME from_TYPENAME##_TO_##to_TYPENAME(EN_ENO_PARAMS, from_TYPENAME op){\
   723 static inline to_TYPENAME from_TYPENAME##_TO_##to_TYPENAME(EN_ENO_PARAMS, from_TYPENAME op){\
   724   TEST_EN(to_TYPENAME)\
   724   TEST_EN(to_TYPENAME)\
   725   return (to_TYPENAME)oper(op);\
   725   return (to_TYPENAME)oper(op);\
   726 }
   726 }
   727 
   727 
       
   728 /******** [ANY_NUM | ANY_NBIT]_TO_BOOL   ************/
       
   729 #define __convert_num_to_bool(TYPENAME) \
       
   730 static inline BOOL TYPENAME##_TO_BOOL(EN_ENO_PARAMS, TYPENAME op){\
       
   731   TEST_EN(BOOL)\
       
   732   return op == 0 ? 0 : 1;\
       
   733 }
       
   734 __ANY_NUM(__convert_num_to_bool)
       
   735 __ANY_NBIT(__convert_num_to_bool)
       
   736 
       
   737 /******** [TIME | ANY_DATE]_TO_BOOL   ************/
       
   738 #define __convert_time_to_bool(TYPENAME) \
       
   739 static inline BOOL TYPENAME##_TO_BOOL(EN_ENO_PARAMS, TYPENAME op){\
       
   740   TEST_EN(BOOL)\
       
   741   return op.tv_sec == 0 && op.tv_nsec == 0 ? 0 : 1;\
       
   742 }
       
   743 __convert_time_to_bool(TIME)
       
   744 __ANY_DATE(__convert_time_to_bool)
   728 
   745 
   729 #define __to_anynum_(from_TYPENAME)   __ANY_NUM_1(__iec_,from_TYPENAME)
   746 #define __to_anynum_(from_TYPENAME)   __ANY_NUM_1(__iec_,from_TYPENAME)
   730 #define __to_anyint_(from_TYPENAME)   __ANY_INT_1(__iec_,from_TYPENAME)
   747 #define __to_anyint_(from_TYPENAME)   __ANY_INT_1(__iec_,from_TYPENAME)
   731 #define __to_anybit_(from_TYPENAME)   __ANY_BIT_1(__iec_,from_TYPENAME)
   748 #define __to_anybit_(from_TYPENAME)   __ANY_BIT_1(__iec_,from_TYPENAME)
   732 #define __to_anynbit_(from_TYPENAME) __ANY_NBIT_1(__iec_,from_TYPENAME)
   749 #define __to_anynbit_(from_TYPENAME) __ANY_NBIT_1(__iec_,from_TYPENAME)
   733 #define __to_anysint_(from_TYPENAME) __ANY_SINT_1(__iec_,from_TYPENAME)
   750 #define __to_anysint_(from_TYPENAME) __ANY_SINT_1(__iec_,from_TYPENAME)
   734 #define __to_anyuint_(from_TYPENAME) __ANY_UINT_1(__iec_,from_TYPENAME)
   751 #define __to_anyuint_(from_TYPENAME) __ANY_UINT_1(__iec_,from_TYPENAME)
   735 #define __to_anyreal_(from_TYPENAME) __ANY_REAL_1(__iec_,from_TYPENAME)
   752 #define __to_anyreal_(from_TYPENAME) __ANY_REAL_1(__iec_,from_TYPENAME)
   736 #define __to_anydate_(from_TYPENAME) __ANY_DATE_1(__iec_,from_TYPENAME)
   753 #define __to_anydate_(from_TYPENAME) __ANY_DATE_1(__iec_,from_TYPENAME)
   737 
   754 
   738 /******** [ANY_BIT]_TO_[ANY_NUM | ANT_BIT]   ************/ 
   755 /******** [ANY_BIT]_TO_[ANY_NUM | ANT_NBIT]   ************/
   739 #define __iec_(to_TYPENAME,from_TYPENAME) __convert_type(from_TYPENAME, to_TYPENAME, __move_##to_TYPENAME)
   756 #define __iec_(to_TYPENAME,from_TYPENAME) __convert_type(from_TYPENAME, to_TYPENAME, __move_##to_TYPENAME)
   740 __ANY_BIT(__to_anynum_)
   757 __ANY_BIT(__to_anynum_)
   741 __ANY_BIT(__to_anybit_)
   758 __ANY_BIT(__to_anynbit_)
   742 #undef __iec_
   759 #undef __iec_
   743 
   760 
   744 /******** [ANY_INT]_TO_[ANY_NUM | ANT_BIT]   ************/ 
   761 /******** [ANY_INT]_TO_[ANY_NUM | ANT_NBIT]   ************/
   745 #define __iec_(to_TYPENAME,from_TYPENAME) __convert_type(from_TYPENAME, to_TYPENAME, __move_##to_TYPENAME)
   762 #define __iec_(to_TYPENAME,from_TYPENAME) __convert_type(from_TYPENAME, to_TYPENAME, __move_##to_TYPENAME)
   746 __ANY_INT(__to_anynum_)
   763 __ANY_INT(__to_anynum_)
   747 __ANY_INT(__to_anybit_)
   764 __ANY_INT(__to_anynbit_)
   748 #undef __iec_
   765 #undef __iec_
   749 
   766 
   750 /******** [ANY_REAL]_TO_[ANY_BIT]   ************/ 
   767 /******** [ANY_REAL]_TO_[ANY_NBIT]   ************/
   751 #define __iec_(to_TYPENAME,from_TYPENAME) __convert_type(from_TYPENAME, to_TYPENAME, __real_to_bit)
   768 #define __iec_(to_TYPENAME,from_TYPENAME) __convert_type(from_TYPENAME, to_TYPENAME, __real_to_bit)
   752 __ANY_REAL(__to_anybit_)
   769 __ANY_REAL(__to_anynbit_)
   753 #undef __iec_
   770 #undef __iec_
   754 
   771 
   755 /******** [ANY_REAL]_TO_[ANY_INT]   ************/ 
   772 /******** [ANY_REAL]_TO_[ANY_NINT]   ************/
   756 #define __iec_(to_TYPENAME,from_TYPENAME) __convert_type(from_TYPENAME, to_TYPENAME, __real_to_sint)
   773 #define __iec_(to_TYPENAME,from_TYPENAME) __convert_type(from_TYPENAME, to_TYPENAME, __real_to_sint)
   757 __ANY_REAL(__to_anysint_)
   774 __ANY_REAL(__to_anysint_)
   758 #undef __iec_
   775 #undef __iec_
   759 #define __iec_(to_TYPENAME,from_TYPENAME) __convert_type(from_TYPENAME, to_TYPENAME, __real_to_uint)
   776 #define __iec_(to_TYPENAME,from_TYPENAME) __convert_type(from_TYPENAME, to_TYPENAME, __real_to_uint)
   760 __ANY_REAL(__to_anyuint_)
   777 __ANY_REAL(__to_anyuint_)
   784 #undef __iec_
   801 #undef __iec_
   785 
   802 
   786 /******** [TIME | ANY_DATE]_TO_[ANY_BIT | ANY_INT]   ************/ 
   803 /******** [TIME | ANY_DATE]_TO_[ANY_BIT | ANY_INT]   ************/ 
   787 #define __iec_(to_TYPENAME,from_TYPENAME) __convert_type(from_TYPENAME, to_TYPENAME, __time_to_int)
   804 #define __iec_(to_TYPENAME,from_TYPENAME) __convert_type(from_TYPENAME, to_TYPENAME, __time_to_int)
   788 __to_anyint_(TIME)
   805 __to_anyint_(TIME)
   789 __to_anybit_(TIME)
   806 __to_anynbit_(TIME)
   790 __ANY_DATE(__to_anyint_)
   807 __ANY_DATE(__to_anyint_)
   791 __ANY_DATE(__to_anybit_)
   808 __ANY_DATE(__to_anynbit_)
   792 #undef __iec_
   809 #undef __iec_
   793 
   810 
   794 /******** [TIME | ANY_DATE]_TO_[ANY_REAL]   ************/ 
   811 /******** [TIME | ANY_DATE]_TO_[ANY_REAL]   ************/ 
   795 #define __iec_(to_TYPENAME,from_TYPENAME) __convert_type(from_TYPENAME, to_TYPENAME, __time_to_real)
   812 #define __iec_(to_TYPENAME,from_TYPENAME) __convert_type(from_TYPENAME, to_TYPENAME, __time_to_real)
   796 __to_anyreal_(TIME)
   813 __to_anyreal_(TIME)
  1129   /*     MOD    */
  1146   /*     MOD    */
  1130   /**************/
  1147   /**************/
  1131 #define __mod(TYPENAME)\
  1148 #define __mod(TYPENAME)\
  1132 /* The explicitly typed standard functions */\
  1149 /* The explicitly typed standard functions */\
  1133 static inline TYPENAME MOD_##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\
  1150 static inline TYPENAME MOD_##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\
  1134   TEST_EN_COND(TYPENAME, op2 == 0)\
  1151   TEST_EN(TYPENAME)\
       
  1152   if (op2 == 0) return 0;\
  1135   return op1 % op2;\
  1153   return op1 % op2;\
  1136 }\
  1154 }\
  1137 /* The overloaded standard functions */\
  1155 /* The overloaded standard functions */\
  1138 static inline TYPENAME MOD__##TYPENAME##__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\
  1156 static inline TYPENAME MOD__##TYPENAME##__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\
  1139   return DIV_##TYPENAME(EN_ENO, op1, op2);\
  1157   return MOD_##TYPENAME(EN_ENO, op1, op2);\
  1140 }
  1158 }
  1141 __ANY_INT(__mod)
  1159 __ANY_INT(__mod)
  1142 
  1160 
  1143   /**************/
  1161   /**************/
  1144   /*    EXPT    */
  1162   /*    EXPT    */
  1547  * unlike remaining functions, that start off at 1.
  1565  * unlike remaining functions, that start off at 1.
  1548  */    
  1566  */    
  1549 /* The explicitly typed standard functions */
  1567 /* The explicitly typed standard functions */
  1550 #define __in1_anyint_(in2_TYPENAME)   __ANY_INT_1(__iec_,in2_TYPENAME)
  1568 #define __in1_anyint_(in2_TYPENAME)   __ANY_INT_1(__iec_,in2_TYPENAME)
  1551 #define __iec_(in1_TYPENAME,in2_TYPENAME) \
  1569 #define __iec_(in1_TYPENAME,in2_TYPENAME) \
  1552 static inline in2_TYPENAME MUX__##in2_TYPENAME##__##in1_TYPENAME##__##in2_TYPENAME(EN_ENO_PARAMS, UINT param_count, in1_TYPENAME K, ...){\
  1570 static inline in2_TYPENAME MUX__##in2_TYPENAME##__##in1_TYPENAME##__##in2_TYPENAME(EN_ENO_PARAMS, in1_TYPENAME K, UINT param_count, ...){\
  1553   va_list ap;\
  1571   va_list ap;\
  1554   UINT i;\
  1572   UINT i;\
  1555   in2_TYPENAME tmp;\
  1573   in2_TYPENAME tmp;\
  1556   TEST_EN_COND(in2_TYPENAME, K >= param_count)\
  1574   TEST_EN_COND(in2_TYPENAME, K >= param_count)\
  1557   tmp = __INIT_##in2_TYPENAME;\
  1575   tmp = __INIT_##in2_TYPENAME;\
  1558   \
  1576   \
  1559   va_start (ap, K);         /* Initialize the argument list.  */\
  1577   va_start (ap, param_count);         /* Initialize the argument list.  */\
  1560   \
  1578   \
  1561   for (i = 0; i < param_count; i++){\
  1579   for (i = 0; i < param_count; i++){\
  1562     if(K == i){\
  1580     if(K == i){\
  1563         tmp = va_arg (ap, VA_ARGS_##in2_TYPENAME);\
  1581         tmp = va_arg (ap, VA_ARGS_##in2_TYPENAME);\
  1564         va_end (ap);                  /* Clean up.  */\
  1582         va_end (ap);                  /* Clean up.  */\
  1732 
  1750 
  1733 
  1751 
  1734     /**************/
  1752     /**************/
  1735     /*     NE     */
  1753     /*     NE     */
  1736     /**************/
  1754     /**************/
       
  1755 
       
  1756 #define __ne_num(fname, TYPENAME) \
       
  1757 static inline BOOL fname(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\
       
  1758   TEST_EN(BOOL)\
       
  1759   return op1 != op2 ? 1 : 0;\
       
  1760 }
       
  1761 
       
  1762 #define __ne_time(fname, TYPENAME) \
       
  1763 static inline BOOL fname(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\
       
  1764   TEST_EN(BOOL)\
       
  1765   return __time_cmp(op1, op2) != 0 ? 1 : 0;\
       
  1766 }
       
  1767 
       
  1768 
  1737 /* Comparison for numerical data types */
  1769 /* Comparison for numerical data types */
  1738 #define __iec_(TYPENAME) \
  1770 #define __iec_(TYPENAME) \
  1739 __compare_num(NE_##TYPENAME, TYPENAME, != ) /* The explicitly typed standard functions */\
  1771 __ne_num(NE_##TYPENAME, TYPENAME) /* The explicitly typed standard functions */\
  1740 __compare_num(NE__BOOL__##TYPENAME##__##TYPENAME, TYPENAME, != ) /* Overloaded function */
  1772 __ne_num(NE__BOOL__##TYPENAME##__##TYPENAME, TYPENAME) /* Overloaded function */
  1741 __ANY_NBIT(__iec_)
  1773 __ANY_NBIT(__iec_)
  1742 __ANY_NUM(__iec_)
  1774 __ANY_NUM(__iec_)
  1743 #undef __iec_
  1775 #undef __iec_
  1744 
  1776 
  1745 /* Comparison for time data types */	
  1777 /* Comparison for time data types */	
  1746 #define __iec_(TYPENAME) \
  1778 #define __iec_(TYPENAME) \
  1747 __compare_time(NE_##TYPENAME, TYPENAME, != ) /* The explicitly typed standard functions */\
  1779 __ne_time(NE_##TYPENAME, TYPENAME) /* The explicitly typed standard functions */\
  1748 __compare_time(NE__BOOL__##TYPENAME##__##TYPENAME, TYPENAME, != ) /* Overloaded function */
  1780 __ne_time(NE__BOOL__##TYPENAME##__##TYPENAME, TYPENAME) /* Overloaded function */
  1749 __ANY_DATE(__iec_)
  1781 __ANY_DATE(__iec_)
  1750 __iec_(TIME)
  1782 __iec_(TIME)
  1751 #undef __iec_
  1783 #undef __iec_
  1752 
  1784 
  1753 /* Comparison for string data types */	
  1785 /* Comparison for string data types */