00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #pragma ident "@(#) libf/fio/s2uz.c 92.1 06/18/99 18:41:02"
00043 #include <fortran.h>
00044 #include <cray/fmtconv.h>
00045 #include <cray/portdefs.h>
00046
00047 #define MXBITS 64
00048 #define MXDGTS 16
00049 #define MXSIZE (MXDGTS + 1)
00050 #define DGSIZE 4
00051
00052 #define UNDP (MODEUN | MODEDP)
00053
00054 extern oc_func _S2UZ;
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 long *
00082 _S2UZ(
00083 const void *value,
00084 long *fca,
00085 const long *mode,
00086 const long *width,
00087 const long *digits,
00088 const long *exp,
00089 const long *scale
00090 )
00091 {
00092 int64 datum;
00093 #ifdef _F_INT4
00094 int32 datum32;
00095
00096 #if defined(_F_INT2)
00097 _f_int2 datum16;
00098 _f_int1 datum8;
00099 #endif
00100 #endif
00101 long fd, fw, m77, nfd, *ptr;
00102
00103 fd = *digits;
00104 fw = *width;
00105
00106 #ifdef _F_INT4
00107 if ((*mode & MODEHP) != 0)
00108 datum = *(_f_int4 *)value;
00109 else
00110
00111 #if defined(_F_INT2)
00112 if ((*mode & MODEWP) != 0)
00113 datum = *(_f_int2 *)value;
00114 else
00115 if ((*mode & MODEBP) != 0)
00116 datum = *(_f_int1 *)value;
00117 else
00118 #endif
00119 #endif
00120 datum = *(_f_int8 *)value;
00121
00122 ptr = fca;
00123 m77 = (*mode & MODE77);
00124
00125
00126
00127 if ((*mode & UNDP) == UNDP && fw > MXSIZE) {
00128
00129 if (fd == 1 && m77 != 0)
00130 fd = fw;
00131
00132 fw -= MXSIZE;
00133 nfd = fd - MXDGTS;
00134
00135 if (nfd < 0)
00136 nfd = 0;
00137 else
00138 if (nfd > fw)
00139 nfd = fw;
00140
00141 if (m77 != 0) {
00142 long mask, temp;
00143
00144 temp = fw * DGSIZE;
00145 mask = (temp < MXBITS) ? ((1 << temp) - 1) : ~0;
00146 datum = datum & mask;
00147 }
00148
00149 ptr = _s2uz(&datum, ptr, mode, &fw, &nfd, exp, scale);
00150
00151 datum = *((int64 *)value + 1);
00152 fw = MXSIZE;
00153
00154 if (fd > MXDGTS)
00155 fd = MXDGTS;
00156 }
00157 else
00158 if (fd == 1 && m77 != 0)
00159 fd = (fw > MXDGTS) ? MXDGTS : fw;
00160
00161 if (m77 != 0) {
00162 long mask, temp;
00163
00164 temp = fw * DGSIZE;
00165 mask = (temp < MXBITS) ? ((1 << temp) - 1) : ~0;
00166 datum = datum & mask;
00167 }
00168
00169 #ifdef _F_INT4
00170 if ((*mode & MODEHP) != 0) {
00171 datum32 = datum;
00172 value = &datum32;
00173 }
00174 else
00175
00176 #if defined(_F_INT2)
00177 if ((*mode & MODEWP) != 0) {
00178 datum16 = datum;
00179 value = &datum16;
00180 }
00181 else
00182 if ((*mode & MODEBP) != 0) {
00183 datum8 = datum;
00184 value = &datum8;
00185 }
00186 else
00187 #endif
00188 #endif
00189 value = &datum;
00190
00191 return( _s2uz(value, ptr, mode, &fw, &fd, exp, scale) );
00192 }