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 #ifndef INLINE
00039 #pragma ident "@(#) libf/fio/rdunf.c 92.2 06/21/99 10:37:55"
00040 #endif
00041
00042 #include <errno.h>
00043 #include <liberrno.h>
00044 #include <fortran.h>
00045 #include <cray/nassert.h>
00046 #ifdef _CRAYT3D
00047 #include <cray/mppsdd.h>
00048 #endif
00049 #include "fio.h"
00050 #include "f90io.h"
00051
00052 #define LOCBUFLN 4096
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 #ifdef INLINE
00069 static int
00070 _inline_rdunf(
00071 #else
00072 int
00073 _rdunf(
00074 #endif
00075 FIOSPTR css,
00076 unit *cup,
00077 void *ptr,
00078 type_packet *tip,
00079 int _Unused
00080 )
00081 {
00082 register short shared;
00083 register int errn;
00084 register int64 fillen;
00085 register long count;
00086 register long elsize;
00087 register long i;
00088 register long incb;
00089 register long items;
00090 int status;
00091 long lbuf[LOCBUFLN];
00092 void *frwdbuf;
00093 #ifdef _CRAYT3D
00094 register long elwords;
00095 #endif
00096
00097 errn = 0;
00098 shared = 0;
00099 count = tip->count;
00100 elsize = tip->elsize;
00101 fillen = tip->extlen;
00102
00103 if (count == 0)
00104 return(0);
00105
00106 if (tip->type90 == DVTYPE_ASCII)
00107 fillen = fillen * elsize;
00108
00109 incb = tip->stride * elsize;
00110
00111 if ( cup->ueor_found ) {
00112 errn = FERDPEOR;
00113 goto done;
00114 }
00115
00116 if (cup->useq == 0) {
00117 register int64 newpos;
00118 register int64 recl;
00119
00120 newpos = cup->urecpos + count * fillen;
00121 recl = (int64) (cup->urecl);
00122
00123 if ((recl << 3) < newpos) {
00124
00125
00126
00127
00128 errn = FERDPEOR;
00129 goto done;
00130 }
00131 }
00132
00133 #ifdef _CRAYT3D
00134 if (_issddptr(ptr)) {
00135
00136
00137
00138
00139
00140 css->f_shrdput = 1;
00141 shared = 1;
00142 elwords = elsize / sizeof(long);
00143 }
00144 #endif
00145
00146
00147
00148 if ((shared == 0) && ((count == 1) || (incb == elsize))) {
00149 register long ret;
00150
00151 ret = _frwd(cup, ptr, tip, PARTIAL, (int *) NULL,
00152 (long *) NULL, &status);
00153
00154 if ( ret == IOERR ) {
00155 errn = errno;
00156 goto done;
00157 }
00158
00159 if ( status == EOR ) {
00160 cup->ueor_found = YES;
00161 cup->uend = BEFORE_ENDFILE;
00162 }
00163 else if ( status == CNT )
00164 cup->uend = BEFORE_ENDFILE;
00165
00166 if ( ret < count ) {
00167 if (status == EOF || status == EOD)
00168 goto endfile_record;
00169 errn = FERDPEOR;
00170 goto done;
00171 }
00172
00173 return(0);
00174 }
00175
00176
00177
00178
00179 items = (LOCBUFLN * sizeof(long)) / elsize;
00180
00181 assert( ! (shared && items == 0) );
00182
00183 if (items == 0)
00184 items = 1;
00185
00186 frwdbuf = lbuf;
00187
00188 for ( i = 0; i < count; i += items ) {
00189 register long ret;
00190
00191
00192
00193 if (items > count - i)
00194 items = count - i;
00195
00196 tip->count = items;
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207 if ((items == 1) && (shared == 0))
00208 frwdbuf = ptr;
00209
00210 ret = _frwd(cup, frwdbuf, tip, PARTIAL, (int *) NULL,
00211 (long *) NULL, &status);
00212
00213 #ifdef _CRAYT3D
00214 if (shared)
00215 _cpytosdd(ptr, lbuf, items, elwords, tip->stride, i);
00216 else
00217 #endif
00218 if (items > 1)
00219 _scatter_data (ptr, items, incb, elsize, lbuf);
00220
00221 if ( ret == IOERR ) {
00222 errn = errno;
00223 goto done;
00224 }
00225 if ( status == EOR ) {
00226 cup->ueor_found = YES;
00227
00228 if ((i + ret) < count) {
00229 errn = FERDPEOR;
00230 goto done;
00231 }
00232 }
00233
00234 if (i == 0)
00235 if (status == EOR || status == CNT)
00236 cup->uend = BEFORE_ENDFILE;
00237
00238
00239
00240
00241 if ( ret < items ) {
00242 if (status == EOF || status == EOD)
00243 goto endfile_record;
00244 errn = FERDPEOR;
00245 goto done;
00246 }
00247
00248 if (!shared)
00249 ptr = (char *) ptr + (ret * incb);
00250 }
00251
00252 done:
00253
00254
00255 if (errn > 0) {
00256 if ((cup->uflag & (_UERRF | _UIOSTF)) == 0)
00257 _ferr(css, errn);
00258 }
00259 else if (errn < 0) {
00260 if ((cup->uflag & (_UENDF | _UIOSTF)) == 0)
00261 _ferr(css, errn);
00262 }
00263
00264 return(errn);
00265
00266 endfile_record:
00267
00268
00269
00270
00271 if (status == EOF) {
00272 cup->uend = PHYSICAL_ENDFILE;
00273 errn = FERDPEOF;
00274 }
00275 else {
00276 if (cup->uend == 0) {
00277 cup->uend = LOGICAL_ENDFILE;
00278 errn = FERDPEOF;
00279 }
00280 else
00281 errn = FERDENDR;
00282 }
00283
00284 if (!(cup->useq))
00285 errn = FENORECN;
00286
00287 goto done;
00288 }