Cleanup for lq_plugin system, preparation for default fpm
[olsrd.git] / src / fpm.c
1 /*
2  * The olsr.org Optimized Link-State Routing daemon(olsrd)
3  * Copyright (c) 2008, Sven-Ola Tuecke (sven-ola@gmx.de)
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without 
7  * modification, are permitted provided that the following conditions 
8  * are met:
9  *
10  * * Redistributions of source code must retain the above copyright 
11  *   notice, this list of conditions and the following disclaimer.
12  * * Redistributions in binary form must reproduce the above copyright 
13  *   notice, this list of conditions and the following disclaimer in 
14  *   the documentation and/or other materials provided with the 
15  *   distribution.
16  * * Neither the name of olsr.org, olsrd nor the names of its 
17  *   contributors may be used to endorse or promote products derived 
18  *   from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
24  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
26  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
28  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
30  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
31  * POSSIBILITY OF SUCH DAMAGE.
32  *
33  * Visit http://www.olsr.org for more information.
34  *
35  * If you find this software useful feel free to make a donation
36  * to the project. For more information see the website or contact
37  * the copyright holders.
38  *
39  */
40
41 #include <stdio.h>
42 #include <assert.h>
43 #include "fpm.h"
44
45 #ifdef USE_FPM
46 #undef NDEBUG
47
48 #ifndef NDEBUG
49
50 fpm itofpm(int i)
51 {
52   fpm r;
53   assert(FPM_MIN <= i && i <= FPM_MAX);
54   r = (fpm)itofpm_def(i);
55   return r;
56 }
57
58 fpm ftofpm(float f)
59 {
60   fpm r;
61   assert(FPM_MIN <= (sfpm)f && (sfpm)f <= FPM_MAX);
62   r = (fpm)(sfpm)ftofpm_def(f);
63   return r;
64 }
65
66 int fpmtoi(fpm a)
67 {
68   int r = fpmtoi_def((sfpm)a);
69   return r;
70 }
71
72 float fpmtof(fpm a)
73 {
74   float r = fpmtof_def((sfpm)a);
75   return r;
76 }
77
78 fpm fpmadd(fpm a, fpm b)
79 {
80   fpm r;
81   assert(0 > (sfpm)a || 0 > (sfpm)b || FPM_INT_MAX - (sfpm)a >= (sfpm)b);
82   assert(0 <= (sfpm)a || 0 <= (sfpm)b || (sfpm)a >= FPM_INT_MIN - (sfpm)b);
83   r = (fpm)fpmadd_def((sfpm)a, (sfpm)b);
84   return r;
85 }
86
87 fpm fpmsub(fpm a, fpm b)
88 {
89   fpm r;
90   assert(0 > (sfpm)a || 0 <= (sfpm)b || (sfpm)a < FPM_INT_MAX + (sfpm)b);
91   assert(0 <= (sfpm)a || 0 > (sfpm)b || (sfpm)a >= FPM_INT_MIN + (sfpm)b);
92   r = (fpm)fpmsub_def((sfpm)a, (sfpm)b);
93   return r;
94 }
95
96 fpm fpmmul(fpm a, fpm b)
97 {
98   fpm r;
99   assert((0 < (sfpm)a) != (0 < (sfpm)b) || ((double)(sfpm)a) * ((double)(sfpm)b) <= (double)FPM_INT_MAX);
100   assert((0 < (sfpm)a) == (0 < (sfpm)b) || ((double)(sfpm)a) * ((double)(sfpm)b) >= (double)FPM_INT_MIN);
101   r = (fpm)fpmmul_def((sfpm)a, (sfpm)b);
102   return r;
103 }
104
105 fpm fpmdiv(fpm a, fpm b) {
106   fpm r;
107   assert(FPM_INT_MIN <= ((long long)(sfpm)a << FPM_BIT) && ((long long)(sfpm)a << FPM_BIT) <= FPM_INT_MAX);
108   r = (fpm)fpmdiv_def((sfpm)a, (sfpm)b);
109   return r;
110 }
111
112 fpm fpmimul(int a, fpm b)
113 {
114   fpm r;
115   assert((0 < a) != (0 < (sfpm)b) || ((double)a * (double)(sfpm)b) <= (double)FPM_INT_MAX);
116   assert((0 < a) == (0 < (sfpm)b) || ((double)a * (double)(sfpm)b) >= (double)FPM_INT_MIN);
117   r = (fpm)fpmimul_def(a, (sfpm)b);
118   return r;
119 }
120
121 fpm fpmmuli(fpm a, int b)
122 {
123   fpm r;
124   assert((0 < (sfpm)a) != (0 < b) || ((double)(sfpm)a * (double)b) <= (double)FPM_INT_MAX);
125   assert((0 < (sfpm)a) == (0 < b) || ((double)(sfpm)a * (double)b) >= (double)FPM_INT_MIN);
126   r = (fpm)fpmmuli_def((sfpm)a, b);
127   return r;
128 }
129
130 fpm fpmidiv(fpm a, int b)
131 {
132   fpm r;
133   r = (fpm)fpmidiv_def((sfpm)a, b);
134   return r;
135 }
136
137 #if 0
138 fpm fpmlmul(fpm a, fpm b)
139 {
140   fpm r;
141   assert((0 < (sfpm)a) != (0 < (sfpm)b) || ((double)(sfpm)a * (double)(sfpm)b / FPM_NUM) <= (double)FPM_INT_MAX);
142   assert((0 < (sfpm)a) == (0 < (sfpm)b) || ((double)(sfpm)a * (double)(sfpm)b / FPM_NUM) >= (double)FPM_INT_MIN);
143   r = (fpm)fpmlmul_def((sfpm)a, (sfpm)b);
144   return r;
145 }
146
147 fpm fpmldiv(fpm a, fpm b) {
148   fpm r;
149   r = (fpm)fpmldiv_def((sfpm)a, (sfpm)b);
150   return r;
151 }
152 #endif
153
154 #endif /* !NDEBUG */
155
156 fpm atofpm(const char *s)
157 {
158   float r = 0.0;
159   sscanf(s, "%f", &r);
160   return ftofpm(r);
161 }
162
163 const char *fpmtoa(fpm a)
164 {
165   static int idx = 0;
166   static char ret[4][20];
167
168   idx = (idx + 1) % (sizeof(ret) / sizeof(ret[0]));
169   snprintf(ret[idx], sizeof(ret[0]), "%ld.%03ld", (sfpm)a >> FPM_BIT,
170     (1000 * ((sfpm)(a) & FPM_MSK) + (FPM_NUM / 2)) >> FPM_BIT);
171   return ret[idx];
172 }
173
174 const char *etxtoa(fpm etx)
175 {
176   return etx >= INFINITE_ETX ? "INF" : fpmtoa(etx);
177 }
178
179 #else /* USE_FPM */
180
181 float atofpm(const char *s)
182 {
183   float r = 0.0;
184   sscanf(s, "%f", &r);
185   return r;
186 }
187
188 const char *fpmtoa(float a)
189 {
190   static int idx = 0;
191   static char ret[4][20];
192
193   idx = (idx + 1) % (sizeof(ret) / sizeof(ret[0]));
194   snprintf(ret[idx], sizeof(ret[0]), "%.3f", a);
195   return ret[idx];
196 }
197
198 const char *etxtoa(float etx)
199 {
200   return etx >= INFINITE_ETX ? "INF" : fpmtoa(etx);
201 }
202
203 #endif /* USE_FPM */
204
205 /*
206  * Local Variables:
207  * c-basic-offset: 2
208  * End:
209  */