]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/fortran/scanner.c
decl.c (rest_of_type_decl_compilation_no_defer): New local function used to process...
[thirdparty/gcc.git] / gcc / fortran / scanner.c
CommitLineData
6de9cd9a 1/* Character scanner.
835aac92 2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
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 1067 int cur_linenum = LOCATION_LINE (gfc_current_locus.lb->location);
45a82bd9
PB
1068 if (cur_linenum != linenum)
1069 {
1070 linenum = cur_linenum;
1071 gfc_warning_now ("Nonconforming tab character at %C");
1072 }
840bd9f7 1073 }
6de9cd9a
DN
1074 }
1075 while (gfc_is_whitespace (c));
1076
63645982 1077 gfc_current_locus = old_loc;
6de9cd9a
DN
1078}
1079
1080
f56c5d5d
TS
1081/* Load a single line into pbuf.
1082
1083 If pbuf points to a NULL pointer, it is allocated.
1084 We truncate lines that are too long, unless we're dealing with
1085 preprocessor lines or if the option -ffixed-line-length-none is set,
1086 in which case we reallocate the buffer to fit the entire line, if
1087 need be.
1088 In fixed mode, we expand a tab that occurs within the statement
1089 label region to expand to spaces that leave the next character in
ba1defa5 1090 the source region.
1526c4b5
JD
1091 load_line returns whether the line was truncated.
1092
1093 NOTE: The error machinery isn't available at this point, so we can't
1094 easily report line and column numbers consistent with other
1095 parts of gfortran. */
6de9cd9a 1096
ba1defa5 1097static int
edf1eac2 1098load_line (FILE *input, char **pbuf, int *pbuflen)
6de9cd9a 1099{
840bd9f7 1100 static int linenum = 0, current_line = 1;
d1e3d6ae 1101 int c, maxlen, i, preprocessor_flag, buflen = *pbuflen;
840bd9f7 1102 int trunc_flag = 0, seen_comment = 0;
1526c4b5 1103 int seen_printable = 0, seen_ampersand = 0;
f56c5d5d 1104 char *buffer;
fd1935d5 1105 bool found_tab = false;
f56c5d5d 1106
1dde8683 1107 /* Determine the maximum allowed line length. */
f56c5d5d 1108 if (gfc_current_form == FORM_FREE)
1dde8683 1109 maxlen = gfc_option.free_line_length;
16ab8e74 1110 else if (gfc_current_form == FORM_FIXED)
1dde8683 1111 maxlen = gfc_option.fixed_line_length;
f56c5d5d 1112 else
16ab8e74 1113 maxlen = 72;
f56c5d5d
TS
1114
1115 if (*pbuf == NULL)
1116 {
1dde8683
BM
1117 /* Allocate the line buffer, storing its length into buflen.
1118 Note that if maxlen==0, indicating that arbitrary-length lines
1119 are allowed, the buffer will be reallocated if this length is
1120 insufficient; since 132 characters is the length of a standard
1121 free-form line, we use that as a starting guess. */
f56c5d5d
TS
1122 if (maxlen > 0)
1123 buflen = maxlen;
1124 else
1dde8683 1125 buflen = 132;
6de9cd9a 1126
f56c5d5d
TS
1127 *pbuf = gfc_getmem (buflen + 1);
1128 }
6de9cd9a
DN
1129
1130 i = 0;
f56c5d5d 1131 buffer = *pbuf;
6de9cd9a 1132
fa841200 1133 preprocessor_flag = 0;
c4da1827 1134 c = getc (input);
fa841200 1135 if (c == '#')
f56c5d5d
TS
1136 /* In order to not truncate preprocessor lines, we have to
1137 remember that this is one. */
fa841200
TS
1138 preprocessor_flag = 1;
1139 ungetc (c, input);
1140
6de9cd9a
DN
1141 for (;;)
1142 {
c4da1827 1143 c = getc (input);
6de9cd9a
DN
1144
1145 if (c == EOF)
1146 break;
1147 if (c == '\n')
1526c4b5
JD
1148 {
1149 /* Check for illegal use of ampersand. See F95 Standard 3.3.1.3. */
1150 if (gfc_current_form == FORM_FREE
c284e499 1151 && !seen_printable && seen_ampersand)
1526c4b5
JD
1152 {
1153 if (pedantic)
edf1eac2
SK
1154 gfc_error_now ("'&' not allowed by itself in line %d",
1155 current_line);
1526c4b5 1156 else
edf1eac2
SK
1157 gfc_warning_now ("'&' not allowed by itself in line %d",
1158 current_line);
1526c4b5
JD
1159 }
1160 break;
1161 }
6de9cd9a
DN
1162
1163 if (c == '\r')
d4fa05b9 1164 continue; /* Gobble characters. */
6de9cd9a
DN
1165 if (c == '\0')
1166 continue;
1167
1526c4b5 1168 if (c == '&')
1526c4b5 1169 {
c284e499
JD
1170 if (seen_ampersand)
1171 seen_ampersand = 0;
1526c4b5 1172 else
c284e499 1173 seen_ampersand = 1;
1526c4b5
JD
1174 }
1175
bd5db9de 1176 if ((c != '&' && c != '!' && c != ' ') || (c == '!' && !seen_ampersand))
c284e499
JD
1177 seen_printable = 1;
1178
840bd9f7
SK
1179 /* Is this a fixed-form comment? */
1180 if (gfc_current_form == FORM_FIXED && i == 0
1181 && (c == '*' || c == 'c' || c == 'd'))
1182 seen_comment = 1;
1183
fd1935d5
TB
1184 /* Vendor extension: "<tab>1" marks a continuation line. */
1185 if (found_tab)
840bd9f7 1186 {
fd1935d5
TB
1187 found_tab = false;
1188 if (c >= '1' && c <= '9')
1189 {
1190 *(buffer-1) = c;
1191 continue;
1192 }
1193 }
1194
1195 if (gfc_current_form == FORM_FIXED && c == '\t' && i < 6)
1196 {
1197 found_tab = true;
1198
840bd9f7
SK
1199 if (!gfc_option.warn_tabs && seen_comment == 0
1200 && current_line != linenum)
1201 {
1202 linenum = current_line;
fd1935d5
TB
1203 gfc_warning_now ("Nonconforming tab character in column %d "
1204 "of line %d", i+1, linenum);
840bd9f7
SK
1205 }
1206
fd1935d5 1207 while (i < 6)
6de9cd9a
DN
1208 {
1209 *buffer++ = ' ';
1210 i++;
1211 }
1212
1213 continue;
1214 }
1215
1216 *buffer++ = c;
1217 i++;
1218
d1e3d6ae 1219 if (maxlen == 0 || preprocessor_flag)
f56c5d5d 1220 {
d1e3d6ae
JJ
1221 if (i >= buflen)
1222 {
1223 /* Reallocate line buffer to double size to hold the
3fbab549 1224 overlong line. */
d1e3d6ae
JJ
1225 buflen = buflen * 2;
1226 *pbuf = xrealloc (*pbuf, buflen + 1);
edf1eac2 1227 buffer = (*pbuf) + i;
d1e3d6ae 1228 }
f56c5d5d 1229 }
d1e3d6ae 1230 else if (i >= maxlen)
16ab8e74 1231 {
f56c5d5d 1232 /* Truncate the rest of the line. */
6de9cd9a
DN
1233 for (;;)
1234 {
c4da1827 1235 c = getc (input);
6de9cd9a
DN
1236 if (c == '\n' || c == EOF)
1237 break;
a34938be
RG
1238
1239 trunc_flag = 1;
6de9cd9a
DN
1240 }
1241
1242 ungetc ('\n', input);
1243 }
1244 }
1245
f56c5d5d
TS
1246 /* Pad lines to the selected line length in fixed form. */
1247 if (gfc_current_form == FORM_FIXED
043c2d9e 1248 && gfc_option.fixed_line_length != 0
f56c5d5d
TS
1249 && !preprocessor_flag
1250 && c != EOF)
043c2d9e
BF
1251 {
1252 while (i++ < maxlen)
1253 *buffer++ = ' ';
1254 }
f56c5d5d 1255
6de9cd9a 1256 *buffer = '\0';
d1e3d6ae 1257 *pbuflen = buflen;
840bd9f7 1258 current_line++;
ba1defa5
RG
1259
1260 return trunc_flag;
6de9cd9a
DN
1261}
1262
1263
d4fa05b9
TS
1264/* Get a gfc_file structure, initialize it and add it to
1265 the file stack. */
1266
1267static gfc_file *
e0bcf78c 1268get_file (const char *name, enum lc_reason reason ATTRIBUTE_UNUSED)
d4fa05b9
TS
1269{
1270 gfc_file *f;
1271
1272 f = gfc_getmem (sizeof (gfc_file));
1273
1274 f->filename = gfc_getmem (strlen (name) + 1);
1275 strcpy (f->filename, name);
1276
1277 f->next = file_head;
1278 file_head = f;
1279
60332588 1280 f->up = current_file;
d4fa05b9 1281 if (current_file != NULL)
1b271c9b 1282 f->inclusion_line = current_file->line;
d4fa05b9 1283
5ffeb913 1284 linemap_add (line_table, reason, false, f->filename, 1);
c8cc8542 1285
d4fa05b9
TS
1286 return f;
1287}
1288
1289/* Deal with a line from the C preprocessor. The
1290 initial octothorp has already been seen. */
6de9cd9a
DN
1291
1292static void
d4fa05b9 1293preprocessor_line (char *c)
6de9cd9a 1294{
d4fa05b9
TS
1295 bool flag[5];
1296 int i, line;
1297 char *filename;
1298 gfc_file *f;
2d7c7df6 1299 int escaped, unescape;
6de9cd9a 1300
d4fa05b9
TS
1301 c++;
1302 while (*c == ' ' || *c == '\t')
1303 c++;
6de9cd9a 1304
d4fa05b9 1305 if (*c < '0' || *c > '9')
fa841200 1306 goto bad_cpp_line;
6de9cd9a 1307
d4fa05b9
TS
1308 line = atoi (c);
1309
4c3a6ca1 1310 c = strchr (c, ' ');
fa841200 1311 if (c == NULL)
4c3a6ca1
JJ
1312 {
1313 /* No file name given. Set new line number. */
1314 current_file->line = line;
1315 return;
1316 }
d7d528c8
ES
1317
1318 /* Skip spaces. */
1319 while (*c == ' ' || *c == '\t')
1320 c++;
1321
1322 /* Skip quote. */
1323 if (*c != '"')
fa841200 1324 goto bad_cpp_line;
d7d528c8
ES
1325 ++c;
1326
d4fa05b9
TS
1327 filename = c;
1328
d7d528c8 1329 /* Make filename end at quote. */
2d7c7df6 1330 unescape = 0;
d7d528c8 1331 escaped = false;
edf1eac2 1332 while (*c && ! (!escaped && *c == '"'))
d7d528c8
ES
1333 {
1334 if (escaped)
edf1eac2 1335 escaped = false;
2d7c7df6
JJ
1336 else if (*c == '\\')
1337 {
1338 escaped = true;
1339 unescape++;
1340 }
d7d528c8
ES
1341 ++c;
1342 }
1343
1344 if (! *c)
fa841200
TS
1345 /* Preprocessor line has no closing quote. */
1346 goto bad_cpp_line;
d7d528c8 1347
d4fa05b9
TS
1348 *c++ = '\0';
1349
2d7c7df6
JJ
1350 /* Undo effects of cpp_quote_string. */
1351 if (unescape)
1352 {
1353 char *s = filename;
1354 char *d = gfc_getmem (c - filename - unescape);
d7d528c8 1355
2d7c7df6
JJ
1356 filename = d;
1357 while (*s)
1358 {
1359 if (*s == '\\')
1360 *d++ = *++s;
1361 else
1362 *d++ = *s;
1363 s++;
1364 }
1365 *d = '\0';
1366 }
d7d528c8 1367
d4fa05b9 1368 /* Get flags. */
4c3a6ca1 1369
1e39a151 1370 flag[1] = flag[2] = flag[3] = flag[4] = false;
6de9cd9a 1371
6de9cd9a
DN
1372 for (;;)
1373 {
d4fa05b9
TS
1374 c = strchr (c, ' ');
1375 if (c == NULL)
1376 break;
6de9cd9a 1377
d4fa05b9
TS
1378 c++;
1379 i = atoi (c);
6de9cd9a 1380
d4fa05b9
TS
1381 if (1 <= i && i <= 4)
1382 flag[i] = true;
1383 }
4c3a6ca1 1384
d4fa05b9 1385 /* Interpret flags. */
4c3a6ca1 1386
94b00ee4 1387 if (flag[1]) /* Starting new file. */
d4fa05b9 1388 {
c8cc8542 1389 f = get_file (filename, LC_RENAME);
1b271c9b 1390 add_file_change (f->filename, f->inclusion_line);
d4fa05b9
TS
1391 current_file = f;
1392 }
4c3a6ca1 1393
d4fa05b9
TS
1394 if (flag[2]) /* Ending current file. */
1395 {
94b00ee4
JJ
1396 if (!current_file->up
1397 || strcmp (current_file->up->filename, filename) != 0)
4c3a6ca1
JJ
1398 {
1399 gfc_warning_now ("%s:%d: file %s left but not entered",
1400 current_file->filename, current_file->line,
1401 filename);
2d7c7df6
JJ
1402 if (unescape)
1403 gfc_free (filename);
4c3a6ca1
JJ
1404 return;
1405 }
ee07457b 1406
1b271c9b 1407 add_file_change (NULL, line);
94b00ee4 1408 current_file = current_file->up;
ee07457b
FXC
1409 linemap_add (line_table, LC_RENAME, false, current_file->filename,
1410 current_file->line);
d4fa05b9 1411 }
4c3a6ca1 1412
d4fa05b9
TS
1413 /* The name of the file can be a temporary file produced by
1414 cpp. Replace the name if it is different. */
4c3a6ca1 1415
d4fa05b9
TS
1416 if (strcmp (current_file->filename, filename) != 0)
1417 {
1418 gfc_free (current_file->filename);
1419 current_file->filename = gfc_getmem (strlen (filename) + 1);
1420 strcpy (current_file->filename, filename);
1421 }
fa841200 1422
4c3a6ca1
JJ
1423 /* Set new line number. */
1424 current_file->line = line;
2d7c7df6
JJ
1425 if (unescape)
1426 gfc_free (filename);
fa841200
TS
1427 return;
1428
1429 bad_cpp_line:
4c3a6ca1 1430 gfc_warning_now ("%s:%d: Illegal preprocessor directive",
fa841200
TS
1431 current_file->filename, current_file->line);
1432 current_file->line++;
d4fa05b9
TS
1433}
1434
1435
e0bcf78c 1436static try load_file (const char *, bool);
d4fa05b9
TS
1437
1438/* include_line()-- Checks a line buffer to see if it is an include
1439 line. If so, we call load_file() recursively to load the included
1440 file. We never return a syntax error because a statement like
1441 "include = 5" is perfectly legal. We return false if no include was
1442 processed or true if we matched an include. */
1443
1444static bool
1445include_line (char *line)
1446{
1447 char quote, *c, *begin, *stop;
9b9e4cd6 1448
d4fa05b9 1449 c = line;
9b9e4cd6
JJ
1450
1451 if (gfc_option.flag_openmp)
1452 {
1453 if (gfc_current_form == FORM_FREE)
1454 {
1455 while (*c == ' ' || *c == '\t')
1456 c++;
1457 if (*c == '!' && c[1] == '$' && (c[2] == ' ' || c[2] == '\t'))
1458 c += 3;
1459 }
1460 else
1461 {
1462 if ((*c == '!' || *c == 'c' || *c == 'C' || *c == '*')
1463 && c[1] == '$' && (c[2] == ' ' || c[2] == '\t'))
1464 c += 3;
1465 }
1466 }
1467
d4fa05b9
TS
1468 while (*c == ' ' || *c == '\t')
1469 c++;
1470
1471 if (strncasecmp (c, "include", 7))
1472 return false;
1473
1474 c += 7;
1475 while (*c == ' ' || *c == '\t')
1476 c++;
1477
1478 /* Find filename between quotes. */
1479
1480 quote = *c++;
1481 if (quote != '"' && quote != '\'')
1482 return false;
1483
1484 begin = c;
1485
1486 while (*c != quote && *c != '\0')
1487 c++;
1488
1489 if (*c == '\0')
1490 return false;
1491
1492 stop = c++;
1493
1494 while (*c == ' ' || *c == '\t')
1495 c++;
1496
1497 if (*c != '\0' && *c != '!')
1498 return false;
1499
f7b529fa 1500 /* We have an include line at this point. */
d4fa05b9
TS
1501
1502 *stop = '\0'; /* It's ok to trash the buffer, as this line won't be
1503 read by anything else. */
1504
1505 load_file (begin, false);
1506 return true;
1507}
1508
edf1eac2 1509
d4fa05b9
TS
1510/* Load a file into memory by calling load_line until the file ends. */
1511
1512static try
e0bcf78c 1513load_file (const char *filename, bool initial)
d4fa05b9 1514{
f56c5d5d 1515 char *line;
d4fa05b9
TS
1516 gfc_linebuf *b;
1517 gfc_file *f;
1518 FILE *input;
d1e3d6ae 1519 int len, line_len;
caef7872 1520 bool first_line;
d4fa05b9
TS
1521
1522 for (f = current_file; f; f = f->up)
1523 if (strcmp (filename, f->filename) == 0)
1524 {
1525 gfc_error_now ("File '%s' is being included recursively", filename);
1526 return FAILURE;
1527 }
1528
1529 if (initial)
1530 {
2d7c7df6
JJ
1531 if (gfc_src_file)
1532 {
1533 input = gfc_src_file;
1534 gfc_src_file = NULL;
1535 }
1536 else
1537 input = gfc_open_file (filename);
d4fa05b9
TS
1538 if (input == NULL)
1539 {
1540 gfc_error_now ("Can't open file '%s'", filename);
1541 return FAILURE;
1542 }
1543 }
1544 else
1545 {
31198773 1546 input = gfc_open_included_file (filename, false, false);
d4fa05b9
TS
1547 if (input == NULL)
1548 {
1549 gfc_error_now ("Can't open included file '%s'", filename);
1550 return FAILURE;
1551 }
1552 }
1553
1554 /* Load the file. */
1555
c8cc8542 1556 f = get_file (filename, initial ? LC_RENAME : LC_ENTER);
1b271c9b
JJ
1557 if (!initial)
1558 add_file_change (f->filename, f->inclusion_line);
d4fa05b9
TS
1559 current_file = f;
1560 current_file->line = 1;
f56c5d5d 1561 line = NULL;
d1e3d6ae 1562 line_len = 0;
caef7872 1563 first_line = true;
d4fa05b9 1564
2d7c7df6
JJ
1565 if (initial && gfc_src_preprocessor_lines[0])
1566 {
1567 preprocessor_line (gfc_src_preprocessor_lines[0]);
1568 gfc_free (gfc_src_preprocessor_lines[0]);
1569 gfc_src_preprocessor_lines[0] = NULL;
1570 if (gfc_src_preprocessor_lines[1])
1571 {
1572 preprocessor_line (gfc_src_preprocessor_lines[1]);
1573 gfc_free (gfc_src_preprocessor_lines[1]);
1574 gfc_src_preprocessor_lines[1] = NULL;
1575 }
1576 }
1577
16ab8e74 1578 for (;;)
d4fa05b9 1579 {
d1e3d6ae 1580 int trunc = load_line (input, &line, &line_len);
d4fa05b9
TS
1581
1582 len = strlen (line);
6de9cd9a
DN
1583 if (feof (input) && len == 0)
1584 break;
1585
caef7872
FXC
1586 /* If this is the first line of the file, it can contain a byte
1587 order mark (BOM), which we will ignore:
1588 FF FE is UTF-16 little endian,
1589 FE FF is UTF-16 big endian,
1590 EF BB BF is UTF-8. */
1591 if (first_line
1592 && ((line_len >= 2 && line[0] == '\xFF' && line[1] == '\xFE')
1593 || (line_len >= 2 && line[0] == '\xFE' && line[1] == '\xFF')
1594 || (line_len >= 3 && line[0] == '\xEF' && line[1] == '\xBB'
1595 && line[2] == '\xBF')))
1596 {
1597 int n = line[1] == '\xBB' ? 3 : 2;
1598 char * new = gfc_getmem (line_len);
1599
1600 strcpy (new, line + n);
1601 gfc_free (line);
1602 line = new;
1603 len -= n;
1604 }
1605
d4fa05b9
TS
1606 /* There are three things this line can be: a line of Fortran
1607 source, an include line or a C preprocessor directive. */
6de9cd9a 1608
d4fa05b9
TS
1609 if (line[0] == '#')
1610 {
9e8a6720
FXC
1611 /* When -g3 is specified, it's possible that we emit #define
1612 and #undef lines, which we need to pass to the middle-end
1613 so that it can emit correct debug info. */
1614 if (debug_info_level == DINFO_LEVEL_VERBOSE
1615 && (strncmp (line, "#define ", 8) == 0
1616 || strncmp (line, "#undef ", 7) == 0))
1617 ;
1618 else
1619 {
1620 preprocessor_line (line);
1621 continue;
1622 }
d4fa05b9 1623 }
6de9cd9a 1624
caef7872
FXC
1625 /* Preprocessed files have preprocessor lines added before the byte
1626 order mark, so first_line is not about the first line of the file
1627 but the first line that's not a preprocessor line. */
1628 first_line = false;
1629
d4fa05b9
TS
1630 if (include_line (line))
1631 {
1632 current_file->line++;
1633 continue;
6de9cd9a
DN
1634 }
1635
d4fa05b9
TS
1636 /* Add line. */
1637
4cdf7223 1638 b = gfc_getmem (gfc_linebuf_header_size + len + 1);
d4fa05b9 1639
c8cc8542 1640 b->location
5ffeb913 1641 = linemap_line_start (line_table, current_file->line++, 120);
d4fa05b9 1642 b->file = current_file;
ba1defa5 1643 b->truncated = trunc;
d4fa05b9
TS
1644 strcpy (b->line, line);
1645
1646 if (line_head == NULL)
1647 line_head = b;
1648 else
1649 line_tail->next = b;
1650
1651 line_tail = b;
1b271c9b
JJ
1652
1653 while (file_changes_cur < file_changes_count)
1654 file_changes[file_changes_cur++].lb = b;
6de9cd9a 1655 }
d4fa05b9 1656
f56c5d5d
TS
1657 /* Release the line buffer allocated in load_line. */
1658 gfc_free (line);
1659
d4fa05b9
TS
1660 fclose (input);
1661
1b271c9b
JJ
1662 if (!initial)
1663 add_file_change (NULL, current_file->inclusion_line + 1);
d4fa05b9 1664 current_file = current_file->up;
5ffeb913 1665 linemap_add (line_table, LC_LEAVE, 0, NULL, 0);
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",
ee07457b 1688 LOCATION_FILE (line_head->location),
c8cc8542 1689 LOCATION_LINE (line_head->location),
c8cc8542 1690 line_head->line);
6de9cd9a 1691
d4fa05b9
TS
1692 exit (0);
1693#endif
6de9cd9a 1694
d4fa05b9 1695 return result;
6de9cd9a 1696}
2d7c7df6
JJ
1697
1698static char *
1699unescape_filename (const char *ptr)
1700{
1701 const char *p = ptr, *s;
1702 char *d, *ret;
1703 int escaped, unescape = 0;
1704
1705 /* Make filename end at quote. */
1706 escaped = false;
1707 while (*p && ! (! escaped && *p == '"'))
1708 {
1709 if (escaped)
1710 escaped = false;
1711 else if (*p == '\\')
1712 {
1713 escaped = true;
1714 unescape++;
1715 }
1716 ++p;
1717 }
1718
edf1eac2 1719 if (!*p || p[1])
2d7c7df6
JJ
1720 return NULL;
1721
1722 /* Undo effects of cpp_quote_string. */
1723 s = ptr;
1724 d = gfc_getmem (p + 1 - ptr - unescape);
1725 ret = d;
1726
1727 while (s != p)
1728 {
1729 if (*s == '\\')
1730 *d++ = *++s;
1731 else
1732 *d++ = *s;
1733 s++;
1734 }
1735 *d = '\0';
1736 return ret;
1737}
1738
1739/* For preprocessed files, if the first tokens are of the form # NUM.
1740 handle the directives so we know the original file name. */
1741
1742const char *
1743gfc_read_orig_filename (const char *filename, const char **canon_source_file)
1744{
1745 int c, len;
1746 char *dirname;
1747
1748 gfc_src_file = gfc_open_file (filename);
1749 if (gfc_src_file == NULL)
1750 return NULL;
1751
c4da1827 1752 c = getc (gfc_src_file);
2d7c7df6
JJ
1753 ungetc (c, gfc_src_file);
1754
1755 if (c != '#')
1756 return NULL;
1757
1758 len = 0;
1759 load_line (gfc_src_file, &gfc_src_preprocessor_lines[0], &len);
1760
1761 if (strncmp (gfc_src_preprocessor_lines[0], "# 1 \"", 5) != 0)
1762 return NULL;
1763
1764 filename = unescape_filename (gfc_src_preprocessor_lines[0] + 5);
1765 if (filename == NULL)
1766 return NULL;
1767
c4da1827 1768 c = getc (gfc_src_file);
2d7c7df6
JJ
1769 ungetc (c, gfc_src_file);
1770
1771 if (c != '#')
1772 return filename;
1773
1774 len = 0;
1775 load_line (gfc_src_file, &gfc_src_preprocessor_lines[1], &len);
1776
1777 if (strncmp (gfc_src_preprocessor_lines[1], "# 1 \"", 5) != 0)
1778 return filename;
1779
1780 dirname = unescape_filename (gfc_src_preprocessor_lines[1] + 5);
1781 if (dirname == NULL)
1782 return filename;
1783
1784 len = strlen (dirname);
1785 if (len < 3 || dirname[len - 1] != '/' || dirname[len - 2] != '/')
1786 {
1787 gfc_free (dirname);
1788 return filename;
1789 }
1790 dirname[len - 2] = '\0';
1791 set_src_pwd (dirname);
1792
1793 if (! IS_ABSOLUTE_PATH (filename))
1794 {
1795 char *p = gfc_getmem (len + strlen (filename));
1796
1797 memcpy (p, dirname, len - 2);
1798 p[len - 2] = '/';
1799 strcpy (p + len - 1, filename);
1800 *canon_source_file = p;
1801 }
1802
1803 gfc_free (dirname);
1804 return filename;
1805}