1/*
2 * Copyright (c) 2010 Apple Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1.  Redistributions of source code must retain the above copyright
11 *     notice, this list of conditions and the following disclaimer.
12 * 2.  Redistributions in binary form must reproduce the above copyright
13 *     notice, this list of conditions and the following disclaimer in the
14 *     documentation and/or other materials provided with the distribution.
15 * 3.  Neither the name of Apple Inc. ("Apple") nor the names of its
16 *     contributors may be used to endorse or promote products derived from
17 *     this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 *
30 * Portions of this software have been released under the following terms:
31 *
32 * (c) Copyright 1989-1993 OPEN SOFTWARE FOUNDATION, INC.
33 * (c) Copyright 1989-1993 HEWLETT-PACKARD COMPANY
34 * (c) Copyright 1989-1993 DIGITAL EQUIPMENT CORPORATION
35 *
36 * To anyone who acknowledges that this file is provided "AS IS"
37 * without any express or implied warranty:
38 * permission to use, copy, modify, and distribute this file for any
39 * purpose is hereby granted without fee, provided that the above
40 * copyright notices and this notice appears in all source code copies,
41 * and that none of the names of Open Software Foundation, Inc., Hewlett-
42 * Packard Company or Digital Equipment Corporation be used
43 * in advertising or publicity pertaining to distribution of the software
44 * without specific, written prior permission.  Neither Open Software
45 * Foundation, Inc., Hewlett-Packard Company nor Digital
46 * Equipment Corporation makes any representations about the suitability
47 * of this software for any purpose.
48 *
49 * Copyright (c) 2007, Novell, Inc. All rights reserved.
50 * Redistribution and use in source and binary forms, with or without
51 * modification, are permitted provided that the following conditions
52 * are met:
53 *
54 * 1.  Redistributions of source code must retain the above copyright
55 *     notice, this list of conditions and the following disclaimer.
56 * 2.  Redistributions in binary form must reproduce the above copyright
57 *     notice, this list of conditions and the following disclaimer in the
58 *     documentation and/or other materials provided with the distribution.
59 * 3.  Neither the name of Novell Inc. nor the names of its contributors
60 *     may be used to endorse or promote products derived from this
61 *     this software without specific prior written permission.
62 *
63 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
64 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
65 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
66 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY
67 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
68 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
69 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
70 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
71 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
72 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
73 *
74 * @APPLE_LICENSE_HEADER_END@
75 */
76
77/*
78**
79**  NAME:
80**
81**      pkvaxg.c.h
82**
83**  FACILITY:
84**
85**      IDL Stub Runtime Support
86**
87**  ABSTRACT:
88**
89**      This module contains code to extract information from an
90**      UNPACKED_REAL structure and to create a VAX g_floating number
91**      with those bits.
92**
93**              This module is meant to be used as an include file.
94**
95**  VERSION: DCE 1.0
96**
97*/
98#if HAVE_CONFIG_H
99#include <config.h>
100#endif
101
102/*
103**++
104**  Functional Description:
105**
106**  This module contains code to extract information from an
107**  UNPACKED_REAL structure and to create a VAX g_floating number
108**  with those bits.
109**
110**  See the header files for a description of the UNPACKED_REAL
111**  structure.
112**
113**  A VAX g_floating number in (16 bit words) looks like:
114**
115**      [0]: Sign bit, 11 exp bits (bias 1024), 4 fraction bits
116**      [1]: 16 more fraction bits
117**      [2]: 16 more fraction bits
118**      [3]: 16 more fraction bits
119**
120**      0.5 <= fraction < 1.0, MSB implicit
121**
122**
123**  Implicit parameters:
124**
125**      options: a word of flags, see include files.
126**
127**      output_value: a pointer to the input parameter.
128**
129**      r: an UNPACKED_REAL structure.
130**
131**--
132*/
133
134if (r[U_R_FLAGS] & U_R_UNUSUAL) {
135
136        if (r[U_R_FLAGS] & U_R_ZERO)
137
138                memcpy(output_value, VAX_G_ZERO, 8);
139
140        else if (r[U_R_FLAGS] & U_R_INFINITY) {
141
142                memcpy(output_value, VAX_G_INVALID, 8);
143                if (r[U_R_FLAGS] & U_R_NEGATIVE) {
144                        DCETHREAD_RAISE(dcethread_aritherr_e);    /* Negative infinity */
145                } else {
146                        DCETHREAD_RAISE(dcethread_aritherr_e);    /* Positive infinity */
147                }
148
149        } else if (r[U_R_FLAGS] & U_R_INVALID) {
150
151                memcpy(output_value, VAX_G_INVALID, 8);
152                DCETHREAD_RAISE(dcethread_aritherr_e);    /* Invalid value */
153
154        }
155
156} else {
157
158        round_bit_position = 53;
159
160#include "round.c.h"
161
162        if (r[U_R_EXP] < (U_R_BIAS - 1023)) {
163
164                /* Underflow */
165
166                memcpy(output_value, VAX_G_ZERO, 8);
167                if (options & CVT_C_ERR_UNDERFLOW) {
168                        DCETHREAD_RAISE(dcethread_fltund_e);  /* Underflow */
169                }
170
171        } else if (r[U_R_EXP] > (U_R_BIAS + 1023)) {
172
173                /* Overflow */
174
175                if (options & CVT_C_TRUNCATE) {
176
177                        if (r[U_R_FLAGS] & U_R_NEGATIVE)
178                                memcpy(output_value, VAX_G_NEG_HUGE, 8);
179                        else
180                                memcpy(output_value, VAX_G_POS_HUGE, 8);
181
182                } else if ((options & CVT_C_ROUND_TO_POS)
183                                        && (r[U_R_FLAGS] & U_R_NEGATIVE)) {
184
185                                memcpy(output_value, VAX_G_NEG_HUGE, 8);
186
187                } else if ((options & CVT_C_ROUND_TO_NEG)
188                                        && !(r[U_R_FLAGS] & U_R_NEGATIVE)) {
189
190                                memcpy(output_value, VAX_G_POS_HUGE, 8);
191
192                } else {
193
194                        memcpy(output_value, VAX_G_INVALID, 8);
195
196                }
197
198                DCETHREAD_RAISE(dcethread_fltovf_e);  /* Overflow */
199
200        } else {
201
202                /* Adjust bias of exponent */
203
204                r[U_R_EXP] -= (U_R_BIAS - 1024);
205
206                /* Make room for exponent and sign bit */
207
208                r[2] >>= 11;
209                r[2] |= (r[1] << 21);
210                r[1] >>= 11;
211
212                /* Clear implicit bit */
213
214                r[1] &= 0x000FFFFFL;
215
216                /* OR in exponent and sign bit */
217
218                r[1] |= (r[U_R_EXP] << 20);
219                r[1] |= (r[U_R_FLAGS] << 31);
220
221                /* Adjust for VAX 16 bit floating format */
222
223                r[1] = ((r[1] << 16) | (r[1] >> 16));
224                r[2] = ((r[2] << 16) | (r[2] >> 16));
225
226                memcpy(output_value, &r[1], 8);
227
228        }
229
230}
231