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