lib/iec_std_lib.h
changeset 393 f09a5ffe1edc
parent 389 94b67e38188a
child 398 f1f3facc59e7
equal deleted inserted replaced
392:9b88b8b6bccd 393:f09a5ffe1edc
   629     /*  MOVE_*  */
   629     /*  MOVE_*  */
   630     /************/
   630     /************/
   631 
   631 
   632 /* some helpful __move_[ANY] functions, used in the *_TO_** and MOVE  standard functions */
   632 /* some helpful __move_[ANY] functions, used in the *_TO_** and MOVE  standard functions */
   633 /* e.g. __move_BOOL, __move_BYTE, __move_REAL, __move_TIME, ... */
   633 /* e.g. __move_BOOL, __move_BYTE, __move_REAL, __move_TIME, ... */
   634 #define __iec_(TYPENAME)\
   634 #define __move_(TYPENAME)\
   635 static inline TYPENAME __move_##TYPENAME(TYPENAME op1) {return op1;}
   635 static inline TYPENAME __move_##TYPENAME(TYPENAME op1) {return op1;}
   636 __ANY(__iec_)
   636 __ANY(__move_)
   637 #undef __iec_
       
   638 
   637 
   639 
   638 
   640 
   639 
   641 /*****************************************************************/
   640 /*****************************************************************/
   642 /*****************************************************************/
   641 /*****************************************************************/
   690 /********************/
   689 /********************/
   691 /*   EN/ENO PARAMS  */
   690 /*   EN/ENO PARAMS  */
   692 /********************/
   691 /********************/
   693 
   692 
   694 #define EN_ENO_PARAMS BOOL EN, BOOL *ENO
   693 #define EN_ENO_PARAMS BOOL EN, BOOL *ENO
       
   694 #define EN_ENO EN, ENO
   695 
   695 
   696 #define TEST_EN(TYPENAME)\
   696 #define TEST_EN(TYPENAME)\
   697   if (!EN) {\
   697   if (!EN) {\
   698     if (ENO != NULL)\
   698     if (ENO != NULL)\
   699       *ENO = __BOOL_LITERAL(FALSE);\
   699       *ENO = __BOOL_LITERAL(FALSE);\
   937 #define VA_ARGS_TOD TOD
   937 #define VA_ARGS_TOD TOD
   938 #define VA_ARGS_DT DT
   938 #define VA_ARGS_DT DT
   939 
   939 
   940 
   940 
   941 #define __numeric(fname,TYPENAME, FUNC) \
   941 #define __numeric(fname,TYPENAME, FUNC) \
       
   942 /* explicitly typed function */\
   942 static inline TYPENAME fname##TYPENAME(EN_ENO_PARAMS, TYPENAME op){\
   943 static inline TYPENAME fname##TYPENAME(EN_ENO_PARAMS, TYPENAME op){\
   943   TEST_EN(TYPENAME)\
   944   TEST_EN(TYPENAME)\
   944   return FUNC(op);\
   945   return FUNC(op);\
       
   946 }\
       
   947 /* overloaded function */\
       
   948 static inline TYPENAME fname##_##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, TYPENAME op) {\
       
   949   return fname##TYPENAME(EN_ENO, op);\
   945 }
   950 }
   946 
   951 
   947 /******************************************************************/
   952 /******************************************************************/
   948 /***   Table 23 - Standard functions of one numeric variable    ***/
   953 /***   Table 23 - Standard functions of one numeric variable    ***/
   949 /******************************************************************/
   954 /******************************************************************/
   950 
   955 
   951   /**************/
   956   /**************/
   952   /*    ABS     */
   957   /*    ABS     */
   953   /**************/
   958   /**************/
   954 /* explicitly typed function */
   959 #define __abs_signed(TYPENAME) \
   955 #define __iec_(TYPENAME) \
   960 /* explicitly typed function */\
   956 static inline TYPENAME ABS_##TYPENAME(EN_ENO_PARAMS, TYPENAME op){\
   961 static inline TYPENAME ABS_##TYPENAME(EN_ENO_PARAMS, TYPENAME op){\
   957   TEST_EN(TYPENAME)\
   962   TEST_EN(TYPENAME)\
   958   if (op < 0)\
   963   if (op < 0)\
   959     return -op;\
   964     return -op;\
   960   return op;\
   965   return op;\
   961 }
   966 }\
   962 __ANY_REAL(__iec_)
   967 /* overloaded function */\
   963 __ANY_SINT(__iec_)
   968 static inline TYPENAME ABS__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, TYPENAME op) {\
   964 #undef __iec_
   969   return ABS_##TYPENAME(EN_ENO, op);\
   965 
   970 }
   966 #define __iec_(TYPENAME) \
   971 
       
   972 #define __abs_unsigned(TYPENAME) \
       
   973 /* explicitly typed function */\
   967 static inline TYPENAME ABS_##TYPENAME(EN_ENO_PARAMS, TYPENAME op){\
   974 static inline TYPENAME ABS_##TYPENAME(EN_ENO_PARAMS, TYPENAME op){\
   968   TEST_EN(TYPENAME)\
   975   TEST_EN(TYPENAME)\
   969   return op;\
   976   return op;\
   970 }
   977 }\
   971 __ANY_UINT(__iec_)
   978 /* overloaded function */\
   972 #undef __iec_
   979 static inline TYPENAME ABS__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, TYPENAME op) {\
   973 
   980   return ABS_##TYPENAME(EN_ENO, op);\
   974 /* overloaded function */
   981 }
   975 #define __iec_(TYPENAME) \
   982 
   976 static inline TYPENAME ABS__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, TYPENAME op){\
   983 __ANY_REAL(__abs_signed)
   977   TEST_EN(TYPENAME)\
   984 __ANY_SINT(__abs_signed)
   978   if (op < 0)\
   985 __ANY_UINT(__abs_unsigned)
   979     return -op;\
       
   980   return op;\
       
   981 }
       
   982 __ANY_REAL(__iec_)
       
   983 __ANY_SINT(__iec_)
       
   984 #undef __iec_
       
   985 
       
   986 #define __iec_(TYPENAME) \
       
   987 static inline TYPENAME ABS__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, TYPENAME op){\
       
   988   TEST_EN(TYPENAME)\
       
   989   return op;\
       
   990 }
       
   991 __ANY_UINT(__iec_)
       
   992 #undef __iec_
       
   993 
   986 
   994 
   987 
   995   /**************/
   988   /**************/
   996   /*    SQRT    */
   989   /*    SQRT    */
   997   /**************/
   990   /**************/
   998 /* explicitly typed function */
   991 #define __sqrt(TYPENAME) __numeric(SQRT_, TYPENAME, sqrt)
   999 #define __iec_(TYPENAME) \
   992 __ANY_REAL(__sqrt)
  1000 __numeric(SQRT_, TYPENAME, sqrt)                             /* explicitly typed function */\
   993 
  1001 __numeric(SQRT__##TYPENAME##__, TYPENAME, sqrt)              /* overloaded function */
   994 
  1002 __ANY_REAL(__iec_)
   995 /**************/
  1003 #undef __iec_
       
  1004 
       
  1005   /**************/
       
  1006   /*     LN     */
   996   /*     LN     */
  1007   /**************/
   997   /**************/
  1008 #define __iec_(TYPENAME) \
   998 #define __ln(TYPENAME) __numeric(LN_, TYPENAME, log)
  1009 __numeric(LN_, TYPENAME, log)                             /* explicitly typed function */\
   999 __ANY_REAL(__ln)
  1010 __numeric(LN__##TYPENAME##__, TYPENAME, log)              /* overloaded function */
       
  1011 __ANY_REAL(__iec_)
       
  1012 #undef __iec_
       
  1013 
  1000 
  1014 
  1001 
  1015   /**************/
  1002   /**************/
  1016   /*     LOG    */
  1003   /*     LOG    */
  1017   /**************/
  1004   /**************/
  1018 #define __iec_(TYPENAME) \
  1005 #define __log(TYPENAME) __numeric(LOG_, TYPENAME, log10)
  1019 __numeric(LOG_, TYPENAME, log10)                             /* explicitly typed function */\
  1006 __ANY_REAL(__log)
  1020 __numeric(LOG__##TYPENAME##__, TYPENAME, log10)              /* overloaded function */
  1007 
  1021 __ANY_REAL(__iec_)
       
  1022 #undef __iec_
       
  1023 
  1008 
  1024   /**************/
  1009   /**************/
  1025   /*     EXP    */
  1010   /*     EXP    */
  1026   /**************/
  1011   /**************/
  1027 #define __iec_(TYPENAME) \
  1012 #define __exp(TYPENAME) __numeric(EXP_, TYPENAME, exp)
  1028 __numeric(EXP_, TYPENAME, exp)                             /* explicitly typed function */\
  1013 __ANY_REAL(__exp)
  1029 __numeric(EXP__##TYPENAME##__, TYPENAME, exp)              /* overloaded function */
       
  1030 __ANY_REAL(__iec_)
       
  1031 #undef __iec_
       
  1032 
  1014 
  1033 
  1015 
  1034   /**************/
  1016   /**************/
  1035   /*     SIN    */
  1017   /*     SIN    */
  1036   /**************/
  1018   /**************/
  1037 #define __iec_(TYPENAME) \
  1019 #define __sin(TYPENAME) __numeric(SIN_, TYPENAME, sin)
  1038 __numeric(SIN_, TYPENAME, sin)                              /* explicitly typed function */\
  1020 __ANY_REAL(__sin)
  1039 __numeric(SIN__##TYPENAME##__, TYPENAME, sin)               /* overloaded function */
       
  1040 __ANY_REAL(__iec_)
       
  1041 #undef __iec_
       
  1042 
  1021 
  1043 
  1022 
  1044   /**************/
  1023   /**************/
  1045   /*     COS    */
  1024   /*     COS    */
  1046   /**************/
  1025   /**************/
  1047 #define __iec_(TYPENAME) \
  1026 #define __cos(TYPENAME) __numeric(COS_, TYPENAME, cos)
  1048 __numeric(COS_, TYPENAME, cos)                             /* explicitly typed function */\
  1027 __ANY_REAL(__cos)
  1049 __numeric(COS__##TYPENAME##__, TYPENAME, cos)              /* overloaded function */
       
  1050 __ANY_REAL(__iec_)
       
  1051 #undef __iec_
       
  1052 
  1028 
  1053   /**************/
  1029   /**************/
  1054   /*     TAN    */
  1030   /*     TAN    */
  1055   /**************/
  1031   /**************/
  1056 #define __iec_(TYPENAME) \
  1032 #define __tan(TYPENAME) __numeric(TAN_, TYPENAME, tan)
  1057 __numeric(TAN_, TYPENAME, tan)                             /* explicitly typed function */\
  1033 __ANY_REAL(__tan)
  1058 __numeric(TAN__##TYPENAME##__, TYPENAME, tan)              /* overloaded function */
       
  1059 __ANY_REAL(__iec_)
       
  1060 #undef __iec_
       
  1061 
  1034 
  1062 
  1035 
  1063   /**************/
  1036   /**************/
  1064   /*    ASIN    */
  1037   /*    ASIN    */
  1065   /**************/
  1038   /**************/
  1066 #define __iec_(TYPENAME) \
  1039 #define __asin(TYPENAME) __numeric(ASIN_, TYPENAME, asin)
  1067 __numeric(ASIN_, TYPENAME, asin)                             /* explicitly typed function */\
  1040 __ANY_REAL(__asin)
  1068 __numeric(ASIN__##TYPENAME##__, TYPENAME, asin)              /* overloaded function */
       
  1069 __ANY_REAL(__iec_)
       
  1070 #undef __iec_
       
  1071 
  1041 
  1072   /**************/
  1042   /**************/
  1073   /*    ACOS    */
  1043   /*    ACOS    */
  1074   /**************/
  1044   /**************/
  1075 #define __iec_(TYPENAME) \
  1045 #define __acos(TYPENAME) __numeric(ACOS_, TYPENAME, acos)
  1076 __numeric(ACOS_, TYPENAME, acos)                             /* explicitly typed function */\
  1046 __ANY_REAL(__acos)
  1077 __numeric(ACOS__##TYPENAME##__, TYPENAME, acos)              /* overloaded function */
       
  1078 __ANY_REAL(__iec_)
       
  1079 #undef __iec_
       
  1080 
  1047 
  1081   /**************/
  1048   /**************/
  1082   /*    ATAN    */
  1049   /*    ATAN    */
  1083   /**************/
  1050   /**************/
  1084 #define __iec_(TYPENAME) \
  1051 #define __atan(TYPENAME) __numeric(ATAN_, TYPENAME, atan)
  1085 __numeric(ATAN_, TYPENAME, atan)                             /* explicitly typed function */\
  1052 __ANY_REAL(__atan)
  1086 __numeric(ATAN__##TYPENAME##__, TYPENAME, atan)              /* overloaded function */
       
  1087 __ANY_REAL(__iec_)
       
  1088 #undef __iec_
       
  1089 
  1053 
  1090 
  1054 
  1091 
  1055 
  1092 /*****************************************************/
  1056 /*****************************************************/
  1093 /***   Table 24 - Standard arithmetic functions    ***/
  1057 /***   Table 24 - Standard arithmetic functions    ***/
  1094 /*****************************************************/
  1058 /*****************************************************/
  1095 /*
  1059 
  1096    Unfortunately, the following does not work!!
  1060 #define __arith_expand(fname,TYPENAME, OP)\
  1097    
       
  1098 #define NUMARGS(...) (sizeof((int[]){__VA_ARGS__})/sizeof(int))
       
  1099 
       
  1100 #define __arith_expand(fname,TYPENAME, OP) \
       
  1101 #define fname(EN, ENO, ...) fname__(EN, ENO, NUMARGS(__VA_ARGS__), __VA_ARGS__)\
       
  1102 static inline TYPENAME fname__(EN_ENO_PARAMS, UINT param_count, TYPENAME op1, ...){\
       
  1103   va_list ap;\
       
  1104   UINT i;\
       
  1105   TEST_EN(TYPENAME)\
       
  1106   \
       
  1107   va_start (ap, op1);         \
       
  1108   \
       
  1109   for (i = 0; i < param_count - 1; i++){\
       
  1110     op1 = op1 OP va_arg (ap, VA_ARGS_##TYPENAME);\
       
  1111   }\
       
  1112   \
       
  1113   va_end (ap);                  \
       
  1114   return op1;\
       
  1115 }
       
  1116 */
       
  1117 
       
  1118 
       
  1119 #define __arith_expand(fname,TYPENAME, OP) \
       
  1120 static inline TYPENAME fname(EN_ENO_PARAMS, UINT param_count, TYPENAME op1, ...){\
  1061 static inline TYPENAME fname(EN_ENO_PARAMS, UINT param_count, TYPENAME op1, ...){\
  1121   va_list ap;\
  1062   va_list ap;\
  1122   UINT i;\
  1063   UINT i;\
  1123   TEST_EN(TYPENAME)\
  1064   TEST_EN(TYPENAME)\
  1124   \
  1065   \
  1130   \
  1071   \
  1131   va_end (ap);                  /* Clean up.  */\
  1072   va_end (ap);                  /* Clean up.  */\
  1132   return op1;\
  1073   return op1;\
  1133 }
  1074 }
  1134 
  1075 
  1135 #define __arith_static(fname,TYPENAME, OP) \
  1076 #define __arith_static(fname,TYPENAME, OP)\
  1136 static inline TYPENAME fname(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\
  1077 /* explicitly typed function */\
       
  1078 static inline TYPENAME fname##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\
  1137   TEST_EN(TYPENAME)\
  1079   TEST_EN(TYPENAME)\
  1138   return op1 OP op2;\
  1080   return op1 OP op2;\
       
  1081 }\
       
  1082 /* overloaded function */\
       
  1083 static inline TYPENAME fname##_##TYPENAME##__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\
       
  1084   return fname##TYPENAME(EN_ENO, op1, op2);\
  1139 }
  1085 }
  1140 
  1086 
  1141   /**************/
  1087   /**************/
  1142   /*     ADD    */
  1088   /*     ADD    */
  1143   /**************/
  1089   /**************/
  1144 #define __iec_(TYPENAME) \
  1090 #define __add(TYPENAME) \
  1145 __arith_expand(ADD_##TYPENAME, TYPENAME, +) 			 /* explicitly typed function */\
  1091 __arith_expand(ADD_##TYPENAME, TYPENAME, +) 			 /* explicitly typed function */\
  1146 __arith_expand(ADD__##TYPENAME##__##TYPENAME, TYPENAME, +)	 /* overloaded function */
  1092 __arith_expand(ADD__##TYPENAME##__##TYPENAME, TYPENAME, +)	 /* overloaded function */
  1147 __ANY_NUM(__iec_)
  1093 __ANY_NUM(__add)
  1148 #undef __iec_
  1094 
  1149 
  1095 
  1150   /**************/
  1096   /**************/
  1151   /*     MUL    */
  1097   /*     MUL    */
  1152   /**************/
  1098   /**************/
  1153 #define __iec_(TYPENAME) \
  1099 #define __mul(TYPENAME) \
  1154 __arith_expand(MUL_##TYPENAME, TYPENAME, *) 			 /* explicitly typed function */\
  1100 __arith_expand(MUL_##TYPENAME, TYPENAME, *) 			 /* explicitly typed function */\
  1155 __arith_expand(MUL__##TYPENAME##__##TYPENAME, TYPENAME, *)	 /* overloaded function */
  1101 __arith_expand(MUL__##TYPENAME##__##TYPENAME, TYPENAME, *)	 /* overloaded function */
  1156 __ANY_NUM(__iec_)
  1102 __ANY_NUM(__mul)
  1157 #undef __iec_
  1103 
  1158 
  1104 
  1159   /**************/
  1105   /**************/
  1160   /*     SUB    */
  1106   /*     SUB    */
  1161   /**************/
  1107   /**************/
  1162 #define __iec_(TYPENAME) \
  1108 #define __sub(TYPENAME) __arith_static(SUB_, TYPENAME, -)
  1163 __arith_expand(SUB_##TYPENAME, TYPENAME, -) 			 /* explicitly typed function */\
  1109 __ANY_NUM(__sub)
  1164 __arith_expand(SUB__##TYPENAME##__##TYPENAME##__##TYPENAME, TYPENAME, -)	 /* overloaded function */
  1110 
  1165 __ANY_NUM(__iec_)
       
  1166 #undef __iec_
       
  1167 
  1111 
  1168   /**************/
  1112   /**************/
  1169   /*     DIV    */
  1113   /*     DIV    */
  1170   /**************/
  1114   /**************/
  1171 /* The explicitly typed standard functions */
  1115 #define __div(TYPENAME)\
  1172 #define __iec_(TYPENAME)\
  1116 /* The explicitly typed standard functions */\
  1173 static inline TYPENAME DIV_##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\
  1117 static inline TYPENAME DIV_##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\
  1174   TEST_EN_COND(TYPENAME, op2 == 0)\
  1118   TEST_EN_COND(TYPENAME, op2 == 0)\
  1175   return op1 / op2;\
  1119   return op1 / op2;\
  1176 }
  1120 }\
  1177 __ANY_NUM(__iec_)
  1121 /* The overloaded standard functions */\
  1178 #undef __iec_
       
  1179 
       
  1180 /* The overloaded standard functions */
       
  1181 #define __iec_(TYPENAME)\
       
  1182 static inline TYPENAME DIV__##TYPENAME##__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\
  1122 static inline TYPENAME DIV__##TYPENAME##__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\
       
  1123   return DIV_##TYPENAME(EN_ENO, op1, op2);\
       
  1124 }
       
  1125 __ANY_NUM(__div)
       
  1126 
       
  1127 
       
  1128   /**************/
       
  1129   /*     MOD    */
       
  1130   /**************/
       
  1131 #define __mod(TYPENAME)\
       
  1132 /* The explicitly typed standard functions */\
       
  1133 static inline TYPENAME MOD_##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\
  1183   TEST_EN_COND(TYPENAME, op2 == 0)\
  1134   TEST_EN_COND(TYPENAME, op2 == 0)\
  1184   return op1 / op2;\
  1135   return op1 % op2;\
  1185 }
  1136 }\
  1186 __ANY_NUM(__iec_)
  1137 /* The overloaded standard functions */\
  1187 #undef __iec_
  1138 static inline TYPENAME MOD__##TYPENAME##__##TYPENAME##__##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\
  1188 
  1139   return DIV_##TYPENAME(EN_ENO, op1, op2);\
  1189   /**************/
  1140 }
  1190   /*     MOD    */
  1141 __ANY_INT(__mod)
  1191   /**************/
       
  1192 /* The explicitly typed standard functions */
       
  1193 #define __iec_(TYPENAME)\
       
  1194 __arith_expand(MOD_##TYPENAME, TYPENAME, %) 			 /* explicitly typed function */\
       
  1195 __arith_expand(MOD__##TYPENAME##__##TYPENAME##__##TYPENAME, TYPENAME, %)	 /* overloaded function */
       
  1196 __ANY_INT(__iec_)
       
  1197 #undef __iec_
       
  1198 
  1142 
  1199   /**************/
  1143   /**************/
  1200   /*    EXPT    */
  1144   /*    EXPT    */
  1201   /**************/
  1145   /**************/
  1202 /* overloaded function */
  1146 /* overloaded function */