58 typedef struct timespec TIME; |
58 typedef struct timespec TIME; |
59 typedef struct timespec DATE; |
59 typedef struct timespec DATE; |
60 typedef struct timespec DT; |
60 typedef struct timespec DT; |
61 typedef struct timespec TOD; |
61 typedef struct timespec TOD; |
62 |
62 |
|
63 #define __TIME_CMP(t1, t2) (t2.tv_sec == t1.tv_sec ? t2.tv_nsec - t1.tv_nsec : t1.tv_sec - t2.tv_sec) |
|
64 |
63 #define STR_MAX_LEN 40 |
65 #define STR_MAX_LEN 40 |
64 typedef int8_t __strlen_t; |
66 typedef int8_t __strlen_t; |
65 typedef struct { |
67 typedef struct { |
66 __strlen_t len; |
68 __strlen_t len; |
67 u_int8_t body[STR_MAX_LEN]; |
69 u_int8_t body[STR_MAX_LEN]; |
68 } STRING; |
70 } STRING; |
|
71 |
|
72 #define __STR_CMP(str1, str2) memcmp((char*)&str1.body,(char*)&str2.body, str1.len < str2.len ? str1.len : str2.len) |
|
73 |
69 |
74 |
70 /* TODO |
75 /* TODO |
71 typedef struct { |
76 typedef struct { |
72 __strlen_t len; |
77 __strlen_t len; |
73 u_int16_t body[STR_MAX_LEN]; |
78 u_int16_t body[STR_MAX_LEN]; |
687 |
692 |
688 /* Call previously defined macro for each concerned type */ |
693 /* Call previously defined macro for each concerned type */ |
689 ANY_NBIT(__limit_) |
694 ANY_NBIT(__limit_) |
690 ANY_NUM(__limit_) |
695 ANY_NUM(__limit_) |
691 |
696 |
692 inline TIME __limit_ptime( TIME* MN, TIME* IN, TIME* MX){ |
|
693 return IN->tv_sec > MN->tv_sec || (IN->tv_sec == MN->tv_sec && IN->tv_nsec > MN->tv_nsec) ? /* IN>MN ?*/ |
|
694 IN->tv_sec < MX->tv_sec || (IN->tv_sec == MX->tv_sec && IN->tv_nsec < MX->tv_nsec) ? /* IN<MX ?*/ |
|
695 *IN : *MX : *MN; |
|
696 } |
|
697 |
|
698 #define __limit_time(TYPENAME)\ |
697 #define __limit_time(TYPENAME)\ |
699 inline TIME __limit_##TYPENAME( TYPENAME MN, TYPENAME IN, TYPENAME MX){\ |
698 inline TIME __limit_##TYPENAME( TYPENAME MN, TYPENAME IN, TYPENAME MX){\ |
700 return __limit_ptime(&MN, &IN, &MX);\ |
699 return __TIME_CMP(IN, MN) > 0 ? /* IN>MN ?*/\ |
|
700 __TIME_CMP(IN, MX) < 0 ? /* IN<MX ?*/\ |
|
701 IN : MX : MN;\ |
701 } |
702 } |
702 |
703 |
703 /* Call previously defined macro for each concerned type */ |
704 /* Call previously defined macro for each concerned type */ |
704 ANY_DATE(__limit_time) |
705 ANY_DATE(__limit_time) |
705 __limit_time(TIME) |
706 __limit_time(TIME) |
706 |
707 |
707 inline STRING __limit_STRING( STRING MN, STRING IN, STRING MX){ |
708 inline STRING __limit_STRING( STRING MN, STRING IN, STRING MX){ |
708 return strcmp((char*)&IN.body, (char*)&MN.body) > 0 ? strcmp((char*)&IN.body, (char*)&MX.body) < 0 ? IN : MX : MN; |
709 return __STR_CMP(IN, MN) > 0 ? __STR_CMP(IN, MX) < 0 ? IN : MX : MN; |
709 } |
710 } |
710 |
711 |
711 /**************/ |
712 /**************/ |
712 /* MAX */ |
713 /* MAX */ |
713 /**************/ |
714 /**************/ |
753 |
754 |
754 #define __max_num(TYPENAME) __extrem_(__max_,TYPENAME, op1 < tmp) |
755 #define __max_num(TYPENAME) __extrem_(__max_,TYPENAME, op1 < tmp) |
755 ANY_NBIT(__max_num) |
756 ANY_NBIT(__max_num) |
756 ANY_NUM(__max_num) |
757 ANY_NUM(__max_num) |
757 |
758 |
758 __extrem_(__max_, STRING, strcmp((char*)&op1.body,(char*)&tmp.body) < 0) |
759 __extrem_(__max_, STRING, __STR_CMP(op1,tmp) < 0) |
759 #define __max_time(TYPENAME) __extrem_(__max_, TYPENAME, tmp.tv_sec > op1.tv_sec || (tmp.tv_sec == op1.tv_sec && tmp.tv_nsec > op1.tv_nsec)) |
760 #define __max_time(TYPENAME) __extrem_(__max_, TYPENAME, __TIME_CMP(op1, tmp) < 0) |
760 |
761 |
761 /* Call previously defined macro for each concerned type */ |
762 /* Call previously defined macro for each concerned type */ |
762 ANY_DATE(__max_time) |
763 ANY_DATE(__max_time) |
763 __max_time(TIME) |
764 __max_time(TIME) |
764 |
765 |
767 /**************/ |
768 /**************/ |
768 #define __min_num(TYPENAME) __extrem_(__min, TYPENAME, op1 > tmp) |
769 #define __min_num(TYPENAME) __extrem_(__min, TYPENAME, op1 > tmp) |
769 ANY_NBIT(__min_num) |
770 ANY_NBIT(__min_num) |
770 ANY_NUM(__min_num) |
771 ANY_NUM(__min_num) |
771 |
772 |
772 __extrem_(__min, STRING, strcmp((char*)&op1.body,(char*)&tmp.body) > 0) |
773 __extrem_(__min, STRING, __STR_CMP(op1,tmp) > 0) |
773 |
774 |
774 #define __min_time(TYPENAME) __extrem_(__min_, TYPENAME, tmp.tv_sec < op1.tv_sec || (tmp.tv_sec == op1.tv_sec && tmp.tv_nsec < op1.tv_nsec)) |
775 #define __min_time(TYPENAME) __extrem_(__min_, TYPENAME, __TIME_CMP(op1, tmp) > 0) |
775 |
776 |
776 /* Call previously defined macro for each concerned type */ |
777 /* Call previously defined macro for each concerned type */ |
777 ANY_DATE(__min_time) |
778 ANY_DATE(__min_time) |
778 __min_time(TIME) |
779 __min_time(TIME) |
779 |
780 |
827 va_end (ap); /* Clean up. */\ |
828 va_end (ap); /* Clean up. */\ |
828 return 1;\ |
829 return 1;\ |
829 } |
830 } |
830 |
831 |
831 #define __compare_num(fname, TYPENAME, TEST) __compare_(fname, TYPENAME, op1 TEST tmp ) |
832 #define __compare_num(fname, TYPENAME, TEST) __compare_(fname, TYPENAME, op1 TEST tmp ) |
832 #define __compare_time(fname, TYPENAME, TEST) __compare_(fname, TYPENAME, op1.tv_sec TEST tmp.tv_sec || (op1.tv_sec == tmp.tv_sec && op1.tv_nsec TEST tmp.tv_nsec)) |
833 #define __compare_time(fname, TYPENAME, TEST) __compare_(fname, TYPENAME, __TIME_CMP(op1, tmp) TEST 0) |
833 #define __compare_string(fname, TEST) __compare_(fname, STRING, strcmp((char*)&op1.body, (char*)&tmp.body) TEST 0 ) |
834 #define __compare_string(fname, TEST) __compare_(fname, STRING, __STR_CMP(op1, tmp) TEST 0 ) |
834 |
835 |
835 /**************/ |
836 /**************/ |
836 /* GT */ |
837 /* GT */ |
837 /**************/ |
838 /**************/ |
838 |
839 |