Update version after release of v0.6.5.2
[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 #if 1 // def 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
115   /*
116    * The following two asserts are always true
117    *
118    * long long tmp = ((long long)(sfpm) a << FPM_BIT);
119    * assert(FPM_INT_MIN <= tmp);
120    * assert(tmp <= FPM_INT_MAX);
121    */
122   r = (fpm) fpmdiv_def((sfpm) a, (sfpm) b);
123   return r;
124 }
125
126 fpm
127 fpmimul(int a, fpm b)
128 {
129   fpm r;
130   assert((0 < a) != (0 < (sfpm) b) || ((double)a * (double)(sfpm) b) <= (double)FPM_INT_MAX);
131   assert((0 < a) == (0 < (sfpm) b) || ((double)a * (double)(sfpm) b) >= (double)FPM_INT_MIN);
132   r = (fpm) fpmimul_def(a, (sfpm) b);
133   return r;
134 }
135
136 fpm
137 fpmmuli(fpm a, int b)
138 {
139   fpm r;
140   assert((0 < (sfpm) a) != (0 < b) || ((double)(sfpm) a * (double)b) <= (double)FPM_INT_MAX);
141   assert((0 < (sfpm) a) == (0 < b) || ((double)(sfpm) a * (double)b) >= (double)FPM_INT_MIN);
142   r = (fpm) fpmmuli_def((sfpm) a, b);
143   return r;
144 }
145
146 fpm
147 fpmidiv(fpm a, int b)
148 {
149   fpm r;
150   r = (fpm) fpmidiv_def((sfpm) a, b);
151   return r;
152 }
153
154 #endif /* NDEBUG */
155
156 fpm
157 atofpm(const char *s)
158 {
159   float r = 0.0;
160   sscanf(s, "%f", &r);
161   return ftofpm(r);
162 }
163
164 const char *
165 fpmtoa(fpm a)
166 {
167   static int idx = 0;
168   static char ret[4][20];
169
170   idx = (idx + 1) % (sizeof(ret) / sizeof(ret[0]));
171   snprintf(ret[idx], sizeof(ret[0]), "%ld.%03ld", (sfpm) a >> FPM_BIT, (1000 * ((sfpm) (a) & FPM_MSK) + (FPM_NUM / 2)) >> FPM_BIT);
172   return ret[idx];
173 }
174
175 #else /* USE_FPM */
176
177 float
178 atofpm(const char *s)
179 {
180   float r = 0.0;
181   sscanf(s, "%f", &r);
182   return r;
183 }
184
185 const char *
186 fpmtoa(float a)
187 {
188   static int idx = 0;
189   static char ret[4][20];
190
191   idx = (idx + 1) % (sizeof(ret) / sizeof(ret[0]));
192   snprintf(ret[idx], sizeof(ret[0]), "%.3f", a);
193   return ret[idx];
194 }
195
196 #endif /* USE_FPM */
197
198 /*
199  * Local Variables:
200  * c-basic-offset: 2
201  * indent-tabs-mode: nil
202  * End:
203  */