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/wf.c 92.2 06/18/99 15:49:57"
00039
00040 #include <ctype.h>
00041 #include <errno.h>
00042 #include <liberrno.h>
00043 #include <fortran.h>
00044 #include <memory.h>
00045 #include <stdlib.h>
00046 #include <string.h>
00047 #include <unistd.h>
00048 #include <cray/fmtconv.h>
00049 #include <cray/format.h>
00050 #include <cray/nassert.h>
00051 #ifndef _ABSOFT
00052 #include <sys/unistd.h>
00053 #endif
00054 #include <cray/clibinc_config.h>
00055 #include "fio.h"
00056 #include "fmt.h"
00057 #include "fstats.h"
00058 #include "f90io.h"
00059 #include "lio.h"
00060 #ifdef _CRAYMPP
00061 #include <stdarg.h>
00062 #endif
00063
00064 #ifdef _UNICOS
00065
00066 #pragma _CRI duplicate $WFI as $WLI
00067 #pragma _CRI duplicate $WFA$ as $WLA$
00068 #pragma _CRI duplicate $WFA$ as $EFA$
00069 #pragma _CRI duplicate $WFF as $WLF
00070 #pragma _CRI duplicate $WFF as $EFF
00071
00072 #endif
00073
00074 #undef BLANK
00075 #define BLANK ((long) ' ')
00076 #undef ZERO
00077 #define ZERO ((long) '0')
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 short _newrec_listio_after_nonadvancing = 0;
00088
00089 #ifdef _UNICOS
00090
00091 int $WFF(void);
00092
00093 #define ERROR0(cond, n) { \
00094 if (!(cond)) \
00095 _ferr(css, n); \
00096 else \
00097 goto error; \
00098 }
00099
00100 #define ERROR1(cond, n, p) { \
00101 if (!(cond)) \
00102 _ferr(css, (n), p); \
00103 else \
00104 goto error; \
00105 }
00106
00107
00108 #define ARGS_6 (4 + 2*sizeof(_fcd)/sizeof(long))
00109 #define ARGS_7 (5 + 2*sizeof(_fcd)/sizeof(long))
00110 #define ARGS_8 (6 + 2*sizeof(_fcd)/sizeof(long))
00111 #define ARGS_9 (7 + 2*sizeof(_fcd)/sizeof(long))
00112
00113
00114
00115
00116 #define IS_PFORM_BROKEN (_numargs() < ARGS_9)
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148 #ifdef _CRAYMPP
00149 $WFI(
00150 _fcd funit,
00151 ...
00152 )
00153 #else
00154 int
00155 $WFI(
00156 _fcd funit,
00157 _fcd format,
00158 long *err,
00159 long *_arg4,
00160 _f_int *iostat,
00161 _f_int *rec,
00162 fmt_type **pform,
00163 long *inumelt,
00164 long *inumcfe
00165 )
00166 #endif
00167 {
00168 register int errf;
00169 register int errn;
00170 register int iost;
00171 register int iotp;
00172 register recn_t recn;
00173 register unum_t unum;
00174 fmt_type **prsfmt;
00175 unit *cup;
00176 FIOSPTR css;
00177 #ifdef _CRAYMPP
00178 va_list args;
00179 _fcd format;
00180 long *err;
00181 long *end;
00182 _f_int *iostat;
00183 _f_int *rec;
00184 fmt_type **pform;
00185 long *inumelt;
00186 long *inumcfe;
00187 #endif
00188
00189 GET_FIOS_PTR(css);
00190
00191
00192
00193 if (css->f_iostmt != 0)
00194 _ferr(css, FEIOACTV);
00195
00196 #ifdef _CRAYMPP
00197 va_start(args, funit);
00198 format = va_arg(args, _fcd);
00199 err = va_arg(args, long *);
00200 end = va_arg(args, long *);
00201 iostat = va_arg(args, _f_int *);
00202 rec = va_arg(args, _f_int *);
00203
00204 if (_numargs() > ARGS_6) {
00205 pform = va_arg(args, fmt_type **);
00206 if (_numargs() > ARGS_7) {
00207 inumelt = va_arg(args, long *);
00208 if (_numargs() > ARGS_8) {
00209 inumcfe = va_arg(args, long *);
00210 }
00211 }
00212 }
00213 va_end(args);
00214 #endif
00215
00216 errn = 0;
00217
00218
00219
00220 if (iostat != NULL)
00221 *iostat = 0;
00222
00223 errf = ((err != NULL) || (iostat != NULL));
00224
00225
00226
00227 iost = (_fcdtocp(format) != NULL) ? T_WSF : T_WLIST;
00228 iotp = SEQ;
00229
00230
00231
00232 if (_fcdlen(funit)) {
00233 iotp = INT;
00234 STMT_BEGIN(-1, 1, iost, NULL, css, cup);
00235 }
00236 else {
00237 unum = **(_f_int **) &funit;
00238
00239 if (rec != NULL) {
00240 iost = T_WDF;
00241 iotp = DIR;
00242 recn = *rec;
00243 }
00244
00245 STMT_BEGIN(unum, 0, iost, NULL, css, cup);
00246
00247 if (cup == NULL) {
00248 int stat;
00249
00250 cup = _imp_open77(css, iotp, FMT, unum, errf, &stat);
00251
00252
00253
00254
00255
00256
00257 if (cup == NULL) {
00258 errn = stat;
00259 goto error;
00260 }
00261 }
00262 }
00263
00264
00265
00266 assert (cup != NULL);
00267
00268
00269
00270 cup->uflag = (iostat != NULL ? _UIOSTF : 0) |
00271 ( err != NULL ? _UERRF : 0);
00272 cup->uiostat = iostat;
00273
00274 if (iotp != INT) {
00275
00276
00277
00278 if ((cup->uaction & OS_WRITE) == 0) {
00279 errn = FENOWRIT;
00280 ERROR0(errf, errn);
00281 }
00282
00283
00284
00285 if (!cup->ufmt) {
00286 errn = FEFMTTIV;
00287 ERROR0(errf, errn);
00288 }
00289 }
00290
00291
00292
00293 css->u.fmt.icp = NULL;
00294 css->u.fmt.nonl = 0;
00295 css->u.fmt.freepfmt = 0;
00296
00297
00298 if (_fcdtocp(format) != NULL) {
00299 char *fptr;
00300 int flen;
00301 int fnum;
00302 int stsz;
00303
00304
00305
00306
00307 css->u.fmt.u.fe.fmtbuf = NULL;
00308 css->u.fmt.u.fe.fmtnum = 0;
00309 css->u.fmt.u.fe.fmtcol = 0;
00310 css->u.fmt.u.fe.scale = 0;
00311 css->u.fmt.cplus = 0;
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335 if (_fcdlen(format) == 0) {
00336 fptr = *(char **) &format;
00337 flen = strlen(fptr);
00338 }
00339 else {
00340 register int repl;
00341
00342 if (_numargs() > ARGS_8 && inumcfe != NULL)
00343 repl = *inumcfe;
00344 else
00345 repl = -1;
00346
00347 fptr = _fcdtocp(format);
00348 flen = (repl >= 0) ? repl * _fcdlen(format) :
00349 strlen(fptr);
00350 }
00351
00352
00353
00354
00355
00356
00357
00358
00359 if (_numargs() > ARGS_6) {
00360 prsfmt = pform;
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370 if (IS_PFORM_BROKEN && pform != NULL) {
00371
00372 if (*(long*)pform == -1)
00373
00374 prsfmt = NULL;
00375 else
00376
00377 prsfmt = (fmt_type**)&pform;
00378 }
00379 }
00380 else
00381 prsfmt = NULL;
00382
00383
00384
00385
00386
00387
00388
00389
00390 fnum = 0;
00391
00392 while (isdigit(*fptr) && flen-- > 0)
00393 fnum = (fnum * 10) + ((int) *fptr++ - ZERO);
00394
00395 css->u.fmt.u.fe.fmtbuf = fptr;
00396 css->u.fmt.u.fe.fmtlen = flen;
00397 css->u.fmt.u.fe.fmtnum = fnum;
00398
00399
00400
00401
00402
00403
00404
00405 if (prsfmt == NULL || *prsfmt == NULL ||
00406 (**prsfmt).offset != PARSER_LEVEL) {
00407
00408 errn = _parse(css, cup, prsfmt);
00409
00410 if (errn != 0) {
00411 ERROR0(errf, errn);
00412 }
00413 }
00414 else
00415 css->u.fmt.u.fe.pfmt = *prsfmt;
00416
00417
00418
00419
00420
00421
00422
00423 stsz = (*css->u.fmt.u.fe.pfmt).rep_count;
00424
00425 if (stsz > cup->upfcstsz) {
00426
00427 cup->upfcstsz = stsz;
00428
00429 if (cup->upfcstk != NULL)
00430 free(cup->upfcstk);
00431
00432 cup->upfcstk = (int *) malloc(sizeof(int) * stsz);
00433
00434 if (cup->upfcstk == NULL) {
00435 errn = FENOMEMY;
00436 ERROR0(errf, errn);
00437 }
00438 }
00439
00440 css->u.fmt.u.fe.pftocs = cup->upfcstk;
00441
00442
00443
00444 css->u.fmt.u.fe.pfcp = css->u.fmt.u.fe.pfmt + 1;
00445
00446
00447
00448 *css->u.fmt.u.fe.pftocs = css->u.fmt.u.fe.pfcp->rep_count;
00449 }
00450 else
00451 css->u.fmt.u.le.ldwinit = 1;
00452
00453
00454
00455 if (iotp == DIR) {
00456
00457 if (cup->useq)
00458 errn = FEDIRTIV;
00459 else
00460 errn = _unit_seek(cup, recn, iost);
00461
00462 if (errn != 0) {
00463 ERROR1(errf, errn, recn);
00464 }
00465
00466 cup->uend = BEFORE_ENDFILE;
00467 cup->ulinecnt = 0;
00468 cup->ulinemax = 0;
00469 cup->ulineptr = cup->ulinebuf;
00470 css->u.fmt.endrec = _dw_endrec;
00471 }
00472 else {
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482 if (iotp == INT) {
00483
00484 cup->ulinecnt = 0;
00485 cup->ulinemax = 0;
00486
00487 css->u.fmt.iiae =
00488 ((_numargs() > ARGS_7) && (inumelt != NULL)) ?
00489 *inumelt : -1;
00490 css->u.fmt.endrec = _iw_endrec;
00491 css->u.fmt.icp = _fcdtocp(funit);
00492 css->u.fmt.icl = _fcdlen (funit);
00493
00494
00495
00496
00497
00498
00499
00500 if (css->u.fmt.icl > cup->urecsize) {
00501
00502 cup->ulinebuf = (long *) realloc(cup->ulinebuf,
00503 sizeof(long) *
00504 (css->u.fmt.icl + 1));
00505
00506 if (cup->ulinebuf == NULL) {
00507 errn = FENOMEMY;
00508 ERROR0(errf, errn);
00509 }
00510 }
00511
00512 cup->urecsize = css->u.fmt.icl;
00513 cup->ulineptr = cup->ulinebuf;
00514 }
00515 else {
00516
00517 if (cup->useq == 0) {
00518 errn = FESEQTIV;
00519 ERROR0(errf, errn);
00520 }
00521
00522 if (cup->uend != BEFORE_ENDFILE) {
00523
00524
00525
00526
00527
00528 if (!cup->umultfil && !cup->uspcproc) {
00529 errn = FEWRAFEN;
00530 ERROR0(errf, errn);
00531 }
00532
00533
00534
00535
00536
00537
00538
00539 if ((cup->uend == LOGICAL_ENDFILE) &&
00540 !(cup->uspcproc)) {
00541 struct ffsw fst;
00542
00543 if (XRCALL(cup->ufp.fdc, weofrtn)
00544 cup->ufp.fdc, &fst) < 0) {
00545
00546 errn = fst.sw_error;
00547
00548 ERROR0(errf, errn);
00549 }
00550 }
00551 cup->uend = BEFORE_ENDFILE;
00552 }
00553
00554 if (cup->pnonadv && cup->uwrt == 0) {
00555 register int offset;
00556
00557
00558
00559
00560
00561
00562
00563
00564 offset = cup->ulineptr - cup->ulinebuf;
00565 cup->ulinemax = offset + cup->ulinecnt;
00566 cup->ulinecnt = offset;
00567 cup->uflshptr = cup->ulinebuf;
00568
00569 errn = _unit_bksp(cup);
00570
00571 if (errn != 0) {
00572 ERROR0(errf, errn);
00573 }
00574 }
00575 else if (cup->pnonadv == 0) {
00576
00577
00578
00579
00580
00581 cup->ulinecnt = 0;
00582 cup->ulinemax = 0;
00583 cup->ulineptr = cup->ulinebuf;
00584 cup->uflshptr = cup->ulinebuf;
00585 }
00586
00587
00588
00589
00590
00591
00592
00593 if (cup->pnonadv && (css->f_iostmt & TF_FMT) == 0) {
00594 errn = _lw_after_nonadv(css, cup,
00595 cup->uldwsize, 0);
00596 if (errn != 0)
00597 goto error;
00598 }
00599
00600 css->u.fmt.endrec = _sw_endrec;
00601 cup->pnonadv = 0;
00602 }
00603 }
00604
00605 css->u.fmt.leftablim = cup->ulineptr;
00606 cup->uwrt = 1;
00607
00608
00609
00610 return(CFT77_RETVAL(IO_OKAY));
00611
00612 error:
00613
00614
00615 if (iostat != NULL)
00616 *iostat = errn;
00617
00618 if (cup != NULL)
00619 cup->uflag = cup->uflag | _UERRC;
00620
00621
00622
00623 return(CFT77_RETVAL($WFF()));
00624 }
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642 int
00643 $WFA$(
00644 _fcd fwa,
00645 long *cnt,
00646 long *inc,
00647 long *typ
00648 )
00649 {
00650 register int errn;
00651 type_packet tip;
00652 unit *cup;
00653 void *vaddr;
00654 xfer_func *xfunc;
00655 FIOSPTR css;
00656
00657
00658
00659 GET_FIOS_PTR(css);
00660
00661 cup = css->f_cu;
00662 tip.type77 = *typ & 017;
00663 tip.type90 = _f77_to_f90_type_cnvt[tip.type77];
00664 tip.count = *cnt;
00665 tip.stride = *inc;
00666 tip.intlen = _f77_type_len[tip.type77];
00667 tip.extlen = tip.intlen;
00668 tip.elsize = tip.intlen;
00669 tip.cnvindx = 0;
00670
00671 if (tip.type77 == DT_CHAR) {
00672 vaddr = _fcdtocp(fwa);
00673 tip.elsize = tip.elsize * _fcdlen (fwa);
00674 }
00675 else
00676 vaddr = *(void **) &fwa;
00677
00678 xfunc = (css->f_iostmt & TF_FMT) ? _wrfmt : _ld_write;
00679 errn = xfunc(css, cup, vaddr, &tip, 0);
00680
00681 if (errn == 0)
00682 return(CFT77_RETVAL(IO_OKAY));
00683
00684
00685
00686 if (cup->uiostat != NULL)
00687 *(cup->uiostat) = errn;
00688
00689 cup->uflag = cup->uflag | _UERRC;
00690
00691
00692
00693 return(CFT77_RETVAL($WFF()));
00694 }
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706 int
00707 $WFF(void)
00708 {
00709 register int errn;
00710 register long flag;
00711 unit *cup;
00712 FIOSPTR css;
00713
00714
00715
00716 GET_FIOS_PTR(css);
00717 cup = css->f_cu;
00718
00719 if (cup == NULL)
00720 flag = _UERRC | _UERRF;
00721 else {
00722
00723
00724
00725 if ((cup->uflag & _UERRC) == 0) {
00726 xfer_func *xfunc;
00727
00728
00729
00730 xfunc = (css->f_iostmt & TF_FMT) ? _wrfmt : _ld_write;
00731
00732 errn = xfunc(css, cup, (void *) NULL, &__tip_null, 0);
00733
00734
00735
00736 if (errn == 0)
00737 errn = (*css->u.fmt.endrec)(css, cup, 1);
00738
00739 if (errn != 0) {
00740
00741
00742
00743 if (cup->uiostat != NULL)
00744 *(cup->uiostat) = errn;
00745
00746
00747
00748 cup->uflag = cup->uflag | _UERRC;
00749 }
00750 }
00751
00752
00753
00754 if (css->u.fmt.freepfmt && css->u.fmt.u.fe.pfmt != NULL)
00755 free(css->u.fmt.u.fe.pfmt);
00756
00757 flag = cup->uflag;
00758 }
00759
00760 STMT_END(cup, TF_WRITE, NULL, css);
00761
00762
00763
00764 if ((flag & _UERRC) == 0)
00765 return(CFT77_RETVAL(IO_OKAY));
00766 else
00767 if ((flag & (_UIOSTF | _UERRF)) != 0)
00768 return(CFT77_RETVAL(IO_ERR));
00769
00770 _ferr(css, FEINTUNK);
00771 }
00772
00773 #endif
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792 int
00793 _dw_endrec(FIOSPTR css, unit *cup, int count)
00794 {
00795 assert ( css != NULL );
00796 assert ( cup != NULL );
00797 assert ( count > 0 );
00798
00799
00800
00801 if (cup->ulinemax < cup->urecl) {
00802 register int i, j;
00803 long *ptr;
00804
00805 j = cup->urecl - cup->ulinemax;
00806 ptr = cup->ulinebuf + cup->ulinemax;
00807
00808
00809
00810 for (i = 0; i < j; i++)
00811 ptr[i] = BLANK;
00812 }
00813
00814 if (_fwch(cup, cup->ulinebuf, cup->urecl, FULL) < 0)
00815 RERROR(errno);
00816
00817 if (count > 1) {
00818 register int i;
00819
00820 if (cup->ulinemax > 0) {
00821 long *ptr;
00822
00823 ptr = cup->ulinebuf;
00824
00825
00826
00827 for (i = 0; i <= cup->ulinemax; i++)
00828 ptr[i] = BLANK;
00829 }
00830
00831 for (i = 1; i < count; i++)
00832 if (_fwch(cup, cup->ulinebuf, cup->urecl, FULL) < 0)
00833 RERROR(errno);
00834 }
00835
00836 cup->udalast = cup->udalast + count;
00837
00838
00839
00840 if (cup->udalast > cup->udamax)
00841 cup->udamax = cup->udalast;
00842
00843 cup->ulinecnt = 0;
00844 cup->ulinemax = 0;
00845 cup->ulineptr = cup->ulinebuf;
00846 css->u.fmt.leftablim = cup->ulinebuf;
00847
00848 return(0);
00849 }
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865 int
00866 _iw_endrec(FIOSPTR css, unit *cup, int count)
00867 {
00868 register int reclen;
00869
00870 assert ( css != NULL );
00871 assert ( cup != NULL );
00872 assert ( count > 0 );
00873
00874 reclen = cup->ulinemax;
00875
00876
00877
00878 if (css->u.fmt.iiae-- == 0)
00879 RERROR(FEWRIEND);
00880
00881 (void) _pack(cup->ulinebuf, css->u.fmt.icp, reclen, -1);
00882
00883 if (reclen < css->u.fmt.icl)
00884 (void) memset(css->u.fmt.icp + reclen, BLANK,
00885 css->u.fmt.icl - reclen);
00886
00887 if (count > 1) {
00888 register int i;
00889
00890 i = count - 1;
00891
00892 if (css->u.fmt.iiae < 0 || css->u.fmt.iiae > i) {
00893 css->u.fmt.iiae = css->u.fmt.iiae - i;
00894 (void) memset(css->u.fmt.icp + css->u.fmt.icl, BLANK,
00895 css->u.fmt.icl * i);
00896 css->u.fmt.icp = css->u.fmt.icp + (css->u.fmt.icl * i);
00897 }
00898 else
00899 for (i = 1; i < count; i++) {
00900
00901 if (css->u.fmt.iiae-- == 0)
00902 RERROR(FEWRIEND);
00903
00904 css->u.fmt.icp = css->u.fmt.icp + css->u.fmt.icl;
00905
00906 (void) memset(css->u.fmt.icp, BLANK,
00907 css->u.fmt.icl);
00908 }
00909 }
00910
00911 cup->ulinecnt = 0;
00912 cup->ulinemax = 0;
00913 cup->ulineptr = cup->ulinebuf;
00914 css->u.fmt.leftablim = cup->ulinebuf;
00915 css->u.fmt.icp = css->u.fmt.icp + css->u.fmt.icl;
00916
00917 return(0);
00918 }
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936 int
00937 _sw_endrec(FIOSPTR css, unit *cup, int count)
00938 {
00939 register long mode;
00940 register long nchars;
00941
00942 assert ( css != NULL );
00943 assert ( cup != NULL );
00944 assert ( count > 0 );
00945
00946 mode = css->u.fmt.nonl ? PARTIAL : FULL;
00947 nchars = cup->ulinemax - (cup->uflshptr - cup->ulinebuf);
00948
00949 if (_fwch(cup, cup->uflshptr, nchars, mode) < 0)
00950 RERROR(errno);
00951
00952 if (count > 1) {
00953 register int i;
00954
00955 for (i = 1; i < count; i++)
00956 if (_fwch(cup, cup->ulinebuf, 0, FULL) < 0)
00957 RERROR(errno);
00958 }
00959
00960 cup->ulinecnt = 0;
00961 cup->ulinemax = 0;
00962 cup->ulineptr = cup->ulinebuf;
00963 cup->uflshptr = cup->ulinebuf;
00964 css->u.fmt.leftablim = cup->ulineptr;
00965 css->u.fmt.nonl = 0;
00966
00967 return(0);
00968 }
00969
00970
00971
00972
00973
00974
00975
00976
00977
00978
00979
00980
00981
00982
00983
00984
00985
00986
00987
00988 int
00989 _nonadv_partrec(FIOSPTR css, unit *cup)
00990 {
00991 register int nchars;
00992 register int offset;
00993
00994 assert ( css != NULL );
00995 assert ( cup != NULL );
00996
00997 offset = cup->ulineptr - cup->ulinebuf;
00998
00999 if (cup->ulinemax < offset) {
01000 register int i;
01001 register int padcnt;
01002 long *lbuff;
01003
01004
01005
01006
01007
01008
01009 lbuff = cup->ulinebuf + cup->ulinemax;
01010 nchars = MIN(cup->ulinemax, cup->urecsize) -
01011 (cup->uflshptr - cup->ulinebuf);
01012 padcnt = MIN(offset, cup->urecsize) - cup->ulinemax;
01013
01014 for (i = 0; i < padcnt; i++)
01015 lbuff[i] = BLANK;
01016 }
01017 else
01018 nchars = cup->ulineptr - cup->uflshptr;
01019
01020 if (_fwch(cup, cup->uflshptr, nchars, PARTIAL) < 0)
01021 RERROR(errno);
01022
01023 cup->uflshptr = cup->uflshptr + nchars;
01024
01025 return(0);
01026 }
01027
01028
01029
01030
01031
01032
01033
01034
01035
01036
01037
01038
01039
01040
01041
01042
01043
01044 int
01045 _nonadv_endrec(FIOSPTR css, unit *cup)
01046 {
01047 register long nchars;
01048
01049 assert ( css != NULL );
01050 assert ( cup != NULL );
01051
01052 nchars = cup->ulinemax - (cup->uflshptr - cup->ulinebuf);
01053
01054 if (_fwch(cup, cup->uflshptr, nchars, FULL) < 0)
01055 RERROR(errno);
01056
01057 cup->pnonadv = 0;
01058
01059 return(0);
01060 }
01061
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075 int
01076 _lw_after_nonadv(FIOSPTR css, unit *cup, int linelimit, int namelist)
01077 {
01078 register int errn;
01079
01080 assert ( css != NULL );
01081 assert ( cup != NULL );
01082
01083 if (_newrec_listio_after_nonadvancing && !namelist)
01084 errn = _sw_endrec(css, cup, 1);
01085 else {
01086 register int nchars;
01087
01088 nchars = cup->ulineptr - cup->ulinebuf;
01089
01090 if (nchars > cup->urecsize)
01091 errn = FEWRLONG;
01092 else {
01093 if (nchars > cup->ulinemax) {
01094 register int i;
01095 register int lmax;
01096 register int nblanks;
01097
01098 nblanks = nchars - cup->ulinemax;
01099 lmax = cup->ulinemax;
01100
01101 for (i = 0; i < nblanks; i++)
01102 cup->ulinebuf[lmax + i] = BLANK;
01103
01104 }
01105
01106 cup->ulinemax = nchars;
01107 errn = 0;
01108
01109 if (cup->ulinemax > linelimit)
01110 errn = _sw_endrec(css, cup, 1);
01111 }
01112 }
01113
01114 return (errn);
01115 }
01116
01117
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127
01128
01129
01130
01131
01132
01133
01134
01135
01136
01137
01138
01139
01140 void
01141 _wf_setup(void)
01142 {
01143 register short i;
01144 register signed char d4, d8, d16;
01145 char *str;
01146
01147
01148
01149
01150
01151 _newrec_listio_after_nonadvancing = (_CRAYLIBS_RELEASE < 2000) ? 1 : 0;
01152
01153 str = getenv("LISTIO_AFTER_NONADVANCING");
01154
01155 if (str != NULL) {
01156 if (strcmp(str, "NEWREC") == 0)
01157 _newrec_listio_after_nonadvancing = 1;
01158 else if (strcmp(str, "CURPOS") == 0)
01159 _newrec_listio_after_nonadvancing = 0;
01160 }
01161
01162
01163
01164
01165
01166
01167
01168
01169
01170 #ifdef _F_REAL4
01171 d4 = DREAL4;
01172 #else
01173 d4 = -1;
01174 #endif
01175 d8 = DREAL8;
01176 d16 = DREAL16;
01177
01178 str = getenv("ZERO_WIDTH_PRECISION");
01179
01180 if (str != NULL) {
01181 if (strcmp(str, "PRECISION") == 0) {
01182 #ifdef _F_REAL4
01183 d4 = DREAL4_P;
01184 #endif
01185 d8 = DREAL8_P;
01186 d16 = DREAL16_P;
01187 }
01188 else if (strcmp(str, "HALF") == 0) {
01189 #ifdef _F_REAL4
01190 d4 = (d4 + 1) >> 1;
01191 #endif
01192 d8 = (d8 + 1) >> 1;
01193 d16 = (d16 + 1) >> 1;
01194 }
01195 }
01196
01197 for (i = D_ED; i <= G_ED; i++) {
01198 _rw_mxdgt[i-1][4-1] = d4;
01199 _rw_mxdgt[i-1][8-1] = d8;
01200 _rw_mxdgt[i-1][16-1] = d16;
01201 }
01202
01203
01204
01205
01206
01207
01208
01209 str = getenv("FORMAT_TYPE_CHECKING");
01210
01211 if (str != NULL) {
01212 register int sz;
01213
01214 sz = sizeof(fmtchk_t) * DVTYPE_ASCII;
01215
01216 if (strcmp(str, "RELAXED") == 0) {
01217 (void) memcpy( (void *) _RCHK, (void *)_RNOCHK, sz);
01218 (void) memcpy( (void *) _WCHK, (void *)_WNOCHK, sz);
01219 }
01220 else if (strcmp(str, "STRICT77") == 0) {
01221 (void) memcpy( (void *) _RCHK, (void *)_RCHK77, sz);
01222 (void) memcpy( (void *) _WCHK, (void *)_WCHK77, sz);
01223 }
01224 else if (strcmp(str, "STRICT90") == 0 ||
01225 strcmp(str, "STRICT95") == 0) {
01226 (void) memcpy( (void *) _RCHK, (void *)_RCHK90, sz);
01227 (void) memcpy( (void *) _WCHK, (void *)_WCHK90, sz);
01228 }
01229 }
01230
01231 return;
01232 }