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 #pragma ident "@(#) libf/fio/ru.c 92.2 06/21/99 10:37:55"
00039
00040 #include <errno.h>
00041 #include <liberrno.h>
00042 #include <fortran.h>
00043 #include "fio.h"
00044 #ifdef _CRAYMPP
00045 #include <stdarg.h>
00046 #endif
00047
00048 #ifdef _UNICOS
00049 #pragma _CRI duplicate _RUI as $RUI
00050 #pragma _CRI duplicate _RUF as $RUF
00051 #endif
00052
00053 int _RUF();
00054
00055 #define ERROR0(cond, n) { \
00056 if (!(cond)) \
00057 _ferr(css, n); \
00058 else \
00059 goto error; \
00060 }
00061
00062 #define ERROR1(cond, n, p) { \
00063 if (!(cond)) \
00064 _ferr(css, (n), p); \
00065 else \
00066 goto error; \
00067 }
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 #ifdef _CRAYMPP
00089 int
00090 _RUI(
00091 _fcd _Unitid,
00092 ...)
00093 #else
00094 int
00095 _RUI(
00096 _fcd _Unitid,
00097 _fcd _arg2,
00098 long *err,
00099 long *end,
00100 _f_int *iostat,
00101 _f_int *rec
00102 #ifndef _UNICOS
00103 ,FIOSPTR cssa
00104 #endif
00105 )
00106 #endif
00107 {
00108 register int errf;
00109 register int errn;
00110 register int iost;
00111 register int iotp;
00112 register recn_t recn;
00113 register unum_t unum;
00114 unit *cup;
00115 FIOSPTR css;
00116 #ifdef _CRAYMPP
00117 va_list args;
00118 _fcd _arg2;
00119 long *err;
00120 long *end;
00121 _f_int *iostat;
00122 _f_int *rec;
00123 #endif
00124
00125 #ifdef _UNICOS
00126 GET_FIOS_PTR(css);
00127
00128
00129
00130 if (css->f_iostmt != 0)
00131 _ferr(css, FEIOACTV);
00132 #else
00133 css = cssa;
00134 #endif
00135
00136 #ifdef _CRAYMPP
00137 va_start(args, _Unitid);
00138 _arg2 = va_arg(args, _fcd);
00139 err = va_arg(args, long *);
00140 end = va_arg(args, long *);
00141 iostat = va_arg(args, _f_int *);
00142 rec = va_arg(args, _f_int *);
00143 va_end(args);
00144 #endif
00145 errn = 0;
00146
00147
00148
00149 if (iostat != NULL)
00150 *iostat = 0;
00151
00152 errf = ((err != NULL) || (iostat != NULL));
00153 iost = T_RSU;
00154 iotp = SEQ;
00155 unum = **(_f_int **)&_Unitid;
00156
00157 if (rec != NULL) {
00158 iost = T_RDU;
00159 iotp = DIR;
00160 recn = *rec;
00161 }
00162
00163 STMT_BEGIN(unum, 0, iost, NULL, css, cup);
00164
00165 if (cup == NULL) {
00166 int stat;
00167
00168 cup = _imp_open77(css, iotp, UNF, unum, errf, &stat);
00169
00170 if (cup == NULL) {
00171 errn = stat;
00172 goto error;
00173 }
00174 }
00175
00176
00177
00178 cup->uiostat = iostat;
00179 cup->uflag = (err != NULL ? _UERRF : 0) |
00180 (end != NULL ? _UENDF : 0) |
00181 (iostat != NULL ? _UIOSTF : 0);
00182
00183
00184
00185 if (cup->ufs == FS_AUX) {
00186 errn = FEMIXAUX;
00187 ERROR0(errf, errn);
00188 }
00189
00190 if ((cup->uaction & OS_READ) == 0) {
00191 errn = FENOREAD;
00192 ERROR0(errf, errn);
00193 }
00194
00195 if (cup->ufmt) {
00196 errn = FEUNFMIV;
00197 ERROR0(errf, errn);
00198 }
00199
00200
00201
00202 if (cup->useq && cup->uwrt != 0) {
00203 errn = FERDAFWR;
00204 ERROR0(errf, errn);
00205 }
00206
00207
00208
00209 cup->ueor_found = NO;
00210 cup->uwrt = 0;
00211 cup->ulastyp = DVTYPE_TYPELESS;
00212
00213 if (iotp == DIR) {
00214
00215 if (cup->useq)
00216 errn = FEDIRTIV;
00217 else
00218 errn = _unit_seek(cup, recn, iost);
00219
00220 if (errn != 0) {
00221 ERROR1(errf, errn, recn);
00222 }
00223 }
00224 else {
00225
00226 if (cup->useq == 0) {
00227 errn = FESEQTIV;
00228 ERROR0(errf, errn);
00229 }
00230
00231 #if PURE_ENABLED
00232 if (cup->upure && cup->upuretype != P_RDWR) {
00233
00234
00235
00236
00237
00238
00239
00240 if (cup->upuretype == P_BUFIO) {
00241 errn = FEMIXBUF;
00242 ERROR0(errf, errn);
00243 }
00244 cup->upuretype = P_RDWR;
00245 }
00246 #endif
00247
00248 }
00249
00250 if (errn != 0)
00251 ERROR0(errf, errn);
00252
00253 return(CFT77_RETVAL(IO_OKAY));
00254
00255 error:
00256 if (iostat != NULL)
00257 *iostat = errn;
00258
00259 if (cup != NULL)
00260 cup->uflag |= (errn > 0) ? _UERRC : _UENDC;
00261
00262 #ifdef _UNICOS
00263 return(CFT77_RETVAL(_RUF()));
00264 #else
00265 return(CFT77_RETVAL(_RUF(css)));
00266 #endif
00267
00268 }
00269
00270 #ifdef _UNICOS
00271
00272
00273
00274
00275 #define INLINE
00276 #include "rdunf.c"
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294 int
00295 $RUA$(
00296 _fcd fwa,
00297 long *count,
00298 long *stride,
00299 long *type
00300 )
00301 {
00302 register short type77;
00303 register int errn;
00304 type_packet tip;
00305 struct f90_type ts;
00306 void *dptr;
00307 unit *cup;
00308 FIOSPTR css;
00309
00310 GET_FIOS_PTR(css);
00311
00312 cup = css->f_cu;
00313 type77 = *type & 017;
00314
00315 CREATE_F90_INFO(ts, tip, type77);
00316
00317 tip.count = *count;
00318 tip.stride = *stride;
00319
00320 if (type77 == DT_CHAR) {
00321 dptr = (void *) _fcdtocp(fwa);
00322 tip.elsize = tip.elsize * _fcdlen(fwa);
00323 }
00324 else
00325 dptr = *(void **)&fwa;
00326
00327 #if NUMERIC_DATA_CONVERSION_ENABLED
00328
00329 if (cup->unumcvrt || cup->ucharset) {
00330
00331 errn = _get_dc_param(css, cup, ts, &tip);
00332
00333 if (errn != 0)
00334 goto error;
00335 }
00336 #endif
00337
00338 #pragma _CRI inline _inline_rdunf
00339 errn = _inline_rdunf(css, cup, dptr, &tip, 0);
00340
00341 if (errn == 0)
00342 return(CFT77_RETVAL(IO_OKAY));
00343
00344 error:
00345 if (cup->uiostat != NULL)
00346 *(cup->uiostat) = errn;
00347
00348 cup->uflag |= (errn > 0) ? _UERRC : _UENDC;
00349
00350 if (cup->uflag & (_UIOSTF | _UERRF | _UENDF))
00351 return(CFT77_RETVAL(_RUF()));
00352
00353 _ferr(css, FEINTUNK);
00354 }
00355
00356 #endif
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368 int
00369 _RUF(
00370 #ifndef _UNICOS
00371 FIOSPTR cssa
00372 #endif
00373 )
00374 {
00375 register int errn;
00376 register long flag;
00377 unit *cup;
00378 FIOSPTR css;
00379
00380 #ifdef _UNICOS
00381 GET_FIOS_PTR(css);
00382 #else
00383 css = cssa;
00384 #endif
00385 cup = css->f_cu;
00386
00387 if (cup == NULL) {
00388
00389
00390
00391
00392
00393 flag = _UERRC | _UERRF;
00394 goto finished;
00395 }
00396
00397 cup->ulrecl = cup->urecpos;
00398 cup->urecpos = 0;
00399
00400 #ifdef _CRAYMPP
00401 if (css->f_shrdput) {
00402 css->f_shrdput = 0;
00403 _remote_write_barrier();
00404 }
00405 #endif
00406 if ((cup->uflag & (_UERRC | _UENDC)) == 0) {
00407
00408 errn = 0;
00409
00410 switch (cup->ufs) {
00411
00412 case FS_FDC:
00413
00414
00415
00416
00417 if (cup->useq)
00418 if (cup->ublkd && !cup->ueor_found) {
00419 int ubc = 0;
00420 char dummy;
00421 struct ffsw fst;
00422
00423 (void) XRCALL(cup->ufp.fdc, readrtn)
00424 cup->ufp.fdc,
00425 CPTR2BP(&dummy), 0,
00426 &fst, FULL, &ubc);
00427
00428 switch (fst.sw_stat) {
00429 case FFERR:
00430 errn = fst.sw_error;
00431 break;
00432
00433 case FFEOF:
00434 cup->uend = PHYSICAL_ENDFILE;
00435 errn = FERDPEOF;
00436 break;
00437
00438 case FFEOD:
00439 if (cup->uend == BEFORE_ENDFILE) {
00440 cup->uend = LOGICAL_ENDFILE;
00441 errn = FERDPEOF;
00442 }
00443 else
00444 errn = FERDENDR;
00445 break;
00446 }
00447 }
00448 break;
00449
00450 default:
00451 break;
00452 }
00453
00454 if (errn != 0) {
00455
00456 if (cup->uiostat != NULL)
00457 *(cup->uiostat) = errn;
00458
00459 flag = (_UIOSTF | ((errn < 0) ? _UENDF : _UERRF));
00460
00461 if ((cup->uflag & flag) == 0)
00462 _ferr(css, errn);
00463 else
00464 cup->uflag |= (errn < 0) ? _UENDC : _UERRC;
00465 }
00466
00467 }
00468
00469 flag = cup->uflag;
00470
00471 finished:
00472 STMT_END(cup, TF_READ, NULL, css);
00473
00474 if ((flag & (_UERRC | _UENDC)) == 0)
00475 return(CFT77_RETVAL(IO_OKAY));
00476 else
00477 if ((flag & _UERRC) != 0) {
00478
00479 if ((flag & (_UIOSTF | _UERRF)) != 0)
00480 return(CFT77_RETVAL(IO_ERR));
00481 }
00482 else
00483 if ((flag & (_UIOSTF | _UENDF)) != 0)
00484 return(CFT77_RETVAL(IO_END));
00485
00486 _ferr(css, FEINTUNK);
00487
00488 return(CFT77_RETVAL(IO_ERR));
00489 }