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