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 #include <cmplrs/fio.h>
00042 #include <mutex.h>
00043 #include <cmplrs/f_errno.h>
00044 #include <sys/errno.h>
00045 #include <limits.h>
00046 #include <unistd.h>
00047
00048 #define INEX 0
00049 #define INOPEN 2
00050 #define INNUM 4
00051 #define INNAMED 6
00052 #define INRECL 8
00053 #define INNREC 10
00054 #include "vmsflags.h"
00055
00056 #include <sys/types.h>
00057 #include <string.h>
00058 #include "util.h"
00059 #include "open.h"
00060 #include "err.h"
00061 #include "bcompat.h"
00062 #include "isam.h"
00063
00064 extern void _cleanup(void);
00065
00066 static int
00067 #if 11
00068 f_inqu0_com (inlist64 *a, int *mask, int lock)
00069 #else
00070 f_inqu0_com (inlist *a, int *mask, int lock)
00071 #endif
00072 {
00073 flag byfile;
00074 flag sysfile = 0;
00075
00076 int i;
00077 char buf[PATH_MAX], *abuf;
00078 int x = 0;
00079 ino_t inod;
00080 unit *ftnunit;
00081
00082 if (a->infile != NULL) {
00083 char *flname;
00084
00085 flname = a->infile;
00086 byfile = 1;
00087 if (flname[3] == '$' && _I90_uppercase(flname, buf) &&
00088 (!strcmp (buf, "SYS$INPUT") || !strcmp (buf, "SYS$OUTPUT")
00089 || !strcmp (buf, "SYS$ERROR")))
00090 sysfile = 1;
00091
00092 if (a->indefaultfile) {
00093 g_char (a->indefaultfile, a->indefaultfilelen, buf);
00094 abuf = buf + strlen (buf);
00095 } else
00096 abuf = buf;
00097 g_char (a->infile, a->infilen, abuf);
00098
00099 x = f77inode (buf, &inod);
00100 if (x < 0) {
00101 mkidxname (buf, buf);
00102 x = f77inode (buf, &inod);
00103 }
00104 if (strlen (buf) > PATH_MAX) {
00105
00106
00107
00108
00109 if (a->inerr) {
00110 return(errno=F_ERFNAME);
00111 } else {
00112 fprintf(stderr, "Error in INQUIRE: file name too long: %s\n", buf);
00113 _cleanup ();
00114 exit(F_ERFNAME);
00115 }
00116 }
00117 ftnunit = NULL;
00118 if (x < 0)
00119 goto setvar;
00120 for (i = 0; i < mxunit; i++)
00121 if (f77units[i].uinode == inod && f77units[i].uconn > 0) {
00122 ftnunit = &f77units[i];
00123
00124
00125
00126
00127 break;
00128 }
00129 } else {
00130 byfile = 0;
00131 ftnunit = map_luno (a->inunit);
00132
00133
00134
00135
00136 }
00137 setvar:
00138 if (a->inex)
00139
00140
00141
00142
00143
00144
00145
00146 set_var (a->inex, *mask, INEX,
00147 (byfile && x > 0 || !byfile && ftnunit != NULL || sysfile) ? 1 : 0);
00148 if (a->inopen)
00149 set_var (a->inopen, *mask, INOPEN, byfile ? (ftnunit != NULL) : (ftnunit && ftnunit->uconn > 0));
00150 if (a->innum)
00151 set_var (a->innum, *mask, INNUM, ftnunit ? ftnunit->luno : 0);
00152 if (a->innamed)
00153 set_var (a->innamed, *mask, INNAMED,
00154 (byfile || ftnunit != NULL && ftnunit->ufnm != NULL) ? 1 : 0);
00155 if (a->inname != NULL)
00156 if (byfile)
00157 b_char (buf, a->inname, a->innamlen);
00158 else if (ftnunit != NULL && ftnunit->ufnm != NULL)
00159 b_char (ftnunit->ufnm, a->inname, a->innamlen);
00160 else
00161 b_char ("", a->inname, a->innamlen);
00162 if (a->inacc)
00163 if (ftnunit && ftnunit->uconn > 0)
00164 switch (ftnunit->uacc) {
00165 case SEQUENTIAL:
00166 b_char ("SEQUENTIAL", a->inacc, a->inacclen);
00167 break;
00168 case DIRECT:
00169 b_char ("DIRECT", a->inacc, a->inacclen);
00170 break;
00171 case KEYED:
00172 b_char ("KEYED", a->inacc, a->inacclen);
00173 break;
00174 default:
00175 b_char ("UNKNOWN", a->inacc, a->inacclen);
00176 }
00177 else
00178 b_char ("UNKNOWN", a->inacc, a->inacclen);
00179 if (a->inseq != NULL)
00180 if (ftnunit)
00181 b_char ((ftnunit->uacc == SEQUENTIAL) ? "YES" : "NO",
00182 a->inseq, a->inseqlen);
00183 else
00184 b_char ("UNKNOWN", a->inseq, a->inseqlen);
00185 if (a->indir != NULL)
00186 if (ftnunit)
00187 b_char ((ftnunit->uacc == DIRECT) ? "YES" : "NO",
00188 a->indir, a->indirlen);
00189 else
00190 b_char ("UNKNOWN", a->indir, a->indirlen);
00191 if (a->infmt != NULL)
00192 if (ftnunit)
00193 if (!ftnunit->ufmt)
00194 b_char ("UNFORMATTED", a->infmt, a->infmtlen);
00195 else if (ftnunit->ufmt == 1)
00196 b_char ("FORMATTED", a->infmt, a->infmtlen);
00197 else
00198 b_char ("BINARY", a->infmt, a->infmtlen);
00199 else
00200 b_char ("UNKNOWN", a->infmt, a->infmtlen);
00201 if (a->inform != NULL)
00202 if (ftnunit)
00203 b_char (ftnunit->ufmt > 0 ? "YES" : "NO", a->inform, a->informlen);
00204 else
00205 b_char ("UNKNOWN", a->inform, a->informlen);
00206 if (a->inunf)
00207 if (ftnunit)
00208 b_char (ftnunit->ufmt > 0 ? "NO" : "YES", a->inunf, a->inunflen);
00209 else
00210 b_char ("UNKNOWN", a->inunf, a->inunflen);
00211 if (a->inrecl)
00212 set_var (a->inrecl, *mask, INRECL,
00213 (int) (ftnunit ? (ftnunit->ufmt || f77vms_flag_[OLD_RL] ?
00214 ftnunit->url : ftnunit->url / sizeof (int)) : 0));
00215 if (a->innrec) {
00216
00217 if (ftnunit && (ftnunit->uacc == DIRECT) && (ftnunit->ufmt == 0)) {
00218 set_var (a->innrec, *mask, INNREC,
00219 (ftnunit && ftnunit->uacc == DIRECT && ftnunit->url) ? ftnunit->uirec + 1 : 0);
00220 } else {
00221 set_var (a->innrec, *mask, INNREC,
00222 (ftnunit && ftnunit->uacc == DIRECT && ftnunit->url) ? ftell (ftnunit->ufd) / ftnunit->url + 1 : 0);
00223 }
00224
00225 }
00226 if (a->inblank)
00227 if (ftnunit && ftnunit->ufmt > 0)
00228 b_char (ftnunit->ublnk ? "ZERO" : "NULL", a->inblank, a->inblanklen);
00229 else
00230 b_char ("UNKNOWN", a->inblank, a->inblanklen);
00231 if (a->incc)
00232 if (ftnunit && ftnunit->ufmt > 0)
00233 switch (ftnunit->ucc) {
00234 case CC_FORTRAN:
00235 b_char ("FORTRAN", a->incc, a->incclen);
00236 break;
00237 case CC_LIST:
00238 b_char ("LIST", a->incc, a->incclen);
00239 break;
00240 case CC_NONE:
00241 b_char ("NONE", a->incc, a->incclen);
00242 break;
00243 default:
00244 b_char ("UNKNOWN", a->incc, a->incclen);
00245 }
00246 else
00247 b_char ("UNKNOWN", a->incc, a->incclen);
00248 if (a->inkeyed)
00249 if (ftnunit)
00250 b_char (ftnunit->uacc == KEYED ? "YES" : "NO", a->inkeyed, a->inkeyedlen);
00251 else
00252 b_char ("UNKNOWN", a->inkeyed, a->inkeyedlen);
00253 if (a->inorg)
00254 if (ftnunit)
00255 switch (ftnunit->uacc) {
00256 case SEQUENTIAL:
00257 b_char ("SEQUNTIAL", a->inorg, a->inorglen);
00258 break;
00259 case DIRECT:
00260 b_char ("RELATIVE", a->inorg, a->inorglen);
00261 break;
00262 case KEYED:
00263 b_char ("INDEXED", a->inorg, a->inorglen);
00264 break;
00265 default:
00266 b_char ("UNKNOWN", a->inorg, a->inorglen);
00267 }
00268 else
00269 b_char ("UNKNOWN", a->inorg, a->inorglen);
00270 if (a->inrecordtype)
00271 if (ftnunit)
00272 switch (ftnunit->uacc) {
00273 case SEQUENTIAL:
00274 b_char (ftnunit->ufmt == 1 ? "STREAM_LF" : "VARIABLE",
00275 a->inrecordtype, a->inrecordtypelen);
00276 break;
00277 case DIRECT:
00278 case KEYED:
00279 b_char ("FIXED", a->inrecordtype, a->inrecordtypelen);
00280 break;
00281 default:
00282 b_char ("UNKNOWN", a->inrecordtype, a->inrecordtypelen);
00283 }
00284 else
00285 b_char ("UNKNOWN", a->inrecordtype, a->inrecordtypelen);
00286
00287
00288
00289
00290
00291 return (0);
00292 }
00293
00294 int
00295 f_inqu0 (inlist *a, int *mask)
00296 {
00297 #if 11
00298 inlist64 dst;
00299 get_inlist64(&dst, a);
00300 return( f_inqu0_com(&dst, mask, 0));
00301 #else
00302 return( f_inqu0_com( a, mask, 0 ) );
00303 #endif
00304 }
00305
00306 int
00307 f_inqu0_mp (inlist *a, int *mask)
00308 {
00309 #if 11
00310 inlist64 dst;
00311 get_inlist64(&dst, a);
00312 return( f_inqu0_com(&dst, mask, 1));
00313 #else
00314 return( f_inqu0_com( a, mask, 1 ) );
00315 #endif
00316 }
00317
00318 #if 11
00319
00320 int
00321 f_inqu064(inlist64 *a, int *mask)
00322 {
00323 return( f_inqu0_com( a, mask, 0 ) );
00324 }
00325
00326 int
00327 f_inqu064_mp (inlist64 *a, int *mask)
00328 {
00329 return( f_inqu0_com( a, mask, 1 ) );
00330 }
00331
00332 #else
00333
00334 #pragma weak f_inqu064 = f_inqu0
00335 #pragma weak f_inqu064_mp = f_inqu0_mp
00336
00337 #endif
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347 int
00348 f_inqu064x (inlist64 *a, XINT xmask)
00349 {
00350 int mask = xmask;
00351 return ( f_inqu0_com ( a, &mask, 0 ) );
00352 }
00353
00354 #pragma weak f_inqu064x_mp = f_inqu064x
00355
00356