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