np/np-conv.h

changeset 62
aae5facf9fc5
parent 60
a4033700e35c
equal deleted inserted replaced
61:fc585645ad05 62:aae5facf9fc5
12 #ifdef NP_SIMPLE_IMPL 12 #ifdef NP_SIMPLE_IMPL
13 13
14 #define FN_NUM_TO_SIGNED(T, UMAX, MAX, MIN) \ 14 #define FN_NUM_TO_SIGNED(T, UMAX, MAX, MIN) \
15 static int num_to_##T(T *ret, const NPNum *num, bool allow_uns_big) \ 15 static int num_to_##T(T *ret, const NPNum *num, bool allow_uns_big) \
16 { \ 16 { \
17 if(num->type!=NPNUM_INT) \ 17 if(num->type!=NPNUM_INT) \
18 return E_TOKZ_NOTINT; \ 18 return E_TOKZ_NOTINT; \
19 \ 19 \
20 if(!num->negative){ \ 20 if(!num->negative){ \
21 *ret=num->ival; \ 21 *ret=num->ival; \
22 if(allow_uns_big?num->ival>UMAX:num->ival>MAX) \ 22 if(allow_uns_big?num->ival>UMAX:num->ival>MAX) \
23 return E_TOKZ_RANGE; \ 23 return E_TOKZ_RANGE; \
24 }else{ \ 24 }else{ \
25 *ret=-num->ival; \ 25 *ret=-num->ival; \
26 if(num->ival>-(ulong)MIN) \ 26 if(num->ival>-(ulong)MIN) \
27 return E_TOKZ_RANGE; \ 27 return E_TOKZ_RANGE; \
28 } \ 28 } \
29 return 0; \ 29 return 0; \
30 } 30 }
31 31
32 #define FN_NUM_TO_UNSIGNED(T, UMAX, MIN) \ 32 #define FN_NUM_TO_UNSIGNED(T, UMAX, MIN) \
33 static int num_to_##T(T *ret, const NPNum *num, bool allow_neg) \ 33 static int num_to_##T(T *ret, const NPNum *num, bool allow_neg) \
34 { \ 34 { \
35 if(num->type!=NPNUM_INT) \ 35 if(num->type!=NPNUM_INT) \
36 return E_TOKZ_NOTINT; \ 36 return E_TOKZ_NOTINT; \
37 \ 37 \
38 if(!num->negative){ \ 38 if(!num->negative){ \
39 *ret=num->ival; \ 39 *ret=num->ival; \
40 if(num->ival>UMAX) \ 40 if(num->ival>UMAX) \
41 return E_TOKZ_RANGE; \ 41 return E_TOKZ_RANGE; \
42 }else{ \ 42 }else{ \
43 *ret=-num->ival; \ 43 *ret=-num->ival; \
44 if(!allow_neg || num->ival>(ulong)-MIN) \ 44 if(!allow_neg || num->ival>(ulong)-MIN) \
45 return E_TOKZ_RANGE; \ 45 return E_TOKZ_RANGE; \
46 } \ 46 } \
47 return 0; \ 47 return 0; \
48 } 48 }
49 49
50 #define FN_NUM_TO_FLOAT(T, POW) \ 50 #define FN_NUM_TO_FLOAT(T, POW) \
51 static int num_to_##T(T *ret, const NPNum *num) \ 51 static int num_to_##T(T *ret, const NPNum *num) \
52 { \ 52 { \
53 *ret=(num->negative?-num->fval:num->fval); \ 53 *ret=(num->negative?-num->fval:num->fval); \
54 return 0; \ 54 return 0; \
55 } 55 }
56 56
57 #else /* NP_SIMPLE_IMPL */ 57 #else /* NP_SIMPLE_IMPL */
58 58
59 #define FN_NUM_TO_SIGNED(T, UMAX, MAX, MIN) \ 59 #define FN_NUM_TO_SIGNED(T, UMAX, MAX, MIN) \
60 static int num_to_##T(T *ret, const NPNum *num, bool allow_uns_big) \ 60 static int num_to_##T(T *ret, const NPNum *num, bool allow_uns_big) \
61 { \ 61 { \
62 if(num->exponent) \ 62 if(num->exponent) \
63 return E_TOKZ_NOTINT; \ 63 return E_TOKZ_NOTINT; \
64 if(num->nmantissa>0) \ 64 if(num->nmantissa>0) \
65 return E_TOKZ_RANGE; \ 65 return E_TOKZ_RANGE; \
66 \ 66 \
67 if(!num->negative){ \ 67 if(!num->negative){ \
68 *ret=num->mantissa[0]; \ 68 *ret=num->mantissa[0]; \
69 if(allow_uns_big?num->mantissa[0]>UMAX:num->mantissa[0]>MAX) \ 69 if(allow_uns_big?num->mantissa[0]>UMAX:num->mantissa[0]>MAX) \
70 return E_TOKZ_RANGE; \ 70 return E_TOKZ_RANGE; \
71 }else{ \ 71 }else{ \
72 *ret=-num->mantissa[0]; \ 72 *ret=-num->mantissa[0]; \
73 if(num->mantissa[0]>-(ulong)MIN) \ 73 if(num->mantissa[0]>-(ulong)MIN) \
74 return E_TOKZ_RANGE; \ 74 return E_TOKZ_RANGE; \
75 } \ 75 } \
76 return 0; \ 76 return 0; \
77 } 77 }
78 78
79 #define FN_NUM_TO_UNSIGNED(T, UMAX, MIN) \ 79 #define FN_NUM_TO_UNSIGNED(T, UMAX, MIN) \
80 static int num_to_##T(T *ret, const NPNum *num, bool allow_neg) \ 80 static int num_to_##T(T *ret, const NPNum *num, bool allow_neg) \
81 { \ 81 { \
82 if(num->exponent) \ 82 if(num->exponent) \
83 return E_TOKZ_NOTINT; \ 83 return E_TOKZ_NOTINT; \
84 if(num->nmantissa>0) \ 84 if(num->nmantissa>0) \
85 return E_TOKZ_RANGE; \ 85 return E_TOKZ_RANGE; \
86 \ 86 \
87 if(!num->negative){ \ 87 if(!num->negative){ \
88 *ret=num->mantissa[0]; \ 88 *ret=num->mantissa[0]; \
89 if(num->mantissa[0]>UMAX) \ 89 if(num->mantissa[0]>UMAX) \
90 return E_TOKZ_RANGE; \ 90 return E_TOKZ_RANGE; \
91 }else{ \ 91 }else{ \
92 *ret=-num->mantissa[0]; \ 92 *ret=-num->mantissa[0]; \
93 if(!allow_neg || num->mantissa[0]>(ulong)-MIN) \ 93 if(!allow_neg || num->mantissa[0]>(ulong)-MIN) \
94 return E_TOKZ_RANGE; \ 94 return E_TOKZ_RANGE; \
95 } \ 95 } \
96 return 0; \ 96 return 0; \
97 } 97 }
98 98
99 99
100 #define FN_NUM_TO_FLOAT(T, POW) \ 100 #define FN_NUM_TO_FLOAT(T, POW) \
101 static int num_to_##T(T *ret, const NPNum *num) \ 101 static int num_to_##T(T *ret, const NPNum *num) \
102 { \ 102 { \
103 T d=0; \ 103 T d=0; \
104 int i; \ 104 int i; \
105 \
106 for(i=num->nmantissa;i>=0;i--) \
107 d=d*(T)(ULONG_MAX+1.0)+num->mantissa[i]; \
108 \ 105 \
109 d*=POW(num->base, num->exponent); \ 106 for(i=num->nmantissa;i>=0;i--) \
110 *ret=d; \ 107 d=d*(T)(ULONG_MAX+1.0)+num->mantissa[i]; \
111 \ 108 \
112 return 0; \ 109 d*=POW(num->base, num->exponent); \
110 *ret=d; \
111 \
112 return 0; \
113 } 113 }
114 114
115 #endif /* NP_SIMPLE_IMPL */ 115 #endif /* NP_SIMPLE_IMPL */
116 116
117 FN_NUM_TO_SIGNED(long, ULONG_MAX, LONG_MAX, LONG_MIN) 117 FN_NUM_TO_SIGNED(long, ULONG_MAX, LONG_MAX, LONG_MIN)

mercurial