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