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