/usr/include/convert_vax_data.h is in libdnet-dev 2.64build2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 | /******************************************************************************
* *
* convert_vax_data.h - Convert VAX-format data to/from Unix (IEEE) format. *
* *
* from_vax_i2() - Byte swap Integer*2 *
* from_vax_i4() - Byte reverse Integer*4 *
* from_vax_r4() - 32-bit VAX F_floating to IEEE S_floating *
* from_vax_d8() - 64-bit VAX D_floating to IEEE T_floating *
* from_vax_g8() - 64-bit VAX G_floating to IEEE T_floating *
* from_vax_h16() - 128-bit VAX H_floating to Alpha X_floating *
* *
* to_vax_i2() - Byte swap Integer*2 *
* to_vax_i4() - Byte reverse Integer*4 *
* to_vax_r4() - 32-bit IEEE S_floating to VAX F_floating *
* to_vax_d8() - 64-bit IEEE T_floating to VAX D_floating *
* to_vax_g8() - 64-bit IEEE T_floating to VAX G_floating *
* to_vax_h16() - 128-bit Alpha X_floating to VAX H_floating *
* *
* All calls take 3 arguments: *
* *
* C declaration: #include "convert_vax_data.h" *
* usage: name( in_array, out_array, &count ); *
* *
* Fortran usage: Call NAME( in_array, out_array, count ) *
* *
* The in_array and out_array parameters may refer to the same object. *
* *
* *
* VAXes (as well as the Intel 80x86 family) store integers in 2's complement *
* format, ordering the bytes in memory from low-order to high-order (collo- *
* quially called little-endian format). Most Unix machines (Sun, IBM, HP) *
* also store integers in 2's complement format, but use the opposite (so *
* called big-endian) byte ordering. *
* *
* A VAX integer is converted to (big-endian) Unix format by reversing the *
* byte order. *
* *
* Most Unix machines implement the ANSI/IEEE 754-1985 floating-point arith- *
* metic standard. VAX and IEEE formats are similar (after byte-swapping). *
* The high-order bit is a sign bit (s). This is followed by a biased expo- *
* nent (e), and a (usually) hidden-bit normalized mantissa (m). They differ *
* in the number used to bias the exponent, the location of the implicit bi- *
* nary point for the mantissa, and the representation of exceptional numbers *
* (e.g., +/-infinity). *
* *
* VAX floating-point formats: (-1)^s * 2^(e-bias) * 0.1m *
* *
* 31 15 0 *
* | | | *
* F_floating mmmmmmmmmmmmmmmmseeeeeeeemmmmmmm bias = 128 *
* D_floating mmmmmmmmmmmmmmmmseeeeeeeemmmmmmm bias = 128 *
* mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm *
* G_floating mmmmmmmmmmmmmmmmseeeeeeeeeeemmmm bias = 1024 *
* mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm *
* H_floating mmmmmmmmmmmmmmmmseeeeeeeeeeeeeee bias = 16384 *
* mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm *
* mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm *
* mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm *
* *
* IEEE floating-point formats: (-1)^s * 2^(e-bias) * 1.m *
* *
* 31 15 0 *
* | | | *
* S_floating seeeeeeeemmmmmmmmmmmmmmmmmmmmmmm bias = 127 *
* T_floating seeeeeeeeeeemmmmmmmmmmmmmmmmmmmm bias = 1023 *
* mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm *
* X_floating seeeeeeeeeeeeeeemmmmmmmmmmmmmmmm bias = 16383 *
* mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm *
* mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm *
* mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm *
* *
* A VAX floating-point number is converted to IEEE floating-point format by *
* subtracting (1+VAX_bias-IEEE_bias) from the exponent field to (1) adjust *
* from VAX 0.1m hidden-bit normalization to IEEE 1.m hidden-bit normaliza- *
* tion and (2) adjust the bias from VAX format to IEEE format. True zero *
* [s=e=m=0] and dirty zero [s=e=0, m<>0] are special cases which must be *
* recognized and handled separately. Both VAX zeros are converted to IEEE *
* +zero [s=e=m=0]. *
* *
* Numbers whose absolute value is too small to represent in the normalized *
* IEEE format illustrated above are converted to subnormal form [e=0, m>0]: *
* (-1)^s * 2^(1-bias) * 0.m. Numbers whose absolute value is too small to *
* represent in subnormal form are set to 0.0 (silent underflow). *
* *
* Note: If the fractional part of the VAX floating-point number is too large *
* for the corresponding IEEE floating-point format, bits are simply *
* discarded from the right. Thus, the remaining fractional part is *
* chopped, not rounded to the lowest-order bit. This can only occur *
* when the conversion requires IEEE subnormal form. *
* *
* A VAX floating-point reserved operand [s=1, e=0, m=any] causes a SIGFPE *
* exception to be raised. The converted result is set to zero. *
* *
* Conversely, an IEEE floating-point number is converted to VAX floating- *
* point format by adding (1+VAX_bias-IEEE_bias) to the exponent field. *
* +zero [s=e=m=0], -zero [s=1, e=m=0], infinities [s=X, e=all-1's, m=0], and *
* NaNs [s=X, e=all-1's, m<>0] are special cases which must be recognized and *
* handled separately. Both IEEE zeros are converted to VAX true zero *
* [s=e=m=0]. Infinities and NaNs cause a SIGFPE exception to be raised. *
* The result returned has the largest VAX exponent [e=all-1's] and zero *
* mantissa [m=0] with the same sign as the original. *
* *
* Numbers whose absolute value is too small to represent in the normalized *
* VAX format illustrated above are set to 0.0 (silent underflow). (VAX *
* floating-point format does not support subnormal numbers.) Numbers whose *
* absolute value exceeds the largest representable VAX-format number cause a *
* SIGFPE exception to be raised (overflow). (VAX floating-point format does *
* not have reserved bit patterns for infinities and not-a-numbers [NaNs].) *
* The result returned has the largest VAX exponent and mantissa [e=m= *
* all-1's] with the same sign as the original. *
* *
* *
* Two variants of convert_vax_data.c are available using IS_LITTLE_ENDIAN *
* and APPEND_UNDERSCORE. If IS_LITTLE_ENDIAN is defined as 0 (false), then *
* the conversions are performed for a big-endian machine, i.e., byte reor- *
* dering is performed for all data types. If IS_LITTLE_ENDIAN is defined as *
* 1 (true), then no reordering is performed. (Integers are identical to VAX *
* format.) *
* *
* If IS_LITTLE_ENDIAN is not defined, then it is defined as 1 (true) if any *
* of the following macros are defined: *
* *
* vax __vax vms __vms __alpha DEC VAX C, GNU C on a DEC VAX or a DEC *
* Alpha, DEC C *
* M_I86 _M_IX86 __M_ALPHA Microsoft 80x86 C or Microsoft Visual C++ *
* on an Intel x86 or a DEC Alpha *
* i386 __i386 Sun C, GNU C, or Intel C on an Intel x86 *
* __x86_64 __x86_64__ GNU C or Portland Group C on an AMD *
* Opteron or an Intel EM64T *
* *
* If APPEND_UNDERSCORE is defined, the entry point names are compiled with *
* an underscore appended. This is required so that they can be called by *
* Fortran in cases where the Fortran compiler appends an underscore to *
* externally called routines (e.g., Sun Fortran). *
* *
* Normally, all routines are compiled into a single object module. To com- *
* pile a single routine into its own module, define MAKE_routine_name, sub- *
* stituting the upper-case name of the routine for routine_name. For exam- *
* ple, MAKE_TO_VAX_I2. (This is useful, for example, to insert the routines *
* into a library such that a linker may extract only the routines actually *
* needed by a particular program.) *
* *
* convert_vax_data.c assumes an ANSI C compiler, 8-bit chars, 16-bit shorts, *
* and 32-bit ints. *
* *
* *
* References: ANSI/IEEE Std 754-1985, IEEE Standard for Binary Floating- *
* Point Arithmetic, Institute of Electrical and Electronics *
* Engineers *
* Brunner, Richard A., Ed., 1991, VAX Architecture Reference *
* Manual, Second Edition, Digital Press *
* Sites, Richard L., and Witek, Richard T., 1995, Alpha AXP *
* Architecture Reference Manual, Second Edition, Digital *
* Press *
* *
* Author: Lawrence M. Baker *
* U.S. Geological Survey *
* 345 Middlefield Road MS977 *
* Menlo Park, CA 94025 *
* baker@usgs.gov *
* *
* Citation: Baker, L.M., 2005, libvaxdata: VAX Data Format Conversion *
* Routines: U.S. Geological Survey Open-File Report 2005- *
* 1424 (http://pubs.usgs.gov/of/2005/1424/). *
* *
* *
* Disclaimer *
* *
* Although this program has been used by the USGS, no warranty, expressed or *
* implied, is made by the USGS or the United States Government as to the *
* accuracy and functioning of the program and related program material, nor *
* shall the fact of distribution constitute any such warranty, and no *
* responsibility is assumed by the USGS in connection therewith. *
* *
* *
* Modification History: *
* *
* 8-Mar-2001 L. M. Baker Original version. *
* Define upcased and underscore-appended *
* variants. *
* 9-Mar-2001 L. M. Baker Add #ifndef _CONVERT_VAX_DATA guard. *
* 16-Sep-2005 L. M. Baker Correct the diagram of IEEE X_floating *
* (exponent is 15 bits, not 11 bits). *
* 19-Sep-2005 L. M. Baker Add fixups for IEEE-to-VAX conversion *
* faults (+-infinity, +-NaN, overflow). *
* 8-Nov-2005 L. M. Baker Move #define const if not __STDC__ from *
* convert_vax_data.c. *
* 27-Jan-2010 L. M. Baker Change guard to #ifndef _CONVERT_VAX_DATA_H. *
* *
******************************************************************************/
#ifndef _CONVERT_VAX_DATA_H
#define _CONVERT_VAX_DATA_H
#ifndef FORTRAN_LINKAGE
#define FORTRAN_LINKAGE
#endif
#ifdef UPCASE
#define from_vax_i2 FROM_VAX_I2
#define from_vax_i4 FROM_VAX_I4
#define from_vax_r4 FROM_VAX_R4
#define from_vax_d8 FROM_VAX_D8
#define from_vax_g8 FROM_VAX_G8
#define from_vax_h16 FROM_VAX_H16
#define to_vax_i2 TO_VAX_I2
#define to_vax_i4 TO_VAX_I4
#define to_vax_r4 TO_VAX_R4
#define to_vax_d8 TO_VAX_D8
#define to_vax_g8 TO_VAX_G8
#define to_vax_h16 TO_VAX_H16
#endif
#ifdef APPEND_UNDERSCORE
#define from_vax_i2 from_vax_i2##_
#define from_vax_i4 from_vax_i4##_
#define from_vax_r4 from_vax_r4##_
#define from_vax_d8 from_vax_d8##_
#define from_vax_g8 from_vax_g8##_
#define from_vax_h16 from_vax_h16##_
#define to_vax_i2 to_vax_i2##_
#define to_vax_i4 to_vax_i4##_
#define to_vax_r4 to_vax_r4##_
#define to_vax_d8 to_vax_d8##_
#define to_vax_g8 to_vax_g8##_
#define to_vax_h16 to_vax_h16##_
#endif
/* const is ANSI C, C++ only */
#if !defined( __STDC__ ) && !defined( __cplusplus )
#define const
#endif
void FORTRAN_LINKAGE from_vax_i2( const void *inbuf, void *outbuf,
const int *count );
void FORTRAN_LINKAGE from_vax_i4( const void *inbuf, void *outbuf,
const int *count );
void FORTRAN_LINKAGE from_vax_r4( const void *inbuf, void *outbuf,
const int *count );
void FORTRAN_LINKAGE from_vax_d8( const void *inbuf, void *outbuf,
const int *count );
void FORTRAN_LINKAGE from_vax_g8( const void *inbuf, void *outbuf,
const int *count );
void FORTRAN_LINKAGE from_vax_h16( const void *inbuf, void *outbuf,
const int *count );
void FORTRAN_LINKAGE to_vax_i2( const void *inbuf, void *outbuf,
const int *count );
void FORTRAN_LINKAGE to_vax_i4( const void *inbuf, void *outbuf,
const int *count );
void FORTRAN_LINKAGE to_vax_r4( const void *inbuf, void *outbuf,
const int *count );
void FORTRAN_LINKAGE to_vax_d8( const void *inbuf, void *outbuf,
const int *count );
void FORTRAN_LINKAGE to_vax_g8( const void *inbuf, void *outbuf,
const int *count );
void FORTRAN_LINKAGE to_vax_h16( const void *inbuf, void *outbuf,
const int *count );
#endif /* _CONVERT_VAX_DATA_H */
|