]> git.ipfire.org Git - thirdparty/gcc.git/blame - libgfortran/io/inquire.c
* g++.dg/cast.C: Change fields of structures to "long" to pass
[thirdparty/gcc.git] / libgfortran / io / inquire.c
CommitLineData
5d38f366 1/* Copyright (C) 2002, 2003, 2005, 2007, 2009, 2010
2 Free Software Foundation, Inc.
4ee9c684 3 Contributed by Andy Vaught
4
5This file is part of the GNU Fortran 95 runtime library (libgfortran).
6
7Libgfortran is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
6bc9506f 9the Free Software Foundation; either version 3, or (at your option)
4ee9c684 10any later version.
11
12Libgfortran is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
6bc9506f 17Under Section 7 of GPL version 3, you are granted additional
18permissions described in the GCC Runtime Library Exception, version
193.1, as published by the Free Software Foundation.
20
21You should have received a copy of the GNU General Public License and
22a copy of the GCC Runtime Library Exception along with this program;
23see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24<http://www.gnu.org/licenses/>. */
4ee9c684 25
26
27/* Implement the non-IOLENGTH variant of the INQUIRY statement */
28
4ee9c684 29#include "io.h"
f65f6629 30#include "unix.h"
060da415 31#include <string.h>
4ee9c684 32
33
fb35179a 34static const char undefined[] = "UNDEFINED";
4ee9c684 35
36
37/* inquire_via_unit()-- Inquiry via unit number. The unit might not exist. */
38
39static void
60c514ba 40inquire_via_unit (st_parameter_inquire *iqp, gfc_unit * u)
4ee9c684 41{
42 const char *p;
60c514ba 43 GFC_INTEGER_4 cf = iqp->common.flags;
4ee9c684 44
60c514ba 45 if ((cf & IOPARM_INQUIRE_HAS_EXIST) != 0)
6550bb3d 46 {
47 *iqp->exist = (iqp->common.unit >= 0
48 && iqp->common.unit <= GFC_INTEGER_4_HUGE);
49
50 if ((cf & IOPARM_INQUIRE_HAS_FILE) == 0)
51 {
52 if (!(*iqp->exist))
53 *iqp->common.iostat = LIBERROR_BAD_UNIT;
54 *iqp->exist = *iqp->exist
55 && (*iqp->common.iostat != LIBERROR_BAD_UNIT);
56 }
57 }
4ee9c684 58
60c514ba 59 if ((cf & IOPARM_INQUIRE_HAS_OPENED) != 0)
60 *iqp->opened = (u != NULL);
4ee9c684 61
60c514ba 62 if ((cf & IOPARM_INQUIRE_HAS_NUMBER) != 0)
63 *iqp->number = (u != NULL) ? u->unit_number : -1;
4ee9c684 64
60c514ba 65 if ((cf & IOPARM_INQUIRE_HAS_NAMED) != 0)
66 *iqp->named = (u != NULL && u->flags.status != STATUS_SCRATCH);
4ee9c684 67
60c514ba 68 if ((cf & IOPARM_INQUIRE_HAS_NAME) != 0
69 && u != NULL && u->flags.status != STATUS_SCRATCH)
4cdcb18d 70 {
71#ifdef HAVE_TTYNAME
72 if (u->unit_number == options.stdin_unit
73 || u->unit_number == options.stdout_unit
74 || u->unit_number == options.stderr_unit)
75 {
76 char * tmp = ttyname (((unix_stream *) u->s)->fd);
77 if (tmp != NULL)
78 {
79 int tmplen = strlen (tmp);
80 fstrcpy (iqp->name, iqp->name_len, tmp, tmplen);
81 }
82 else /* If ttyname does not work, go with the default. */
83 fstrcpy (iqp->name, iqp->name_len, u->file, u->file_len);
84 }
85 else
86#endif
87 fstrcpy (iqp->name, iqp->name_len, u->file, u->file_len);
88 }
4ee9c684 89
60c514ba 90 if ((cf & IOPARM_INQUIRE_HAS_ACCESS) != 0)
4ee9c684 91 {
92 if (u == NULL)
93 p = undefined;
94 else
95 switch (u->flags.access)
96 {
97 case ACCESS_SEQUENTIAL:
98 p = "SEQUENTIAL";
99 break;
100 case ACCESS_DIRECT:
101 p = "DIRECT";
102 break;
4d8ee55b 103 case ACCESS_STREAM:
104 p = "STREAM";
105 break;
4ee9c684 106 default:
60c514ba 107 internal_error (&iqp->common, "inquire_via_unit(): Bad access");
4ee9c684 108 }
109
60c514ba 110 cf_strcpy (iqp->access, iqp->access_len, p);
4ee9c684 111 }
112
60c514ba 113 if ((cf & IOPARM_INQUIRE_HAS_SEQUENTIAL) != 0)
4ee9c684 114 {
214b69f2 115 if (u == NULL)
116 p = inquire_sequential (NULL, 0);
117 else
2e1fa727 118 switch (u->flags.access)
119 {
120 case ACCESS_DIRECT:
121 case ACCESS_STREAM:
122 p = "NO";
123 break;
124 case ACCESS_SEQUENTIAL:
125 p = "YES";
126 break;
127 default:
128 internal_error (&iqp->common, "inquire_via_unit(): Bad access");
129 }
4ee9c684 130
60c514ba 131 cf_strcpy (iqp->sequential, iqp->sequential_len, p);
4ee9c684 132 }
133
60c514ba 134 if ((cf & IOPARM_INQUIRE_HAS_DIRECT) != 0)
4ee9c684 135 {
2e1fa727 136 if (u == NULL)
137 p = inquire_direct (NULL, 0);
138 else
139 switch (u->flags.access)
140 {
141 case ACCESS_SEQUENTIAL:
142 case ACCESS_STREAM:
143 p = "NO";
144 break;
145 case ACCESS_DIRECT:
146 p = "YES";
147 break;
148 default:
149 internal_error (&iqp->common, "inquire_via_unit(): Bad access");
150 }
4ee9c684 151
60c514ba 152 cf_strcpy (iqp->direct, iqp->direct_len, p);
4ee9c684 153 }
154
60c514ba 155 if ((cf & IOPARM_INQUIRE_HAS_FORM) != 0)
4ee9c684 156 {
157 if (u == NULL)
158 p = undefined;
159 else
160 switch (u->flags.form)
161 {
162 case FORM_FORMATTED:
163 p = "FORMATTED";
164 break;
165 case FORM_UNFORMATTED:
166 p = "UNFORMATTED";
167 break;
168 default:
60c514ba 169 internal_error (&iqp->common, "inquire_via_unit(): Bad form");
4ee9c684 170 }
171
60c514ba 172 cf_strcpy (iqp->form, iqp->form_len, p);
4ee9c684 173 }
174
60c514ba 175 if ((cf & IOPARM_INQUIRE_HAS_FORMATTED) != 0)
4ee9c684 176 {
2e1fa727 177 if (u == NULL)
178 p = inquire_formatted (NULL, 0);
179 else
180 switch (u->flags.form)
181 {
182 case FORM_FORMATTED:
183 p = "YES";
184 break;
185 case FORM_UNFORMATTED:
186 p = "NO";
187 break;
188 default:
189 internal_error (&iqp->common, "inquire_via_unit(): Bad form");
190 }
4ee9c684 191
60c514ba 192 cf_strcpy (iqp->formatted, iqp->formatted_len, p);
4ee9c684 193 }
194
60c514ba 195 if ((cf & IOPARM_INQUIRE_HAS_UNFORMATTED) != 0)
4ee9c684 196 {
2e1fa727 197 if (u == NULL)
198 p = inquire_unformatted (NULL, 0);
199 else
200 switch (u->flags.form)
201 {
202 case FORM_FORMATTED:
203 p = "NO";
204 break;
205 case FORM_UNFORMATTED:
206 p = "YES";
207 break;
208 default:
209 internal_error (&iqp->common, "inquire_via_unit(): Bad form");
210 }
4ee9c684 211
60c514ba 212 cf_strcpy (iqp->unformatted, iqp->unformatted_len, p);
4ee9c684 213 }
214
60c514ba 215 if ((cf & IOPARM_INQUIRE_HAS_RECL_OUT) != 0)
216 *iqp->recl_out = (u != NULL) ? u->recl : 0;
4ee9c684 217
4d8ee55b 218 if ((cf & IOPARM_INQUIRE_HAS_STRM_POS_OUT) != 0)
3c43c91f 219 *iqp->strm_pos_out = (u != NULL) ? u->strm_pos : 0;
4d8ee55b 220
60c514ba 221 if ((cf & IOPARM_INQUIRE_HAS_NEXTREC) != 0)
f4bfed80 222 {
223 /* This only makes sense in the context of DIRECT access. */
224 if (u != NULL && u->flags.access == ACCESS_DIRECT)
225 *iqp->nextrec = u->last_record + 1;
226 else
227 *iqp->nextrec = 0;
228 }
4ee9c684 229
60c514ba 230 if ((cf & IOPARM_INQUIRE_HAS_BLANK) != 0)
4ee9c684 231 {
8e327405 232 if (u == NULL || u->flags.form != FORM_FORMATTED)
4ee9c684 233 p = undefined;
234 else
235 switch (u->flags.blank)
236 {
237 case BLANK_NULL:
60c514ba 238 p = "NULL";
4ee9c684 239 break;
240 case BLANK_ZERO:
241 p = "ZERO";
242 break;
243 default:
60c514ba 244 internal_error (&iqp->common, "inquire_via_unit(): Bad blank");
4ee9c684 245 }
246
60c514ba 247 cf_strcpy (iqp->blank, iqp->blank_len, p);
4ee9c684 248 }
249
8e327405 250 if ((cf & IOPARM_INQUIRE_HAS_PAD) != 0)
251 {
252 if (u == NULL || u->flags.form != FORM_FORMATTED)
253 p = undefined;
254 else
255 switch (u->flags.pad)
256 {
257 case PAD_YES:
258 p = "YES";
259 break;
260 case PAD_NO:
261 p = "NO";
262 break;
263 default:
264 internal_error (&iqp->common, "inquire_via_unit(): Bad pad");
265 }
266
267 cf_strcpy (iqp->pad, iqp->pad_len, p);
268 }
269
0d72fa67 270 if (cf & IOPARM_INQUIRE_HAS_FLAGS2)
8e327405 271 {
b5d015e3 272 GFC_INTEGER_4 cf2 = iqp->flags2;
273
0d72fa67 274 if ((cf2 & IOPARM_INQUIRE_HAS_PENDING) != 0)
275 *iqp->pending = 0;
276
277 if ((cf2 & IOPARM_INQUIRE_HAS_ID) != 0)
278 *iqp->id = 0;
8e327405 279
0d72fa67 280 if ((cf2 & IOPARM_INQUIRE_HAS_ENCODING) != 0)
281 {
282 if (u == NULL || u->flags.form != FORM_FORMATTED)
283 p = undefined;
284 else
285 switch (u->flags.encoding)
286 {
287 case ENCODING_DEFAULT:
288 p = "UNKNOWN";
289 break;
290 case ENCODING_UTF8:
291 p = "UTF-8";
292 break;
293 default:
294 internal_error (&iqp->common, "inquire_via_unit(): Bad encoding");
295 }
296
297 cf_strcpy (iqp->encoding, iqp->encoding_len, p);
298 }
8e327405 299
0d72fa67 300 if ((cf2 & IOPARM_INQUIRE_HAS_DECIMAL) != 0)
301 {
302 if (u == NULL || u->flags.form != FORM_FORMATTED)
303 p = undefined;
304 else
305 switch (u->flags.decimal)
306 {
307 case DECIMAL_POINT:
308 p = "POINT";
309 break;
310 case DECIMAL_COMMA:
311 p = "COMMA";
312 break;
313 default:
314 internal_error (&iqp->common, "inquire_via_unit(): Bad comma");
315 }
316
317 cf_strcpy (iqp->decimal, iqp->decimal_len, p);
318 }
8e327405 319
0d72fa67 320 if ((cf2 & IOPARM_INQUIRE_HAS_ASYNCHRONOUS) != 0)
321 {
322 if (u == NULL)
323 p = undefined;
324 else
325 switch (u->flags.async)
326 {
327 case ASYNC_YES:
328 p = "YES";
329 break;
330 case ASYNC_NO:
331 p = "NO";
332 break;
333 default:
334 internal_error (&iqp->common, "inquire_via_unit(): Bad async");
335 }
336
337 cf_strcpy (iqp->asynchronous, iqp->asynchronous_len, p);
338 }
8e327405 339
0d72fa67 340 if ((cf2 & IOPARM_INQUIRE_HAS_SIGN) != 0)
341 {
342 if (u == NULL)
343 p = undefined;
344 else
345 switch (u->flags.sign)
346 {
347 case SIGN_PROCDEFINED:
348 p = "PROCESSOR_DEFINED";
349 break;
350 case SIGN_SUPPRESS:
351 p = "SUPPRESS";
352 break;
353 case SIGN_PLUS:
354 p = "PLUS";
355 break;
356 default:
357 internal_error (&iqp->common, "inquire_via_unit(): Bad sign");
358 }
359
360 cf_strcpy (iqp->sign, iqp->sign_len, p);
361 }
8e327405 362
0d72fa67 363 if ((cf2 & IOPARM_INQUIRE_HAS_ROUND) != 0)
364 {
365 if (u == NULL)
366 p = undefined;
367 else
368 switch (u->flags.round)
369 {
370 case ROUND_UP:
371 p = "UP";
372 break;
373 case ROUND_DOWN:
374 p = "DOWN";
375 break;
376 case ROUND_ZERO:
377 p = "ZERO";
378 break;
379 case ROUND_NEAREST:
380 p = "NEAREST";
381 break;
382 case ROUND_COMPATIBLE:
383 p = "COMPATIBLE";
384 break;
385 case ROUND_PROCDEFINED:
386 p = "PROCESSOR_DEFINED";
387 break;
388 default:
389 internal_error (&iqp->common, "inquire_via_unit(): Bad round");
390 }
391
392 cf_strcpy (iqp->round, iqp->round_len, p);
393 }
f4e9c676 394
395 if ((cf2 & IOPARM_INQUIRE_HAS_SIZE) != 0)
396 {
397 if (u == NULL)
398 *iqp->size = -1;
399 else
400 *iqp->size = file_size (u->file, (gfc_charlen_type) u->file_len);
401 }
8e327405 402 }
403
60c514ba 404 if ((cf & IOPARM_INQUIRE_HAS_POSITION) != 0)
4ee9c684 405 {
406 if (u == NULL || u->flags.access == ACCESS_DIRECT)
b3b0377b 407 p = undefined;
4ee9c684 408 else
b3b0377b 409 switch (u->flags.position)
410 {
411 case POSITION_REWIND:
412 p = "REWIND";
413 break;
414 case POSITION_APPEND:
415 p = "APPEND";
416 break;
417 case POSITION_ASIS:
418 p = "ASIS";
419 break;
420 default:
421 /* if not direct access, it must be
422 either REWIND, APPEND, or ASIS.
423 ASIS seems to be the best default */
424 p = "ASIS";
425 break;
426 }
60c514ba 427 cf_strcpy (iqp->position, iqp->position_len, p);
4ee9c684 428 }
429
60c514ba 430 if ((cf & IOPARM_INQUIRE_HAS_ACTION) != 0)
4ee9c684 431 {
432 if (u == NULL)
433 p = undefined;
434 else
435 switch (u->flags.action)
436 {
437 case ACTION_READ:
438 p = "READ";
439 break;
440 case ACTION_WRITE:
441 p = "WRITE";
442 break;
443 case ACTION_READWRITE:
444 p = "READWRITE";
445 break;
446 default:
60c514ba 447 internal_error (&iqp->common, "inquire_via_unit(): Bad action");
4ee9c684 448 }
449
60c514ba 450 cf_strcpy (iqp->action, iqp->action_len, p);
4ee9c684 451 }
452
60c514ba 453 if ((cf & IOPARM_INQUIRE_HAS_READ) != 0)
4ee9c684 454 {
455 p = (u == NULL) ? inquire_read (NULL, 0) :
456 inquire_read (u->file, u->file_len);
457
60c514ba 458 cf_strcpy (iqp->read, iqp->read_len, p);
4ee9c684 459 }
460
60c514ba 461 if ((cf & IOPARM_INQUIRE_HAS_WRITE) != 0)
4ee9c684 462 {
463 p = (u == NULL) ? inquire_write (NULL, 0) :
464 inquire_write (u->file, u->file_len);
465
60c514ba 466 cf_strcpy (iqp->write, iqp->write_len, p);
4ee9c684 467 }
468
60c514ba 469 if ((cf & IOPARM_INQUIRE_HAS_READWRITE) != 0)
4ee9c684 470 {
471 p = (u == NULL) ? inquire_readwrite (NULL, 0) :
472 inquire_readwrite (u->file, u->file_len);
473
60c514ba 474 cf_strcpy (iqp->readwrite, iqp->readwrite_len, p);
4ee9c684 475 }
476
60c514ba 477 if ((cf & IOPARM_INQUIRE_HAS_DELIM) != 0)
4ee9c684 478 {
479 if (u == NULL || u->flags.form != FORM_FORMATTED)
480 p = undefined;
481 else
482 switch (u->flags.delim)
483 {
484 case DELIM_NONE:
485 p = "NONE";
486 break;
487 case DELIM_QUOTE:
488 p = "QUOTE";
489 break;
490 case DELIM_APOSTROPHE:
491 p = "APOSTROPHE";
492 break;
493 default:
60c514ba 494 internal_error (&iqp->common, "inquire_via_unit(): Bad delim");
4ee9c684 495 }
496
60c514ba 497 cf_strcpy (iqp->delim, iqp->delim_len, p);
4ee9c684 498 }
499
60c514ba 500 if ((cf & IOPARM_INQUIRE_HAS_PAD) != 0)
4ee9c684 501 {
502 if (u == NULL || u->flags.form != FORM_FORMATTED)
503 p = undefined;
504 else
505 switch (u->flags.pad)
506 {
507 case PAD_NO:
508 p = "NO";
509 break;
510 case PAD_YES:
511 p = "YES";
512 break;
513 default:
60c514ba 514 internal_error (&iqp->common, "inquire_via_unit(): Bad pad");
4ee9c684 515 }
516
60c514ba 517 cf_strcpy (iqp->pad, iqp->pad_len, p);
4ee9c684 518 }
9e94d29f 519
520 if ((cf & IOPARM_INQUIRE_HAS_CONVERT) != 0)
521 {
522 if (u == NULL)
523 p = undefined;
524 else
525 switch (u->flags.convert)
526 {
1316e8f0 527 /* big_endian is 0 for little-endian, 1 for big-endian. */
18f0b7df 528 case GFC_CONVERT_NATIVE:
1316e8f0 529 p = big_endian ? "BIG_ENDIAN" : "LITTLE_ENDIAN";
9e94d29f 530 break;
531
18f0b7df 532 case GFC_CONVERT_SWAP:
1316e8f0 533 p = big_endian ? "LITTLE_ENDIAN" : "BIG_ENDIAN";
9e94d29f 534 break;
535
536 default:
537 internal_error (&iqp->common, "inquire_via_unit(): Bad convert");
538 }
539
540 cf_strcpy (iqp->convert, iqp->convert_len, p);
541 }
4ee9c684 542}
543
544
545/* inquire_via_filename()-- Inquiry via filename. This subroutine is
546 * only used if the filename is *not* connected to a unit number. */
547
548static void
60c514ba 549inquire_via_filename (st_parameter_inquire *iqp)
4ee9c684 550{
551 const char *p;
60c514ba 552 GFC_INTEGER_4 cf = iqp->common.flags;
4ee9c684 553
60c514ba 554 if ((cf & IOPARM_INQUIRE_HAS_EXIST) != 0)
555 *iqp->exist = file_exists (iqp->file, iqp->file_len);
4ee9c684 556
60c514ba 557 if ((cf & IOPARM_INQUIRE_HAS_OPENED) != 0)
558 *iqp->opened = 0;
4ee9c684 559
60c514ba 560 if ((cf & IOPARM_INQUIRE_HAS_NUMBER) != 0)
561 *iqp->number = -1;
4ee9c684 562
60c514ba 563 if ((cf & IOPARM_INQUIRE_HAS_NAMED) != 0)
564 *iqp->named = 1;
4ee9c684 565
60c514ba 566 if ((cf & IOPARM_INQUIRE_HAS_NAME) != 0)
567 fstrcpy (iqp->name, iqp->name_len, iqp->file, iqp->file_len);
4ee9c684 568
60c514ba 569 if ((cf & IOPARM_INQUIRE_HAS_ACCESS) != 0)
570 cf_strcpy (iqp->access, iqp->access_len, undefined);
4ee9c684 571
60c514ba 572 if ((cf & IOPARM_INQUIRE_HAS_SEQUENTIAL) != 0)
4ee9c684 573 {
2e1fa727 574 p = "UNKNOWN";
60c514ba 575 cf_strcpy (iqp->sequential, iqp->sequential_len, p);
4ee9c684 576 }
577
60c514ba 578 if ((cf & IOPARM_INQUIRE_HAS_DIRECT) != 0)
4ee9c684 579 {
2e1fa727 580 p = "UNKNOWN";
60c514ba 581 cf_strcpy (iqp->direct, iqp->direct_len, p);
4ee9c684 582 }
583
60c514ba 584 if ((cf & IOPARM_INQUIRE_HAS_FORM) != 0)
585 cf_strcpy (iqp->form, iqp->form_len, undefined);
4ee9c684 586
60c514ba 587 if ((cf & IOPARM_INQUIRE_HAS_FORMATTED) != 0)
4ee9c684 588 {
2e1fa727 589 p = "UNKNOWN";
60c514ba 590 cf_strcpy (iqp->formatted, iqp->formatted_len, p);
4ee9c684 591 }
592
60c514ba 593 if ((cf & IOPARM_INQUIRE_HAS_UNFORMATTED) != 0)
4ee9c684 594 {
2e1fa727 595 p = "UNKNOWN";
60c514ba 596 cf_strcpy (iqp->unformatted, iqp->unformatted_len, p);
4ee9c684 597 }
598
60c514ba 599 if ((cf & IOPARM_INQUIRE_HAS_RECL_OUT) != 0)
600 *iqp->recl_out = 0;
4ee9c684 601
60c514ba 602 if ((cf & IOPARM_INQUIRE_HAS_NEXTREC) != 0)
603 *iqp->nextrec = 0;
4ee9c684 604
60c514ba 605 if ((cf & IOPARM_INQUIRE_HAS_BLANK) != 0)
606 cf_strcpy (iqp->blank, iqp->blank_len, undefined);
4ee9c684 607
8e327405 608 if ((cf & IOPARM_INQUIRE_HAS_PAD) != 0)
609 cf_strcpy (iqp->pad, iqp->pad_len, undefined);
610
0d72fa67 611 if (cf & IOPARM_INQUIRE_HAS_FLAGS2)
612 {
b5d015e3 613 GFC_INTEGER_4 cf2 = iqp->flags2;
614
0d72fa67 615 if ((cf2 & IOPARM_INQUIRE_HAS_ENCODING) != 0)
616 cf_strcpy (iqp->encoding, iqp->encoding_len, undefined);
8e327405 617
0d72fa67 618 if ((cf2 & IOPARM_INQUIRE_HAS_DELIM) != 0)
619 cf_strcpy (iqp->delim, iqp->delim_len, undefined);
620
621 if ((cf2 & IOPARM_INQUIRE_HAS_DECIMAL) != 0)
622 cf_strcpy (iqp->decimal, iqp->decimal_len, undefined);
8e327405 623
0d72fa67 624 if ((cf2 & IOPARM_INQUIRE_HAS_DELIM) != 0)
625 cf_strcpy (iqp->delim, iqp->delim_len, undefined);
626
627 if ((cf2 & IOPARM_INQUIRE_HAS_PAD) != 0)
628 cf_strcpy (iqp->pad, iqp->pad_len, undefined);
629
630 if ((cf2 & IOPARM_INQUIRE_HAS_ENCODING) != 0)
631 cf_strcpy (iqp->encoding, iqp->encoding_len, undefined);
f4e9c676 632
633 if ((cf2 & IOPARM_INQUIRE_HAS_SIZE) != 0)
634 *iqp->size = file_size (iqp->file, iqp->file_len);
0d72fa67 635 }
8e327405 636
60c514ba 637 if ((cf & IOPARM_INQUIRE_HAS_POSITION) != 0)
638 cf_strcpy (iqp->position, iqp->position_len, undefined);
4ee9c684 639
60c514ba 640 if ((cf & IOPARM_INQUIRE_HAS_ACCESS) != 0)
641 cf_strcpy (iqp->access, iqp->access_len, undefined);
4ee9c684 642
60c514ba 643 if ((cf & IOPARM_INQUIRE_HAS_READ) != 0)
4ee9c684 644 {
60c514ba 645 p = inquire_read (iqp->file, iqp->file_len);
646 cf_strcpy (iqp->read, iqp->read_len, p);
4ee9c684 647 }
648
60c514ba 649 if ((cf & IOPARM_INQUIRE_HAS_WRITE) != 0)
4ee9c684 650 {
60c514ba 651 p = inquire_write (iqp->file, iqp->file_len);
652 cf_strcpy (iqp->write, iqp->write_len, p);
4ee9c684 653 }
654
60c514ba 655 if ((cf & IOPARM_INQUIRE_HAS_READWRITE) != 0)
4ee9c684 656 {
60c514ba 657 p = inquire_read (iqp->file, iqp->file_len);
658 cf_strcpy (iqp->readwrite, iqp->readwrite_len, p);
4ee9c684 659 }
4ee9c684 660}
661
662
6799e2f8 663/* Library entry point for the INQUIRE statement (non-IOLENGTH
664 form). */
4ee9c684 665
60c514ba 666extern void st_inquire (st_parameter_inquire *);
7b6cb5bd 667export_proto(st_inquire);
668
4ee9c684 669void
60c514ba 670st_inquire (st_parameter_inquire *iqp)
4ee9c684 671{
f02dd226 672 gfc_unit *u;
4ee9c684 673
60c514ba 674 library_start (&iqp->common);
4ee9c684 675
60c514ba 676 if ((iqp->common.flags & IOPARM_INQUIRE_HAS_FILE) == 0)
677 {
678 u = find_unit (iqp->common.unit);
679 inquire_via_unit (iqp, u);
680 }
4ee9c684 681 else
682 {
60c514ba 683 u = find_file (iqp->file, iqp->file_len);
4ee9c684 684 if (u == NULL)
60c514ba 685 inquire_via_filename (iqp);
4ee9c684 686 else
60c514ba 687 inquire_via_unit (iqp, u);
4ee9c684 688 }
60c514ba 689 if (u != NULL)
690 unlock_unit (u);
4ee9c684 691
692 library_end ();
693}