580fc5c0e83c329089ee4fb5f8418e2e545c4132
[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 "fpm.h"
42 #include "defs.h"
43
44 #include <stdio.h>
45 #include <assert.h>
46
47 #ifdef USE_FPM
48
49 #ifndef NDEBUG
50
51 fpm itofpm(int i)
52 {
53   fpm r;
54   assert(FPM_MIN <= i && i <= FPM_MAX);
55   r = (fpm)itofpm_def(i);
56   return r;
57 }
58
59 fpm ftofpm(float f)
60 {
61   fpm r;
62   assert(FPM_MIN <= (sfpm)f && (sfpm)f <= FPM_MAX);
63   r = (fpm)(sfpm)ftofpm_def(f);
64   return r;
65 }
66
67 int fpmtoi(fpm a)
68 {
69   int r = fpmtoi_def((sfpm)a);
70   return r;
71 }
72
73 float fpmtof(fpm a)
74 {
75   float r = fpmtof_def((sfpm)a);
76   return r;
77 }
78
79 fpm fpmadd(fpm a, fpm b)
80 {
81   fpm r;
82   assert(0 > (sfpm)a || 0 > (sfpm)b || FPM_INT_MAX - (sfpm)a >= (sfpm)b);
83   assert(0 <= (sfpm)a || 0 <= (sfpm)b || (sfpm)a >= FPM_INT_MIN - (sfpm)b);
84   r = (fpm)fpmadd_def((sfpm)a, (sfpm)b);
85   return r;
86 }
87
88 fpm fpmsub(fpm a, fpm b)
89 {
90   fpm r;
91   assert(0 > (sfpm)a || 0 <= (sfpm)b || (sfpm)a < FPM_INT_MAX + (sfpm)b);
92   assert(0 <= (sfpm)a || 0 > (sfpm)b || (sfpm)a >= FPM_INT_MIN + (sfpm)b);
93   r = (fpm)fpmsub_def((sfpm)a, (sfpm)b);
94   return r;
95 }
96
97 fpm fpmmul(fpm a, fpm b)
98 {
99   fpm r;
100   assert((0 < (sfpm)a) != (0 < (sfpm)b) || ((double)(sfpm)a) * ((double)(sfpm)b) <= (double)FPM_INT_MAX);
101   assert((0 < (sfpm)a) == (0 < (sfpm)b) || ((double)(sfpm)a) * ((double)(sfpm)b) >= (double)FPM_INT_MIN);
102   r = (fpm)fpmmul_def((sfpm)a, (sfpm)b);
103   return r;
104 }
105
106 fpm fpmdiv(fpm a, fpm b) {
107   fpm r;
108   assert(FPM_INT_MIN <= ((long long)(sfpm)a << FPM_BIT) && ((long long)(sfpm)a << FPM_BIT) <= FPM_INT_MAX);
109   r = (fpm)fpmdiv_def((sfpm)a, (sfpm)b);
110   return r;
111 }
112
113 fpm fpmimul(int a, fpm b)
114 {
115   fpm r;
116   assert((0 < a) != (0 < (sfpm)b) || ((double)a * (double)(sfpm)b) <= (double)FPM_INT_MAX);
117   assert((0 < a) == (0 < (sfpm)b) || ((double)a * (double)(sfpm)b) >= (double)FPM_INT_MIN);
118   r = (fpm)fpmimul_def(a, (sfpm)b);
119   return r;
120 }
121
122 fpm fpmmuli(fpm a, int b)
123 {
124   fpm r;
125   assert((0 < (sfpm)a) != (0 < b) || ((double)(sfpm)a * (double)b) <= (double)FPM_INT_MAX);
126   assert((0 < (sfpm)a) == (0 < b) || ((double)(sfpm)a * (double)b) >= (double)FPM_INT_MIN);
127   r = (fpm)fpmmuli_def((sfpm)a, b);
128   return r;
129 }
130
131 fpm fpmidiv(fpm a, int b)
132 {
133   fpm r;
134   r = (fpm)fpmidiv_def((sfpm)a, b);
135   return r;
136 }
137
138 #if 0
139 fpm fpmlmul(fpm a, fpm b)
140 {
141   fpm r;
142   assert((0 < (sfpm)a) != (0 < (sfpm)b) || ((double)(sfpm)a * (double)(sfpm)b / FPM_NUM) <= (double)FPM_INT_MAX);
143   assert((0 < (sfpm)a) == (0 < (sfpm)b) || ((double)(sfpm)a * (double)(sfpm)b / FPM_NUM) >= (double)FPM_INT_MIN);
144   r = (fpm)fpmlmul_def((sfpm)a, (sfpm)b);
145   return r;
146 }
147
148 fpm fpmldiv(fpm a, fpm b) {
149   fpm r;
150   r = (fpm)fpmldiv_def((sfpm)a, (sfpm)b);
151   return r;
152 }
153 #endif
154
155 #endif /* !NDEBUG */
156
157 #if 0
158 fpm atofpm(const char *s)
159 {
160   float r = 0.0;
161   sscanf(s, "%f", &r);
162   return ftofpm(r);
163 }
164
165 const char *fpmtoa(fpm a)
166 {
167   static int idx = 0;
168   static char ret[4][20];
169
170   idx = (idx + 1) % (ARRAYSIZE(ret));
171   snprintf(ret[idx], sizeof(ret[0]), "%d.%03d", (sfpm)a >> FPM_BIT,
172     (1000 * ((sfpm)(a) & FPM_MSK) + (FPM_NUM / 2)) >> FPM_BIT);
173   return ret[idx];
174 }
175
176 const char *etxtoa(fpm etx)
177 {
178   return etx >= INFINITE_ETX ? "INF" : fpmtoa(etx);
179 }
180 #endif
181
182 #else /* USE_FPM */
183
184 #if 0
185 float atofpm(const char *s)
186 {
187   float r = 0.0;
188   sscanf(s, "%f", &r);
189   return r;
190 }
191
192 const char *fpmtoa(float a)
193 {
194   static int idx = 0;
195   static char ret[4][20];
196
197   idx = (idx + 1) % (ARRAYSIZE(ret));
198   snprintf(ret[idx], sizeof(ret[0]), "%.3f", a);
199   return ret[idx];
200 }
201
202 const char *etxtoa(float etx)
203 {
204   return etx >= INFINITE_ETX ? "INF" : fpmtoa(etx);
205 }
206 #endif
207
208 #endif /* USE_FPM */
209
210 /*
211  * Local Variables:
212  * c-basic-offset: 2
213  * indent-tabs-mode: nil
214  * End:
215  */