VirtualBox

source: vbox/trunk/src/VBox/Devices/EFI/FirmwareNew/StdLib/LibC/gdtoa/smisc.c@ 77599

最後變更 在這個檔案從77599是 48674,由 vboxsync 提交於 11 年 前

EFI: Export newly imported tinaocore UEFI sources to OSE.

  • 屬性 svn:eol-style 設為 native
檔案大小: 4.2 KB
 
1/* $NetBSD: smisc.c,v 1.2.14.1 2008/04/08 21:10:55 jdc Exp $ */
2
3/****************************************************************
4
5The author of this software is David M. Gay.
6
7Copyright (C) 1998, 1999 by Lucent Technologies
8All Rights Reserved
9
10Permission to use, copy, modify, and distribute this software and
11its documentation for any purpose and without fee is hereby
12granted, provided that the above copyright notice appear in all
13copies and that both that the copyright notice and this
14permission notice and warranty disclaimer appear in supporting
15documentation, and that the name of Lucent or any of its entities
16not be used in advertising or publicity pertaining to
17distribution of the software without specific, written prior
18permission.
19
20LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
21INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
22IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
23SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
24WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
25IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
26ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
27THIS SOFTWARE.
28
29****************************************************************/
30
31/* Please send bug reports to David M. Gay (dmg at acm dot org,
32 * with " at " changed at "@" and " dot " changed to "."). */
33#include <LibConfig.h>
34
35#include "gdtoaimp.h"
36
37#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */
38// Disable: warning C4700: uninitialized local variable 'xx' used
39#pragma warning ( disable : 4700 )
40#endif /* defined(_MSC_VER) */
41
42Bigint *
43s2b
44#ifdef KR_headers
45 (s, nd0, nd, y9) CONST char *s; int nd0, nd; ULong y9;
46#else
47 (CONST char *s, int nd0, int nd, ULong y9)
48#endif
49{
50 Bigint *b;
51 int i, k;
52 Long x, y;
53
54 x = (nd + 8) / 9;
55 for(k = 0, y = 1; x > y; y <<= 1, k++) ;
56#ifdef Pack_32
57 b = Balloc(k);
58 if (b == NULL)
59 return NULL;
60 b->x[0] = y9;
61 b->wds = 1;
62#else
63 b = Balloc(k+1);
64 if (b == NULL)
65 return NULL;
66 b->x[0] = y9 & 0xffff;
67 b->wds = (b->x[1] = y9 >> 16) ? 2 : 1;
68#endif
69
70 i = 9;
71 if (9 < nd0) {
72 s += 9;
73 do {
74 b = multadd(b, 10, *s++ - '0');
75 if (b == NULL)
76 return NULL;
77 } while(++i < nd0);
78 s++;
79 }
80 else
81 s += 10;
82 for(; i < nd; i++) {
83 b = multadd(b, 10, *s++ - '0');
84 if (b == NULL)
85 return NULL;
86 }
87 return b;
88 }
89
90 double
91ratio
92#ifdef KR_headers
93 (a, b) Bigint *a, *b;
94#else
95 (Bigint *a, Bigint *b)
96#endif
97{
98 double da, db;
99 int k, ka, kb;
100
101 dval(da) = b2d(a, &ka);
102 dval(db) = b2d(b, &kb);
103 k = ka - kb + ULbits*(a->wds - b->wds);
104#ifdef IBM
105 if (k > 0) {
106 word0(da) += (k >> 2)*Exp_msk1;
107 if (k &= 3)
108 dval(da) *= 1 << k;
109 }
110 else {
111 k = -k;
112 word0(db) += (k >> 2)*Exp_msk1;
113 if (k &= 3)
114 dval(db) *= 1 << k;
115 }
116#else
117 if (k > 0)
118 word0(da) += k*Exp_msk1;
119 else {
120 k = -k;
121 word0(db) += k*Exp_msk1;
122 }
123#endif
124 return dval(da) / dval(db);
125 }
126
127#ifdef INFNAN_CHECK
128
129 int
130match
131#ifdef KR_headers
132 (sp, t) CONST char **sp, *t;
133#else
134 (CONST char **sp, CONST char *t)
135#endif
136{
137 int c, d;
138 CONST char *s = *sp;
139
140 while( (d = *t++) !=0) {
141 if ((c = *++s) >= 'A' && c <= 'Z')
142 c += 'a' - 'A';
143 if (c != d)
144 return 0;
145 }
146 *sp = s + 1;
147 return 1;
148 }
149#endif /* INFNAN_CHECK */
150
151 void
152#ifdef KR_headers
153copybits(c, n, b) ULong *c; int n; Bigint *b;
154#else
155copybits(ULong *c, int n, Bigint *b)
156#endif
157{
158 ULong *ce, *x, *xe;
159#ifdef Pack_16
160 int nw, nw1;
161#endif
162
163 ce = c + ((unsigned int)(n-1) >> kshift) + 1;
164 x = b->x;
165#ifdef Pack_32
166 xe = x + b->wds;
167 while(x < xe)
168 *c++ = *x++;
169#else
170 nw = b->wds;
171 nw1 = nw & 1;
172 for(xe = x + (nw - nw1); x < xe; x += 2)
173 Storeinc(c, x[1], x[0]);
174 if (nw1)
175 *c++ = *x;
176#endif
177 while(c < ce)
178 *c++ = 0;
179 }
180
181 ULong
182#ifdef KR_headers
183any_on(b, k) Bigint *b; int k;
184#else
185any_on(Bigint *b, int k)
186#endif
187{
188 int n, nwds;
189 ULong *x, *x0, x1, x2;
190
191 x = b->x;
192 nwds = b->wds;
193 n = (unsigned int)k >> kshift;
194 if (n > nwds)
195 n = nwds;
196 else if (n < nwds && (k &= kmask)) {
197 x1 = x2 = x[n];
198 x1 >>= k;
199 x1 <<= k;
200 if (x1 != x2)
201 return 1;
202 }
203 x0 = x;
204 x += n;
205 while(x > x0)
206 if (*--x)
207 return 1;
208 return 0;
209 }
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette