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 #ifndef _FIO_H
00040 #define _FIO_H
00041
00042 #include "fstats.h"
00043 #include <errno.h>
00044 #include <ffio.h>
00045 #include <fortran.h>
00046 #ifdef _UNICOS
00047 #include <procstat.h>
00048 #endif
00049 #include <stdio.h>
00050 #include <sys/types.h>
00051 #if defined(_UNICOS) || defined(_SOLARIS)
00052 #include <sys/iosw.h>
00053 #endif
00054 #include <cray/assign.h>
00055 #include <cray/fndc.h>
00056 #include <cray/format.h>
00057 #include <cray/fortio.h>
00058 #include <cray/mtlock.h>
00059 #include <cray/dopevec.h>
00060 #include <cray/nassert.h>
00061 #include <cray/portdefs.h>
00062 #ifdef _CRAYMPP
00063 #include <signal.h>
00064 #endif
00065
00066
00067
00068
00069
00070
00071
00072 #ifdef LIBDEBUG
00073 #define _ASSERT_ON 1
00074 #define DEBUG_MTIO 1
00075 #endif
00076
00077 #define PRINT_TIP(tipa) { \
00078 fprintf(stderr, "tip address = %o\n", tipa); \
00079 fprintf(stderr, " type90 = %d\n", (tipa)->type90); \
00080 fprintf(stderr, " type77 = %d\n", (tipa)->type77); \
00081 fprintf(stderr, " intlen = %d\n", (tipa)->intlen); \
00082 fprintf(stderr, " extlen = %d\n", (tipa)->extlen); \
00083 fprintf(stderr, " cnvindx = %d\n", (tipa)->cnvindx); \
00084 fprintf(stderr, " count = %ld\n", (tipa)->count); \
00085 fprintf(stderr, " stride = %ld\n", (tipa)->stride); \
00086 fprintf(stderr, " elsize = %d\n", (tipa)->elsize); \
00087 if ((tipa)->cnvindx) { \
00088 fprintf(stderr, " newfunc = %d\n", (tipa)->newfunc);\
00089 fprintf(stderr, " cnvtype = %d\n", (tipa)->cnvtype);\
00090 fprintf(stderr, " cnvfunc = %o\n", (tipa)->cnvfunc);\
00091 } \
00092 }
00093
00094
00095
00096
00097
00098
00099
00100 #define HASH_SIZE 256
00101
00102 #define STDIN_U 100
00103 #define STDOUT_U 101
00104 #define STDERR_U 102
00105
00106 #define RECMAX 1024
00107 #define RECMAXLDO 133
00108
00109 #define ERROR 1
00110 #define OK 0
00111 #define YES 1
00112 #define NO 0
00113
00114 #define WRITE 1
00115 #define READ 2
00116 #define SEQ 3
00117 #define DIR 4
00118 #define FMT 5
00119 #define UNF 6
00120 #define EXT 7
00121 #define INT 8
00122
00123
00124
00125
00126
00127
00128 #define TF_WRITE 001
00129 #define TF_READ 002
00130 #define TF_POS 004
00131 #define TF_FMT 010
00132
00133
00134
00135 #define T_WSF (00100 | TF_WRITE | TF_POS | TF_FMT )
00136 #define T_WSU (00200 | TF_WRITE | TF_POS )
00137 #define T_WDF (00300 | TF_WRITE | TF_POS | TF_FMT )
00138 #define T_WDU (00400 | TF_WRITE | TF_POS )
00139 #define T_WLIST (00500 | TF_WRITE | TF_POS )
00140 #define T_WNL (00600 | TF_WRITE | TF_POS )
00141
00142 #define T_RSF (00700 | TF_READ | TF_POS | TF_FMT )
00143 #define T_RSU (01100 | TF_READ | TF_POS )
00144 #define T_RDF (01200 | TF_READ | TF_POS | TF_FMT )
00145 #define T_RDU (01300 | TF_READ | TF_POS )
00146 #define T_RLIST (01400 | TF_READ | TF_POS )
00147 #define T_RNL (01500 | TF_READ | TF_POS )
00148
00149 #define T_BUFOUT (01600 | TF_POS )
00150 #define T_BUFIN (01700 | TF_POS )
00151
00152 #define T_OPEN (02000 )
00153 #define T_REWIND (02100 | TF_POS )
00154 #define T_BACKSPACE (02200 | TF_POS )
00155 #define T_ENDFILE (02300 | TF_POS )
00156 #define T_CLOSE (02400 )
00157 #define T_INQF (02500 )
00158 #define T_INQU (02600 )
00159
00160 #define T_MISC (02700 | TF_POS )
00161
00162 #define T_GETPOS (03000 )
00163 #define T_SETPOS (03100 | TF_POS )
00164 #define T_LENGTH (03200 )
00165 #define T_UNIT (03300 )
00166 #define T_TAPE (03400 | TF_POS )
00167 #define T_FLUSH (03500 )
00168 #define T_NUMBLKS (03600 )
00169
00170
00171
00172
00173
00174 #define DT_NONE 0
00175 #define DT_INT 1
00176 #define DT_REAL 2
00177 #define DT_DBLE 3
00178 #define DT_CMPLX 4
00179 #define DT_LOG 5
00180 #define DT_CHAR 6
00181 #define DT_SINT 7
00182 #define DT_DBLCOM 8
00183
00184 #define DT_MAX 9
00185
00186
00187
00188
00189
00190 #define BLKSIZE 4096
00191 #define SECTOR BLKSIZE
00192 #ifdef _UNICOS
00193 #define DEF_BIN_BS _VALUE(_def_bin_bs)
00194 #define DEF_SBIN_BS _VALUE(_def_sbin_bs)
00195 #else
00196 #define DEF_BIN_BS 1
00197 #define DEF_SBIN_BS 1
00198 #endif
00199
00200 #ifdef _CRAYMPP
00201
00202 #define DEF_BINSIM_BS 1
00203 #define DEF_SBINSIM_BS 1
00204 #endif
00205
00206 #define DFBUFSZ 8
00207 #define SFBUFSZ 8
00208 #if defined(__mips) || defined(_LITTLE_ENDIAN)
00209
00210
00211 #define DUBUFSZ 16
00212 #else
00213 #define DUBUFSZ 8
00214 #endif
00215 #define SUBUFSZ 48
00216
00217 #define DEFAULT_NBUF 4
00218
00219
00220
00221 #ifdef _MAXVL
00222 #define TBUFSZW _MAXVL
00223 #else
00224 #define TBUFSZW 36
00225 #endif
00226
00227 #define TBUFSZB (TBUFSZW * sizeof(long))
00228
00229 #define CHBUFSIZE (1024 * sizeof(long))
00230
00231
00232
00233
00234
00235 #define IO_OKAY 0
00236 #define IO_ERR 1
00237 #define IO_END 2
00238
00239
00240
00241
00242
00243 #define CNT 1
00244 #define EOR 0
00245 #ifndef EOF
00246 #define EOF -1
00247 #endif
00248 #define EOD -2
00249
00250 #define IOERR -1
00251
00252
00253
00254
00255
00256 #define PARTIAL 0
00257 #define FULL 1
00258
00259
00260
00261
00262
00263 enum status_spec { OS_UNKNOWN = 1, OS_OLD, OS_NEW, OS_SCRATCH,
00264 OS_REPLACE };
00265 #if defined(__mips) || defined(_LITTLE_ENDIAN)
00266 enum access_spec { OS_SEQUENTIAL = 1, OS_DIRECT, OS_OAPPEND, OS_KEYED };
00267 #else
00268 enum access_spec { OS_SEQUENTIAL = 1, OS_DIRECT };
00269 #endif
00270 enum form_spec { OS_FORMATTED = 1, OS_UNFORMATTED, OS_BINARY, OS_SYSTEM };
00271 enum blank_spec { OS_NULL = 1, OS_ZERO };
00272 enum position_spec { OS_REWIND = 1, OS_ASIS, OS_APPEND };
00273 enum action_spec { OS_ACTION_UNSPECIFIED = 0, OS_READ = 1, OS_WRITE = 2,
00274 OS_READWRITE = (OS_READ | OS_WRITE) };
00275 enum delim_spec { OS_NONE = 1, OS_QUOTE, OS_APOSTROPHE };
00276 enum pad_spec { OS_NO = 1, OS_YES };
00277
00278
00279
00280
00281
00282 #define CLST_UNSPEC 0
00283 #define CLST_KEEP 1
00284 #define CLST_DELETE 2
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296 #define _UERRF 01
00297 #define _UEORF 02
00298 #define _UENDF 04
00299 #define _UIOSTF 010
00300
00301 #define _UERRC 020
00302 #define _UEORC 040
00303 #define _UENDC 0100
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331 #ifndef _CRAYT3D
00332
00333 #define CVOLATILE volatile
00334
00335 #else
00336
00337 #define CVOLATILE
00338
00339 #endif
00340
00341
00342
00343
00344
00345
00346
00347 typedef short s_flag;
00348 typedef long ftnlen;
00349 typedef _f_comp8 _gen_complex;
00350
00351
00352
00353 typedef union {
00354 FILE *std;
00355 struct fdinfo *fdc;
00356 } FP;
00357
00358
00359
00360
00361
00362 #if defined(__mips) || defined(_LITTLE_ENDIAN)
00363 typedef _f_int1 bcont;
00364 #elif !defined(_WORD32) && (defined(_F_INT4) || defined(_F_REAL4))
00365 typedef short bcont;
00366 #else
00367 typedef long bcont;
00368 #endif
00369
00370
00371
00372
00373
00374
00375
00376
00377 #define UNIT_HEADER (offsetof(unit, auxlockp))
00378
00379 typedef struct unit_s {
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398 struct unit_s * CVOLATILE hashlink;
00399 CVOLATILE unum_t uid;
00400
00401 CVOLATILE int private;
00402 CVOLATILE int utid;
00403 plock_t uiolock;
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413 plock_t *auxlockp;
00414 int ufs;
00415 char *ufnm;
00416 ino_t uinode;
00417 dev_t udevice;
00418 char *alfnm;
00419 long urecl;
00420 int usysfd;
00421
00422
00423 long uflagword;
00424 int ucharset;
00425 int unumcvrt;
00426 int ualignmask;
00427 struct _dal_s ualign;
00428
00429 unsigned
00430 uostatus:3,
00431 uposition:3,
00432 uaction :3,
00433 udelim :3,
00434 upad :3,
00435 utrunc :1,
00436 ubmx :1,
00437 usysread:1,
00438 usyswrite:1,
00439 useek :1,
00440 ublkd :1,
00441 ublnk :1,
00442 ufmt :1,
00443 useq :1,
00444 uscrtch :1,
00445 unlinked:1,
00446 usnglink:1,
00447 umultfil:1,
00448 uft90 :1,
00449 umultup :1,
00450 utmpfil :1,
00451 ok_wr_seq_fmt:1,
00452 ok_wr_seq_unf:1,
00453 ok_wr_dir_fmt:1,
00454 ok_wr_dir_unf:1,
00455 ok_rd_seq_fmt:1,
00456 ok_rd_seq_unf:1,
00457 ok_rd_dir_fmt:1,
00458 ok_rd_dir_unf:1,
00459 ufcompat:3,
00460 ufcomsep:1,
00461 ufunilist:1,
00462 ufcomplen:1,
00463 ufrptcnt:1,
00464 ufnl_skip:1,
00465 ufnegzero:1,
00466 ukeyed :1,
00467 ubinary :1,
00468 usystem :1;
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479 FP ufp;
00480
00481 struct repdata *urepdata;
00482
00483 int upfcstsz;
00484 int *upfcstk;
00485
00486 unsigned
00487 unitchk :1,
00488 urecmode:1,
00489 uerr :1,
00490 uwrt :1,
00491 pnonadv :1,
00492 uspcproc:1;
00493
00494
00495
00496
00497
00498
00499
00500
00501 enum {
00502 BEFORE_ENDFILE = 0,
00503 PHYSICAL_ENDFILE = 1,
00504 LOGICAL_ENDFILE = 2
00505 } uend :3;
00506
00507
00508
00509
00510
00511
00512 long uwaddr;
00513
00514 int64 ulrecl;
00515
00516
00517 enum {
00518 ASYNC_NOTOK = 0,
00519 ASYNC_OK = 1,
00520 ASYNC_ACTIVE = 2
00521 } uasync;
00522
00523 struct ffsw uffsw;
00524
00525 union stat_ntry *ftstat;
00526
00527 long ufbitpos;
00528
00529
00530
00531 recn_t udamax;
00532 recn_t udalast;
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573 long *ulinebuf;
00574 long *ulineptr;
00575 long *uflshptr;
00576 long ulinemax;
00577 long ulinecnt;
00578 long urecsize;
00579 long uldwsize;
00580 long unmlsize;
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590 _f_int *uiostat;
00591 long uflag;
00592 unsigned
00593 ueor_found:1,
00594 f_lastwritten:1;
00595
00596
00597
00598 void *f_lastiolist;
00599
00600
00601
00602
00603
00604
00605
00606 int64 urecpos;
00607 int ulastyp;
00608
00609 } unit;
00610
00611
00612
00613
00614
00615
00616
00617 typedef CVOLATILE struct {
00618 unit *ulist;
00619 } unit_htable;
00620
00621
00622
00623
00624
00625 struct fiostate {
00626 unit *f_cu;
00627 long f_iostmt;
00628 unum_t f_curun;
00629 s_flag f_intflg;
00630 long f_rtbgn;
00631 unsigned f_shrdput:1;
00632
00633
00634 union iostate {
00635
00636
00637
00638 struct unfstate {
00639 int recpos;
00640 int lastyp;
00641 } unf;
00642
00643
00644
00645
00646 struct fmtstate {
00647 int (*endrec)(
00648 struct fiostate *css,
00649 unit *cup,
00650 int count);
00651
00652
00653 long *leftablim;
00654 char *icp;
00655 char *tempicp;
00656 int icl;
00657 int iiae;
00658
00659
00660
00661 unsigned
00662 freefmtbuf:1,
00663 freepfmt:1,
00664 lcomma :1,
00665 blank0 :1,
00666 cplus :1,
00667 nonl :1,
00668 nonadv :1,
00669 slash :1;
00670
00671 union {
00672
00673 struct {
00674 char *fmtbuf;
00675 int fmtcol;
00676 int fmtlen;
00677 int fmtnum;
00678 fmt_type *pfmt;
00679 fmt_type *pfcp;
00680 int *pftocs;
00681
00682 int charcnt;
00683 long scale;
00684 } fe;
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698 struct {
00699 union {
00700 long value[4];
00701 void *copy;
00702 } u;
00703 int repcnt;
00704 int elsize;
00705 ftype_t type :8;
00706 unsigned ndchar :1;
00707 unsigned item1 :1;
00708 unsigned ldwinit :1;
00709 } le;
00710
00711 } u;
00712
00713 } fmt;
00714 } u;
00715 };
00716
00717
00718
00719 typedef struct fiostate *FIOSPTR;
00720
00721
00722
00723 typedef struct {
00724 s_flag oerr;
00725 _f_int ounit;
00726 char *ofile;
00727 ftnlen ofilelen;
00728 enum status_spec ostatus;
00729 enum access_spec oaccess;
00730 enum form_spec oform;
00731 _f_int orecl;
00732 enum blank_spec oblank;
00733 enum position_spec oposition;
00734 enum action_spec oaction;
00735 enum delim_spec odelim;
00736 enum pad_spec opad;
00737 } olist;
00738
00739
00740
00741 typedef struct {
00742 s_flag cerr;
00743 _f_int cunit;
00744 char *csta;
00745 } cllist;
00746
00747
00748
00749 typedef struct {
00750 s_flag inerr;
00751 _f_int inunit;
00752 char *infile;
00753 ftnlen infilen;
00754 _f_log *inex;
00755 _f_log *inopen;
00756 _f_int *innum;
00757 _f_log *innamed;
00758 char *inname;
00759 ftnlen innamlen;
00760 char *inacc;
00761 ftnlen inacclen;
00762 char *inseq;
00763 ftnlen inseqlen;
00764 char *indir;
00765 ftnlen indirlen;
00766 char *infmt;
00767 ftnlen infmtlen;
00768 char *inform;
00769 _f_int informlen;
00770 char *inunf;
00771 ftnlen inunflen;
00772 _f_int *inrecl;
00773 _f_int *innrec;
00774 char *inblank;
00775 ftnlen inblanklen;
00776 char *inposit;
00777 ftnlen inpositlen;
00778 char *inaction;
00779 ftnlen inactonlen;
00780 char *inread;
00781 ftnlen inreadlen;
00782 char *inwrite;
00783 ftnlen inwritelen;
00784 char *inredwrit;
00785 ftnlen inrdwrtlen;
00786 char *indelim;
00787 ftnlen indelimlen;
00788 char *inpad;
00789 ftnlen inpadlen;
00790 } inlist;
00791
00792
00793
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806 typedef struct type_information_packet {
00807 ftype_t type90;
00808 short type77;
00809 short intlen;
00810 short extlen;
00811 short cnvindx;
00812 long count;
00813 long stride;
00814
00815
00816
00817
00818
00819 long elsize;
00820
00821
00822
00823 short newfunc;
00824 short cnvtype;
00825 int (* cnvfunc)();
00826 } type_packet;
00827
00828
00829
00830
00831
00832
00833 typedef int xfer_func(FIOSPTR css, unit *cup, void *dptr, type_packet *tip,
00834 int mode);
00835
00836
00837
00838
00839
00840
00841 typedef long xfer_func_c(unit *cup, void *uda, type_packet *tip, int mode,
00842 int *ubc_ret, long *wr, int *status);
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866 #define ABORT_ON_ERROR (cup == NULL || (cup->uflag & (_UERRF | _UIOSTF)) == 0)
00867
00868 #define RERROR(n) { \
00869 if (ABORT_ON_ERROR) \
00870 _ferr(css, n); \
00871 else \
00872 return(n); \
00873 }
00874
00875 #define RERROR1(n, p) { \
00876 if (ABORT_ON_ERROR) \
00877 _ferr(css, n, p); \
00878 else \
00879 return(n); \
00880 }
00881
00882 #define GOERROR(err, label) { errn = err; goto label; }
00883 #define GOERROR1(err, p, label) { errn = err; parm = p; goto label; }
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895 #define REND(n) { \
00896 if ((cup == NULL) || (cup->uflag & (_UENDF | _UIOSTF)) == 0) \
00897 _ferr(css, n); \
00898 else \
00899 return(n); \
00900 }
00901
00902
00903
00904
00905
00906
00907
00908 #ifdef _UNICOS
00909 #define INITIALIZE_LOCK(x) { (x) = 0; }
00910 #elif defined(__mips) || (defined(_LITTLE_ENDIAN) && defined(__sv2))
00911 #define INITIALIZE_LOCK(x) { (x) = 0; }
00912 #elif defined(_SOLARIS)
00913 #define INITIALIZE_LOCK(x) mutex_init(&(x), USYNC_THREAD, NULL)
00914 #elif defined(_LITTLE_ENDIAN) && !defined(__sv2)
00915 #define INITIALIZE_LOCK(x) { (x) = 0; }
00916 #endif
00917
00918 #define OPENLOCK() MEM_LOCK(&_openlock)
00919
00920 #define OPENUNLOCK() MEM_UNLOCK(&_openlock)
00921
00922 #define PARSELOCK() MEM_LOCK(&_parselock)
00923
00924 #define PARSEUNLOCK() MEM_UNLOCK(&_parselock)
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937
00938
00939
00940
00941
00942 #ifdef _CRAY1
00943 #define FLSH_MEM() { _Pragma("suppress"); _cmr(); }
00944 #elif defined(_SOLARIS)
00945 #define FLSH_MEM() { _flsh_mem(); }
00946 #else
00947 #define FLSH_MEM() { }
00948 #endif
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961 #undef MAX
00962 #define MAX(a,b) ((a) > (b) ? (a) : (b))
00963
00964 #undef MIN
00965 #define MIN(a,b) ((a) < (b) ? (a) : (b))
00966
00967 #define FF2FTNST(ffstat) _ffstat_cnvt[ffstat]
00968
00969
00970
00971
00972
00973
00974
00975 #ifdef DEBUG
00976 #define AIOCHK(cup) { if (cup->ufs != FS_FDC) _ferr(NULL, FEINTUNK); }
00977 #else
00978 #define AIOCHK(cup)
00979 #endif
00980
00981 #define MAXRECALL 1000000
00982
00983 #define WAITIO(cup, error_handle) { \
00984
00985
00986
00987
00988 \
00989 if (cup->uasync == ASYNC_ACTIVE) { \
00990 register int ct = 0; \
00991 struct ffsw zzstat; \
00992 struct fdinfo *llfio; \
00993 \
00994 llfio = (struct fdinfo *)cup->ufp.fdc; \
00995 AIOCHK(cup); \
00996
00997
00998
00999
01000
01001 \
01002 while (FFSTAT(cup->uffsw) == 0) { \
01003 (void)XRCALL(llfio, fcntlrtn) llfio, \
01004 FC_RECALL, &cup->uffsw, &zzstat);\
01005 \
01006 if (ct++ > MAXRECALL) _ferr(NULL, FEINTUNK);\
01007 } \
01008
01009
01010 \
01011 cup->ulrecl = (uint64)cup->uffsw.sw_count << 3; \
01012 cup->ufbitpos += cup->ulrecl; \
01013 if (cup->urecmode == PARTIAL) \
01014 cup->urecpos += cup->ulrecl; \
01015 \
01016 switch (FFSTAT(cup->uffsw)) { \
01017 case FFEOR: \
01018 cup->ulastyp = DT_NONE; \
01019 cup->urecpos = 0; \
01020 case FFCNT: \
01021 cup->uend = BEFORE_ENDFILE; \
01022 break; \
01023 case FFEOF: \
01024 cup->uend = PHYSICAL_ENDFILE; \
01025 break; \
01026 case FFEOD: \
01027 if (cup->uend == BEFORE_ENDFILE) \
01028 cup->uend = LOGICAL_ENDFILE;\
01029 break; \
01030 } \
01031 \
01032 cup->uasync = ASYNC_OK; \
01033
01034
01035 \
01036 if (cup->uffsw.sw_error != 0) { \
01037 error_handle; \
01038 } \
01039 } \
01040 }
01041
01042
01043
01044
01045
01046
01047 #ifdef _CRAY1
01048 #define POWER_OF_TWO(n) (_popcnt(n) == 1)
01049 #else
01050 #define POWER_OF_TWO(n) ((n & (n - 1)) == 0 && n != 0)
01051 #endif
01052
01053
01054
01055
01056
01057
01058
01059
01060
01061
01062
01063
01064
01065
01066
01067
01068 #if NUMERIC_DATA_CONVERSION_ENABLED
01069 #define COMPADD(cup, pbytes, pbits, pval) { \
01070 register int64 bitpos, bits, gran; \
01071 \
01072 if (cup->ualign.pflag) { \
01073 bitpos = cup->urecpos; \
01074 gran = cup->ualign.gran; \
01075
01076
01077
01078 \
01079 if (POWER_OF_TWO(gran)) { \
01080 bits = gran - (bitpos & (gran - 1)); \
01081 bits &= gran - 1; \
01082 } \
01083 else { \
01084 bits = gran - (bitpos % gran); \
01085 bits = bits % gran; \
01086 } \
01087 pbytes = (bits + 7) >> 3; \
01088 pbits = (pbytes << 3) - bits; \
01089 pval = cup->ualign.padval; \
01090 } \
01091 else \
01092 pbytes = pbits = pval = 0; \
01093 }
01094 #else
01095 #define COMPADD(cup, pbytes, pbits, pval) pbytes = pbits = pval = 0;
01096 #endif
01097
01098
01099
01100
01101
01102
01103
01104
01105
01106
01107
01108
01109
01110 #define CREATE_F90_INFO(ts, tip, type77) { \
01111 ts.type = _f77_to_f90_type_cnvt[type77]; \
01112 ts.dpflag = (type77 == DT_DBLE) ? 1 : 0; \
01113 ts.int_len = _f77_type_len[type77] << 3; \
01114 ts.dec_len = ts.int_len >> 3; \
01115 if (type77 == DT_SINT) { \
01116 ts.kind_or_star = DVD_STAR; \
01117 if (ts.dec_len == sizeof(_f_int)) \
01118 ts.dec_len = ts.dec_len >> 1; \
01119 } \
01120 else \
01121 ts.kind_or_star = DVD_DEFAULT; \
01122 tip.type77 = type77; \
01123 tip.type90 = ts.type; \
01124 tip.intlen = ts.int_len; \
01125 tip.extlen = ts.int_len; \
01126 tip.elsize = ts.int_len >> 3; \
01127 tip.stride = 1; \
01128 tip.cnvindx = 0; \
01129 }
01130
01131
01132
01133
01134
01135
01136 #define GOOD_UNUM(u) ((u) >= 0)
01137
01138
01139
01140
01141
01142
01143 #define RSVD_UNUM(_U) ((_U) >= STDIN_U && (_U) <= STDERR_U)
01144
01145
01146
01147
01148
01149
01150 #define OPEN_UPTR(_U) ((_U) != NULL && (_U)->ufs != 0)
01151
01152
01153
01154
01155
01156 #define UHASH(x) (x & (HASH_SIZE - 1))
01157
01158
01159
01160
01161
01162 #define UNIT_NUM(_U) ((_U)->uid)
01163
01164 #define GT_UNUM(_U, _N) { _N = UNIT_NUM(_U); }
01165
01166
01167
01168
01169
01170 #ifdef _CRAY1
01171 #define MYTASK (t_tid())
01172 #elif defined(_CRAYMPP)
01173 #define MYTASK (_my_pe())
01174 #else
01175 #define MYTASK 0
01176 #endif
01177
01178
01179
01180
01181
01182
01183
01184
01185
01186
01187
01188
01189
01190
01191
01192
01193
01194
01195
01196
01197
01198
01199 #ifndef _UNICOS
01200 #define _rtc() 0
01201 #endif
01202 #ifdef _CRAYMPP
01203
01204 #define INCRINIO {_infio++;}
01205 #define CHKSTOP { \
01206 _infio--; \
01207 if (_needtostop){ \
01208 _f_stopsig(SIGBUFIO); \
01209 } \
01210 }
01211 #else
01212 #define INCRINIO
01213 #define CHKSTOP
01214 #endif
01215 #define STMT_BEGIN(_UNUM, _INTFLAG, _STMTCODE, _CILIST, _LOCFIOSP, _CUP) {\
01216 FIOSPTR fiosp; \
01217 \
01218 assert( _CILIST == NULL ); \
01219 if (_LOCFIOSP != NULL) \
01220 fiosp = _LOCFIOSP; \
01221 else \
01222 GET_FIOS_PTR(fiosp); \
01223 if (_INTFLAG) \
01224 _CUP = _get_int_cup(); \
01225 else \
01226 _CUP = _get_cup(_UNUM); \
01227 \
01228 \
01229 \
01230 INCRINIO; \
01231 fiosp->f_cu = _CUP; \
01232 fiosp->f_curun = _UNUM; \
01233 fiosp->f_intflg = _INTFLAG; \
01234 fiosp->f_iostmt = _STMTCODE; \
01235 \
01236 if ((_STMTCODE) & TF_FMT) \
01237 fiosp->u.fmt.u.fe.fmtbuf = NULL; \
01238 \
01239 fiosp->f_rtbgn = _rtc(); \
01240 }
01241
01242
01243
01244
01245
01246
01247
01248
01249
01250
01251
01252
01253
01254
01255
01256
01257
01258
01259
01260
01261 #define STMT_END(_CUP, _STATSCODE, _CILIST, _LOCFIOSP) { \
01262 FIOSPTR fiosp; \
01263 \
01264 assert( _CILIST == NULL ); \
01265 if (_LOCFIOSP != NULL) \
01266 fiosp = _LOCFIOSP; \
01267 else \
01268 GET_FIOS_PTR(fiosp); \
01269 if ((_CUP) != NULL) { \
01270 if (fiosp->f_iostmt & TF_POS) \
01271 cup->uposition = 0; \
01272 FSTATS_POST(_CUP, _STATSCODE, fiosp); \
01273 _release_cup(_CUP); \
01274 } \
01275 CHKSTOP \
01276 fiosp->f_curun = -1; \
01277 fiosp->f_iostmt = 0; \
01278 fiosp->f_cu = NULL; \
01279 }
01280
01281
01282
01283
01284
01285
01286
01287
01288 #if defined(_CRAYMPP) || !defined(_UNICOS)
01289 #define CFT77_RETVAL(_VAL) (_VAL)
01290 #else
01291 #define CFT77_RETVAL(_VAL) _sets3(_VAL)
01292 #endif
01293
01294
01295
01296
01297
01298
01299 #define GET_FIOS_PTR(_P) _P = &_tsk_fiostate;
01300
01301
01302
01303
01304
01305
01306
01307
01308
01309 #define IO_TYPE(_U) ((_U->useq) ? \
01310 (_U->ufmt ? FIO_SF : FIO_SU): \
01311 (_U->ufmt ? FIO_DF : FIO_DU))
01312
01313
01314
01315
01316
01317
01318 extern unit *_alloc_unit(unum_t unum, int private);
01319 extern void _fcleanup(void);
01320 extern void _fcontext(FIOSPTR fiosp);
01321 extern void _ferr(FIOSPTR fiosp, int _Errno, ...);
01322 extern long _frch(unit *_Cup, long *_Uda, long _Chars, int _Mode,
01323 long *_Status);
01324 extern long _fwch(unit *_Cup, long *_Uda, long _Chars, int _Mode);
01325 extern unit *_search_unit_list(unit *p, unum_t unum);
01326 extern unit *_get_next_unit(unit *p, int iflock, int iftask);
01327 extern unit *_implicit_open(int acc, int form, unum_t unum, int errf,
01328 int *errn);
01329 extern unit *_imp_open(struct fiostate *css, int acc, int form, unum_t unum,
01330 int errf, int *errn);
01331 extern unit *_imp_open77(struct fiostate *css, int acc, int form,
01332 unum_t unum, int errf, int *errn);
01333 extern void _initialize_fortran_io(void);
01334 extern void _init_unit(unit *cup);
01335 extern unit *_init_internal_unit(void);
01336 extern int _parse(FIOSPTR _Css, unit *_Cup, fmt_type **_Prsfmt);
01337 extern int _unit_bksp(unit *cup);
01338 extern int _unit_close(unit *cup, int cstat, FIOSPTR css);
01339 extern int _unit_scratch(unit *cup);
01340 extern int _unit_seek(unit *cup, recn_t recn, int iost);
01341 extern int _unit_trunc(unit *cup);
01342 extern int _setpos(FIOSPTR css, unit *cup, int *pa, int len);
01343 extern int _uniqinod(unit *cup, assign_info *aip);
01344 extern int _f_opn(char *actnam, unit *cup, FIOSPTR css, int tufs,
01345 int aifound, assign_info *aip, struct stat *statp,
01346 int statp_valid, int catcherr, int o_sysflgs);
01347 extern int _do_open(unit *cup, FIOSPTR css, int tufs, char *actnam,
01348 int flags, int aifound, assign_info *aip,
01349 union spec_u *fdspec, int catcherr);
01350 extern void _set_device_and_inode(int sysfd, dev_t *devicep, ino_t *inodep);
01351
01352 extern xfer_func _rdunf;
01353 extern xfer_func _wrunf;
01354 extern xfer_func _rdfmt;
01355 extern xfer_func _wrfmt;
01356 extern xfer_func _ld_read;
01357 extern xfer_func _ld_write;
01358 extern xfer_func_c _frwd;
01359 extern xfer_func_c _fwwd;
01360
01361 extern int _dw_endrec(FIOSPTR _Css, unit *_Cup, int _Count);
01362 extern int _iw_endrec(FIOSPTR _Css, unit *_Cup, int _Count);
01363 extern int _sw_endrec(FIOSPTR _Css, unit *_Cup, int _Count);
01364 extern int _nonadv_endrec(FIOSPTR _Css, unit *_Cup);
01365 extern int _lw_after_nonadv(FIOSPTR _Css, unit *_Cup, int _Linelimit,
01366 int _Namelistflag);
01367
01368 extern int _dr_endrec(FIOSPTR _Css, unit *_Cup, int _Count);
01369 extern int _ir_endrec(FIOSPTR _Css, unit *_Cup, int _Count);
01370 extern int _sr_endrec(FIOSPTR _Css, unit *_Cup, int _Count);
01371
01372 extern void _gather_data(void *lbuf, long items, long inc, int len,
01373 void *ptr);
01374 extern void _scatter_data (void *ptr, long items, long inc, int len,
01375 void *lbuf);
01376
01377 extern void _set_ok_flags(unit *cup);
01378 extern int _get_mismatch_error(int noabort, int iost, unit *cup,
01379 FIOSPTR css);
01380
01381 extern int _iochunk(FIOSPTR css, unit *cup, xfer_func *func,
01382 struct DvDimen *dimen, type_packet *tip, short nd,
01383 long extent, int bshft, bcont *addr);
01384
01385 extern void _flsh_mem(void);
01386
01387 extern int _deduce_fstruct(int, struct fdinfo *, int);
01388 extern void _setup_cvrt(unit *cup);
01389 extern void _b_char(char *a, char *b, ftnlen blen);
01390 extern void _copy_n_trim(char *a, ftnlen alen, char *b);
01391
01392
01393
01394
01395
01396
01397 #define errfile stderr
01398
01399 extern unit_htable _fort_unit[];
01400
01401 extern plock_t _openlock;
01402 extern plock_t _ioblock;
01403 extern plock_t _parselock;
01404 extern plock_t _stdin_lock;
01405 extern plock_t _stdout_lock;
01406 extern plock_t _stderr_lock;
01407
01408 extern int _f_rcsz;
01409 extern int _f_ldsz;
01410 extern int _def_bin_bs;
01411 extern int _def_sbin_bs;
01412 #ifdef _CRAYMPP
01413 extern volatile int _infio;
01414 extern volatile int _needtostop;
01415 #endif
01416
01417
01418
01419 extern const ftype_t
01420 _f77_to_f90_type_cnvt[DT_MAX];
01421 extern const short
01422 _f90_to_f77_type_cnvt[DVTYPE_NTYPES];
01423 extern const short
01424 _f77_type_len[DT_MAX];
01425 extern const char *
01426 _f90_type_name[DVTYPE_NTYPES];
01427 extern const char *
01428 _f77_type_name[DT_MAX];
01429 extern const short
01430 _charset_cnvt[CS_MAX];
01431 extern const short
01432 _ffstat_cnvt[7];
01433 extern const short
01434 _old_namelist_to_f77_type_cnvt[10];
01435 extern type_packet __tip_null;
01436
01437 #ifdef _CRAY1
01438 #pragma _CRI taskcommon _tsk_fiostate
01439 #endif
01440 extern struct fiostate _tsk_fiostate;
01441 extern short _fortran_io_is_init;
01442 extern short _e_fortran_io_is_init;
01443 extern short _i_fortran_io_is_init;
01444 extern unit *_fort_internal_unit;
01445
01446
01447
01448
01449
01450
01451
01452
01453
01454
01455
01456
01457
01458
01459
01460
01461
01462
01463
01464
01465
01466
01467
01468
01469 _PRAGMA_INLINE(_get_cup)
01470 static unit *
01471 _get_cup(unum_t unum)
01472 {
01473 unit *cup;
01474
01475 cup = _fort_unit[UHASH(unum)].ulist;
01476
01477 if (cup != NULL) {
01478 #ifdef _CRAYMPP
01479 if (cup->uid != unum)
01480 #else
01481 if (cup->private || cup->uid != unum)
01482 #endif
01483 cup = _search_unit_list(cup, unum);
01484 }
01485
01486 if (cup != NULL) {
01487 MEM_LOCK(&cup->uiolock);
01488 if (OPEN_UPTR(cup)) {
01489
01490
01491
01492
01493
01494 if (cup->auxlockp != NULL) {
01495 MEM_LOCK(cup->auxlockp);
01496 }
01497 }
01498 else {
01499 MEM_UNLOCK(&cup->uiolock);
01500 cup = NULL;
01501 }
01502 }
01503 return(cup);
01504 }
01505
01506
01507
01508
01509
01510
01511
01512
01513
01514
01515
01516
01517
01518 _PRAGMA_INLINE(_get_int_cup)
01519 static unit *
01520 _get_int_cup(void)
01521 {
01522 unit *cup;
01523 cup = _fort_internal_unit;
01524 if (cup == NULL)
01525 cup = _init_internal_unit();
01526 MEM_LOCK(&cup->uiolock);
01527 return(cup);
01528 }
01529
01530
01531
01532
01533
01534
01535 _PRAGMA_INLINE(_release_cup)
01536 static void
01537 _release_cup(unit *cup)
01538 {
01539 MEM_UNLOCK(&cup->uiolock);
01540 if (cup->auxlockp != NULL)
01541 MEM_UNLOCK(cup->auxlockp);
01542 }
01543
01544 #if defined(LIBDEBUG) && ! defined(_UNICOS)
01545
01546
01547
01548 #define _ferr \
01549 fprintf(stderr,"ERROR on line %d in file \"%s\"\n", \
01550 __LINE__, __FILE__), \
01551 _ferr_routine
01552 #endif
01553
01554 #if defined(__mips) || defined(_LITTLE_ENDIAN)
01555
01556
01557 #pragma inline _get_cup
01558 #pragma inline _get_int_cup
01559 #pragma inline _release_cup
01560 #endif
01561
01562 #endif