232 IEC_error(); |
229 IEC_error(); |
233 |
230 |
234 return ts; |
231 return ts; |
235 } |
232 } |
236 |
233 |
|
234 /********************/ |
|
235 /* EN/ENO PARAMS */ |
|
236 /********************/ |
|
237 |
|
238 #define EN_ENO_PARAMS BOOL EN, BOOL *ENO |
|
239 #define TEST_EN(TYPENAME)\ |
|
240 if (!EN) {\ |
|
241 if (ENO != NULL)\ |
|
242 *ENO = __BOOL_LITERAL(FALSE);\ |
|
243 return __INIT_##TYPENAME;\ |
|
244 }\ |
|
245 else if (ENO != NULL)\ |
|
246 *ENO = __BOOL_LITERAL(TRUE); |
|
247 #define TEST_EN_COND(TYPENAME, COND)\ |
|
248 if (!EN || (COND)) {\ |
|
249 if (ENO != NULL)\ |
|
250 *ENO = __BOOL_LITERAL(FALSE);\ |
|
251 return __INIT_##TYPENAME;\ |
|
252 }\ |
|
253 else if (ENO != NULL)\ |
|
254 *ENO = __BOOL_LITERAL(TRUE); |
|
255 |
237 /***************/ |
256 /***************/ |
238 /* Time ops */ |
257 /* Time ops */ |
239 /***************/ |
258 /***************/ |
240 static inline TIME __date_and_time_to_time_of_day(TIME IN){ |
259 #define __TIME_CMP(t1, t2) (t2.tv_sec == t1.tv_sec ? t1.tv_nsec - t2.tv_nsec : t1.tv_sec - t2.tv_sec) |
241 return (TIME){IN.tv_sec % 86400, IN.tv_nsec}; |
260 |
242 } |
261 static inline TIME __TIME_ADD(TIME IN1, TIME IN2){ |
243 static inline TIME __date_and_time_to_date(TIME IN){ |
|
244 return (TIME){IN.tv_sec - (IN.tv_sec % (24*60*60)), 0}; |
|
245 } |
|
246 static inline TIME __time_add(TIME IN1, TIME IN2){ |
|
247 TIME res ={IN1.tv_sec + IN2.tv_sec, |
262 TIME res ={IN1.tv_sec + IN2.tv_sec, |
248 IN1.tv_nsec + IN2.tv_nsec }; |
263 IN1.tv_nsec + IN2.tv_nsec }; |
249 __normalize_timespec(&res); |
264 __normalize_timespec(&res); |
250 return res; |
265 return res; |
251 } |
266 } |
252 static inline TIME __time_sub(TIME IN1, TIME IN2){ |
267 static inline TIME __TIME_SUB(TIME IN1, TIME IN2){ |
253 TIME res ={IN1.tv_sec - IN2.tv_sec, |
268 TIME res ={IN1.tv_sec - IN2.tv_sec, |
254 IN1.tv_nsec - IN2.tv_nsec }; |
269 IN1.tv_nsec - IN2.tv_nsec }; |
255 __normalize_timespec(&res); |
270 __normalize_timespec(&res); |
256 return res; |
271 return res; |
257 } |
272 } |
258 static inline TIME __time_mul(TIME IN1, LREAL IN2){ |
273 static inline TIME __TIME_MUL(TIME IN1, LREAL IN2){ |
259 LREAL s_f = IN1.tv_sec * IN2; |
274 LREAL s_f = IN1.tv_sec * IN2; |
260 time_t s = s_f; |
275 time_t s = s_f; |
261 div_t ns = div((LREAL)IN1.tv_nsec * IN2, 1000000000); |
276 div_t ns = div((LREAL)IN1.tv_nsec * IN2, 1000000000); |
262 TIME res = {s + ns.quot, |
277 TIME res = {s + ns.quot, |
263 ns.rem + (s_f - s) * 1000000000 }; |
278 ns.rem + (s_f - s) * 1000000000 }; |
264 __normalize_timespec(&res); |
279 __normalize_timespec(&res); |
265 return res; |
280 return res; |
266 } |
281 } |
267 static inline TIME __time_div(TIME IN1, LREAL IN2){ |
282 static inline TIME __TIME_DIV(TIME IN1, LREAL IN2){ |
268 LREAL s_f = IN1.tv_sec / IN2; |
283 LREAL s_f = IN1.tv_sec / IN2; |
269 time_t s = s_f; |
284 time_t s = s_f; |
270 TIME res = {s, |
285 TIME res = {s, |
271 IN1.tv_nsec / IN2 + (s_f - s) * 1000000000 }; |
286 IN1.tv_nsec / IN2 + (s_f - s) * 1000000000 }; |
272 __normalize_timespec(&res); |
287 __normalize_timespec(&res); |
273 return res; |
288 return res; |
274 } |
289 } |
275 |
290 |
|
291 static inline TIME __date_and_time_to_time_of_day(EN_ENO_PARAMS, TIME IN){ |
|
292 TEST_EN(TIME) |
|
293 return (TIME){IN.tv_sec % 86400, IN.tv_nsec}; |
|
294 } |
|
295 static inline TIME __date_and_time_to_date(EN_ENO_PARAMS, TIME IN){ |
|
296 TEST_EN(TIME) |
|
297 return (TIME){IN.tv_sec - (IN.tv_sec % (24*60*60)), 0}; |
|
298 } |
|
299 static inline TIME __time_add(EN_ENO_PARAMS, TIME IN1, TIME IN2){ |
|
300 TEST_EN(TIME) |
|
301 return __TIME_ADD(IN1, IN2); |
|
302 } |
|
303 static inline TIME __time_sub(EN_ENO_PARAMS, TIME IN1, TIME IN2){ |
|
304 TEST_EN(TIME) |
|
305 return __TIME_SUB(IN1, IN2); |
|
306 } |
|
307 static inline TIME __time_mul(EN_ENO_PARAMS, TIME IN1, LREAL IN2){ |
|
308 TEST_EN(TIME) |
|
309 return __TIME_MUL(IN1, IN2); |
|
310 } |
|
311 static inline TIME __time_div(EN_ENO_PARAMS, TIME IN1, LREAL IN2){ |
|
312 TEST_EN(TIME) |
|
313 return __TIME_DIV(IN1, IN2); |
|
314 } |
|
315 |
276 /***************/ |
316 /***************/ |
277 /* String ops */ |
317 /* String ops */ |
278 /***************/ |
318 /***************/ |
279 static inline UINT __len(STRING IN){ |
319 #define __STR_CMP(str1, str2) memcmp((char*)&str1.body,(char*)&str2.body, str1.len < str2.len ? str1.len : str2.len) |
|
320 |
|
321 static inline UINT __len(EN_ENO_PARAMS, STRING IN){ |
|
322 TEST_EN(UINT) |
280 return IN.len; |
323 return IN.len; |
281 } |
324 } |
282 static inline STRING __left(STRING IN, SINT L){ |
325 static inline STRING __left(EN_ENO_PARAMS, STRING IN, SINT L){ |
|
326 TEST_EN_COND(STRING, L < 0) |
283 STRING res = __INIT_STRING; |
327 STRING res = __INIT_STRING; |
284 L = L < IN.len ? L : IN.len; |
328 L = L < IN.len ? L : IN.len; |
285 memcpy(&res.body, &IN.body, L); |
329 memcpy(&res.body, &IN.body, L); |
286 res.len = L; |
330 res.len = L; |
287 return res; |
331 return res; |
288 } |
332 } |
289 static inline STRING __right(STRING IN, SINT L){ |
333 static inline STRING __right(EN_ENO_PARAMS, STRING IN, SINT L){ |
|
334 TEST_EN_COND(STRING, L < 0) |
290 STRING res = __INIT_STRING; |
335 STRING res = __INIT_STRING; |
291 L = L < IN.len ? L : IN.len; |
336 L = L < IN.len ? L : IN.len; |
292 memcpy(&res.body, &IN.body[IN.len - L], L); |
337 memcpy(&res.body, &IN.body[IN.len - L], L); |
293 res.len = L; |
338 res.len = L; |
294 return res; |
339 return res; |
295 } |
340 } |
296 static inline STRING __mid(STRING IN, SINT L, SINT P){ |
341 static inline STRING __mid(EN_ENO_PARAMS, STRING IN, SINT L, SINT P){ |
|
342 TEST_EN_COND(STRING, L < 0 || P < 0) |
297 STRING res = __INIT_STRING; |
343 STRING res = __INIT_STRING; |
298 if(P <= IN.len){ |
344 if(P <= IN.len){ |
299 P -= 1; /* now can be used as [index]*/ |
345 P -= 1; /* now can be used as [index]*/ |
300 L = L + P <= IN.len ? L : IN.len - P; |
346 L = L + P <= IN.len ? L : IN.len - P; |
301 memcpy(&res.body, &IN.body[P] , L); |
347 memcpy(&res.body, &IN.body[P] , L); |
302 res.len = L; |
348 res.len = L; |
303 } |
349 } |
304 return res; |
350 return res; |
305 } |
351 } |
306 static inline STRING __concat(SINT param_count, ...){ |
352 static inline STRING __concat(EN_ENO_PARAMS, SINT param_count, ...){ |
|
353 TEST_EN(STRING) |
307 va_list ap; |
354 va_list ap; |
308 UINT i; |
355 UINT i; |
309 __strlen_t charcount = 0; |
356 __strlen_t charcount = 0; |
310 STRING res = __INIT_STRING; |
357 STRING res = __INIT_STRING; |
311 |
358 |
398 count2 = 0; |
448 count2 = 0; |
399 } |
449 } |
400 } |
450 } |
401 return count2 == IN2->len -1 ? 0 : count1 + 1; |
451 return count2 == IN2->len -1 ? 0 : count1 + 1; |
402 } |
452 } |
403 static inline UINT __find(STRING IN1, STRING IN2){ |
453 static inline UINT __find(EN_ENO_PARAMS, STRING IN1, STRING IN2){ |
|
454 TEST_EN(UINT) |
404 return __pfind(&IN1, &IN2); |
455 return __pfind(&IN1, &IN2); |
405 } |
456 } |
406 |
457 |
407 /***************/ |
458 /***************/ |
408 /* Convertions */ |
459 /* Convertions */ |
409 /***************/ |
460 /***************/ |
410 /***************/ |
461 /***************/ |
411 /* TO_STRING */ |
462 /* TO_STRING */ |
412 /***************/ |
463 /***************/ |
413 static inline STRING __bool_to_string(BOOL IN) |
464 static inline STRING __bool_to_string(EN_ENO_PARAMS, BOOL IN) |
414 { |
465 { |
|
466 TEST_EN(STRING) |
415 if(IN) |
467 if(IN) |
416 return (STRING){4, "TRUE"}; |
468 return (STRING){4, "TRUE"}; |
417 return (STRING){5,"FALSE"}; |
469 return (STRING){5,"FALSE"}; |
418 } |
470 } |
419 static inline STRING __bit_to_string(LWORD IN){ |
471 static inline STRING __bit_to_string(EN_ENO_PARAMS, LWORD IN){ |
|
472 TEST_EN(STRING) |
420 STRING res = __INIT_STRING; |
473 STRING res = __INIT_STRING; |
421 res.len = snprintf((char*)res.body, STR_MAX_LEN, "16#%llx", IN); |
474 res.len = snprintf((char*)res.body, STR_MAX_LEN, "16#%llx", IN); |
422 if(res.len > STR_MAX_LEN) res.len = STR_MAX_LEN; |
475 if(res.len > STR_MAX_LEN) res.len = STR_MAX_LEN; |
423 return res; |
476 return res; |
424 } |
477 } |
425 static inline STRING __real_to_string(LREAL IN){ |
478 static inline STRING __real_to_string(EN_ENO_PARAMS, LREAL IN){ |
|
479 TEST_EN(STRING) |
426 STRING res = __INIT_STRING; |
480 STRING res = __INIT_STRING; |
427 res.len = snprintf((char*)res.body, STR_MAX_LEN, "%.10g", IN); |
481 res.len = snprintf((char*)res.body, STR_MAX_LEN, "%.10g", IN); |
428 if(res.len > STR_MAX_LEN) res.len = STR_MAX_LEN; |
482 if(res.len > STR_MAX_LEN) res.len = STR_MAX_LEN; |
429 return res; |
483 return res; |
430 } |
484 } |
431 static inline STRING __sint_to_string(LINT IN){ |
485 static inline STRING __sint_to_string(EN_ENO_PARAMS, LINT IN){ |
|
486 TEST_EN(STRING) |
432 STRING res = __INIT_STRING; |
487 STRING res = __INIT_STRING; |
433 res.len = snprintf((char*)res.body, STR_MAX_LEN, "%lld", IN); |
488 res.len = snprintf((char*)res.body, STR_MAX_LEN, "%lld", IN); |
434 if(res.len > STR_MAX_LEN) res.len = STR_MAX_LEN; |
489 if(res.len > STR_MAX_LEN) res.len = STR_MAX_LEN; |
435 return res; |
490 return res; |
436 } |
491 } |
437 static inline STRING __uint_to_string(ULINT IN){ |
492 static inline STRING __uint_to_string(EN_ENO_PARAMS, ULINT IN){ |
|
493 TEST_EN(STRING) |
438 STRING res = __INIT_STRING; |
494 STRING res = __INIT_STRING; |
439 res.len = snprintf((char*)res.body, STR_MAX_LEN, "%llu", IN); |
495 res.len = snprintf((char*)res.body, STR_MAX_LEN, "%llu", IN); |
440 if(res.len > STR_MAX_LEN) res.len = STR_MAX_LEN; |
496 if(res.len > STR_MAX_LEN) res.len = STR_MAX_LEN; |
441 return res; |
497 return res; |
442 } |
498 } |
443 /***************/ |
499 /***************/ |
444 /* FROM_STRING */ |
500 /* FROM_STRING */ |
445 /***************/ |
501 /***************/ |
446 static inline BOOL __string_to_bool(STRING IN){ |
502 static inline BOOL __string_to_bool(EN_ENO_PARAMS, STRING IN){ |
|
503 TEST_EN(BOOL) |
447 return IN.len == 5 ? !memcmp(&IN.body,"TRUE", IN.len) : 0; |
504 return IN.len == 5 ? !memcmp(&IN.body,"TRUE", IN.len) : 0; |
448 } |
505 } |
449 |
506 |
450 static inline LINT __pstring_to_sint(STRING* IN){ |
507 static inline LINT __pstring_to_sint(STRING* IN){ |
451 LINT res = 0; |
508 LINT res = 0; |
705 (IN - (IN /= 10)) << 52 | |
777 (IN - (IN /= 10)) << 52 | |
706 (IN - (IN /= 10)) << 56 | |
778 (IN - (IN /= 10)) << 56 | |
707 (IN - (IN /= 10)) << 60; |
779 (IN - (IN /= 10)) << 60; |
708 } |
780 } |
709 |
781 |
710 /**************/ |
|
711 /* Binary ops */ |
|
712 /**************/ |
|
713 #define __ror_(TYPENAME)\ |
|
714 static inline TYPENAME __ror_##TYPENAME( TYPENAME IN, USINT N){\ |
|
715 N %= 8*sizeof(TYPENAME);\ |
|
716 return (IN >> N) | (IN << 8*sizeof(TYPENAME)-N);\ |
|
717 } |
|
718 /* Call previously defined macro for each ANY_NBIT */ |
|
719 ANY_NBIT(__ror_) |
|
720 |
|
721 #define __rol_(TYPENAME)\ |
|
722 static inline TYPENAME __rol_##TYPENAME( TYPENAME IN, USINT N){\ |
|
723 N %= 8*sizeof(TYPENAME);\ |
|
724 return (IN << N) | (IN >> 8*sizeof(TYPENAME)-N);\ |
|
725 } |
|
726 /* Call previously defined macro for each ANY_NBIT */ |
|
727 ANY_NBIT(__rol_) |
|
728 |
|
729 /**************/ |
|
730 /* Selection */ |
|
731 /**************/ |
|
732 /**************/ |
|
733 /* limit */ |
|
734 /**************/ |
|
735 |
|
736 #define __limit_(TYPENAME)\ |
|
737 static inline TYPENAME __limit_##TYPENAME( TYPENAME MN, TYPENAME IN, TYPENAME MX){\ |
|
738 return IN > MN ? IN < MX ? IN : MX : MN;\ |
|
739 } |
|
740 |
|
741 /* Call previously defined macro for each concerned type */ |
|
742 ANY_NBIT(__limit_) |
|
743 ANY_NUM(__limit_) |
|
744 |
|
745 #define __limit_time(TYPENAME)\ |
|
746 static inline TIME __limit_##TYPENAME( TYPENAME MN, TYPENAME IN, TYPENAME MX){\ |
|
747 return __TIME_CMP(IN, MN) > 0 ? /* IN>MN ?*/\ |
|
748 __TIME_CMP(IN, MX) < 0 ? /* IN<MX ?*/\ |
|
749 IN : MX : MN;\ |
|
750 } |
|
751 |
|
752 /* Call previously defined macro for each concerned type */ |
|
753 ANY_DATE(__limit_time) |
|
754 __limit_time(TIME) |
|
755 |
|
756 static inline STRING __limit_STRING( STRING MN, STRING IN, STRING MX){ |
|
757 return __STR_CMP(IN, MN) > 0 ? __STR_CMP(IN, MX) < 0 ? IN : MX : MN; |
|
758 } |
|
759 |
|
760 /**************/ |
|
761 /* MAX */ |
|
762 /**************/ |
|
763 |
|
764 /* workaround for va-atgs limitation on shorter that int params */ |
782 /* workaround for va-atgs limitation on shorter that int params */ |
765 #define VA_ARGS_REAL LREAL |
783 #define VA_ARGS_REAL LREAL |
766 #define VA_ARGS_LREAL LREAL |
784 #define VA_ARGS_LREAL LREAL |
767 #define VA_ARGS_SINT DINT |
785 #define VA_ARGS_SINT DINT |
768 #define VA_ARGS_INT DINT |
786 #define VA_ARGS_INT DINT |
782 #define VA_ARGS_WSTRING WSTRING |
800 #define VA_ARGS_WSTRING WSTRING |
783 #define VA_ARGS_DATE DATE |
801 #define VA_ARGS_DATE DATE |
784 #define VA_ARGS_TOD TOD |
802 #define VA_ARGS_TOD TOD |
785 #define VA_ARGS_DT DT |
803 #define VA_ARGS_DT DT |
786 |
804 |
|
805 /*******************************************/ |
|
806 /* Arithmetic and bitwise functions */ |
|
807 /*******************************************/ |
|
808 #define __arith_expand(fname,TYPENAME, OP) \ |
|
809 static inline TYPENAME fname##TYPENAME(EN_ENO_PARAMS, UINT param_count, TYPENAME op1, ...){\ |
|
810 TEST_EN(TYPENAME)\ |
|
811 va_list ap;\ |
|
812 UINT i;\ |
|
813 \ |
|
814 va_start (ap, op1); /* Initialize the argument list. */\ |
|
815 \ |
|
816 for (i = 0; i < param_count - 1; i++){\ |
|
817 op1 = op1 OP va_arg (ap, VA_ARGS_##TYPENAME);\ |
|
818 }\ |
|
819 \ |
|
820 va_end (ap); /* Clean up. */\ |
|
821 return op1;\ |
|
822 } |
|
823 |
|
824 #define __arith_static(fname,TYPENAME, OP) \ |
|
825 static inline TYPENAME fname##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\ |
|
826 TEST_EN(TYPENAME)\ |
|
827 return op1 OP op2;\ |
|
828 } |
|
829 |
|
830 /**************/ |
|
831 /* ADD */ |
|
832 /**************/ |
|
833 #define __add_(TYPENAME) __arith_expand(__add_, TYPENAME, + ) |
|
834 ANY_NUM(__add_) |
|
835 |
|
836 /**************/ |
|
837 /* MUL */ |
|
838 /**************/ |
|
839 #define __mul_(TYPENAME) __arith_expand(__mul_, TYPENAME, * ) |
|
840 ANY_NUM(__mul_) |
|
841 |
|
842 /**************/ |
|
843 /* SUB */ |
|
844 /**************/ |
|
845 #define __sub_(TYPENAME) __arith_static(__sub_, TYPENAME, - ) |
|
846 ANY_NUM(__sub_) |
|
847 |
|
848 /**************/ |
|
849 /* DIV */ |
|
850 /**************/ |
|
851 #define __div_(TYPENAME)\ |
|
852 static inline TYPENAME __div_##TYPENAME(EN_ENO_PARAMS, TYPENAME op1, TYPENAME op2){\ |
|
853 TEST_EN_COND(TYPENAME, op2 == 0)\ |
|
854 return op1 / op2;\ |
|
855 } |
|
856 ANY_NUM(__div_) |
|
857 |
|
858 /**************/ |
|
859 /* MOD */ |
|
860 /**************/ |
|
861 #define __mod_(TYPENAME) __arith_static(__mod_, TYPENAME, % ) |
|
862 ANY_INT(__mod_) |
|
863 |
|
864 /**************/ |
|
865 /* AND */ |
|
866 /**************/ |
|
867 __arith_expand(__and_, BOOL, && ) |
|
868 #define __and_(TYPENAME) __arith_expand(__and_, TYPENAME, & ) |
|
869 ANY_NBIT(__and_) |
|
870 |
|
871 /*************/ |
|
872 /* OR */ |
|
873 /*************/ |
|
874 __arith_expand(__or_, BOOL, || ) |
|
875 #define __or_(TYPENAME) __arith_expand(__or_, TYPENAME, |) |
|
876 ANY_NBIT(__or_) |
|
877 |
|
878 /**************/ |
|
879 /* XOR */ |
|
880 /**************/ |
|
881 static inline BOOL __xor_BOOL(EN_ENO_PARAMS, UINT param_count, BOOL op1, ...){ |
|
882 TEST_EN(BOOL) |
|
883 va_list ap; |
|
884 UINT i; |
|
885 |
|
886 va_start (ap, op1); /* Initialize the argument list. */ |
|
887 |
|
888 for (i = 0; i < param_count - 1; i++){ |
|
889 BOOL tmp = va_arg (ap, VA_ARGS_BOOL); |
|
890 op1 = (op1 && !tmp) || (!op1 && tmp); |
|
891 } |
|
892 |
|
893 va_end (ap); /* Clean up. */ |
|
894 return op1; |
|
895 } |
|
896 #define __xor_(TYPENAME) __arith_expand(__xor_, TYPENAME, ^) |
|
897 ANY_NBIT(__xor_) |
|
898 |
|
899 /**************/ |
|
900 /* NOT */ |
|
901 /**************/ |
|
902 static inline BOOL __not_BOOL(EN_ENO_PARAMS, BOOL op1){ |
|
903 TEST_EN(BOOL) |
|
904 return !op1; |
|
905 } |
|
906 |
|
907 #define __not_(TYPENAME)\ |
|
908 static inline TYPENAME __not_##TYPENAME(EN_ENO_PARAMS, TYPENAME op1){\ |
|
909 TEST_EN(TYPENAME)\ |
|
910 return ~op1;\ |
|
911 } |
|
912 ANY_NBIT(__not_) |
|
913 |
|
914 /***************/ |
|
915 /* MOVE */ |
|
916 /***************/ |
|
917 #define __move_(TYPENAME)\ |
|
918 static inline TYPENAME __move_##TYPENAME(EN_ENO_PARAMS, TYPENAME op1){\ |
|
919 TEST_EN(TYPENAME)\ |
|
920 return op1;\ |
|
921 } |
|
922 ANY(__move_) |
|
923 |
|
924 /**************/ |
|
925 /* Binary ops */ |
|
926 /**************/ |
|
927 #define __shift_(fname, TYPENAME, OP)\ |
|
928 static inline TYPENAME fname##TYPENAME(EN_ENO_PARAMS, TYPENAME IN, USINT N) {\ |
|
929 TEST_EN_COND(TYPENAME, N < 0)\ |
|
930 return IN OP N;\ |
|
931 } |
|
932 |
|
933 #define __shl_(TYPENAME) __shift_(__shl_, TYPENAME, << ) |
|
934 /* Call previously defined macro for each ANY_NBIT */ |
|
935 ANY_NBIT(__shl_) |
|
936 |
|
937 #define __shr_(TYPENAME) __shift_(__shr_, TYPENAME, >> ) |
|
938 /* Call previously defined macro for each ANY_NBIT */ |
|
939 ANY_NBIT(__shr_) |
|
940 |
|
941 #define __ror_(TYPENAME)\ |
|
942 static inline TYPENAME __ror_##TYPENAME(EN_ENO_PARAMS, TYPENAME IN, USINT N){\ |
|
943 TEST_EN_COND(TYPENAME, N < 0)\ |
|
944 N %= 8*sizeof(TYPENAME);\ |
|
945 return (IN >> N) | (IN << 8*sizeof(TYPENAME)-N);\ |
|
946 } |
|
947 /* Call previously defined macro for each ANY_NBIT */ |
|
948 ANY_NBIT(__ror_) |
|
949 |
|
950 #define __rol_(TYPENAME)\ |
|
951 static inline TYPENAME __rol_##TYPENAME(EN_ENO_PARAMS, TYPENAME IN, USINT N){\ |
|
952 TEST_EN_COND(TYPENAME, N < 0)\ |
|
953 N %= 8*sizeof(TYPENAME);\ |
|
954 return (IN << N) | (IN >> 8*sizeof(TYPENAME)-N);\ |
|
955 } |
|
956 /* Call previously defined macro for each ANY_NBIT */ |
|
957 ANY_NBIT(__rol_) |
|
958 |
|
959 /**************/ |
|
960 /* Selection */ |
|
961 /**************/ |
|
962 |
|
963 /**************/ |
|
964 /* SEL */ |
|
965 /**************/ |
|
966 |
|
967 #define __sel_(TYPENAME)\ |
|
968 static inline TYPENAME __sel_##TYPENAME(EN_ENO_PARAMS, BOOL G, TYPENAME op0, TYPENAME op1){\ |
|
969 TEST_EN(TYPENAME)\ |
|
970 return G ? op1 : op0;\ |
|
971 } |
|
972 ANY(__sel_) |
|
973 |
|
974 /**************/ |
|
975 /* limit */ |
|
976 /**************/ |
|
977 |
|
978 #define __limit_(TYPENAME)\ |
|
979 static inline TYPENAME __limit_##TYPENAME(EN_ENO_PARAMS, TYPENAME MN, TYPENAME IN, TYPENAME MX){\ |
|
980 TEST_EN(TYPENAME)\ |
|
981 return IN > MN ? IN < MX ? IN : MX : MN;\ |
|
982 } |
|
983 |
|
984 /* Call previously defined macro for each concerned type */ |
|
985 ANY_NBIT(__limit_) |
|
986 ANY_NUM(__limit_) |
|
987 |
|
988 #define __limit_time(TYPENAME)\ |
|
989 static inline TYPENAME __limit_##TYPENAME(EN_ENO_PARAMS, TYPENAME MN, TYPENAME IN, TYPENAME MX){\ |
|
990 TEST_EN(TYPENAME)\ |
|
991 return __TIME_CMP(IN, MN) > 0 ? /* IN>MN ?*/\ |
|
992 __TIME_CMP(IN, MX) < 0 ? /* IN<MX ?*/\ |
|
993 IN : MX : MN;\ |
|
994 } |
|
995 |
|
996 /* Call previously defined macro for each concerned type */ |
|
997 ANY_DATE(__limit_time) |
|
998 __limit_time(TIME) |
|
999 |
|
1000 static inline STRING __limit_STRING(EN_ENO_PARAMS, STRING MN, STRING IN, STRING MX){ |
|
1001 TEST_EN(STRING) |
|
1002 return __STR_CMP(IN, MN) > 0 ? __STR_CMP(IN, MX) < 0 ? IN : MX : MN; |
|
1003 } |
|
1004 |
|
1005 /**************/ |
|
1006 /* MAX */ |
|
1007 /**************/ |
|
1008 |
787 #define __extrem_(fname,TYPENAME, COND) \ |
1009 #define __extrem_(fname,TYPENAME, COND) \ |
788 static inline TYPENAME fname##TYPENAME( UINT param_count, TYPENAME op1, ...){\ |
1010 static inline TYPENAME fname##TYPENAME(EN_ENO_PARAMS, UINT param_count, TYPENAME op1, ...){\ |
|
1011 TEST_EN(TYPENAME)\ |
789 va_list ap;\ |
1012 va_list ap;\ |
790 UINT i;\ |
1013 UINT i;\ |
791 \ |
1014 \ |
792 va_start (ap, op1); /* Initialize the argument list. */\ |
1015 va_start (ap, op1); /* Initialize the argument list. */\ |
793 \ |
1016 \ |