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/fwwd.c 92.3 09/29/99 19:50:24"
00043
00044 #include <errno.h>
00045 #include <fortran.h>
00046 #include <liberrno.h>
00047 #include <cray/nassert.h>
00048 #include "fio.h"
00049 #ifdef _ABSOFT
00050 #include "ac_sysdep.h"
00051 #else
00052
00053 #if defined(_LITTLE_ENDIAN) && !defined(__sv2)
00054 #ifndef FILE_FLAG
00055 #define FILE_FLAG(__f) (__f)->_flags
00056 #endif
00057
00058 #ifndef IOREAD
00059 #define IOREAD = _IO_CURRENTLY_APPENDING
00060 #endif
00061 #ifndef IORW
00062 #define IORW = _IO_TIED_PUTGET
00063 #endif
00064
00065 #else
00066
00067
00068 #ifndef FILE_FLAG
00069 #define FILE_FLAG(__f) (__f)->_flag
00070 #endif
00071
00072 #endif
00073 #endif
00074
00075 #define TBFSZ (4096 * sizeof(long))
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092 long
00093 _fwwd(
00094 unit *cup,
00095 void *uda,
00096 type_packet *tip,
00097 int mode,
00098 int *ubcret,
00099
00100
00101
00102 long *unused_6,
00103 int *status)
00104 {
00105 register int buflim;
00106 register int fdsize;
00107 register int padbyts;
00108 register long elsize;
00109 register long items;
00110 register ftype_t type;
00111 register size_t breq;
00112 register ssize_t ret;
00113 int padubc;
00114 int padval;
00115 int ubc;
00116 FILE *fptr;
00117
00118
00119
00120 #ifdef _UNICOS
00121 assert ( _numargs() == 7);
00122 #endif
00123 assert ( mode == FULL || mode == PARTIAL );
00124 assert ( tip != NULL );
00125 assert ( status != NULL );
00126
00127
00128
00129
00130
00131
00132 if (cup->uend && !cup->umultfil) {
00133 errno = FEWRAFEN;
00134 return(IOERR);
00135 }
00136
00137 type = tip->type90;
00138 elsize = tip->elsize;
00139 items = tip->count;
00140 breq = elsize * items;
00141 padbyts = 0;
00142 padubc = 0;
00143 ubc = 0;
00144
00145 if (ubcret != NULL) {
00146
00147 if ((*ubcret % 8) != 0 && cup->ufs != FS_FDC) {
00148 errno = FEUBCINV;
00149 return (IOERR);
00150 }
00151
00152 if (type != DVTYPE_TYPELESS) {
00153 errno = FEINTUNK;
00154 return (IOERR);
00155 }
00156
00157
00158
00159 breq = breq - (*ubcret >> 3);
00160 ubc = *ubcret % 8;
00161 }
00162 #if NUMERIC_DATA_CONVERSION_ENABLED
00163 else {
00164
00165
00166
00167
00168
00169
00170 if ((cup->urecpos & cup->ualignmask) != 0 &&
00171 type != DVTYPE_ASCII &&
00172 items > 0 &&
00173 #if defined(__mips) || defined(_LITTLE_ENDIAN)
00174 elsize > 2 )
00175 #else
00176 elsize > 4 )
00177 #endif
00178 COMPADD(cup, padbyts, padubc, padval);
00179 }
00180 #endif
00181
00182 cup->ulastyp = type;
00183
00184 if (mode == FULL) {
00185 cup->ulastyp = DVTYPE_TYPELESS;
00186 cup->urecpos = 0;
00187 }
00188
00189
00190
00191
00192 *status = CNT;
00193
00194 switch ( cup->ufs ) {
00195
00196 case FS_FDC:
00197
00198
00199
00200
00201
00202 if (cup->uend == LOGICAL_ENDFILE) {
00203 if (XRCALL(cup->ufp.fdc, weofrtn)cup->ufp.fdc,
00204 &cup->uffsw) < 0){
00205 errno = cup->uffsw.sw_error;
00206 return(IOERR);
00207 }
00208 }
00209
00210 cup->uend = BEFORE_ENDFILE;
00211
00212
00213
00214 if (items == 0) {
00215 if (mode == FULL) {
00216 long end;
00217
00218 ret = XRCALL(cup->ufp.fdc, writertn)
00219 cup->ufp.fdc,
00220 CPTR2BP(&end), 0, &cup->uffsw,
00221 mode, &ubc);
00222
00223 if (ret < 0) {
00224 errno = cup->uffsw.sw_error;
00225 return(IOERR);
00226 }
00227
00228 *status = EOR;
00229 }
00230
00231
00232
00233 return(EOR);
00234 }
00235
00236
00237
00238 if (padbyts > 0) {
00239
00240 ret = XRCALL(cup->ufp.fdc, writertn) cup->ufp.fdc,
00241 CPTR2BP(&padval),
00242 padbyts, &cup->uffsw, PARTIAL, &padubc);
00243
00244 if (ret < 0) {
00245 errno = cup->uffsw.sw_error;
00246 return(IOERR);
00247 }
00248 if (mode != FULL)
00249 cup->urecpos += ((uint64)ret << 3) - padubc;
00250 }
00251
00252
00253
00254 if (tip->cnvindx == 0) {
00255
00256 ubc = 0;
00257
00258 ret = XRCALL(cup->ufp.fdc, writertn) cup->ufp.fdc,
00259 CPTR2BP(uda),
00260 breq, &cup->uffsw, mode, &ubc);
00261
00262 if (ret < 0) {
00263 errno = cup->uffsw.sw_error;
00264 return(IOERR);
00265 }
00266
00267 if (mode == FULL)
00268 *status = EOR;
00269 else
00270 cup->urecpos += ((uint64)ret << 3) - ubc;
00271
00272 return(items);
00273 }
00274
00275 #if NUMERIC_DATA_CONVERSION_ENABLED
00276
00277
00278
00279
00280 {
00281 register int uoff;
00282 register int64 bits;
00283 register int64 totbits;
00284 #ifdef KEY
00285
00286 unsigned long long tbuf[
00287 (TBFSZ + sizeof(unsigned long long) - 1) /
00288 sizeof(unsigned long long)];
00289 unsigned char *tp = (unsigned char *) tbuf;
00290 #else
00291 unsigned char tbuf[TBFSZ], *tp;
00292 #endif
00293
00294 _f_int dctype;
00295 int (* cvt_fun)();
00296
00297 cvt_fun = __fndc_ncfunc[tip->cnvindx].to_foreign;
00298
00299 #if !defined(__mips) && !defined(_LITTLE_ENDIAN)
00300 if (!_loaded(cvt_fun)) {
00301 errno = FELDDCNV;
00302 return(IOERR);
00303 }
00304 #endif
00305
00306 fdsize = tip->extlen;
00307 dctype = tip->cnvtype;
00308
00309 if (fdsize == 0) {
00310 errno = FDC_ERR_NCVRT;
00311 return(IOERR);
00312 }
00313 #ifndef KEY
00314 tp = tbuf;
00315 #endif
00316 buflim = ((TBFSZ << 3) / fdsize) * fdsize;
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327 totbits = (items * fdsize) - ubc;
00328
00329 if (type == DVTYPE_ASCII)
00330 totbits = totbits * elsize;
00331
00332 bits = 0;
00333 uoff = 0;
00334
00335 while (bits < totbits) {
00336 #ifdef KEY
00337 register long slice;
00338 #else
00339 register int slice;
00340 #endif
00341 register _f_int numerr;
00342 int locubc;
00343 int locmode;
00344 _f_int icount;
00345 const _f_int bitoff = 0;
00346 const _f_int stride = 1;
00347 #ifdef _CRAY
00348 _fcd craychr;
00349 #endif
00350
00351 slice = totbits - bits;
00352 locmode = mode;
00353
00354 if (slice > buflim) {
00355 slice = buflim;
00356 locmode = PARTIAL;
00357 }
00358
00359
00360
00361 breq = (slice + 7) >> 3;
00362 locubc = (breq << 3) - slice;
00363
00364
00365
00366
00367 icount = slice / fdsize;
00368
00369 #ifdef _CRAY
00370 craychr = _cptofcd((char *)uda + uoff, icount);
00371 #endif
00372
00373 if (tip->newfunc) {
00374 _f_int flen;
00375 _f_int nlen;
00376
00377 flen = fdsize;
00378 nlen = tip->intlen;
00379
00380 numerr = cvt_fun(&dctype, &icount, (void *)tp,
00381 &bitoff, (char *)uda + uoff,
00382 &stride, &nlen, &flen,
00383 #ifdef _CRAY
00384 craychr);
00385 #else
00386 (char *) uda + uoff, icount);
00387 #endif
00388 }
00389 else
00390 numerr = cvt_fun(&dctype, &icount, (void *)tp,
00391 &bitoff, (char *)uda + uoff,
00392 &stride,
00393 #ifdef _CRAY
00394 craychr);
00395 #else
00396 (char *) uda + uoff, icount);
00397 #endif
00398
00399 if (numerr != 0) {
00400 errno = (numerr < 0) ? FEINTUNK : FDC_ERR_NCVRT;
00401 return(IOERR);
00402 }
00403
00404
00405
00406 ret = XRCALL(cup->ufp.fdc, writertn) cup->ufp.fdc,
00407 CPTR2BP(tp), breq, &cup->uffsw,
00408 locmode, &locubc);
00409
00410 if (ret < 0) {
00411 errno = cup->uffsw.sw_error;
00412 return(IOERR);
00413 }
00414
00415 bits = bits + slice;
00416 uoff = uoff + (icount * elsize);
00417 }
00418
00419 if (mode == FULL)
00420 *status = EOR;
00421
00422 cup->urecpos = cup->urecpos + totbits;
00423
00424 break;
00425
00426 }
00427 #endif
00428
00429 case STD:
00430 {
00431
00432 fptr = cup->ufp.std;
00433
00434
00435
00436 #if !defined(_LITTLE_ENDIAN) || (defined(_LITTLE_ENDIAN) && defined(__sv2))
00437 if ((FILE_FLAG(fptr) & (_IOREAD | _IORW)) == (_IOREAD | _IORW) )
00438 (void) fseek(fptr, 0, SEEK_CUR);
00439 #endif
00440
00441
00442
00443 if (items == 0)
00444 return(EOR);
00445
00446
00447
00448 if (padbyts > 0) {
00449
00450 ret = fwrite(" ", 1, padbyts, fptr);
00451
00452 if (ret <= 0) {
00453 if (errno == 0)
00454 errno = FESTIOER;
00455 return(IOERR);
00456 }
00457
00458 cup->urecpos += (uint64)ret << 3;
00459 }
00460
00461
00462
00463
00464
00465
00466 ret = fwrite(uda, 1, breq, fptr);
00467
00468 if (ret != breq) {
00469 if (ret > 0 || errno == 0)
00470 errno = FESTIOER;
00471 return(IOERR);
00472 }
00473
00474 cup->urecpos += (uint64)ret << 3;
00475
00476 }
00477 break;
00478
00479 case FS_AUX:
00480 errno = FEMIXAUX;
00481 return (IOERR);
00482 default:
00483 errno = FEINTFST;
00484 return (IOERR);
00485 }
00486
00487
00488
00489 if (mode == FULL)
00490 cup->urecpos = 0;
00491
00492 return(items);
00493 }