]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/fortran/scanner.c
re PR fortran/34896 (libgomp.fortran/reduction5.f90)
[thirdparty/gcc.git] / gcc / fortran / scanner.c
CommitLineData
6de9cd9a 1/* Character scanner.
4d499824 2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
ec378180 3 Free Software Foundation, Inc.
6de9cd9a
DN
4 Contributed by Andy Vaught
5
9fc4d79b 6This file is part of GCC.
6de9cd9a 7
9fc4d79b
TS
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
d234d788 10Software Foundation; either version 3, or (at your option) any later
9fc4d79b 11version.
6de9cd9a 12
9fc4d79b
TS
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
6de9cd9a
DN
17
18You should have received a copy of the GNU General Public License
d234d788
NC
19along with GCC; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>. */
6de9cd9a
DN
21
22/* Set of subroutines to (ultimately) return the next character to the
23 various matching subroutines. This file's job is to read files and
24 build up lines that are parsed by the parser. This means that we
25 handle continuation lines and "include" lines.
26
27 The first thing the scanner does is to load an entire file into
28 memory. We load the entire file into memory for a couple reasons.
29 The first is that we want to be able to deal with nonseekable input
30 (pipes, stdin) and there is a lot of backing up involved during
31 parsing.
32
33 The second is that we want to be able to print the locus of errors,
34 and an error on line 999999 could conflict with something on line
35 one. Given nonseekable input, we've got to store the whole thing.
36
37 One thing that helps are the column truncation limits that give us
38 an upper bound on the size of individual lines. We don't store the
39 truncated stuff.
40
41 From the scanner's viewpoint, the higher level subroutines ask for
42 new characters and do a lot of jumping backwards. */
43
44#include "config.h"
d22e4895 45#include "system.h"
6de9cd9a 46#include "gfortran.h"
2d7c7df6 47#include "toplev.h"
9e8a6720
FXC
48#include "debug.h"
49#include "flags.h"
6de9cd9a
DN
50
51/* Structure for holding module and include file search path. */
52typedef struct gfc_directorylist
53{
54 char *path;
31198773 55 bool use_for_modules;
6de9cd9a
DN
56 struct gfc_directorylist *next;
57}
58gfc_directorylist;
59
60/* List of include file search directories. */
31198773 61static gfc_directorylist *include_dirs, *intrinsic_modules_dirs;
6de9cd9a 62
d4fa05b9 63static gfc_file *file_head, *current_file;
6de9cd9a 64
6c7a4dfd 65static int continue_flag, end_flag, openmp_flag;
5a06474c 66static int continue_count, continue_line;
6c7a4dfd 67static locus openmp_locus;
6de9cd9a 68
d4fa05b9
TS
69gfc_source_form gfc_current_form;
70static gfc_linebuf *line_head, *line_tail;
71
63645982 72locus gfc_current_locus;
e0bcf78c 73const char *gfc_source_file;
2d7c7df6
JJ
74static FILE *gfc_src_file;
75static char *gfc_src_preprocessor_lines[2];
76
5a06474c 77extern int pedantic;
6de9cd9a 78
1b271c9b
JJ
79static struct gfc_file_change
80{
81 const char *filename;
82 gfc_linebuf *lb;
83 int line;
84} *file_changes;
85size_t file_changes_cur, file_changes_count;
86size_t file_changes_allocated;
87
6de9cd9a
DN
88/* Main scanner initialization. */
89
90void
91gfc_scanner_init_1 (void)
92{
d4fa05b9
TS
93 file_head = NULL;
94 line_head = NULL;
95 line_tail = NULL;
6de9cd9a 96
5a06474c
JD
97 continue_count = 0;
98 continue_line = 0;
99
6de9cd9a
DN
100 end_flag = 0;
101}
102
103
104/* Main scanner destructor. */
105
106void
107gfc_scanner_done_1 (void)
108{
d4fa05b9
TS
109 gfc_linebuf *lb;
110 gfc_file *f;
6de9cd9a 111
d4fa05b9 112 while(line_head != NULL)
6de9cd9a 113 {
d4fa05b9
TS
114 lb = line_head->next;
115 gfc_free(line_head);
116 line_head = lb;
6de9cd9a 117 }
d4fa05b9
TS
118
119 while(file_head != NULL)
6de9cd9a 120 {
d4fa05b9
TS
121 f = file_head->next;
122 gfc_free(file_head->filename);
123 gfc_free(file_head);
124 file_head = f;
6de9cd9a
DN
125 }
126}
127
128
129/* Adds path to the list pointed to by list. */
130
31198773
FXC
131static void
132add_path_to_list (gfc_directorylist **list, const char *path,
133 bool use_for_modules)
6de9cd9a
DN
134{
135 gfc_directorylist *dir;
136 const char *p;
137
138 p = path;
31198773 139 while (*p == ' ' || *p == '\t') /* someone might do "-I include" */
6de9cd9a
DN
140 if (*p++ == '\0')
141 return;
142
31198773 143 dir = *list;
6de9cd9a 144 if (!dir)
31198773 145 dir = *list = gfc_getmem (sizeof (gfc_directorylist));
6de9cd9a
DN
146 else
147 {
148 while (dir->next)
149 dir = dir->next;
150
151 dir->next = gfc_getmem (sizeof (gfc_directorylist));
152 dir = dir->next;
153 }
154
155 dir->next = NULL;
31198773 156 dir->use_for_modules = use_for_modules;
6de9cd9a
DN
157 dir->path = gfc_getmem (strlen (p) + 2);
158 strcpy (dir->path, p);
159 strcat (dir->path, "/"); /* make '/' last character */
160}
161
162
31198773
FXC
163void
164gfc_add_include_path (const char *path, bool use_for_modules)
165{
166 add_path_to_list (&include_dirs, path, use_for_modules);
167}
168
169
170void
171gfc_add_intrinsic_modules_path (const char *path)
172{
173 add_path_to_list (&intrinsic_modules_dirs, path, true);
174}
175
176
6de9cd9a
DN
177/* Release resources allocated for options. */
178
179void
180gfc_release_include_path (void)
181{
182 gfc_directorylist *p;
183
6de9cd9a
DN
184 while (include_dirs != NULL)
185 {
186 p = include_dirs;
187 include_dirs = include_dirs->next;
188 gfc_free (p->path);
189 gfc_free (p);
190 }
31198773 191
31198773
FXC
192 while (intrinsic_modules_dirs != NULL)
193 {
194 p = intrinsic_modules_dirs;
195 intrinsic_modules_dirs = intrinsic_modules_dirs->next;
196 gfc_free (p->path);
197 gfc_free (p);
198 }
1bc23383
FXC
199
200 gfc_free (gfc_option.module_dir);
6de9cd9a
DN
201}
202
6de9cd9a 203
31198773
FXC
204static FILE *
205open_included_file (const char *name, gfc_directorylist *list, bool module)
6de9cd9a 206{
200cfbe7 207 char *fullname;
6de9cd9a
DN
208 gfc_directorylist *p;
209 FILE *f;
210
31198773 211 for (p = list; p; p = p->next)
b424a572 212 {
31198773
FXC
213 if (module && !p->use_for_modules)
214 continue;
6de9cd9a 215
200cfbe7 216 fullname = (char *) alloca(strlen (p->path) + strlen (name) + 1);
6de9cd9a
DN
217 strcpy (fullname, p->path);
218 strcat (fullname, name);
219
220 f = gfc_open_file (fullname);
221 if (f != NULL)
222 return f;
223 }
224
225 return NULL;
226}
227
31198773
FXC
228
229/* Opens file for reading, searching through the include directories
230 given if necessary. If the include_cwd argument is true, we try
231 to open the file in the current directory first. */
232
233FILE *
234gfc_open_included_file (const char *name, bool include_cwd, bool module)
235{
236 FILE *f;
237
e01f74e0
TB
238 if (IS_ABSOLUTE_PATH (name))
239 return gfc_open_file (name);
240
31198773
FXC
241 if (include_cwd)
242 {
243 f = gfc_open_file (name);
244 if (f != NULL)
245 return f;
246 }
247
248 return open_included_file (name, include_dirs, module);
249}
250
251FILE *
252gfc_open_intrinsic_module (const char *name)
253{
e01f74e0
TB
254 if (IS_ABSOLUTE_PATH (name))
255 return gfc_open_file (name);
256
31198773
FXC
257 return open_included_file (name, intrinsic_modules_dirs, true);
258}
259
edf1eac2 260
6de9cd9a
DN
261/* Test to see if we're at the end of the main source file. */
262
263int
264gfc_at_end (void)
265{
6de9cd9a
DN
266 return end_flag;
267}
268
269
270/* Test to see if we're at the end of the current file. */
271
272int
273gfc_at_eof (void)
274{
6de9cd9a
DN
275 if (gfc_at_end ())
276 return 1;
277
d4fa05b9 278 if (line_head == NULL)
6de9cd9a
DN
279 return 1; /* Null file */
280
63645982 281 if (gfc_current_locus.lb == NULL)
6de9cd9a
DN
282 return 1;
283
284 return 0;
285}
286
287
288/* Test to see if we're at the beginning of a new line. */
289
290int
291gfc_at_bol (void)
292{
6de9cd9a
DN
293 if (gfc_at_eof ())
294 return 1;
295
63645982 296 return (gfc_current_locus.nextc == gfc_current_locus.lb->line);
6de9cd9a
DN
297}
298
299
300/* Test to see if we're at the end of a line. */
301
302int
303gfc_at_eol (void)
304{
6de9cd9a
DN
305 if (gfc_at_eof ())
306 return 1;
307
63645982 308 return (*gfc_current_locus.nextc == '\0');
6de9cd9a
DN
309}
310
60332588 311static void
1b271c9b 312add_file_change (const char *filename, int line)
60332588 313{
1b271c9b
JJ
314 if (file_changes_count == file_changes_allocated)
315 {
316 if (file_changes_allocated)
317 file_changes_allocated *= 2;
318 else
319 file_changes_allocated = 16;
320 file_changes
321 = xrealloc (file_changes,
322 file_changes_allocated * sizeof (*file_changes));
323 }
324 file_changes[file_changes_count].filename = filename;
325 file_changes[file_changes_count].lb = NULL;
326 file_changes[file_changes_count++].line = line;
327}
60332588 328
1b271c9b
JJ
329static void
330report_file_change (gfc_linebuf *lb)
331{
332 size_t c = file_changes_cur;
333 while (c < file_changes_count
334 && file_changes[c].lb == lb)
335 {
336 if (file_changes[c].filename)
337 (*debug_hooks->start_source_file) (file_changes[c].line,
338 file_changes[c].filename);
339 else
340 (*debug_hooks->end_source_file) (file_changes[c].line);
341 ++c;
342 }
343 file_changes_cur = c;
60332588
JJ
344}
345
346void
347gfc_start_source_files (void)
348{
349 /* If the debugger wants the name of the main source file,
350 we give it. */
351 if (debug_hooks->start_end_main_source_file)
352 (*debug_hooks->start_source_file) (0, gfc_source_file);
353
1b271c9b
JJ
354 file_changes_cur = 0;
355 report_file_change (gfc_current_locus.lb);
60332588
JJ
356}
357
358void
359gfc_end_source_files (void)
360{
1b271c9b 361 report_file_change (NULL);
60332588
JJ
362
363 if (debug_hooks->start_end_main_source_file)
364 (*debug_hooks->end_source_file) (0);
365}
6de9cd9a
DN
366
367/* Advance the current line pointer to the next line. */
368
369void
370gfc_advance_line (void)
371{
6de9cd9a 372 if (gfc_at_end ())
4a58b9ad 373 return;
6de9cd9a 374
63645982 375 if (gfc_current_locus.lb == NULL)
6de9cd9a 376 {
d4fa05b9
TS
377 end_flag = 1;
378 return;
379 }
6de9cd9a 380
9e8a6720 381 if (gfc_current_locus.lb->next
60332588 382 && !gfc_current_locus.lb->next->dbg_emitted)
9e8a6720 383 {
1b271c9b 384 report_file_change (gfc_current_locus.lb->next);
60332588 385 gfc_current_locus.lb->next->dbg_emitted = true;
9e8a6720
FXC
386 }
387
63645982 388 gfc_current_locus.lb = gfc_current_locus.lb->next;
6de9cd9a 389
edf1eac2 390 if (gfc_current_locus.lb != NULL)
63645982 391 gfc_current_locus.nextc = gfc_current_locus.lb->line;
d4fa05b9
TS
392 else
393 {
63645982 394 gfc_current_locus.nextc = NULL;
d4fa05b9
TS
395 end_flag = 1;
396 }
6de9cd9a
DN
397}
398
399
400/* Get the next character from the input, advancing gfc_current_file's
401 locus. When we hit the end of the line or the end of the file, we
402 start returning a '\n' in order to complete the current statement.
403 No Fortran line conventions are implemented here.
404
405 Requiring explicit advances to the next line prevents the parse
406 pointer from being on the wrong line if the current statement ends
407 prematurely. */
408
409static int
410next_char (void)
411{
6de9cd9a 412 int c;
d4fa05b9 413
63645982 414 if (gfc_current_locus.nextc == NULL)
6de9cd9a
DN
415 return '\n';
416
16a374c6 417 c = (unsigned char) *gfc_current_locus.nextc++;
6de9cd9a
DN
418 if (c == '\0')
419 {
63645982 420 gfc_current_locus.nextc--; /* Remain on this line. */
6de9cd9a
DN
421 c = '\n';
422 }
423
424 return c;
425}
426
edf1eac2 427
6de9cd9a
DN
428/* Skip a comment. When we come here the parse pointer is positioned
429 immediately after the comment character. If we ever implement
430 compiler directives withing comments, here is where we parse the
431 directive. */
432
433static void
434skip_comment_line (void)
435{
436 char c;
437
438 do
439 {
440 c = next_char ();
441 }
442 while (c != '\n');
443
444 gfc_advance_line ();
445}
446
447
9e8a6720
FXC
448int
449gfc_define_undef_line (void)
450{
451 /* All lines beginning with '#' are either #define or #undef. */
452 if (debug_info_level != DINFO_LEVEL_VERBOSE || gfc_peek_char () != '#')
453 return 0;
454
455 if (strncmp (gfc_current_locus.nextc, "#define ", 8) == 0)
456 (*debug_hooks->define) (gfc_linebuf_linenum (gfc_current_locus.lb),
457 &(gfc_current_locus.nextc[8]));
458
459 if (strncmp (gfc_current_locus.nextc, "#undef ", 7) == 0)
460 (*debug_hooks->undef) (gfc_linebuf_linenum (gfc_current_locus.lb),
461 &(gfc_current_locus.nextc[7]));
462
463 /* Skip the rest of the line. */
464 skip_comment_line ();
465
466 return 1;
467}
468
469
6de9cd9a 470/* Comment lines are null lines, lines containing only blanks or lines
0d3abf6f
JJ
471 on which the first nonblank line is a '!'.
472 Return true if !$ openmp conditional compilation sentinel was
473 seen. */
6de9cd9a 474
0d3abf6f 475static bool
6de9cd9a
DN
476skip_free_comments (void)
477{
478 locus start;
479 char c;
6c7a4dfd 480 int at_bol;
6de9cd9a
DN
481
482 for (;;)
483 {
6c7a4dfd 484 at_bol = gfc_at_bol ();
63645982 485 start = gfc_current_locus;
6de9cd9a
DN
486 if (gfc_at_eof ())
487 break;
488
489 do
6c7a4dfd 490 c = next_char ();
6de9cd9a
DN
491 while (gfc_is_whitespace (c));
492
493 if (c == '\n')
494 {
495 gfc_advance_line ();
496 continue;
497 }
498
499 if (c == '!')
500 {
6c7a4dfd
JJ
501 /* If -fopenmp, we need to handle here 2 things:
502 1) don't treat !$omp as comments, but directives
503 2) handle OpenMP conditional compilation, where
504 !$ should be treated as 2 spaces (for initial lines
505 only if followed by space). */
506 if (gfc_option.flag_openmp && at_bol)
507 {
508 locus old_loc = gfc_current_locus;
509 if (next_char () == '$')
510 {
511 c = next_char ();
512 if (c == 'o' || c == 'O')
513 {
514 if (((c = next_char ()) == 'm' || c == 'M')
9fa6cfec 515 && ((c = next_char ()) == 'p' || c == 'P'))
6c7a4dfd 516 {
9fa6cfec 517 if ((c = next_char ()) == ' ' || continue_flag)
6c7a4dfd 518 {
9fa6cfec
TB
519 while (gfc_is_whitespace (c))
520 c = next_char ();
521 if (c != '\n' && c != '!')
522 {
523 openmp_flag = 1;
524 openmp_locus = old_loc;
525 gfc_current_locus = start;
526 return false;
527 }
6c7a4dfd 528 }
9fa6cfec
TB
529 else
530 gfc_warning_now ("!$OMP at %C starts a commented "
531 "line as it neither is followed "
532 "by a space nor is a "
533 "continuation line");
6c7a4dfd
JJ
534 }
535 gfc_current_locus = old_loc;
536 next_char ();
537 c = next_char ();
538 }
539 if (continue_flag || c == ' ')
540 {
541 gfc_current_locus = old_loc;
542 next_char ();
b30c6a0d 543 openmp_flag = 0;
0d3abf6f 544 return true;
6c7a4dfd
JJ
545 }
546 }
547 gfc_current_locus = old_loc;
548 }
6de9cd9a
DN
549 skip_comment_line ();
550 continue;
551 }
552
553 break;
554 }
555
6c7a4dfd
JJ
556 if (openmp_flag && at_bol)
557 openmp_flag = 0;
63645982 558 gfc_current_locus = start;
0d3abf6f 559 return false;
6de9cd9a
DN
560}
561
562
563/* Skip comment lines in fixed source mode. We have the same rules as
564 in skip_free_comment(), except that we can have a 'c', 'C' or '*'
e0bcf78c
TS
565 in column 1, and a '!' cannot be in column 6. Also, we deal with
566 lines with 'd' or 'D' in column 1, if the user requested this. */
6de9cd9a
DN
567
568static void
569skip_fixed_comments (void)
570{
571 locus start;
572 int col;
573 char c;
574
6c7a4dfd
JJ
575 if (! gfc_at_bol ())
576 {
577 start = gfc_current_locus;
578 if (! gfc_at_eof ())
579 {
580 do
581 c = next_char ();
582 while (gfc_is_whitespace (c));
583
584 if (c == '\n')
585 gfc_advance_line ();
586 else if (c == '!')
587 skip_comment_line ();
588 }
589
590 if (! gfc_at_bol ())
591 {
592 gfc_current_locus = start;
593 return;
594 }
595 }
596
6de9cd9a
DN
597 for (;;)
598 {
63645982 599 start = gfc_current_locus;
6de9cd9a
DN
600 if (gfc_at_eof ())
601 break;
602
603 c = next_char ();
604 if (c == '\n')
605 {
606 gfc_advance_line ();
607 continue;
608 }
609
610 if (c == '!' || c == 'c' || c == 'C' || c == '*')
611 {
6c7a4dfd
JJ
612 /* If -fopenmp, we need to handle here 2 things:
613 1) don't treat !$omp|c$omp|*$omp as comments, but directives
614 2) handle OpenMP conditional compilation, where
615 !$|c$|*$ should be treated as 2 spaces if the characters
616 in columns 3 to 6 are valid fixed form label columns
617 characters. */
618 if (gfc_option.flag_openmp)
619 {
620 if (next_char () == '$')
621 {
622 c = next_char ();
623 if (c == 'o' || c == 'O')
624 {
625 if (((c = next_char ()) == 'm' || c == 'M')
626 && ((c = next_char ()) == 'p' || c == 'P'))
627 {
628 c = next_char ();
629 if (c != '\n'
630 && ((openmp_flag && continue_flag)
631 || c == ' ' || c == '0'))
632 {
633 c = next_char ();
634 while (gfc_is_whitespace (c))
635 c = next_char ();
636 if (c != '\n' && c != '!')
637 {
638 /* Canonicalize to *$omp. */
639 *start.nextc = '*';
640 openmp_flag = 1;
641 gfc_current_locus = start;
642 return;
643 }
644 }
645 }
646 }
647 else
648 {
649 int digit_seen = 0;
650
651 for (col = 3; col < 6; col++, c = next_char ())
652 if (c == ' ')
653 continue;
654 else if (c < '0' || c > '9')
655 break;
656 else
657 digit_seen = 1;
658
659 if (col == 6 && c != '\n'
660 && ((continue_flag && !digit_seen)
661 || c == ' ' || c == '0'))
662 {
663 gfc_current_locus = start;
664 start.nextc[0] = ' ';
665 start.nextc[1] = ' ';
666 continue;
667 }
668 }
669 }
670 gfc_current_locus = start;
671 }
6de9cd9a
DN
672 skip_comment_line ();
673 continue;
674 }
675
e0bcf78c
TS
676 if (gfc_option.flag_d_lines != -1 && (c == 'd' || c == 'D'))
677 {
678 if (gfc_option.flag_d_lines == 0)
679 {
680 skip_comment_line ();
681 continue;
682 }
683 else
684 *start.nextc = c = ' ';
685 }
686
6de9cd9a 687 col = 1;
e0bcf78c
TS
688
689 while (gfc_is_whitespace (c))
6de9cd9a
DN
690 {
691 c = next_char ();
692 col++;
693 }
6de9cd9a
DN
694
695 if (c == '\n')
696 {
697 gfc_advance_line ();
698 continue;
699 }
700
701 if (col != 6 && c == '!')
702 {
703 skip_comment_line ();
704 continue;
705 }
706
707 break;
708 }
709
6c7a4dfd 710 openmp_flag = 0;
63645982 711 gfc_current_locus = start;
6de9cd9a
DN
712}
713
714
6c7a4dfd 715/* Skips the current line if it is a comment. */
6de9cd9a
DN
716
717void
718gfc_skip_comments (void)
719{
6c7a4dfd 720 if (gfc_current_form == FORM_FREE)
6de9cd9a
DN
721 skip_free_comments ();
722 else
723 skip_fixed_comments ();
724}
725
726
727/* Get the next character from the input, taking continuation lines
728 and end-of-line comments into account. This implies that comment
729 lines between continued lines must be eaten here. For higher-level
730 subroutines, this flattens continued lines into a single logical
731 line. The in_string flag denotes whether we're inside a character
732 context or not. */
733
734int
735gfc_next_char_literal (int in_string)
736{
737 locus old_loc;
6c7a4dfd 738 int i, c, prev_openmp_flag;
6de9cd9a
DN
739
740 continue_flag = 0;
741
742restart:
743 c = next_char ();
744 if (gfc_at_end ())
5a06474c
JD
745 {
746 continue_count = 0;
747 return c;
748 }
6de9cd9a 749
d4fa05b9 750 if (gfc_current_form == FORM_FREE)
6de9cd9a 751 {
0d3abf6f
JJ
752 bool openmp_cond_flag;
753
6de9cd9a
DN
754 if (!in_string && c == '!')
755 {
6c7a4dfd
JJ
756 if (openmp_flag
757 && memcmp (&gfc_current_locus, &openmp_locus,
758 sizeof (gfc_current_locus)) == 0)
759 goto done;
760
6de9cd9a
DN
761 /* This line can't be continued */
762 do
763 {
764 c = next_char ();
765 }
766 while (c != '\n');
767
a34938be
RG
768 /* Avoid truncation warnings for comment ending lines. */
769 gfc_current_locus.lb->truncated = 0;
770
6de9cd9a
DN
771 goto done;
772 }
773
774 if (c != '&')
775 goto done;
776
777 /* If the next nonblank character is a ! or \n, we've got a
6c7a4dfd 778 continuation line. */
63645982 779 old_loc = gfc_current_locus;
6de9cd9a
DN
780
781 c = next_char ();
782 while (gfc_is_whitespace (c))
783 c = next_char ();
784
785 /* Character constants to be continued cannot have commentary
6c7a4dfd 786 after the '&'. */
6de9cd9a
DN
787
788 if (in_string && c != '\n')
789 {
63645982 790 gfc_current_locus = old_loc;
6de9cd9a
DN
791 c = '&';
792 goto done;
793 }
794
795 if (c != '!' && c != '\n')
796 {
63645982 797 gfc_current_locus = old_loc;
6de9cd9a
DN
798 c = '&';
799 goto done;
800 }
801
6c7a4dfd 802 prev_openmp_flag = openmp_flag;
6de9cd9a
DN
803 continue_flag = 1;
804 if (c == '!')
805 skip_comment_line ();
806 else
807 gfc_advance_line ();
0267ffdc
JD
808
809 if (gfc_at_eof())
810 goto not_continuation;
6de9cd9a 811
5a06474c
JD
812 /* We've got a continuation line. If we are on the very next line after
813 the last continuation, increment the continuation line count and
814 check whether the limit has been exceeded. */
5ffeb913 815 if (gfc_linebuf_linenum (gfc_current_locus.lb) == continue_line + 1)
5a06474c
JD
816 {
817 if (++continue_count == gfc_option.max_continue_free)
818 {
edf1eac2
SK
819 if (gfc_notification_std (GFC_STD_GNU) || pedantic)
820 gfc_warning ("Limit of %d continuations exceeded in "
821 "statement at %C", gfc_option.max_continue_free);
5a06474c
JD
822 }
823 }
5ffeb913 824 continue_line = gfc_linebuf_linenum (gfc_current_locus.lb);
5a06474c
JD
825
826 /* Now find where it continues. First eat any comment lines. */
0d3abf6f 827 openmp_cond_flag = skip_free_comments ();
6de9cd9a 828
6c7a4dfd
JJ
829 if (prev_openmp_flag != openmp_flag)
830 {
831 gfc_current_locus = old_loc;
832 openmp_flag = prev_openmp_flag;
833 c = '&';
834 goto done;
835 }
836
6de9cd9a 837 /* Now that we have a non-comment line, probe ahead for the
6c7a4dfd
JJ
838 first non-whitespace character. If it is another '&', then
839 reading starts at the next character, otherwise we must back
840 up to where the whitespace started and resume from there. */
6de9cd9a 841
63645982 842 old_loc = gfc_current_locus;
6de9cd9a
DN
843
844 c = next_char ();
845 while (gfc_is_whitespace (c))
846 c = next_char ();
847
6c7a4dfd
JJ
848 if (openmp_flag)
849 {
850 for (i = 0; i < 5; i++, c = next_char ())
851 {
852 gcc_assert (TOLOWER (c) == "!$omp"[i]);
853 if (i == 4)
854 old_loc = gfc_current_locus;
855 }
856 while (gfc_is_whitespace (c))
857 c = next_char ();
858 }
859
6de9cd9a 860 if (c != '&')
3fbab549 861 {
5a06474c
JD
862 if (in_string)
863 {
864 if (gfc_option.warn_ampersand)
edf1eac2
SK
865 gfc_warning_now ("Missing '&' in continued character "
866 "constant at %C");
5a06474c
JD
867 gfc_current_locus.nextc--;
868 }
0d3abf6f
JJ
869 /* Both !$omp and !$ -fopenmp continuation lines have & on the
870 continuation line only optionally. */
871 else if (openmp_flag || openmp_cond_flag)
872 gfc_current_locus.nextc--;
5a06474c
JD
873 else
874 {
875 c = ' ';
876 gfc_current_locus = old_loc;
877 goto done;
878 }
3fbab549 879 }
6de9cd9a
DN
880 }
881 else
882 {
883 /* Fixed form continuation. */
884 if (!in_string && c == '!')
885 {
886 /* Skip comment at end of line. */
887 do
888 {
889 c = next_char ();
890 }
891 while (c != '\n');
a34938be
RG
892
893 /* Avoid truncation warnings for comment ending lines. */
894 gfc_current_locus.lb->truncated = 0;
6de9cd9a
DN
895 }
896
897 if (c != '\n')
898 goto done;
899
6c7a4dfd 900 prev_openmp_flag = openmp_flag;
6de9cd9a 901 continue_flag = 1;
63645982 902 old_loc = gfc_current_locus;
6de9cd9a
DN
903
904 gfc_advance_line ();
0d3abf6f 905 skip_fixed_comments ();
6de9cd9a
DN
906
907 /* See if this line is a continuation line. */
6c7a4dfd 908 if (openmp_flag != prev_openmp_flag)
6de9cd9a 909 {
6c7a4dfd
JJ
910 openmp_flag = prev_openmp_flag;
911 goto not_continuation;
6de9cd9a
DN
912 }
913
6c7a4dfd
JJ
914 if (!openmp_flag)
915 for (i = 0; i < 5; i++)
916 {
917 c = next_char ();
918 if (c != ' ')
919 goto not_continuation;
920 }
921 else
922 for (i = 0; i < 5; i++)
923 {
924 c = next_char ();
925 if (TOLOWER (c) != "*$omp"[i])
926 goto not_continuation;
927 }
928
6de9cd9a 929 c = next_char ();
6c7a4dfd 930 if (c == '0' || c == ' ' || c == '\n')
6de9cd9a 931 goto not_continuation;
5a06474c
JD
932
933 /* We've got a continuation line. If we are on the very next line after
934 the last continuation, increment the continuation line count and
935 check whether the limit has been exceeded. */
5ffeb913 936 if (gfc_linebuf_linenum (gfc_current_locus.lb) == continue_line + 1)
5a06474c
JD
937 {
938 if (++continue_count == gfc_option.max_continue_fixed)
939 {
edf1eac2
SK
940 if (gfc_notification_std (GFC_STD_GNU) || pedantic)
941 gfc_warning ("Limit of %d continuations exceeded in "
942 "statement at %C",
943 gfc_option.max_continue_fixed);
5a06474c
JD
944 }
945 }
946
5ffeb913
TT
947 if (continue_line < gfc_linebuf_linenum (gfc_current_locus.lb))
948 continue_line = gfc_linebuf_linenum (gfc_current_locus.lb);
6de9cd9a
DN
949 }
950
951 /* Ready to read first character of continuation line, which might
952 be another continuation line! */
953 goto restart;
954
955not_continuation:
956 c = '\n';
63645982 957 gfc_current_locus = old_loc;
6de9cd9a
DN
958
959done:
5a06474c
JD
960 if (c == '\n')
961 continue_count = 0;
6de9cd9a
DN
962 continue_flag = 0;
963 return c;
964}
965
966
967/* Get the next character of input, folded to lowercase. In fixed
968 form mode, we also ignore spaces. When matcher subroutines are
969 parsing character literals, they have to call
970 gfc_next_char_literal(). */
971
972int
973gfc_next_char (void)
974{
975 int c;
976
977 do
978 {
979 c = gfc_next_char_literal (0);
980 }
d4fa05b9 981 while (gfc_current_form == FORM_FIXED && gfc_is_whitespace (c));
6de9cd9a
DN
982
983 return TOLOWER (c);
984}
985
986
987int
988gfc_peek_char (void)
989{
990 locus old_loc;
991 int c;
992
63645982 993 old_loc = gfc_current_locus;
6de9cd9a 994 c = gfc_next_char ();
63645982 995 gfc_current_locus = old_loc;
6de9cd9a
DN
996
997 return c;
998}
999
1000
1001/* Recover from an error. We try to get past the current statement
1002 and get lined up for the next. The next statement follows a '\n'
1003 or a ';'. We also assume that we are not within a character
1004 constant, and deal with finding a '\'' or '"'. */
1005
1006void
1007gfc_error_recovery (void)
1008{
1009 char c, delim;
1010
1011 if (gfc_at_eof ())
1012 return;
1013
1014 for (;;)
1015 {
1016 c = gfc_next_char ();
1017 if (c == '\n' || c == ';')
1018 break;
1019
1020 if (c != '\'' && c != '"')
1021 {
1022 if (gfc_at_eof ())
1023 break;
1024 continue;
1025 }
1026 delim = c;
1027
1028 for (;;)
1029 {
1030 c = next_char ();
1031
1032 if (c == delim)
1033 break;
1034 if (c == '\n')
ba1defa5 1035 return;
6de9cd9a
DN
1036 if (c == '\\')
1037 {
1038 c = next_char ();
1039 if (c == '\n')
ba1defa5 1040 return;
6de9cd9a
DN
1041 }
1042 }
1043 if (gfc_at_eof ())
1044 break;
1045 }
6de9cd9a
DN
1046}
1047
1048
1049/* Read ahead until the next character to be read is not whitespace. */
1050
1051void
1052gfc_gobble_whitespace (void)
1053{
840bd9f7 1054 static int linenum = 0;
6de9cd9a
DN
1055 locus old_loc;
1056 int c;
1057
1058 do
1059 {
63645982 1060 old_loc = gfc_current_locus;
6de9cd9a 1061 c = gfc_next_char_literal (0);
840bd9f7
SK
1062 /* Issue a warning for nonconforming tabs. We keep track of the line
1063 number because the Fortran matchers will often back up and the same
1064 line will be scanned multiple times. */
45a82bd9 1065 if (!gfc_option.warn_tabs && c == '\t')
840bd9f7 1066 {
45a82bd9
PB
1067#ifdef USE_MAPPED_LOCATION
1068 int cur_linenum = LOCATION_LINE (gfc_current_locus.lb->location);
1069#else
1070 int cur_linenum = gfc_current_locus.lb->linenum;
1071#endif
1072 if (cur_linenum != linenum)
1073 {
1074 linenum = cur_linenum;
1075 gfc_warning_now ("Nonconforming tab character at %C");
1076 }
840bd9f7 1077 }
6de9cd9a
DN
1078 }
1079 while (gfc_is_whitespace (c));
1080
63645982 1081 gfc_current_locus = old_loc;
6de9cd9a
DN
1082}
1083
1084
f56c5d5d
TS
1085/* Load a single line into pbuf.
1086
1087 If pbuf points to a NULL pointer, it is allocated.
1088 We truncate lines that are too long, unless we're dealing with
1089 preprocessor lines or if the option -ffixed-line-length-none is set,
1090 in which case we reallocate the buffer to fit the entire line, if
1091 need be.
1092 In fixed mode, we expand a tab that occurs within the statement
1093 label region to expand to spaces that leave the next character in
ba1defa5 1094 the source region.
1526c4b5
JD
1095 load_line returns whether the line was truncated.
1096
1097 NOTE: The error machinery isn't available at this point, so we can't
1098 easily report line and column numbers consistent with other
1099 parts of gfortran. */
6de9cd9a 1100
ba1defa5 1101static int
edf1eac2 1102load_line (FILE *input, char **pbuf, int *pbuflen)
6de9cd9a 1103{
840bd9f7 1104 static int linenum = 0, current_line = 1;
d1e3d6ae 1105 int c, maxlen, i, preprocessor_flag, buflen = *pbuflen;
840bd9f7 1106 int trunc_flag = 0, seen_comment = 0;
1526c4b5 1107 int seen_printable = 0, seen_ampersand = 0;
f56c5d5d
TS
1108 char *buffer;
1109
1dde8683 1110 /* Determine the maximum allowed line length. */
f56c5d5d 1111 if (gfc_current_form == FORM_FREE)
1dde8683 1112 maxlen = gfc_option.free_line_length;
16ab8e74 1113 else if (gfc_current_form == FORM_FIXED)
1dde8683 1114 maxlen = gfc_option.fixed_line_length;
f56c5d5d 1115 else
16ab8e74 1116 maxlen = 72;
f56c5d5d
TS
1117
1118 if (*pbuf == NULL)
1119 {
1dde8683
BM
1120 /* Allocate the line buffer, storing its length into buflen.
1121 Note that if maxlen==0, indicating that arbitrary-length lines
1122 are allowed, the buffer will be reallocated if this length is
1123 insufficient; since 132 characters is the length of a standard
1124 free-form line, we use that as a starting guess. */
f56c5d5d
TS
1125 if (maxlen > 0)
1126 buflen = maxlen;
1127 else
1dde8683 1128 buflen = 132;
6de9cd9a 1129
f56c5d5d
TS
1130 *pbuf = gfc_getmem (buflen + 1);
1131 }
6de9cd9a
DN
1132
1133 i = 0;
f56c5d5d 1134 buffer = *pbuf;
6de9cd9a 1135
fa841200 1136 preprocessor_flag = 0;
c4da1827 1137 c = getc (input);
fa841200 1138 if (c == '#')
f56c5d5d
TS
1139 /* In order to not truncate preprocessor lines, we have to
1140 remember that this is one. */
fa841200
TS
1141 preprocessor_flag = 1;
1142 ungetc (c, input);
1143
6de9cd9a
DN
1144 for (;;)
1145 {
c4da1827 1146 c = getc (input);
6de9cd9a
DN
1147
1148 if (c == EOF)
1149 break;
1150 if (c == '\n')
1526c4b5
JD
1151 {
1152 /* Check for illegal use of ampersand. See F95 Standard 3.3.1.3. */
1153 if (gfc_current_form == FORM_FREE
c284e499 1154 && !seen_printable && seen_ampersand)
1526c4b5
JD
1155 {
1156 if (pedantic)
edf1eac2
SK
1157 gfc_error_now ("'&' not allowed by itself in line %d",
1158 current_line);
1526c4b5 1159 else
edf1eac2
SK
1160 gfc_warning_now ("'&' not allowed by itself in line %d",
1161 current_line);
1526c4b5
JD
1162 }
1163 break;
1164 }
6de9cd9a
DN
1165
1166 if (c == '\r')
d4fa05b9 1167 continue; /* Gobble characters. */
6de9cd9a
DN
1168 if (c == '\0')
1169 continue;
1170
1526c4b5 1171 if (c == '&')
1526c4b5 1172 {
c284e499
JD
1173 if (seen_ampersand)
1174 seen_ampersand = 0;
1526c4b5 1175 else
c284e499 1176 seen_ampersand = 1;
1526c4b5
JD
1177 }
1178
bd5db9de 1179 if ((c != '&' && c != '!' && c != ' ') || (c == '!' && !seen_ampersand))
c284e499
JD
1180 seen_printable = 1;
1181
840bd9f7
SK
1182 /* Is this a fixed-form comment? */
1183 if (gfc_current_form == FORM_FIXED && i == 0
1184 && (c == '*' || c == 'c' || c == 'd'))
1185 seen_comment = 1;
1186
d4fa05b9 1187 if (gfc_current_form == FORM_FIXED && c == '\t' && i <= 6)
840bd9f7 1188 {
840bd9f7
SK
1189 if (!gfc_option.warn_tabs && seen_comment == 0
1190 && current_line != linenum)
1191 {
1192 linenum = current_line;
edf1eac2
SK
1193 gfc_warning_now ("Nonconforming tab character in column 1 "
1194 "of line %d", linenum);
840bd9f7
SK
1195 }
1196
6de9cd9a
DN
1197 while (i <= 6)
1198 {
1199 *buffer++ = ' ';
1200 i++;
1201 }
1202
1203 continue;
1204 }
1205
1206 *buffer++ = c;
1207 i++;
1208
d1e3d6ae 1209 if (maxlen == 0 || preprocessor_flag)
f56c5d5d 1210 {
d1e3d6ae
JJ
1211 if (i >= buflen)
1212 {
1213 /* Reallocate line buffer to double size to hold the
3fbab549 1214 overlong line. */
d1e3d6ae
JJ
1215 buflen = buflen * 2;
1216 *pbuf = xrealloc (*pbuf, buflen + 1);
edf1eac2 1217 buffer = (*pbuf) + i;
d1e3d6ae 1218 }
f56c5d5d 1219 }
d1e3d6ae 1220 else if (i >= maxlen)
16ab8e74 1221 {
f56c5d5d 1222 /* Truncate the rest of the line. */
6de9cd9a
DN
1223 for (;;)
1224 {
c4da1827 1225 c = getc (input);
6de9cd9a
DN
1226 if (c == '\n' || c == EOF)
1227 break;
a34938be
RG
1228
1229 trunc_flag = 1;
6de9cd9a
DN
1230 }
1231
1232 ungetc ('\n', input);
1233 }
1234 }
1235
f56c5d5d
TS
1236 /* Pad lines to the selected line length in fixed form. */
1237 if (gfc_current_form == FORM_FIXED
043c2d9e 1238 && gfc_option.fixed_line_length != 0
f56c5d5d
TS
1239 && !preprocessor_flag
1240 && c != EOF)
043c2d9e
BF
1241 {
1242 while (i++ < maxlen)
1243 *buffer++ = ' ';
1244 }
f56c5d5d 1245
6de9cd9a 1246 *buffer = '\0';
d1e3d6ae 1247 *pbuflen = buflen;
840bd9f7 1248 current_line++;
ba1defa5
RG
1249
1250 return trunc_flag;
6de9cd9a
DN
1251}
1252
1253
d4fa05b9
TS
1254/* Get a gfc_file structure, initialize it and add it to
1255 the file stack. */
1256
1257static gfc_file *
e0bcf78c 1258get_file (const char *name, enum lc_reason reason ATTRIBUTE_UNUSED)
d4fa05b9
TS
1259{
1260 gfc_file *f;
1261
1262 f = gfc_getmem (sizeof (gfc_file));
1263
1264 f->filename = gfc_getmem (strlen (name) + 1);
1265 strcpy (f->filename, name);
1266
1267 f->next = file_head;
1268 file_head = f;
1269
60332588 1270 f->up = current_file;
d4fa05b9 1271 if (current_file != NULL)
1b271c9b 1272 f->inclusion_line = current_file->line;
d4fa05b9 1273
c8cc8542 1274#ifdef USE_MAPPED_LOCATION
5ffeb913 1275 linemap_add (line_table, reason, false, f->filename, 1);
c8cc8542
PB
1276#endif
1277
d4fa05b9
TS
1278 return f;
1279}
1280
1281/* Deal with a line from the C preprocessor. The
1282 initial octothorp has already been seen. */
6de9cd9a
DN
1283
1284static void
d4fa05b9 1285preprocessor_line (char *c)
6de9cd9a 1286{
d4fa05b9
TS
1287 bool flag[5];
1288 int i, line;
1289 char *filename;
1290 gfc_file *f;
2d7c7df6 1291 int escaped, unescape;
6de9cd9a 1292
d4fa05b9
TS
1293 c++;
1294 while (*c == ' ' || *c == '\t')
1295 c++;
6de9cd9a 1296
d4fa05b9 1297 if (*c < '0' || *c > '9')
fa841200 1298 goto bad_cpp_line;
6de9cd9a 1299
d4fa05b9
TS
1300 line = atoi (c);
1301
4c3a6ca1 1302 c = strchr (c, ' ');
fa841200 1303 if (c == NULL)
4c3a6ca1
JJ
1304 {
1305 /* No file name given. Set new line number. */
1306 current_file->line = line;
1307 return;
1308 }
d7d528c8
ES
1309
1310 /* Skip spaces. */
1311 while (*c == ' ' || *c == '\t')
1312 c++;
1313
1314 /* Skip quote. */
1315 if (*c != '"')
fa841200 1316 goto bad_cpp_line;
d7d528c8
ES
1317 ++c;
1318
d4fa05b9
TS
1319 filename = c;
1320
d7d528c8 1321 /* Make filename end at quote. */
2d7c7df6 1322 unescape = 0;
d7d528c8 1323 escaped = false;
edf1eac2 1324 while (*c && ! (!escaped && *c == '"'))
d7d528c8
ES
1325 {
1326 if (escaped)
edf1eac2 1327 escaped = false;
2d7c7df6
JJ
1328 else if (*c == '\\')
1329 {
1330 escaped = true;
1331 unescape++;
1332 }
d7d528c8
ES
1333 ++c;
1334 }
1335
1336 if (! *c)
fa841200
TS
1337 /* Preprocessor line has no closing quote. */
1338 goto bad_cpp_line;
d7d528c8 1339
d4fa05b9
TS
1340 *c++ = '\0';
1341
2d7c7df6
JJ
1342 /* Undo effects of cpp_quote_string. */
1343 if (unescape)
1344 {
1345 char *s = filename;
1346 char *d = gfc_getmem (c - filename - unescape);
d7d528c8 1347
2d7c7df6
JJ
1348 filename = d;
1349 while (*s)
1350 {
1351 if (*s == '\\')
1352 *d++ = *++s;
1353 else
1354 *d++ = *s;
1355 s++;
1356 }
1357 *d = '\0';
1358 }
d7d528c8 1359
d4fa05b9 1360 /* Get flags. */
4c3a6ca1 1361
1e39a151 1362 flag[1] = flag[2] = flag[3] = flag[4] = false;
6de9cd9a 1363
6de9cd9a
DN
1364 for (;;)
1365 {
d4fa05b9
TS
1366 c = strchr (c, ' ');
1367 if (c == NULL)
1368 break;
6de9cd9a 1369
d4fa05b9
TS
1370 c++;
1371 i = atoi (c);
6de9cd9a 1372
d4fa05b9
TS
1373 if (1 <= i && i <= 4)
1374 flag[i] = true;
1375 }
4c3a6ca1 1376
d4fa05b9 1377 /* Interpret flags. */
4c3a6ca1 1378
94b00ee4 1379 if (flag[1]) /* Starting new file. */
d4fa05b9 1380 {
c8cc8542 1381 f = get_file (filename, LC_RENAME);
1b271c9b 1382 add_file_change (f->filename, f->inclusion_line);
d4fa05b9
TS
1383 current_file = f;
1384 }
4c3a6ca1 1385
d4fa05b9
TS
1386 if (flag[2]) /* Ending current file. */
1387 {
94b00ee4
JJ
1388 if (!current_file->up
1389 || strcmp (current_file->up->filename, filename) != 0)
4c3a6ca1
JJ
1390 {
1391 gfc_warning_now ("%s:%d: file %s left but not entered",
1392 current_file->filename, current_file->line,
1393 filename);
2d7c7df6
JJ
1394 if (unescape)
1395 gfc_free (filename);
4c3a6ca1
JJ
1396 return;
1397 }
ee07457b 1398
1b271c9b 1399 add_file_change (NULL, line);
94b00ee4 1400 current_file = current_file->up;
ee07457b
FXC
1401#ifdef USE_MAPPED_LOCATION
1402 linemap_add (line_table, LC_RENAME, false, current_file->filename,
1403 current_file->line);
1404#endif
d4fa05b9 1405 }
4c3a6ca1 1406
d4fa05b9
TS
1407 /* The name of the file can be a temporary file produced by
1408 cpp. Replace the name if it is different. */
4c3a6ca1 1409
d4fa05b9
TS
1410 if (strcmp (current_file->filename, filename) != 0)
1411 {
1412 gfc_free (current_file->filename);
1413 current_file->filename = gfc_getmem (strlen (filename) + 1);
1414 strcpy (current_file->filename, filename);
1415 }
fa841200 1416
4c3a6ca1
JJ
1417 /* Set new line number. */
1418 current_file->line = line;
2d7c7df6
JJ
1419 if (unescape)
1420 gfc_free (filename);
fa841200
TS
1421 return;
1422
1423 bad_cpp_line:
4c3a6ca1 1424 gfc_warning_now ("%s:%d: Illegal preprocessor directive",
fa841200
TS
1425 current_file->filename, current_file->line);
1426 current_file->line++;
d4fa05b9
TS
1427}
1428
1429
e0bcf78c 1430static try load_file (const char *, bool);
d4fa05b9
TS
1431
1432/* include_line()-- Checks a line buffer to see if it is an include
1433 line. If so, we call load_file() recursively to load the included
1434 file. We never return a syntax error because a statement like
1435 "include = 5" is perfectly legal. We return false if no include was
1436 processed or true if we matched an include. */
1437
1438static bool
1439include_line (char *line)
1440{
1441 char quote, *c, *begin, *stop;
9b9e4cd6 1442
d4fa05b9 1443 c = line;
9b9e4cd6
JJ
1444
1445 if (gfc_option.flag_openmp)
1446 {
1447 if (gfc_current_form == FORM_FREE)
1448 {
1449 while (*c == ' ' || *c == '\t')
1450 c++;
1451 if (*c == '!' && c[1] == '$' && (c[2] == ' ' || c[2] == '\t'))
1452 c += 3;
1453 }
1454 else
1455 {
1456 if ((*c == '!' || *c == 'c' || *c == 'C' || *c == '*')
1457 && c[1] == '$' && (c[2] == ' ' || c[2] == '\t'))
1458 c += 3;
1459 }
1460 }
1461
d4fa05b9
TS
1462 while (*c == ' ' || *c == '\t')
1463 c++;
1464
1465 if (strncasecmp (c, "include", 7))
1466 return false;
1467
1468 c += 7;
1469 while (*c == ' ' || *c == '\t')
1470 c++;
1471
1472 /* Find filename between quotes. */
1473
1474 quote = *c++;
1475 if (quote != '"' && quote != '\'')
1476 return false;
1477
1478 begin = c;
1479
1480 while (*c != quote && *c != '\0')
1481 c++;
1482
1483 if (*c == '\0')
1484 return false;
1485
1486 stop = c++;
1487
1488 while (*c == ' ' || *c == '\t')
1489 c++;
1490
1491 if (*c != '\0' && *c != '!')
1492 return false;
1493
f7b529fa 1494 /* We have an include line at this point. */
d4fa05b9
TS
1495
1496 *stop = '\0'; /* It's ok to trash the buffer, as this line won't be
1497 read by anything else. */
1498
1499 load_file (begin, false);
1500 return true;
1501}
1502
edf1eac2 1503
d4fa05b9
TS
1504/* Load a file into memory by calling load_line until the file ends. */
1505
1506static try
e0bcf78c 1507load_file (const char *filename, bool initial)
d4fa05b9 1508{
f56c5d5d 1509 char *line;
d4fa05b9
TS
1510 gfc_linebuf *b;
1511 gfc_file *f;
1512 FILE *input;
d1e3d6ae 1513 int len, line_len;
caef7872 1514 bool first_line;
d4fa05b9
TS
1515
1516 for (f = current_file; f; f = f->up)
1517 if (strcmp (filename, f->filename) == 0)
1518 {
1519 gfc_error_now ("File '%s' is being included recursively", filename);
1520 return FAILURE;
1521 }
1522
1523 if (initial)
1524 {
2d7c7df6
JJ
1525 if (gfc_src_file)
1526 {
1527 input = gfc_src_file;
1528 gfc_src_file = NULL;
1529 }
1530 else
1531 input = gfc_open_file (filename);
d4fa05b9
TS
1532 if (input == NULL)
1533 {
1534 gfc_error_now ("Can't open file '%s'", filename);
1535 return FAILURE;
1536 }
1537 }
1538 else
1539 {
31198773 1540 input = gfc_open_included_file (filename, false, false);
d4fa05b9
TS
1541 if (input == NULL)
1542 {
1543 gfc_error_now ("Can't open included file '%s'", filename);
1544 return FAILURE;
1545 }
1546 }
1547
1548 /* Load the file. */
1549
c8cc8542 1550 f = get_file (filename, initial ? LC_RENAME : LC_ENTER);
1b271c9b
JJ
1551 if (!initial)
1552 add_file_change (f->filename, f->inclusion_line);
d4fa05b9
TS
1553 current_file = f;
1554 current_file->line = 1;
f56c5d5d 1555 line = NULL;
d1e3d6ae 1556 line_len = 0;
caef7872 1557 first_line = true;
d4fa05b9 1558
2d7c7df6
JJ
1559 if (initial && gfc_src_preprocessor_lines[0])
1560 {
1561 preprocessor_line (gfc_src_preprocessor_lines[0]);
1562 gfc_free (gfc_src_preprocessor_lines[0]);
1563 gfc_src_preprocessor_lines[0] = NULL;
1564 if (gfc_src_preprocessor_lines[1])
1565 {
1566 preprocessor_line (gfc_src_preprocessor_lines[1]);
1567 gfc_free (gfc_src_preprocessor_lines[1]);
1568 gfc_src_preprocessor_lines[1] = NULL;
1569 }
1570 }
1571
16ab8e74 1572 for (;;)
d4fa05b9 1573 {
d1e3d6ae 1574 int trunc = load_line (input, &line, &line_len);
d4fa05b9
TS
1575
1576 len = strlen (line);
6de9cd9a
DN
1577 if (feof (input) && len == 0)
1578 break;
1579
caef7872
FXC
1580 /* If this is the first line of the file, it can contain a byte
1581 order mark (BOM), which we will ignore:
1582 FF FE is UTF-16 little endian,
1583 FE FF is UTF-16 big endian,
1584 EF BB BF is UTF-8. */
1585 if (first_line
1586 && ((line_len >= 2 && line[0] == '\xFF' && line[1] == '\xFE')
1587 || (line_len >= 2 && line[0] == '\xFE' && line[1] == '\xFF')
1588 || (line_len >= 3 && line[0] == '\xEF' && line[1] == '\xBB'
1589 && line[2] == '\xBF')))
1590 {
1591 int n = line[1] == '\xBB' ? 3 : 2;
1592 char * new = gfc_getmem (line_len);
1593
1594 strcpy (new, line + n);
1595 gfc_free (line);
1596 line = new;
1597 len -= n;
1598 }
1599
d4fa05b9
TS
1600 /* There are three things this line can be: a line of Fortran
1601 source, an include line or a C preprocessor directive. */
6de9cd9a 1602
d4fa05b9
TS
1603 if (line[0] == '#')
1604 {
9e8a6720
FXC
1605 /* When -g3 is specified, it's possible that we emit #define
1606 and #undef lines, which we need to pass to the middle-end
1607 so that it can emit correct debug info. */
1608 if (debug_info_level == DINFO_LEVEL_VERBOSE
1609 && (strncmp (line, "#define ", 8) == 0
1610 || strncmp (line, "#undef ", 7) == 0))
1611 ;
1612 else
1613 {
1614 preprocessor_line (line);
1615 continue;
1616 }
d4fa05b9 1617 }
6de9cd9a 1618
caef7872
FXC
1619 /* Preprocessed files have preprocessor lines added before the byte
1620 order mark, so first_line is not about the first line of the file
1621 but the first line that's not a preprocessor line. */
1622 first_line = false;
1623
d4fa05b9
TS
1624 if (include_line (line))
1625 {
1626 current_file->line++;
1627 continue;
6de9cd9a
DN
1628 }
1629
d4fa05b9
TS
1630 /* Add line. */
1631
4cdf7223 1632 b = gfc_getmem (gfc_linebuf_header_size + len + 1);
d4fa05b9 1633
c8cc8542
PB
1634#ifdef USE_MAPPED_LOCATION
1635 b->location
5ffeb913 1636 = linemap_line_start (line_table, current_file->line++, 120);
c8cc8542 1637#else
d4fa05b9 1638 b->linenum = current_file->line++;
c8cc8542 1639#endif
d4fa05b9 1640 b->file = current_file;
ba1defa5 1641 b->truncated = trunc;
d4fa05b9
TS
1642 strcpy (b->line, line);
1643
1644 if (line_head == NULL)
1645 line_head = b;
1646 else
1647 line_tail->next = b;
1648
1649 line_tail = b;
1b271c9b
JJ
1650
1651 while (file_changes_cur < file_changes_count)
1652 file_changes[file_changes_cur++].lb = b;
6de9cd9a 1653 }
d4fa05b9 1654
f56c5d5d
TS
1655 /* Release the line buffer allocated in load_line. */
1656 gfc_free (line);
1657
d4fa05b9
TS
1658 fclose (input);
1659
1b271c9b
JJ
1660 if (!initial)
1661 add_file_change (NULL, current_file->inclusion_line + 1);
d4fa05b9 1662 current_file = current_file->up;
c8cc8542 1663#ifdef USE_MAPPED_LOCATION
5ffeb913 1664 linemap_add (line_table, LC_LEAVE, 0, NULL, 0);
c8cc8542 1665#endif
d4fa05b9 1666 return SUCCESS;
6de9cd9a
DN
1667}
1668
1669
d4fa05b9
TS
1670/* Open a new file and start scanning from that file. Returns SUCCESS
1671 if everything went OK, FAILURE otherwise. If form == FORM_UKNOWN
1672 it tries to determine the source form from the filename, defaulting
1673 to free form. */
6de9cd9a
DN
1674
1675try
e0bcf78c 1676gfc_new_file (void)
6de9cd9a 1677{
d4fa05b9 1678 try result;
6de9cd9a 1679
d4fa05b9 1680 result = load_file (gfc_source_file, true);
6de9cd9a 1681
63645982
TS
1682 gfc_current_locus.lb = line_head;
1683 gfc_current_locus.nextc = (line_head == NULL) ? NULL : line_head->line;
6de9cd9a 1684
d4fa05b9
TS
1685#if 0 /* Debugging aid. */
1686 for (; line_head; line_head = line_head->next)
ee07457b 1687 gfc_status ("%s:%3d %s\n",
c8cc8542 1688#ifdef USE_MAPPED_LOCATION
ee07457b 1689 LOCATION_FILE (line_head->location),
c8cc8542
PB
1690 LOCATION_LINE (line_head->location),
1691#else
ee07457b 1692 line_head->file->filename,
c8cc8542
PB
1693 line_head->linenum,
1694#endif
1695 line_head->line);
6de9cd9a 1696
d4fa05b9
TS
1697 exit (0);
1698#endif
6de9cd9a 1699
d4fa05b9 1700 return result;
6de9cd9a 1701}
2d7c7df6
JJ
1702
1703static char *
1704unescape_filename (const char *ptr)
1705{
1706 const char *p = ptr, *s;
1707 char *d, *ret;
1708 int escaped, unescape = 0;
1709
1710 /* Make filename end at quote. */
1711 escaped = false;
1712 while (*p && ! (! escaped && *p == '"'))
1713 {
1714 if (escaped)
1715 escaped = false;
1716 else if (*p == '\\')
1717 {
1718 escaped = true;
1719 unescape++;
1720 }
1721 ++p;
1722 }
1723
edf1eac2 1724 if (!*p || p[1])
2d7c7df6
JJ
1725 return NULL;
1726
1727 /* Undo effects of cpp_quote_string. */
1728 s = ptr;
1729 d = gfc_getmem (p + 1 - ptr - unescape);
1730 ret = d;
1731
1732 while (s != p)
1733 {
1734 if (*s == '\\')
1735 *d++ = *++s;
1736 else
1737 *d++ = *s;
1738 s++;
1739 }
1740 *d = '\0';
1741 return ret;
1742}
1743
1744/* For preprocessed files, if the first tokens are of the form # NUM.
1745 handle the directives so we know the original file name. */
1746
1747const char *
1748gfc_read_orig_filename (const char *filename, const char **canon_source_file)
1749{
1750 int c, len;
1751 char *dirname;
1752
1753 gfc_src_file = gfc_open_file (filename);
1754 if (gfc_src_file == NULL)
1755 return NULL;
1756
c4da1827 1757 c = getc (gfc_src_file);
2d7c7df6
JJ
1758 ungetc (c, gfc_src_file);
1759
1760 if (c != '#')
1761 return NULL;
1762
1763 len = 0;
1764 load_line (gfc_src_file, &gfc_src_preprocessor_lines[0], &len);
1765
1766 if (strncmp (gfc_src_preprocessor_lines[0], "# 1 \"", 5) != 0)
1767 return NULL;
1768
1769 filename = unescape_filename (gfc_src_preprocessor_lines[0] + 5);
1770 if (filename == NULL)
1771 return NULL;
1772
c4da1827 1773 c = getc (gfc_src_file);
2d7c7df6
JJ
1774 ungetc (c, gfc_src_file);
1775
1776 if (c != '#')
1777 return filename;
1778
1779 len = 0;
1780 load_line (gfc_src_file, &gfc_src_preprocessor_lines[1], &len);
1781
1782 if (strncmp (gfc_src_preprocessor_lines[1], "# 1 \"", 5) != 0)
1783 return filename;
1784
1785 dirname = unescape_filename (gfc_src_preprocessor_lines[1] + 5);
1786 if (dirname == NULL)
1787 return filename;
1788
1789 len = strlen (dirname);
1790 if (len < 3 || dirname[len - 1] != '/' || dirname[len - 2] != '/')
1791 {
1792 gfc_free (dirname);
1793 return filename;
1794 }
1795 dirname[len - 2] = '\0';
1796 set_src_pwd (dirname);
1797
1798 if (! IS_ABSOLUTE_PATH (filename))
1799 {
1800 char *p = gfc_getmem (len + strlen (filename));
1801
1802 memcpy (p, dirname, len - 2);
1803 p[len - 2] = '/';
1804 strcpy (p + len - 1, filename);
1805 *canon_source_file = p;
1806 }
1807
1808 gfc_free (dirname);
1809 return filename;
1810}