]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/fortran/scanner.c
Update copyright years.
[thirdparty/gcc.git] / gcc / fortran / scanner.c
CommitLineData
6de9cd9a 1/* Character scanner.
8d9254fc 2 Copyright (C) 2000-2020 Free Software Foundation, Inc.
6de9cd9a
DN
3 Contributed by Andy Vaught
4
9fc4d79b 5This file is part of GCC.
6de9cd9a 6
9fc4d79b
TS
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
d234d788 9Software Foundation; either version 3, or (at your option) any later
9fc4d79b 10version.
6de9cd9a 11
9fc4d79b
TS
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
6de9cd9a
DN
16
17You should have received a copy of the GNU General Public License
d234d788
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
6de9cd9a
DN
20
21/* Set of subroutines to (ultimately) return the next character to the
22 various matching subroutines. This file's job is to read files and
23 build up lines that are parsed by the parser. This means that we
24 handle continuation lines and "include" lines.
25
26 The first thing the scanner does is to load an entire file into
27 memory. We load the entire file into memory for a couple reasons.
28 The first is that we want to be able to deal with nonseekable input
29 (pipes, stdin) and there is a lot of backing up involved during
30 parsing.
31
32 The second is that we want to be able to print the locus of errors,
33 and an error on line 999999 could conflict with something on line
34 one. Given nonseekable input, we've got to store the whole thing.
35
36 One thing that helps are the column truncation limits that give us
37 an upper bound on the size of individual lines. We don't store the
38 truncated stuff.
39
40 From the scanner's viewpoint, the higher level subroutines ask for
41 new characters and do a lot of jumping backwards. */
42
43#include "config.h"
d22e4895 44#include "system.h"
953bee7c 45#include "coretypes.h"
6de9cd9a 46#include "gfortran.h"
7274feea 47#include "toplev.h" /* For set_src_pwd. */
9e8a6720 48#include "debug.h"
1916bcb5 49#include "options.h"
670637ee 50#include "cpp.h"
070edbc2 51#include "scanner.h"
6de9cd9a
DN
52
53/* List of include file search directories. */
070edbc2 54gfc_directorylist *include_dirs, *intrinsic_modules_dirs;
6de9cd9a 55
d4fa05b9 56static gfc_file *file_head, *current_file;
6de9cd9a 57
41dbbb37
TS
58static int continue_flag, end_flag, gcc_attribute_flag;
59/* If !$omp/!$acc occurred in current comment line. */
60static int openmp_flag, openacc_flag;
5a06474c 61static int continue_count, continue_line;
6c7a4dfd 62static locus openmp_locus;
41dbbb37 63static locus openacc_locus;
08a6b8e0 64static locus gcc_attribute_locus;
6de9cd9a 65
d4fa05b9
TS
66gfc_source_form gfc_current_form;
67static gfc_linebuf *line_head, *line_tail;
68
63645982 69locus gfc_current_locus;
e0bcf78c 70const char *gfc_source_file;
2d7c7df6 71static FILE *gfc_src_file;
8fc541d3 72static gfc_char_t *gfc_src_preprocessor_lines[2];
2d7c7df6 73
1b271c9b
JJ
74static struct gfc_file_change
75{
76 const char *filename;
77 gfc_linebuf *lb;
78 int line;
79} *file_changes;
80size_t file_changes_cur, file_changes_count;
81size_t file_changes_allocated;
82
31677224 83static gfc_char_t *last_error_char;
8fc541d3
FXC
84
85/* Functions dealing with our wide characters (gfc_char_t) and
86 sequences of such characters. */
87
88int
89gfc_wide_fits_in_byte (gfc_char_t c)
90{
91 return (c <= UCHAR_MAX);
92}
93
94static inline int
95wide_is_ascii (gfc_char_t c)
96{
97 return (gfc_wide_fits_in_byte (c) && ((unsigned char) c & ~0x7f) == 0);
98}
99
100int
101gfc_wide_is_printable (gfc_char_t c)
102{
103 return (gfc_wide_fits_in_byte (c) && ISPRINT ((unsigned char) c));
104}
105
106gfc_char_t
107gfc_wide_tolower (gfc_char_t c)
108{
109 return (wide_is_ascii (c) ? (gfc_char_t) TOLOWER((unsigned char) c) : c);
110}
111
00660189
FXC
112gfc_char_t
113gfc_wide_toupper (gfc_char_t c)
114{
115 return (wide_is_ascii (c) ? (gfc_char_t) TOUPPER((unsigned char) c) : c);
116}
117
8fc541d3
FXC
118int
119gfc_wide_is_digit (gfc_char_t c)
120{
121 return (c >= '0' && c <= '9');
122}
123
124static inline int
125wide_atoi (gfc_char_t *c)
126{
127#define MAX_DIGITS 20
128 char buf[MAX_DIGITS+1];
129 int i = 0;
130
131 while (gfc_wide_is_digit(*c) && i < MAX_DIGITS)
132 buf[i++] = *c++;
133 buf[i] = '\0';
134 return atoi (buf);
135}
136
137size_t
138gfc_wide_strlen (const gfc_char_t *str)
139{
140 size_t i;
141
142 for (i = 0; str[i]; i++)
143 ;
144
145 return i;
146}
147
00660189
FXC
148gfc_char_t *
149gfc_wide_memset (gfc_char_t *b, gfc_char_t c, size_t len)
150{
151 size_t i;
152
153 for (i = 0; i < len; i++)
154 b[i] = c;
155
156 return b;
157}
158
8fc541d3
FXC
159static gfc_char_t *
160wide_strcpy (gfc_char_t *dest, const gfc_char_t *src)
161{
162 gfc_char_t *d;
163
164 for (d = dest; (*d = *src) != '\0'; ++src, ++d)
165 ;
166
167 return dest;
168}
169
170static gfc_char_t *
00660189 171wide_strchr (const gfc_char_t *s, gfc_char_t c)
8fc541d3
FXC
172{
173 do {
174 if (*s == c)
175 {
00660189 176 return CONST_CAST(gfc_char_t *, s);
8fc541d3
FXC
177 }
178 } while (*s++);
179 return 0;
180}
181
00660189
FXC
182char *
183gfc_widechar_to_char (const gfc_char_t *s, int length)
184{
185 size_t len, i;
186 char *res;
187
188 if (s == NULL)
189 return NULL;
190
191 /* Passing a negative length is used to indicate that length should be
192 calculated using gfc_wide_strlen(). */
193 len = (length >= 0 ? (size_t) length : gfc_wide_strlen (s));
ece3f663 194 res = XNEWVEC (char, len + 1);
00660189
FXC
195
196 for (i = 0; i < len; i++)
197 {
198 gcc_assert (gfc_wide_fits_in_byte (s[i]));
199 res[i] = (unsigned char) s[i];
200 }
201
202 res[len] = '\0';
203 return res;
204}
205
206gfc_char_t *
207gfc_char_to_widechar (const char *s)
8fc541d3 208{
00660189
FXC
209 size_t len, i;
210 gfc_char_t *res;
211
212 if (s == NULL)
213 return NULL;
214
215 len = strlen (s);
216 res = gfc_get_wide_string (len + 1);
8fc541d3
FXC
217
218 for (i = 0; i < len; i++)
00660189 219 res[i] = (unsigned char) s[i];
8fc541d3
FXC
220
221 res[len] = '\0';
222 return res;
223}
224
225static int
226wide_strncmp (const gfc_char_t *s1, const char *s2, size_t n)
227{
228 gfc_char_t c1, c2;
229
230 while (n-- > 0)
231 {
232 c1 = *s1++;
233 c2 = *s2++;
234 if (c1 != c2)
235 return (c1 > c2 ? 1 : -1);
236 if (c1 == '\0')
237 return 0;
238 }
239 return 0;
240}
241
00660189
FXC
242int
243gfc_wide_strncasecmp (const gfc_char_t *s1, const char *s2, size_t n)
8fc541d3
FXC
244{
245 gfc_char_t c1, c2;
246
247 while (n-- > 0)
248 {
249 c1 = gfc_wide_tolower (*s1++);
250 c2 = TOLOWER (*s2++);
251 if (c1 != c2)
252 return (c1 > c2 ? 1 : -1);
253 if (c1 == '\0')
254 return 0;
255 }
256 return 0;
257}
258
259
6de9cd9a
DN
260/* Main scanner initialization. */
261
262void
263gfc_scanner_init_1 (void)
264{
d4fa05b9
TS
265 file_head = NULL;
266 line_head = NULL;
267 line_tail = NULL;
6de9cd9a 268
5a06474c
JD
269 continue_count = 0;
270 continue_line = 0;
271
6de9cd9a 272 end_flag = 0;
31677224 273 last_error_char = NULL;
6de9cd9a
DN
274}
275
276
277/* Main scanner destructor. */
278
279void
280gfc_scanner_done_1 (void)
281{
d4fa05b9
TS
282 gfc_linebuf *lb;
283 gfc_file *f;
6de9cd9a 284
d4fa05b9 285 while(line_head != NULL)
6de9cd9a 286 {
d4fa05b9 287 lb = line_head->next;
cede9502 288 free (line_head);
d4fa05b9 289 line_head = lb;
6de9cd9a 290 }
d4fa05b9
TS
291
292 while(file_head != NULL)
6de9cd9a 293 {
d4fa05b9 294 f = file_head->next;
cede9502
JM
295 free (file_head->filename);
296 free (file_head);
d4fa05b9 297 file_head = f;
6de9cd9a
DN
298 }
299}
300
301
302/* Adds path to the list pointed to by list. */
303
31198773
FXC
304static void
305add_path_to_list (gfc_directorylist **list, const char *path,
57bdf399 306 bool use_for_modules, bool head, bool warn)
6de9cd9a
DN
307{
308 gfc_directorylist *dir;
309 const char *p;
bfc16654 310 char *q;
ff9e56a9 311 struct stat st;
bfc16654
TK
312 size_t len;
313 int i;
ff9e56a9 314
6de9cd9a 315 p = path;
31198773 316 while (*p == ' ' || *p == '\t') /* someone might do "-I include" */
6de9cd9a
DN
317 if (*p++ == '\0')
318 return;
319
bfc16654
TK
320 /* Strip trailing directory separators from the path, as this
321 will confuse Windows systems. */
322 len = strlen (p);
323 q = (char *) alloca (len + 1);
324 memcpy (q, p, len + 1);
325 i = len - 1;
524af0d6 326 while (i >=0 && IS_DIR_SEPARATOR (q[i]))
bfc16654
TK
327 q[i--] = '\0';
328
329 if (stat (q, &st))
ff9e56a9
TK
330 {
331 if (errno != ENOENT)
db30e21c 332 gfc_warning_now (0, "Include directory %qs: %s", path,
4daa149b 333 xstrerror(errno));
7c02f68b 334 else if (warn)
4daa149b
TB
335 gfc_warning_now (OPT_Wmissing_include_dirs,
336 "Nonexistent include directory %qs", path);
ff9e56a9
TK
337 return;
338 }
339 else if (!S_ISDIR (st.st_mode))
340 {
7cc5ec65 341 gfc_fatal_error ("%qs is not a directory", path);
ff9e56a9
TK
342 return;
343 }
344
0ee1b105
TB
345 if (head || *list == NULL)
346 {
347 dir = XCNEW (gfc_directorylist);
348 if (!head)
349 *list = dir;
350 }
6de9cd9a
DN
351 else
352 {
0ee1b105 353 dir = *list;
6de9cd9a
DN
354 while (dir->next)
355 dir = dir->next;
356
ece3f663 357 dir->next = XCNEW (gfc_directorylist);
6de9cd9a
DN
358 dir = dir->next;
359 }
360
0ee1b105
TB
361 dir->next = head ? *list : NULL;
362 if (head)
363 *list = dir;
31198773 364 dir->use_for_modules = use_for_modules;
ece3f663 365 dir->path = XCNEWVEC (char, strlen (p) + 2);
6de9cd9a
DN
366 strcpy (dir->path, p);
367 strcat (dir->path, "/"); /* make '/' last character */
368}
369
370
31198773 371void
308f961b
TK
372gfc_add_include_path (const char *path, bool use_for_modules, bool file_dir,
373 bool warn)
31198773 374{
308f961b 375 add_path_to_list (&include_dirs, path, use_for_modules, file_dir, warn);
0ee1b105
TB
376
377 /* For '#include "..."' these directories are automatically searched. */
378 if (!file_dir)
379 gfc_cpp_add_include_path (xstrdup(path), true);
31198773
FXC
380}
381
382
383void
384gfc_add_intrinsic_modules_path (const char *path)
385{
57bdf399 386 add_path_to_list (&intrinsic_modules_dirs, path, true, false, false);
31198773
FXC
387}
388
389
6de9cd9a
DN
390/* Release resources allocated for options. */
391
392void
393gfc_release_include_path (void)
394{
395 gfc_directorylist *p;
396
6de9cd9a
DN
397 while (include_dirs != NULL)
398 {
399 p = include_dirs;
400 include_dirs = include_dirs->next;
cede9502
JM
401 free (p->path);
402 free (p);
6de9cd9a 403 }
31198773 404
31198773
FXC
405 while (intrinsic_modules_dirs != NULL)
406 {
407 p = intrinsic_modules_dirs;
408 intrinsic_modules_dirs = intrinsic_modules_dirs->next;
cede9502
JM
409 free (p->path);
410 free (p);
31198773 411 }
1bc23383 412
cede9502 413 free (gfc_option.module_dir);
6de9cd9a
DN
414}
415
6de9cd9a 416
31198773 417static FILE *
d8ddea40
DF
418open_included_file (const char *name, gfc_directorylist *list,
419 bool module, bool system)
6de9cd9a 420{
200cfbe7 421 char *fullname;
6de9cd9a
DN
422 gfc_directorylist *p;
423 FILE *f;
424
31198773 425 for (p = list; p; p = p->next)
b424a572 426 {
31198773
FXC
427 if (module && !p->use_for_modules)
428 continue;
6de9cd9a 429
200cfbe7 430 fullname = (char *) alloca(strlen (p->path) + strlen (name) + 1);
6de9cd9a
DN
431 strcpy (fullname, p->path);
432 strcat (fullname, name);
433
434 f = gfc_open_file (fullname);
435 if (f != NULL)
d8ddea40
DF
436 {
437 if (gfc_cpp_makedep ())
438 gfc_cpp_add_dep (fullname, system);
439
440 return f;
441 }
6de9cd9a
DN
442 }
443
444 return NULL;
445}
446
31198773
FXC
447
448/* Opens file for reading, searching through the include directories
449 given if necessary. If the include_cwd argument is true, we try
450 to open the file in the current directory first. */
451
452FILE *
453gfc_open_included_file (const char *name, bool include_cwd, bool module)
454{
d8ddea40 455 FILE *f = NULL;
e01f74e0 456
d8ddea40 457 if (IS_ABSOLUTE_PATH (name) || include_cwd)
31198773
FXC
458 {
459 f = gfc_open_file (name);
d8ddea40
DF
460 if (f && gfc_cpp_makedep ())
461 gfc_cpp_add_dep (name, false);
31198773
FXC
462 }
463
d8ddea40
DF
464 if (!f)
465 f = open_included_file (name, include_dirs, module, false);
466
467 return f;
31198773
FXC
468}
469
edf1eac2 470
6de9cd9a
DN
471/* Test to see if we're at the end of the main source file. */
472
473int
474gfc_at_end (void)
475{
6de9cd9a
DN
476 return end_flag;
477}
478
479
480/* Test to see if we're at the end of the current file. */
481
482int
483gfc_at_eof (void)
484{
6de9cd9a
DN
485 if (gfc_at_end ())
486 return 1;
487
d4fa05b9 488 if (line_head == NULL)
6de9cd9a
DN
489 return 1; /* Null file */
490
63645982 491 if (gfc_current_locus.lb == NULL)
6de9cd9a
DN
492 return 1;
493
494 return 0;
495}
496
497
498/* Test to see if we're at the beginning of a new line. */
499
500int
501gfc_at_bol (void)
502{
6de9cd9a
DN
503 if (gfc_at_eof ())
504 return 1;
505
63645982 506 return (gfc_current_locus.nextc == gfc_current_locus.lb->line);
6de9cd9a
DN
507}
508
509
510/* Test to see if we're at the end of a line. */
511
512int
513gfc_at_eol (void)
514{
6de9cd9a
DN
515 if (gfc_at_eof ())
516 return 1;
517
63645982 518 return (*gfc_current_locus.nextc == '\0');
6de9cd9a
DN
519}
520
60332588 521static void
1b271c9b 522add_file_change (const char *filename, int line)
60332588 523{
1b271c9b
JJ
524 if (file_changes_count == file_changes_allocated)
525 {
526 if (file_changes_allocated)
527 file_changes_allocated *= 2;
528 else
529 file_changes_allocated = 16;
ece3f663
KG
530 file_changes = XRESIZEVEC (struct gfc_file_change, file_changes,
531 file_changes_allocated);
1b271c9b
JJ
532 }
533 file_changes[file_changes_count].filename = filename;
534 file_changes[file_changes_count].lb = NULL;
535 file_changes[file_changes_count++].line = line;
536}
60332588 537
1b271c9b
JJ
538static void
539report_file_change (gfc_linebuf *lb)
540{
541 size_t c = file_changes_cur;
542 while (c < file_changes_count
543 && file_changes[c].lb == lb)
544 {
545 if (file_changes[c].filename)
546 (*debug_hooks->start_source_file) (file_changes[c].line,
547 file_changes[c].filename);
548 else
549 (*debug_hooks->end_source_file) (file_changes[c].line);
550 ++c;
551 }
552 file_changes_cur = c;
60332588
JJ
553}
554
555void
556gfc_start_source_files (void)
557{
558 /* If the debugger wants the name of the main source file,
559 we give it. */
560 if (debug_hooks->start_end_main_source_file)
561 (*debug_hooks->start_source_file) (0, gfc_source_file);
562
1b271c9b
JJ
563 file_changes_cur = 0;
564 report_file_change (gfc_current_locus.lb);
60332588
JJ
565}
566
567void
568gfc_end_source_files (void)
569{
1b271c9b 570 report_file_change (NULL);
60332588
JJ
571
572 if (debug_hooks->start_end_main_source_file)
573 (*debug_hooks->end_source_file) (0);
574}
6de9cd9a
DN
575
576/* Advance the current line pointer to the next line. */
577
578void
579gfc_advance_line (void)
580{
6de9cd9a 581 if (gfc_at_end ())
4a58b9ad 582 return;
6de9cd9a 583
63645982 584 if (gfc_current_locus.lb == NULL)
6de9cd9a 585 {
d4fa05b9
TS
586 end_flag = 1;
587 return;
588 }
6de9cd9a 589
9e8a6720 590 if (gfc_current_locus.lb->next
60332588 591 && !gfc_current_locus.lb->next->dbg_emitted)
9e8a6720 592 {
1b271c9b 593 report_file_change (gfc_current_locus.lb->next);
60332588 594 gfc_current_locus.lb->next->dbg_emitted = true;
9e8a6720
FXC
595 }
596
63645982 597 gfc_current_locus.lb = gfc_current_locus.lb->next;
6de9cd9a 598
edf1eac2 599 if (gfc_current_locus.lb != NULL)
63645982 600 gfc_current_locus.nextc = gfc_current_locus.lb->line;
d4fa05b9
TS
601 else
602 {
63645982 603 gfc_current_locus.nextc = NULL;
d4fa05b9
TS
604 end_flag = 1;
605 }
6de9cd9a
DN
606}
607
608
609/* Get the next character from the input, advancing gfc_current_file's
610 locus. When we hit the end of the line or the end of the file, we
611 start returning a '\n' in order to complete the current statement.
612 No Fortran line conventions are implemented here.
613
614 Requiring explicit advances to the next line prevents the parse
615 pointer from being on the wrong line if the current statement ends
616 prematurely. */
617
8fc541d3 618static gfc_char_t
6de9cd9a
DN
619next_char (void)
620{
8fc541d3 621 gfc_char_t c;
d4fa05b9 622
63645982 623 if (gfc_current_locus.nextc == NULL)
6de9cd9a
DN
624 return '\n';
625
8fc541d3 626 c = *gfc_current_locus.nextc++;
6de9cd9a
DN
627 if (c == '\0')
628 {
63645982 629 gfc_current_locus.nextc--; /* Remain on this line. */
6de9cd9a
DN
630 c = '\n';
631 }
632
633 return c;
634}
635
edf1eac2 636
6de9cd9a
DN
637/* Skip a comment. When we come here the parse pointer is positioned
638 immediately after the comment character. If we ever implement
9cd38d51 639 compiler directives within comments, here is where we parse the
6de9cd9a
DN
640 directive. */
641
642static void
643skip_comment_line (void)
644{
8fc541d3 645 gfc_char_t c;
6de9cd9a
DN
646
647 do
648 {
649 c = next_char ();
650 }
651 while (c != '\n');
652
653 gfc_advance_line ();
654}
655
656
9e8a6720
FXC
657int
658gfc_define_undef_line (void)
659{
8fc541d3
FXC
660 char *tmp;
661
9e8a6720 662 /* All lines beginning with '#' are either #define or #undef. */
8fc541d3 663 if (debug_info_level != DINFO_LEVEL_VERBOSE || gfc_peek_ascii_char () != '#')
9e8a6720
FXC
664 return 0;
665
8fc541d3
FXC
666 if (wide_strncmp (gfc_current_locus.nextc, "#define ", 8) == 0)
667 {
00660189 668 tmp = gfc_widechar_to_char (&gfc_current_locus.nextc[8], -1);
8fc541d3
FXC
669 (*debug_hooks->define) (gfc_linebuf_linenum (gfc_current_locus.lb),
670 tmp);
cede9502 671 free (tmp);
8fc541d3 672 }
9e8a6720 673
8fc541d3
FXC
674 if (wide_strncmp (gfc_current_locus.nextc, "#undef ", 7) == 0)
675 {
00660189 676 tmp = gfc_widechar_to_char (&gfc_current_locus.nextc[7], -1);
8fc541d3
FXC
677 (*debug_hooks->undef) (gfc_linebuf_linenum (gfc_current_locus.lb),
678 tmp);
cede9502 679 free (tmp);
8fc541d3 680 }
9e8a6720
FXC
681
682 /* Skip the rest of the line. */
683 skip_comment_line ();
684
685 return 1;
686}
687
688
08a6b8e0
TB
689/* Return true if GCC$ was matched. */
690static bool
691skip_gcc_attribute (locus start)
692{
693 bool r = false;
694 char c;
695 locus old_loc = gfc_current_locus;
696
697 if ((c = next_char ()) == 'g' || c == 'G')
698 if ((c = next_char ()) == 'c' || c == 'C')
699 if ((c = next_char ()) == 'c' || c == 'C')
700 if ((c = next_char ()) == '$')
701 r = true;
702
703 if (r == false)
704 gfc_current_locus = old_loc;
705 else
706 {
707 gcc_attribute_flag = 1;
708 gcc_attribute_locus = old_loc;
709 gfc_current_locus = start;
710 }
711
712 return r;
713}
714
41dbbb37
TS
715/* Return true if CC was matched. */
716static bool
aa81272c 717skip_free_oacc_sentinel (locus start, locus old_loc)
41dbbb37
TS
718{
719 bool r = false;
720 char c;
721
722 if ((c = next_char ()) == 'c' || c == 'C')
723 if ((c = next_char ()) == 'c' || c == 'C')
724 r = true;
725
726 if (r)
727 {
728 if ((c = next_char ()) == ' ' || c == '\t'
729 || continue_flag)
730 {
731 while (gfc_is_whitespace (c))
732 c = next_char ();
733 if (c != '\n' && c != '!')
734 {
735 openacc_flag = 1;
736 openacc_locus = old_loc;
737 gfc_current_locus = start;
738 }
739 else
740 r = false;
741 }
742 else
743 {
db30e21c 744 gfc_warning_now (0, "!$ACC at %C starts a commented "
41dbbb37
TS
745 "line as it neither is followed "
746 "by a space nor is a "
747 "continuation line");
748 r = false;
749 }
750 }
751
752 return r;
753}
754
755/* Return true if MP was matched. */
756static bool
aa81272c 757skip_free_omp_sentinel (locus start, locus old_loc)
41dbbb37
TS
758{
759 bool r = false;
760 char c;
761
762 if ((c = next_char ()) == 'm' || c == 'M')
763 if ((c = next_char ()) == 'p' || c == 'P')
764 r = true;
765
766 if (r)
767 {
768 if ((c = next_char ()) == ' ' || c == '\t'
769 || continue_flag)
770 {
771 while (gfc_is_whitespace (c))
772 c = next_char ();
773 if (c != '\n' && c != '!')
774 {
775 openmp_flag = 1;
776 openmp_locus = old_loc;
777 gfc_current_locus = start;
778 }
779 else
780 r = false;
781 }
782 else
783 {
db30e21c 784 gfc_warning_now (0, "!$OMP at %C starts a commented "
41dbbb37
TS
785 "line as it neither is followed "
786 "by a space nor is a "
787 "continuation line");
788 r = false;
789 }
790 }
08a6b8e0 791
41dbbb37
TS
792 return r;
793}
08a6b8e0 794
6de9cd9a 795/* Comment lines are null lines, lines containing only blanks or lines
0d3abf6f 796 on which the first nonblank line is a '!'.
41dbbb37 797 Return true if !$ openmp or openacc conditional compilation sentinel was
0d3abf6f 798 seen. */
6de9cd9a 799
0d3abf6f 800static bool
6de9cd9a
DN
801skip_free_comments (void)
802{
803 locus start;
8fc541d3 804 gfc_char_t c;
6c7a4dfd 805 int at_bol;
6de9cd9a
DN
806
807 for (;;)
808 {
6c7a4dfd 809 at_bol = gfc_at_bol ();
63645982 810 start = gfc_current_locus;
6de9cd9a
DN
811 if (gfc_at_eof ())
812 break;
813
814 do
6c7a4dfd 815 c = next_char ();
6de9cd9a
DN
816 while (gfc_is_whitespace (c));
817
818 if (c == '\n')
819 {
820 gfc_advance_line ();
821 continue;
822 }
823
824 if (c == '!')
825 {
08a6b8e0 826 /* Keep the !GCC$ line. */
90c4f6ba 827 if (at_bol && skip_gcc_attribute (start))
08a6b8e0
TB
828 return false;
829
41dbbb37
TS
830 /* If -fopenmp/-fopenacc, we need to handle here 2 things:
831 1) don't treat !$omp/!$acc as comments, but directives
832 2) handle OpenMP/OpenACC conditional compilation, where
6c7a4dfd
JJ
833 !$ should be treated as 2 spaces (for initial lines
834 only if followed by space). */
41dbbb37
TS
835 if (at_bol)
836 {
837 if ((flag_openmp || flag_openmp_simd)
838 && flag_openacc)
839 {
840 locus old_loc = gfc_current_locus;
841 if (next_char () == '$')
842 {
843 c = next_char ();
844 if (c == 'o' || c == 'O')
845 {
aa81272c 846 if (skip_free_omp_sentinel (start, old_loc))
41dbbb37
TS
847 return false;
848 gfc_current_locus = old_loc;
849 next_char ();
850 c = next_char ();
851 }
852 else if (c == 'a' || c == 'A')
853 {
aa81272c 854 if (skip_free_oacc_sentinel (start, old_loc))
41dbbb37
TS
855 return false;
856 gfc_current_locus = old_loc;
857 next_char ();
858 c = next_char ();
859 }
860 if (continue_flag || c == ' ' || c == '\t')
861 {
862 gfc_current_locus = old_loc;
863 next_char ();
864 openmp_flag = openacc_flag = 0;
865 return true;
866 }
867 }
868 gfc_current_locus = old_loc;
869 }
870 else if ((flag_openmp || flag_openmp_simd)
871 && !flag_openacc)
872 {
873 locus old_loc = gfc_current_locus;
874 if (next_char () == '$')
875 {
876 c = next_char ();
877 if (c == 'o' || c == 'O')
878 {
aa81272c 879 if (skip_free_omp_sentinel (start, old_loc))
41dbbb37
TS
880 return false;
881 gfc_current_locus = old_loc;
882 next_char ();
883 c = next_char ();
884 }
885 if (continue_flag || c == ' ' || c == '\t')
886 {
887 gfc_current_locus = old_loc;
888 next_char ();
889 openmp_flag = 0;
890 return true;
891 }
892 }
893 gfc_current_locus = old_loc;
894 }
895 else if (flag_openacc
896 && !(flag_openmp || flag_openmp_simd))
897 {
898 locus old_loc = gfc_current_locus;
899 if (next_char () == '$')
900 {
901 c = next_char ();
902 if (c == 'a' || c == 'A')
6c7a4dfd 903 {
aa81272c 904 if (skip_free_oacc_sentinel (start, old_loc))
41dbbb37
TS
905 return false;
906 gfc_current_locus = old_loc;
907 next_char();
908 c = next_char();
6c7a4dfd 909 }
41dbbb37
TS
910 if (continue_flag || c == ' ' || c == '\t')
911 {
912 gfc_current_locus = old_loc;
913 next_char();
914 openacc_flag = 0;
915 return true;
916 }
917 }
918 gfc_current_locus = old_loc;
919 }
920 }
6de9cd9a
DN
921 skip_comment_line ();
922 continue;
923 }
924
925 break;
926 }
927
6c7a4dfd
JJ
928 if (openmp_flag && at_bol)
929 openmp_flag = 0;
08a6b8e0 930
41dbbb37
TS
931 if (openacc_flag && at_bol)
932 openacc_flag = 0;
933
08a6b8e0 934 gcc_attribute_flag = 0;
63645982 935 gfc_current_locus = start;
0d3abf6f 936 return false;
6de9cd9a
DN
937}
938
aa81272c
IU
939/* Return true if MP was matched in fixed form. */
940static bool
941skip_fixed_omp_sentinel (locus *start)
942{
943 gfc_char_t c;
944 if (((c = next_char ()) == 'm' || c == 'M')
945 && ((c = next_char ()) == 'p' || c == 'P'))
946 {
947 c = next_char ();
948 if (c != '\n'
949 && (continue_flag
950 || c == ' ' || c == '\t' || c == '0'))
951 {
952 do
953 c = next_char ();
954 while (gfc_is_whitespace (c));
955 if (c != '\n' && c != '!')
956 {
957 /* Canonicalize to *$omp. */
958 *start->nextc = '*';
959 openmp_flag = 1;
960 gfc_current_locus = *start;
961 return true;
962 }
963 }
964 }
965 return false;
966}
967
968/* Return true if CC was matched in fixed form. */
969static bool
970skip_fixed_oacc_sentinel (locus *start)
971{
972 gfc_char_t c;
973 if (((c = next_char ()) == 'c' || c == 'C')
974 && ((c = next_char ()) == 'c' || c == 'C'))
975 {
976 c = next_char ();
977 if (c != '\n'
978 && (continue_flag
979 || c == ' ' || c == '\t' || c == '0'))
980 {
981 do
982 c = next_char ();
983 while (gfc_is_whitespace (c));
984 if (c != '\n' && c != '!')
985 {
986 /* Canonicalize to *$acc. */
987 *start->nextc = '*';
988 openacc_flag = 1;
989 gfc_current_locus = *start;
990 return true;
991 }
992 }
993 }
994 return false;
995}
6de9cd9a
DN
996
997/* Skip comment lines in fixed source mode. We have the same rules as
998 in skip_free_comment(), except that we can have a 'c', 'C' or '*'
e0bcf78c
TS
999 in column 1, and a '!' cannot be in column 6. Also, we deal with
1000 lines with 'd' or 'D' in column 1, if the user requested this. */
6de9cd9a
DN
1001
1002static void
1003skip_fixed_comments (void)
1004{
1005 locus start;
1006 int col;
8fc541d3 1007 gfc_char_t c;
6de9cd9a 1008
6c7a4dfd
JJ
1009 if (! gfc_at_bol ())
1010 {
1011 start = gfc_current_locus;
1012 if (! gfc_at_eof ())
1013 {
1014 do
1015 c = next_char ();
1016 while (gfc_is_whitespace (c));
1017
1018 if (c == '\n')
1019 gfc_advance_line ();
1020 else if (c == '!')
1021 skip_comment_line ();
1022 }
1023
1024 if (! gfc_at_bol ())
1025 {
1026 gfc_current_locus = start;
1027 return;
1028 }
1029 }
1030
6de9cd9a
DN
1031 for (;;)
1032 {
63645982 1033 start = gfc_current_locus;
6de9cd9a
DN
1034 if (gfc_at_eof ())
1035 break;
1036
1037 c = next_char ();
1038 if (c == '\n')
1039 {
1040 gfc_advance_line ();
1041 continue;
1042 }
1043
1044 if (c == '!' || c == 'c' || c == 'C' || c == '*')
1045 {
08a6b8e0
TB
1046 if (skip_gcc_attribute (start))
1047 {
1048 /* Canonicalize to *$omp. */
1049 *start.nextc = '*';
1050 return;
1051 }
1052
47cc2d49
TB
1053 if (gfc_current_locus.lb != NULL
1054 && continue_line < gfc_linebuf_linenum (gfc_current_locus.lb))
1055 continue_line = gfc_linebuf_linenum (gfc_current_locus.lb);
1056
41dbbb37
TS
1057 /* If -fopenmp/-fopenacc, we need to handle here 2 things:
1058 1) don't treat !$omp/!$acc|c$omp/c$acc|*$omp / *$acc as comments,
1059 but directives
1060 2) handle OpenMP/OpenACC conditional compilation, where
6c7a4dfd
JJ
1061 !$|c$|*$ should be treated as 2 spaces if the characters
1062 in columns 3 to 6 are valid fixed form label columns
1063 characters. */
aa81272c 1064 if ((flag_openmp || flag_openmp_simd) && !flag_openacc)
6c7a4dfd
JJ
1065 {
1066 if (next_char () == '$')
1067 {
1068 c = next_char ();
1069 if (c == 'o' || c == 'O')
1070 {
aa81272c
IU
1071 if (skip_fixed_omp_sentinel (&start))
1072 return;
6c7a4dfd
JJ
1073 }
1074 else
aa81272c
IU
1075 goto check_for_digits;
1076 }
1077 gfc_current_locus = start;
1078 }
1079
1080 if (flag_openacc && !(flag_openmp || flag_openmp_simd))
1081 {
1082 if (next_char () == '$')
1083 {
1084 c = next_char ();
1085 if (c == 'a' || c == 'A')
6c7a4dfd 1086 {
aa81272c
IU
1087 if (skip_fixed_oacc_sentinel (&start))
1088 return;
6c7a4dfd 1089 }
aa81272c
IU
1090 else
1091 goto check_for_digits;
6c7a4dfd
JJ
1092 }
1093 gfc_current_locus = start;
1094 }
41dbbb37 1095
aa81272c 1096 if (flag_openacc || flag_openmp || flag_openmp_simd)
41dbbb37
TS
1097 {
1098 if (next_char () == '$')
1099 {
1100 c = next_char ();
1101 if (c == 'a' || c == 'A')
1102 {
aa81272c
IU
1103 if (skip_fixed_oacc_sentinel (&start))
1104 return;
41dbbb37 1105 }
aa81272c 1106 else if (c == 'o' || c == 'O')
41dbbb37 1107 {
aa81272c
IU
1108 if (skip_fixed_omp_sentinel (&start))
1109 return;
41dbbb37 1110 }
aa81272c
IU
1111 else
1112 goto check_for_digits;
41dbbb37
TS
1113 }
1114 gfc_current_locus = start;
1115 }
1116
6de9cd9a
DN
1117 skip_comment_line ();
1118 continue;
aa81272c
IU
1119
1120 gcc_unreachable ();
1121check_for_digits:
1122 {
1123 int digit_seen = 0;
1124
1125 for (col = 3; col < 6; col++, c = next_char ())
1126 if (c == ' ')
1127 continue;
1128 else if (c == '\t')
1129 {
1130 col = 6;
1131 break;
1132 }
1133 else if (c < '0' || c > '9')
1134 break;
1135 else
1136 digit_seen = 1;
1137
1138 if (col == 6 && c != '\n'
1139 && ((continue_flag && !digit_seen)
1140 || c == ' ' || c == '\t' || c == '0'))
1141 {
1142 gfc_current_locus = start;
1143 start.nextc[0] = ' ';
1144 start.nextc[1] = ' ';
1145 continue;
1146 }
1147 }
1148 skip_comment_line ();
1149 continue;
6de9cd9a
DN
1150 }
1151
e0bcf78c
TS
1152 if (gfc_option.flag_d_lines != -1 && (c == 'd' || c == 'D'))
1153 {
1154 if (gfc_option.flag_d_lines == 0)
1155 {
1156 skip_comment_line ();
1157 continue;
1158 }
1159 else
1160 *start.nextc = c = ' ';
1161 }
1162
6de9cd9a 1163 col = 1;
e0bcf78c
TS
1164
1165 while (gfc_is_whitespace (c))
6de9cd9a
DN
1166 {
1167 c = next_char ();
1168 col++;
1169 }
6de9cd9a
DN
1170
1171 if (c == '\n')
1172 {
1173 gfc_advance_line ();
1174 continue;
1175 }
1176
1177 if (col != 6 && c == '!')
1178 {
f449022d
JD
1179 if (gfc_current_locus.lb != NULL
1180 && continue_line < gfc_linebuf_linenum (gfc_current_locus.lb))
1181 continue_line = gfc_linebuf_linenum (gfc_current_locus.lb);
6de9cd9a
DN
1182 skip_comment_line ();
1183 continue;
1184 }
1185
1186 break;
1187 }
1188
6c7a4dfd 1189 openmp_flag = 0;
41dbbb37 1190 openacc_flag = 0;
08a6b8e0 1191 gcc_attribute_flag = 0;
63645982 1192 gfc_current_locus = start;
6de9cd9a
DN
1193}
1194
1195
6c7a4dfd 1196/* Skips the current line if it is a comment. */
6de9cd9a
DN
1197
1198void
1199gfc_skip_comments (void)
1200{
6c7a4dfd 1201 if (gfc_current_form == FORM_FREE)
6de9cd9a
DN
1202 skip_free_comments ();
1203 else
1204 skip_fixed_comments ();
1205}
1206
1207
1208/* Get the next character from the input, taking continuation lines
1209 and end-of-line comments into account. This implies that comment
1210 lines between continued lines must be eaten here. For higher-level
1211 subroutines, this flattens continued lines into a single logical
1212 line. The in_string flag denotes whether we're inside a character
1213 context or not. */
1214
8fc541d3 1215gfc_char_t
696abb30 1216gfc_next_char_literal (gfc_instring in_string)
6de9cd9a
DN
1217{
1218 locus old_loc;
41dbbb37 1219 int i, prev_openmp_flag, prev_openacc_flag;
8fc541d3 1220 gfc_char_t c;
6de9cd9a
DN
1221
1222 continue_flag = 0;
41dbbb37 1223 prev_openacc_flag = prev_openmp_flag = 0;
6de9cd9a
DN
1224
1225restart:
1226 c = next_char ();
1227 if (gfc_at_end ())
5a06474c
JD
1228 {
1229 continue_count = 0;
1230 return c;
1231 }
6de9cd9a 1232
d4fa05b9 1233 if (gfc_current_form == FORM_FREE)
6de9cd9a 1234 {
0d3abf6f
JJ
1235 bool openmp_cond_flag;
1236
6de9cd9a
DN
1237 if (!in_string && c == '!')
1238 {
08a6b8e0
TB
1239 if (gcc_attribute_flag
1240 && memcmp (&gfc_current_locus, &gcc_attribute_locus,
1241 sizeof (gfc_current_locus)) == 0)
1242 goto done;
1243
6c7a4dfd
JJ
1244 if (openmp_flag
1245 && memcmp (&gfc_current_locus, &openmp_locus,
1246 sizeof (gfc_current_locus)) == 0)
1247 goto done;
1248
41dbbb37
TS
1249 if (openacc_flag
1250 && memcmp (&gfc_current_locus, &openacc_locus,
1251 sizeof (gfc_current_locus)) == 0)
1252 goto done;
1253
6de9cd9a
DN
1254 /* This line can't be continued */
1255 do
1256 {
1257 c = next_char ();
1258 }
1259 while (c != '\n');
1260
a34938be
RG
1261 /* Avoid truncation warnings for comment ending lines. */
1262 gfc_current_locus.lb->truncated = 0;
1263
6de9cd9a
DN
1264 goto done;
1265 }
1266
ac64eec4 1267 /* Check to see if the continuation line was truncated. */
73e42eef 1268 if (warn_line_truncation && gfc_current_locus.lb != NULL
ac64eec4
JD
1269 && gfc_current_locus.lb->truncated)
1270 {
203c7ebf 1271 int maxlen = flag_free_line_length;
021aa628
TB
1272 gfc_char_t *current_nextc = gfc_current_locus.nextc;
1273
ac64eec4 1274 gfc_current_locus.lb->truncated = 0;
021aa628 1275 gfc_current_locus.nextc = gfc_current_locus.lb->line + maxlen;
b93c0722
MLI
1276 gfc_warning_now (OPT_Wline_truncation,
1277 "Line truncated at %L", &gfc_current_locus);
021aa628 1278 gfc_current_locus.nextc = current_nextc;
ac64eec4
JD
1279 }
1280
6de9cd9a
DN
1281 if (c != '&')
1282 goto done;
1283
1284 /* If the next nonblank character is a ! or \n, we've got a
6c7a4dfd 1285 continuation line. */
63645982 1286 old_loc = gfc_current_locus;
6de9cd9a
DN
1287
1288 c = next_char ();
1289 while (gfc_is_whitespace (c))
1290 c = next_char ();
1291
1292 /* Character constants to be continued cannot have commentary
0d6fc963
JD
1293 after the '&'. However, there are cases where we may think we
1294 are still in a string and we are looking for a possible
1295 doubled quote and we end up here. See PR64506. */
6de9cd9a 1296
c55bbc72 1297 if (in_string && c != '\n')
6de9cd9a 1298 {
63645982 1299 gfc_current_locus = old_loc;
c55bbc72
JD
1300 c = '&';
1301 goto done;
6de9cd9a
DN
1302 }
1303
1304 if (c != '!' && c != '\n')
1305 {
63645982 1306 gfc_current_locus = old_loc;
6de9cd9a
DN
1307 c = '&';
1308 goto done;
1309 }
1310
41dbbb37
TS
1311 if (flag_openmp)
1312 prev_openmp_flag = openmp_flag;
1313 if (flag_openacc)
1314 prev_openacc_flag = openacc_flag;
1315
47cc2d49
TB
1316 /* This can happen if the input file changed or via cpp's #line
1317 without getting reset (e.g. via input_stmt). It also happens
1318 when pre-including files via -fpre-include=. */
1319 if (continue_count == 0
1320 && gfc_current_locus.lb
1321 && continue_line > gfc_linebuf_linenum (gfc_current_locus.lb) + 1)
1322 continue_line = gfc_linebuf_linenum (gfc_current_locus.lb) + 1;
1323
6de9cd9a
DN
1324 continue_flag = 1;
1325 if (c == '!')
1326 skip_comment_line ();
1327 else
1328 gfc_advance_line ();
0267ffdc 1329
524af0d6 1330 if (gfc_at_eof ())
0267ffdc 1331 goto not_continuation;
6de9cd9a 1332
5a06474c
JD
1333 /* We've got a continuation line. If we are on the very next line after
1334 the last continuation, increment the continuation line count and
1335 check whether the limit has been exceeded. */
5ffeb913 1336 if (gfc_linebuf_linenum (gfc_current_locus.lb) == continue_line + 1)
5a06474c
JD
1337 {
1338 if (++continue_count == gfc_option.max_continue_free)
1339 {
edf1eac2 1340 if (gfc_notification_std (GFC_STD_GNU) || pedantic)
db30e21c 1341 gfc_warning (0, "Limit of %d continuations exceeded in "
edf1eac2 1342 "statement at %C", gfc_option.max_continue_free);
5a06474c
JD
1343 }
1344 }
5a06474c
JD
1345
1346 /* Now find where it continues. First eat any comment lines. */
0d3abf6f 1347 openmp_cond_flag = skip_free_comments ();
6de9cd9a 1348
f449022d
JD
1349 if (gfc_current_locus.lb != NULL
1350 && continue_line < gfc_linebuf_linenum (gfc_current_locus.lb))
1351 continue_line = gfc_linebuf_linenum (gfc_current_locus.lb);
1352
41dbbb37 1353 if (flag_openmp)
aa81272c 1354 if (prev_openmp_flag != openmp_flag && !openacc_flag)
41dbbb37
TS
1355 {
1356 gfc_current_locus = old_loc;
1357 openmp_flag = prev_openmp_flag;
1358 c = '&';
1359 goto done;
1360 }
1361
1362 if (flag_openacc)
aa81272c 1363 if (prev_openacc_flag != openacc_flag && !openmp_flag)
41dbbb37
TS
1364 {
1365 gfc_current_locus = old_loc;
1366 openacc_flag = prev_openacc_flag;
1367 c = '&';
1368 goto done;
1369 }
6c7a4dfd 1370
6de9cd9a 1371 /* Now that we have a non-comment line, probe ahead for the
6c7a4dfd
JJ
1372 first non-whitespace character. If it is another '&', then
1373 reading starts at the next character, otherwise we must back
1374 up to where the whitespace started and resume from there. */
6de9cd9a 1375
63645982 1376 old_loc = gfc_current_locus;
6de9cd9a
DN
1377
1378 c = next_char ();
1379 while (gfc_is_whitespace (c))
1380 c = next_char ();
1381
aa81272c 1382 if (openmp_flag && !openacc_flag)
6c7a4dfd
JJ
1383 {
1384 for (i = 0; i < 5; i++, c = next_char ())
1385 {
8fc541d3 1386 gcc_assert (gfc_wide_tolower (c) == (unsigned char) "!$omp"[i]);
6c7a4dfd
JJ
1387 if (i == 4)
1388 old_loc = gfc_current_locus;
1389 }
1390 while (gfc_is_whitespace (c))
1391 c = next_char ();
1392 }
aa81272c 1393 if (openacc_flag && !openmp_flag)
41dbbb37
TS
1394 {
1395 for (i = 0; i < 5; i++, c = next_char ())
1396 {
1397 gcc_assert (gfc_wide_tolower (c) == (unsigned char) "!$acc"[i]);
1398 if (i == 4)
1399 old_loc = gfc_current_locus;
1400 }
1401 while (gfc_is_whitespace (c))
1402 c = next_char ();
1403 }
6c7a4dfd 1404
aa81272c
IU
1405 /* In case we have an OpenMP directive continued by OpenACC
1406 sentinel, or vice versa, we get both openmp_flag and
1407 openacc_flag on. */
1408
1409 if (openacc_flag && openmp_flag)
1410 {
1411 int is_openmp = 0;
1412 for (i = 0; i < 5; i++, c = next_char ())
1413 {
1414 if (gfc_wide_tolower (c) != (unsigned char) "!$acc"[i])
1415 is_openmp = 1;
1416 if (i == 4)
1417 old_loc = gfc_current_locus;
1418 }
324ff1a0
JJ
1419 gfc_error (is_openmp
1420 ? G_("Wrong OpenACC continuation at %C: "
1421 "expected !$ACC, got !$OMP")
1422 : G_("Wrong OpenMP continuation at %C: "
1423 "expected !$OMP, got !$ACC"));
aa81272c
IU
1424 }
1425
6de9cd9a 1426 if (c != '&')
3fbab549 1427 {
523ee218 1428 if (in_string && gfc_current_locus.nextc)
5a06474c 1429 {
523ee218 1430 gfc_current_locus.nextc--;
73e42eef 1431 if (warn_ampersand && in_string == INSTRING_WARN)
48749dbc
MLI
1432 gfc_warning (OPT_Wampersand,
1433 "Missing %<&%> in continued character "
696abb30 1434 "constant at %C");
5a06474c 1435 }
c55bbc72
JD
1436 else if (!in_string && (c == '\'' || c == '"'))
1437 goto done;
0d3abf6f
JJ
1438 /* Both !$omp and !$ -fopenmp continuation lines have & on the
1439 continuation line only optionally. */
41dbbb37 1440 else if (openmp_flag || openacc_flag || openmp_cond_flag)
b5f58440
JD
1441 {
1442 if (gfc_current_locus.nextc)
1443 gfc_current_locus.nextc--;
1444 }
5a06474c
JD
1445 else
1446 {
1447 c = ' ';
1448 gfc_current_locus = old_loc;
1449 goto done;
1450 }
3fbab549 1451 }
6de9cd9a 1452 }
b823d9eb 1453 else /* Fixed form. */
6de9cd9a
DN
1454 {
1455 /* Fixed form continuation. */
0d6fc963 1456 if (in_string != INSTRING_WARN && c == '!')
6de9cd9a
DN
1457 {
1458 /* Skip comment at end of line. */
1459 do
1460 {
1461 c = next_char ();
1462 }
1463 while (c != '\n');
a34938be
RG
1464
1465 /* Avoid truncation warnings for comment ending lines. */
1466 gfc_current_locus.lb->truncated = 0;
6de9cd9a
DN
1467 }
1468
1469 if (c != '\n')
1470 goto done;
1471
9cd38d51 1472 /* Check to see if the continuation line was truncated. */
73e42eef 1473 if (warn_line_truncation && gfc_current_locus.lb != NULL
9cd38d51
JD
1474 && gfc_current_locus.lb->truncated)
1475 {
1476 gfc_current_locus.lb->truncated = 0;
b93c0722
MLI
1477 gfc_warning_now (OPT_Wline_truncation,
1478 "Line truncated at %L", &gfc_current_locus);
9cd38d51
JD
1479 }
1480
41dbbb37
TS
1481 if (flag_openmp)
1482 prev_openmp_flag = openmp_flag;
1483 if (flag_openacc)
1484 prev_openacc_flag = openacc_flag;
1485
47cc2d49
TB
1486 /* This can happen if the input file changed or via cpp's #line
1487 without getting reset (e.g. via input_stmt). It also happens
1488 when pre-including files via -fpre-include=. */
1489 if (continue_count == 0
1490 && gfc_current_locus.lb
1491 && continue_line > gfc_linebuf_linenum (gfc_current_locus.lb) + 1)
1492 continue_line = gfc_linebuf_linenum (gfc_current_locus.lb) + 1;
1493
6de9cd9a 1494 continue_flag = 1;
63645982 1495 old_loc = gfc_current_locus;
6de9cd9a
DN
1496
1497 gfc_advance_line ();
0d3abf6f 1498 skip_fixed_comments ();
6de9cd9a
DN
1499
1500 /* See if this line is a continuation line. */
aa81272c 1501 if (flag_openmp && openmp_flag != prev_openmp_flag && !openacc_flag)
6de9cd9a 1502 {
6c7a4dfd
JJ
1503 openmp_flag = prev_openmp_flag;
1504 goto not_continuation;
6de9cd9a 1505 }
aa81272c 1506 if (flag_openacc && openacc_flag != prev_openacc_flag && !openmp_flag)
41dbbb37
TS
1507 {
1508 openacc_flag = prev_openacc_flag;
1509 goto not_continuation;
1510 }
6de9cd9a 1511
aa81272c
IU
1512 /* In case we have an OpenMP directive continued by OpenACC
1513 sentinel, or vice versa, we get both openmp_flag and
1514 openacc_flag on. */
1515 if (openacc_flag && openmp_flag)
1516 {
1517 int is_openmp = 0;
1518 for (i = 0; i < 5; i++)
1519 {
1520 c = next_char ();
1521 if (gfc_wide_tolower (c) != (unsigned char) "*$acc"[i])
1522 is_openmp = 1;
1523 }
324ff1a0
JJ
1524 gfc_error (is_openmp
1525 ? G_("Wrong OpenACC continuation at %C: "
1526 "expected !$ACC, got !$OMP")
1527 : G_("Wrong OpenMP continuation at %C: "
1528 "expected !$OMP, got !$ACC"));
aa81272c
IU
1529 }
1530 else if (!openmp_flag && !openacc_flag)
6c7a4dfd
JJ
1531 for (i = 0; i < 5; i++)
1532 {
1533 c = next_char ();
1534 if (c != ' ')
1535 goto not_continuation;
1536 }
41dbbb37 1537 else if (openmp_flag)
6c7a4dfd
JJ
1538 for (i = 0; i < 5; i++)
1539 {
1540 c = next_char ();
8fc541d3 1541 if (gfc_wide_tolower (c) != (unsigned char) "*$omp"[i])
6c7a4dfd
JJ
1542 goto not_continuation;
1543 }
41dbbb37
TS
1544 else if (openacc_flag)
1545 for (i = 0; i < 5; i++)
1546 {
1547 c = next_char ();
1548 if (gfc_wide_tolower (c) != (unsigned char) "*$acc"[i])
1549 goto not_continuation;
1550 }
6c7a4dfd 1551
6de9cd9a 1552 c = next_char ();
6c7a4dfd 1553 if (c == '0' || c == ' ' || c == '\n')
6de9cd9a 1554 goto not_continuation;
5a06474c
JD
1555
1556 /* We've got a continuation line. If we are on the very next line after
1557 the last continuation, increment the continuation line count and
1558 check whether the limit has been exceeded. */
5ffeb913 1559 if (gfc_linebuf_linenum (gfc_current_locus.lb) == continue_line + 1)
5a06474c
JD
1560 {
1561 if (++continue_count == gfc_option.max_continue_fixed)
1562 {
edf1eac2 1563 if (gfc_notification_std (GFC_STD_GNU) || pedantic)
db30e21c 1564 gfc_warning (0, "Limit of %d continuations exceeded in "
edf1eac2
SK
1565 "statement at %C",
1566 gfc_option.max_continue_fixed);
5a06474c
JD
1567 }
1568 }
1569
f449022d
JD
1570 if (gfc_current_locus.lb != NULL
1571 && continue_line < gfc_linebuf_linenum (gfc_current_locus.lb))
5ffeb913 1572 continue_line = gfc_linebuf_linenum (gfc_current_locus.lb);
6de9cd9a
DN
1573 }
1574
1575 /* Ready to read first character of continuation line, which might
1576 be another continuation line! */
1577 goto restart;
1578
1579not_continuation:
1580 c = '\n';
63645982 1581 gfc_current_locus = old_loc;
85d5c27d 1582 end_flag = 0;
6de9cd9a
DN
1583
1584done:
5a06474c
JD
1585 if (c == '\n')
1586 continue_count = 0;
6de9cd9a
DN
1587 continue_flag = 0;
1588 return c;
1589}
1590
1591
1592/* Get the next character of input, folded to lowercase. In fixed
1593 form mode, we also ignore spaces. When matcher subroutines are
1594 parsing character literals, they have to call
1595 gfc_next_char_literal(). */
1596
8fc541d3 1597gfc_char_t
6de9cd9a
DN
1598gfc_next_char (void)
1599{
8fc541d3 1600 gfc_char_t c;
6de9cd9a
DN
1601
1602 do
1603 {
696abb30 1604 c = gfc_next_char_literal (NONSTRING);
6de9cd9a 1605 }
d4fa05b9 1606 while (gfc_current_form == FORM_FIXED && gfc_is_whitespace (c));
6de9cd9a 1607
8fc541d3 1608 return gfc_wide_tolower (c);
6de9cd9a
DN
1609}
1610
8fc541d3
FXC
1611char
1612gfc_next_ascii_char (void)
1613{
1614 gfc_char_t c = gfc_next_char ();
6de9cd9a 1615
8fc541d3
FXC
1616 return (gfc_wide_fits_in_byte (c) ? (unsigned char) c
1617 : (unsigned char) UCHAR_MAX);
1618}
1619
1620
1621gfc_char_t
6de9cd9a
DN
1622gfc_peek_char (void)
1623{
1624 locus old_loc;
8fc541d3 1625 gfc_char_t c;
6de9cd9a 1626
63645982 1627 old_loc = gfc_current_locus;
6de9cd9a 1628 c = gfc_next_char ();
63645982 1629 gfc_current_locus = old_loc;
6de9cd9a
DN
1630
1631 return c;
1632}
1633
1634
8fc541d3
FXC
1635char
1636gfc_peek_ascii_char (void)
1637{
1638 gfc_char_t c = gfc_peek_char ();
1639
1640 return (gfc_wide_fits_in_byte (c) ? (unsigned char) c
1641 : (unsigned char) UCHAR_MAX);
1642}
1643
1644
6de9cd9a
DN
1645/* Recover from an error. We try to get past the current statement
1646 and get lined up for the next. The next statement follows a '\n'
1647 or a ';'. We also assume that we are not within a character
1648 constant, and deal with finding a '\'' or '"'. */
1649
1650void
1651gfc_error_recovery (void)
1652{
8fc541d3 1653 gfc_char_t c, delim;
6de9cd9a
DN
1654
1655 if (gfc_at_eof ())
1656 return;
1657
1658 for (;;)
1659 {
1660 c = gfc_next_char ();
1661 if (c == '\n' || c == ';')
1662 break;
1663
1664 if (c != '\'' && c != '"')
1665 {
1666 if (gfc_at_eof ())
1667 break;
1668 continue;
1669 }
1670 delim = c;
1671
1672 for (;;)
1673 {
1674 c = next_char ();
1675
1676 if (c == delim)
1677 break;
1678 if (c == '\n')
ba1defa5 1679 return;
6de9cd9a
DN
1680 if (c == '\\')
1681 {
1682 c = next_char ();
1683 if (c == '\n')
ba1defa5 1684 return;
6de9cd9a
DN
1685 }
1686 }
1687 if (gfc_at_eof ())
1688 break;
1689 }
6de9cd9a
DN
1690}
1691
1692
1693/* Read ahead until the next character to be read is not whitespace. */
1694
1695void
1696gfc_gobble_whitespace (void)
1697{
840bd9f7 1698 static int linenum = 0;
6de9cd9a 1699 locus old_loc;
8fc541d3 1700 gfc_char_t c;
6de9cd9a
DN
1701
1702 do
1703 {
63645982 1704 old_loc = gfc_current_locus;
696abb30 1705 c = gfc_next_char_literal (NONSTRING);
840bd9f7
SK
1706 /* Issue a warning for nonconforming tabs. We keep track of the line
1707 number because the Fortran matchers will often back up and the same
1708 line will be scanned multiple times. */
16db2a6a 1709 if (warn_tabs && c == '\t')
840bd9f7 1710 {
45a82bd9 1711 int cur_linenum = LOCATION_LINE (gfc_current_locus.lb->location);
45a82bd9
PB
1712 if (cur_linenum != linenum)
1713 {
1714 linenum = cur_linenum;
d0e168a0 1715 gfc_warning_now (OPT_Wtabs, "Nonconforming tab character at %C");
45a82bd9 1716 }
840bd9f7 1717 }
6de9cd9a
DN
1718 }
1719 while (gfc_is_whitespace (c));
1720
31677224
TK
1721 if (!ISPRINT(c) && c != '\n' && last_error_char != gfc_current_locus.nextc)
1722 {
1723 char buf[20];
1724 last_error_char = gfc_current_locus.nextc;
1725 snprintf (buf, 20, "%2.2X", c);
1726 gfc_error_now ("Invalid character 0x%s at %C", buf);
1727 }
1728
63645982 1729 gfc_current_locus = old_loc;
6de9cd9a
DN
1730}
1731
1732
f56c5d5d
TS
1733/* Load a single line into pbuf.
1734
1735 If pbuf points to a NULL pointer, it is allocated.
1736 We truncate lines that are too long, unless we're dealing with
1737 preprocessor lines or if the option -ffixed-line-length-none is set,
1738 in which case we reallocate the buffer to fit the entire line, if
1739 need be.
1740 In fixed mode, we expand a tab that occurs within the statement
1741 label region to expand to spaces that leave the next character in
ba1defa5 1742 the source region.
f2f5443c
FXC
1743
1744 If first_char is not NULL, it's a pointer to a single char value holding
1745 the first character of the line, which has already been read by the
1746 caller. This avoids the use of ungetc().
1747
1526c4b5
JD
1748 load_line returns whether the line was truncated.
1749
1750 NOTE: The error machinery isn't available at this point, so we can't
1751 easily report line and column numbers consistent with other
1752 parts of gfortran. */
6de9cd9a 1753
ba1defa5 1754static int
f2f5443c 1755load_line (FILE *input, gfc_char_t **pbuf, int *pbuflen, const int *first_char)
6de9cd9a 1756{
d1e3d6ae 1757 int c, maxlen, i, preprocessor_flag, buflen = *pbuflen;
840bd9f7 1758 int trunc_flag = 0, seen_comment = 0;
ac64eec4 1759 int seen_printable = 0, seen_ampersand = 0, quoted = ' ';
8fc541d3 1760 gfc_char_t *buffer;
fd1935d5 1761 bool found_tab = false;
985a7216 1762 bool warned_tabs = false;
f56c5d5d 1763
1dde8683 1764 /* Determine the maximum allowed line length. */
f56c5d5d 1765 if (gfc_current_form == FORM_FREE)
203c7ebf 1766 maxlen = flag_free_line_length;
16ab8e74 1767 else if (gfc_current_form == FORM_FIXED)
203c7ebf 1768 maxlen = flag_fixed_line_length;
f56c5d5d 1769 else
16ab8e74 1770 maxlen = 72;
f56c5d5d
TS
1771
1772 if (*pbuf == NULL)
1773 {
1dde8683
BM
1774 /* Allocate the line buffer, storing its length into buflen.
1775 Note that if maxlen==0, indicating that arbitrary-length lines
1776 are allowed, the buffer will be reallocated if this length is
1777 insufficient; since 132 characters is the length of a standard
1778 free-form line, we use that as a starting guess. */
f56c5d5d
TS
1779 if (maxlen > 0)
1780 buflen = maxlen;
1781 else
1dde8683 1782 buflen = 132;
6de9cd9a 1783
00660189 1784 *pbuf = gfc_get_wide_string (buflen + 1);
f56c5d5d 1785 }
6de9cd9a
DN
1786
1787 i = 0;
f56c5d5d 1788 buffer = *pbuf;
6de9cd9a 1789
f2f5443c
FXC
1790 if (first_char)
1791 c = *first_char;
1792 else
1793 c = getc (input);
1794
1795 /* In order to not truncate preprocessor lines, we have to
1796 remember that this is one. */
1797 preprocessor_flag = (c == '#' ? 1 : 0);
fa841200 1798
6de9cd9a
DN
1799 for (;;)
1800 {
6de9cd9a
DN
1801 if (c == EOF)
1802 break;
f2f5443c 1803
6de9cd9a 1804 if (c == '\n')
1526c4b5
JD
1805 {
1806 /* Check for illegal use of ampersand. See F95 Standard 3.3.1.3. */
1807 if (gfc_current_form == FORM_FREE
c284e499 1808 && !seen_printable && seen_ampersand)
1526c4b5
JD
1809 {
1810 if (pedantic)
4daa149b 1811 gfc_error_now ("%<&%> not allowed by itself in line %d",
985a7216 1812 current_file->line);
1526c4b5 1813 else
db30e21c 1814 gfc_warning_now (0, "%<&%> not allowed by itself in line %d",
985a7216 1815 current_file->line);
1526c4b5
JD
1816 }
1817 break;
1818 }
6de9cd9a 1819
f2f5443c
FXC
1820 if (c == '\r' || c == '\0')
1821 goto next_char; /* Gobble characters. */
6de9cd9a 1822
1526c4b5 1823 if (c == '&')
1526c4b5 1824 {
c284e499 1825 if (seen_ampersand)
47b0b4fa
TB
1826 {
1827 seen_ampersand = 0;
1828 seen_printable = 1;
1829 }
1526c4b5 1830 else
c284e499 1831 seen_ampersand = 1;
1526c4b5
JD
1832 }
1833
bd5db9de 1834 if ((c != '&' && c != '!' && c != ' ') || (c == '!' && !seen_ampersand))
c284e499
JD
1835 seen_printable = 1;
1836
840bd9f7
SK
1837 /* Is this a fixed-form comment? */
1838 if (gfc_current_form == FORM_FIXED && i == 0
1839 && (c == '*' || c == 'c' || c == 'd'))
1840 seen_comment = 1;
1841
ac64eec4
JD
1842 if (quoted == ' ')
1843 {
1844 if (c == '\'' || c == '"')
1845 quoted = c;
1846 }
1847 else if (c == quoted)
1848 quoted = ' ';
1849
1850 /* Is this a free-form comment? */
1851 if (c == '!' && quoted == ' ')
1852 seen_comment = 1;
1853
fd1935d5
TB
1854 /* Vendor extension: "<tab>1" marks a continuation line. */
1855 if (found_tab)
840bd9f7 1856 {
fd1935d5
TB
1857 found_tab = false;
1858 if (c >= '1' && c <= '9')
1859 {
1860 *(buffer-1) = c;
f2f5443c 1861 goto next_char;
fd1935d5
TB
1862 }
1863 }
1864
1865 if (gfc_current_form == FORM_FIXED && c == '\t' && i < 6)
1866 {
1867 found_tab = true;
1868
985a7216 1869 if (warn_tabs && seen_comment == 0 && !warned_tabs)
840bd9f7 1870 {
985a7216 1871 warned_tabs = true;
4daa149b
TB
1872 gfc_warning_now (OPT_Wtabs,
1873 "Nonconforming tab character in column %d "
985a7216 1874 "of line %d", i + 1, current_file->line);
840bd9f7
SK
1875 }
1876
fd1935d5 1877 while (i < 6)
6de9cd9a
DN
1878 {
1879 *buffer++ = ' ';
1880 i++;
1881 }
1882
f2f5443c 1883 goto next_char;
6de9cd9a
DN
1884 }
1885
1886 *buffer++ = c;
1887 i++;
1888
d1e3d6ae 1889 if (maxlen == 0 || preprocessor_flag)
f56c5d5d 1890 {
d1e3d6ae
JJ
1891 if (i >= buflen)
1892 {
1893 /* Reallocate line buffer to double size to hold the
3fbab549 1894 overlong line. */
d1e3d6ae 1895 buflen = buflen * 2;
ece3f663 1896 *pbuf = XRESIZEVEC (gfc_char_t, *pbuf, (buflen + 1));
edf1eac2 1897 buffer = (*pbuf) + i;
d1e3d6ae 1898 }
f56c5d5d 1899 }
d1e3d6ae 1900 else if (i >= maxlen)
16ab8e74 1901 {
ac64eec4
JD
1902 bool trunc_warn = true;
1903
1904 /* Enhancement, if the very next non-space character is an ampersand
1905 or comment that we would otherwise warn about, don't mark as
1906 truncated. */
1907
f56c5d5d 1908 /* Truncate the rest of the line. */
6de9cd9a
DN
1909 for (;;)
1910 {
c4da1827 1911 c = getc (input);
ac64eec4 1912 if (c == '\r' || c == ' ')
9c747b97
DF
1913 continue;
1914
6de9cd9a
DN
1915 if (c == '\n' || c == EOF)
1916 break;
a34938be 1917
ac64eec4
JD
1918 if (!trunc_warn && c != '!')
1919 trunc_warn = true;
1920
32e4257f
JD
1921 if (trunc_warn && ((gfc_current_form == FORM_FIXED && c == '&')
1922 || c == '!'))
ac64eec4
JD
1923 trunc_warn = false;
1924
1925 if (c == '!')
1926 seen_comment = 1;
1927
1928 if (trunc_warn && !seen_comment)
1929 trunc_flag = 1;
6de9cd9a
DN
1930 }
1931
f2f5443c
FXC
1932 c = '\n';
1933 continue;
6de9cd9a 1934 }
f2f5443c
FXC
1935
1936next_char:
1937 c = getc (input);
6de9cd9a
DN
1938 }
1939
f56c5d5d
TS
1940 /* Pad lines to the selected line length in fixed form. */
1941 if (gfc_current_form == FORM_FIXED
203c7ebf 1942 && flag_fixed_line_length != 0
f03d260a 1943 && flag_pad_source
f56c5d5d
TS
1944 && !preprocessor_flag
1945 && c != EOF)
043c2d9e
BF
1946 {
1947 while (i++ < maxlen)
1948 *buffer++ = ' ';
1949 }
f56c5d5d 1950
6de9cd9a 1951 *buffer = '\0';
d1e3d6ae 1952 *pbuflen = buflen;
ba1defa5
RG
1953
1954 return trunc_flag;
6de9cd9a
DN
1955}
1956
1957
d4fa05b9
TS
1958/* Get a gfc_file structure, initialize it and add it to
1959 the file stack. */
1960
1961static gfc_file *
47cc2d49 1962get_file (const char *name, enum lc_reason reason)
d4fa05b9
TS
1963{
1964 gfc_file *f;
1965
ece3f663 1966 f = XCNEW (gfc_file);
d4fa05b9 1967
ece3f663 1968 f->filename = xstrdup (name);
d4fa05b9
TS
1969
1970 f->next = file_head;
1971 file_head = f;
1972
60332588 1973 f->up = current_file;
d4fa05b9 1974 if (current_file != NULL)
1b271c9b 1975 f->inclusion_line = current_file->line;
d4fa05b9 1976
5ffeb913 1977 linemap_add (line_table, reason, false, f->filename, 1);
c8cc8542 1978
d4fa05b9
TS
1979 return f;
1980}
1981
8fc541d3 1982
d4fa05b9
TS
1983/* Deal with a line from the C preprocessor. The
1984 initial octothorp has already been seen. */
6de9cd9a
DN
1985
1986static void
8fc541d3 1987preprocessor_line (gfc_char_t *c)
6de9cd9a 1988{
d4fa05b9
TS
1989 bool flag[5];
1990 int i, line;
8fc541d3 1991 gfc_char_t *wide_filename;
d4fa05b9 1992 gfc_file *f;
2d7c7df6 1993 int escaped, unescape;
8fc541d3 1994 char *filename;
6de9cd9a 1995
d4fa05b9
TS
1996 c++;
1997 while (*c == ' ' || *c == '\t')
1998 c++;
6de9cd9a 1999
d4fa05b9 2000 if (*c < '0' || *c > '9')
fa841200 2001 goto bad_cpp_line;
6de9cd9a 2002
8fc541d3 2003 line = wide_atoi (c);
d4fa05b9 2004
8fc541d3 2005 c = wide_strchr (c, ' ');
fa841200 2006 if (c == NULL)
4c3a6ca1
JJ
2007 {
2008 /* No file name given. Set new line number. */
2009 current_file->line = line;
2010 return;
2011 }
d7d528c8
ES
2012
2013 /* Skip spaces. */
2014 while (*c == ' ' || *c == '\t')
2015 c++;
2016
2017 /* Skip quote. */
2018 if (*c != '"')
fa841200 2019 goto bad_cpp_line;
d7d528c8
ES
2020 ++c;
2021
8fc541d3 2022 wide_filename = c;
d4fa05b9 2023
d7d528c8 2024 /* Make filename end at quote. */
2d7c7df6 2025 unescape = 0;
d7d528c8 2026 escaped = false;
edf1eac2 2027 while (*c && ! (!escaped && *c == '"'))
d7d528c8
ES
2028 {
2029 if (escaped)
edf1eac2 2030 escaped = false;
2d7c7df6
JJ
2031 else if (*c == '\\')
2032 {
2033 escaped = true;
2034 unescape++;
2035 }
d7d528c8
ES
2036 ++c;
2037 }
2038
2039 if (! *c)
fa841200
TS
2040 /* Preprocessor line has no closing quote. */
2041 goto bad_cpp_line;
d7d528c8 2042
d4fa05b9
TS
2043 *c++ = '\0';
2044
2d7c7df6
JJ
2045 /* Undo effects of cpp_quote_string. */
2046 if (unescape)
2047 {
8fc541d3 2048 gfc_char_t *s = wide_filename;
b0b14c7b 2049 gfc_char_t *d = gfc_get_wide_string (c - wide_filename - unescape);
d7d528c8 2050
8fc541d3 2051 wide_filename = d;
2d7c7df6
JJ
2052 while (*s)
2053 {
2054 if (*s == '\\')
2055 *d++ = *++s;
2056 else
2057 *d++ = *s;
2058 s++;
2059 }
2060 *d = '\0';
2061 }
d7d528c8 2062
d4fa05b9 2063 /* Get flags. */
4c3a6ca1 2064
1e39a151 2065 flag[1] = flag[2] = flag[3] = flag[4] = false;
6de9cd9a 2066
6de9cd9a
DN
2067 for (;;)
2068 {
8fc541d3 2069 c = wide_strchr (c, ' ');
d4fa05b9
TS
2070 if (c == NULL)
2071 break;
6de9cd9a 2072
d4fa05b9 2073 c++;
8fc541d3 2074 i = wide_atoi (c);
6de9cd9a 2075
01512446 2076 if (i >= 1 && i <= 4)
d4fa05b9
TS
2077 flag[i] = true;
2078 }
4c3a6ca1 2079
8fc541d3
FXC
2080 /* Convert the filename in wide characters into a filename in narrow
2081 characters. */
00660189 2082 filename = gfc_widechar_to_char (wide_filename, -1);
8fc541d3 2083
d4fa05b9 2084 /* Interpret flags. */
4c3a6ca1 2085
94b00ee4 2086 if (flag[1]) /* Starting new file. */
d4fa05b9 2087 {
c8cc8542 2088 f = get_file (filename, LC_RENAME);
1b271c9b 2089 add_file_change (f->filename, f->inclusion_line);
d4fa05b9
TS
2090 current_file = f;
2091 }
4c3a6ca1 2092
d4fa05b9
TS
2093 if (flag[2]) /* Ending current file. */
2094 {
94b00ee4 2095 if (!current_file->up
ba78087b 2096 || filename_cmp (current_file->up->filename, filename) != 0)
4c3a6ca1 2097 {
2a2703a2
MLI
2098 linemap_line_start (line_table, current_file->line, 80);
2099 /* ??? One could compute the exact column where the filename
2100 starts and compute the exact location here. */
2101 gfc_warning_now_at (linemap_position_for_column (line_table, 1),
2102 0, "file %qs left but not entered",
2103 filename);
2104 current_file->line++;
2d7c7df6 2105 if (unescape)
cede9502
JM
2106 free (wide_filename);
2107 free (filename);
4c3a6ca1
JJ
2108 return;
2109 }
ee07457b 2110
1b271c9b 2111 add_file_change (NULL, line);
94b00ee4 2112 current_file = current_file->up;
ee07457b
FXC
2113 linemap_add (line_table, LC_RENAME, false, current_file->filename,
2114 current_file->line);
d4fa05b9 2115 }
4c3a6ca1 2116
d4fa05b9
TS
2117 /* The name of the file can be a temporary file produced by
2118 cpp. Replace the name if it is different. */
4c3a6ca1 2119
ba78087b 2120 if (filename_cmp (current_file->filename, filename) != 0)
d4fa05b9 2121 {
95213750
LB
2122 /* FIXME: we leak the old filename because a pointer to it may be stored
2123 in the linemap. Alternative could be using GC or updating linemap to
1cc0e193 2124 point to the new name, but there is no API for that currently. */
ece3f663 2125 current_file->filename = xstrdup (filename);
0d1f4de9
JL
2126
2127 /* We need to tell the linemap API that the filename changed. Just
2128 changing current_file is insufficient. */
2129 linemap_add (line_table, LC_RENAME, false, current_file->filename, line);
d4fa05b9 2130 }
fa841200 2131
4c3a6ca1
JJ
2132 /* Set new line number. */
2133 current_file->line = line;
2d7c7df6 2134 if (unescape)
cede9502
JM
2135 free (wide_filename);
2136 free (filename);
fa841200
TS
2137 return;
2138
2139 bad_cpp_line:
2a2703a2
MLI
2140 linemap_line_start (line_table, current_file->line, 80);
2141 /* ??? One could compute the exact column where the directive
2142 starts and compute the exact location here. */
2143 gfc_warning_now_at (linemap_position_for_column (line_table, 2), 0,
2144 "Illegal preprocessor directive");
fa841200 2145 current_file->line++;
d4fa05b9
TS
2146}
2147
2148
524af0d6 2149static bool load_file (const char *, const char *, bool);
d4fa05b9
TS
2150
2151/* include_line()-- Checks a line buffer to see if it is an include
2152 line. If so, we call load_file() recursively to load the included
2153 file. We never return a syntax error because a statement like
7c74e813
JJ
2154 "include = 5" is perfectly legal. We return 0 if no include was
2155 processed, 1 if we matched an include or -1 if include was
2156 partially processed, but will need continuation lines. */
d4fa05b9 2157
7c74e813 2158static int
8fc541d3 2159include_line (gfc_char_t *line)
d4fa05b9 2160{
8fc541d3
FXC
2161 gfc_char_t quote, *c, *begin, *stop;
2162 char *filename;
7c74e813
JJ
2163 const char *include = "include";
2164 bool allow_continuation = flag_dec_include;
2165 int i;
9b9e4cd6 2166
d4fa05b9 2167 c = line;
9b9e4cd6 2168
c61819ff 2169 if (flag_openmp || flag_openmp_simd)
9b9e4cd6
JJ
2170 {
2171 if (gfc_current_form == FORM_FREE)
2172 {
2173 while (*c == ' ' || *c == '\t')
2174 c++;
2175 if (*c == '!' && c[1] == '$' && (c[2] == ' ' || c[2] == '\t'))
2176 c += 3;
2177 }
2178 else
2179 {
2180 if ((*c == '!' || *c == 'c' || *c == 'C' || *c == '*')
7c74e813 2181 && c[1] == '$' && c[2] == ' ')
9b9e4cd6
JJ
2182 c += 3;
2183 }
2184 }
2185
7c74e813
JJ
2186 if (gfc_current_form == FORM_FREE)
2187 {
2188 while (*c == ' ' || *c == '\t')
2189 c++;
2190 if (gfc_wide_strncasecmp (c, "include", 7))
2191 {
2192 if (!allow_continuation)
2193 return 0;
2194 for (i = 0; i < 7; ++i)
2195 {
2196 gfc_char_t c1 = gfc_wide_tolower (*c);
2197 if (c1 != (unsigned char) include[i])
2198 break;
2199 c++;
2200 }
2201 if (i == 0 || *c != '&')
2202 return 0;
2203 c++;
2204 while (*c == ' ' || *c == '\t')
2205 c++;
2206 if (*c == '\0' || *c == '!')
2207 return -1;
2208 return 0;
2209 }
d4fa05b9 2210
7c74e813
JJ
2211 c += 7;
2212 }
2213 else
2214 {
2215 while (*c == ' ' || *c == '\t')
2216 c++;
2217 if (flag_dec_include && *c == '0' && c - line == 5)
2218 {
2219 c++;
2220 while (*c == ' ' || *c == '\t')
2221 c++;
2222 }
2223 if (c - line < 6)
2224 allow_continuation = false;
2225 for (i = 0; i < 7; ++i)
2226 {
2227 gfc_char_t c1 = gfc_wide_tolower (*c);
2228 if (c1 != (unsigned char) include[i])
2229 break;
2230 c++;
2231 while (*c == ' ' || *c == '\t')
2232 c++;
2233 }
2234 if (!allow_continuation)
2235 {
2236 if (i != 7)
2237 return 0;
2238 }
2239 else if (i != 7)
2240 {
2241 if (i == 0)
2242 return 0;
2243
2244 /* At the end of line or comment this might be continued. */
2245 if (*c == '\0' || *c == '!')
2246 return -1;
2247
2248 return 0;
2249 }
2250 }
d4fa05b9 2251
d4fa05b9
TS
2252 while (*c == ' ' || *c == '\t')
2253 c++;
2254
2255 /* Find filename between quotes. */
7c74e813 2256
d4fa05b9
TS
2257 quote = *c++;
2258 if (quote != '"' && quote != '\'')
7c74e813
JJ
2259 {
2260 if (allow_continuation)
2261 {
2262 if (gfc_current_form == FORM_FREE)
2263 {
2264 if (quote == '&')
2265 {
2266 while (*c == ' ' || *c == '\t')
2267 c++;
2268 if (*c == '\0' || *c == '!')
2269 return -1;
2270 }
2271 }
2272 else if (quote == '\0' || quote == '!')
2273 return -1;
2274 }
2275 return 0;
2276 }
d4fa05b9
TS
2277
2278 begin = c;
2279
7c74e813 2280 bool cont = false;
d4fa05b9 2281 while (*c != quote && *c != '\0')
7c74e813
JJ
2282 {
2283 if (allow_continuation && gfc_current_form == FORM_FREE)
2284 {
2285 if (*c == '&')
2286 cont = true;
2287 else if (*c != ' ' && *c != '\t')
2288 cont = false;
2289 }
2290 c++;
2291 }
d4fa05b9
TS
2292
2293 if (*c == '\0')
7c74e813
JJ
2294 {
2295 if (allow_continuation
2296 && (cont || gfc_current_form != FORM_FREE))
2297 return -1;
2298 return 0;
2299 }
d4fa05b9
TS
2300
2301 stop = c++;
7c74e813 2302
d4fa05b9
TS
2303 while (*c == ' ' || *c == '\t')
2304 c++;
2305
2306 if (*c != '\0' && *c != '!')
7c74e813 2307 return 0;
d4fa05b9 2308
f7b529fa 2309 /* We have an include line at this point. */
d4fa05b9
TS
2310
2311 *stop = '\0'; /* It's ok to trash the buffer, as this line won't be
2312 read by anything else. */
2313
00660189 2314 filename = gfc_widechar_to_char (begin, -1);
524af0d6 2315 if (!load_file (filename, NULL, false))
abba1823 2316 exit (FATAL_EXIT_CODE);
570f4691 2317
cede9502 2318 free (filename);
7c74e813 2319 return 1;
d4fa05b9
TS
2320}
2321
7c74e813
JJ
2322/* Similarly, but try to parse an INCLUDE statement, using gfc_next_char etc.
2323 APIs. Return 1 if recognized as valid INCLUDE statement and load_file has
2324 been called, 0 if it is not a valid INCLUDE statement and -1 if eof has
2325 been encountered while parsing it. */
2326static int
2327include_stmt (gfc_linebuf *b)
2328{
2329 int ret = 0, i, length;
2330 const char *include = "include";
2331 gfc_char_t c, quote = 0;
2332 locus str_locus;
2333 char *filename;
2334
2335 continue_flag = 0;
2336 end_flag = 0;
2337 gcc_attribute_flag = 0;
2338 openmp_flag = 0;
2339 openacc_flag = 0;
2340 continue_count = 0;
2341 continue_line = 0;
2342 gfc_current_locus.lb = b;
2343 gfc_current_locus.nextc = b->line;
2344
2345 gfc_skip_comments ();
2346 gfc_gobble_whitespace ();
2347
2348 for (i = 0; i < 7; i++)
2349 {
2350 c = gfc_next_char ();
2351 if (c != (unsigned char) include[i])
2352 {
2353 if (gfc_current_form == FORM_FIXED
2354 && i == 0
2355 && c == '0'
2356 && gfc_current_locus.nextc == b->line + 6)
2357 {
2358 gfc_gobble_whitespace ();
2359 i--;
2360 continue;
2361 }
2362 gcc_assert (i != 0);
2363 if (c == '\n')
2364 {
2365 gfc_advance_line ();
2366 gfc_skip_comments ();
2367 if (gfc_at_eof ())
2368 ret = -1;
2369 }
2370 goto do_ret;
2371 }
2372 }
2373 gfc_gobble_whitespace ();
2374
2375 c = gfc_next_char ();
2376 if (c == '\'' || c == '"')
2377 quote = c;
2378 else
2379 {
2380 if (c == '\n')
2381 {
2382 gfc_advance_line ();
2383 gfc_skip_comments ();
2384 if (gfc_at_eof ())
2385 ret = -1;
2386 }
2387 goto do_ret;
2388 }
2389
2390 str_locus = gfc_current_locus;
2391 length = 0;
2392 do
2393 {
2394 c = gfc_next_char_literal (INSTRING_NOWARN);
2395 if (c == quote)
2396 break;
2397 if (c == '\n')
2398 {
2399 gfc_advance_line ();
2400 gfc_skip_comments ();
2401 if (gfc_at_eof ())
2402 ret = -1;
2403 goto do_ret;
2404 }
2405 length++;
2406 }
2407 while (1);
2408
2409 gfc_gobble_whitespace ();
2410 c = gfc_next_char ();
2411 if (c != '\n')
2412 goto do_ret;
2413
2414 gfc_current_locus = str_locus;
2415 ret = 1;
2416 filename = XNEWVEC (char, length + 1);
2417 for (i = 0; i < length; i++)
2418 {
2419 c = gfc_next_char_literal (INSTRING_WARN);
2420 gcc_assert (gfc_wide_fits_in_byte (c));
2421 filename[i] = (unsigned char) c;
2422 }
2423 filename[length] = '\0';
2424 if (!load_file (filename, NULL, false))
2425 exit (FATAL_EXIT_CODE);
2426
2427 free (filename);
2428
2429do_ret:
2430 continue_flag = 0;
2431 end_flag = 0;
2432 gcc_attribute_flag = 0;
2433 openmp_flag = 0;
2434 openacc_flag = 0;
2435 continue_count = 0;
2436 continue_line = 0;
2437 memset (&gfc_current_locus, '\0', sizeof (locus));
2438 memset (&openmp_locus, '\0', sizeof (locus));
2439 memset (&openacc_locus, '\0', sizeof (locus));
2440 memset (&gcc_attribute_locus, '\0', sizeof (locus));
2441 return ret;
2442}
edf1eac2 2443
d4fa05b9
TS
2444/* Load a file into memory by calling load_line until the file ends. */
2445
524af0d6 2446static bool
e513a086 2447load_file (const char *realfilename, const char *displayedname, bool initial)
d4fa05b9 2448{
8fc541d3 2449 gfc_char_t *line;
7c74e813 2450 gfc_linebuf *b, *include_b = NULL;
d4fa05b9
TS
2451 gfc_file *f;
2452 FILE *input;
d1e3d6ae 2453 int len, line_len;
caef7872 2454 bool first_line;
44e66a77
JD
2455 struct stat st;
2456 int stat_result;
e513a086 2457 const char *filename;
892a371f
DS
2458 /* If realfilename and displayedname are different and non-null then
2459 surely realfilename is the preprocessed form of
2460 displayedname. */
2461 bool preprocessed_p = (realfilename && displayedname
2462 && strcmp (realfilename, displayedname));
e513a086
TB
2463
2464 filename = displayedname ? displayedname : realfilename;
d4fa05b9
TS
2465
2466 for (f = current_file; f; f = f->up)
ba78087b 2467 if (filename_cmp (filename, f->filename) == 0)
d4fa05b9 2468 {
0ee1b105
TB
2469 fprintf (stderr, "%s:%d: Error: File '%s' is being included "
2470 "recursively\n", current_file->filename, current_file->line,
2471 filename);
524af0d6 2472 return false;
d4fa05b9
TS
2473 }
2474
2475 if (initial)
2476 {
2d7c7df6
JJ
2477 if (gfc_src_file)
2478 {
2479 input = gfc_src_file;
2480 gfc_src_file = NULL;
2481 }
2482 else
e513a086 2483 input = gfc_open_file (realfilename);
44e66a77 2484
d4fa05b9
TS
2485 if (input == NULL)
2486 {
1fe61adf 2487 gfc_error_now ("Cannot open file %qs", filename);
524af0d6 2488 return false;
d4fa05b9
TS
2489 }
2490 }
2491 else
2492 {
e513a086 2493 input = gfc_open_included_file (realfilename, false, false);
d4fa05b9
TS
2494 if (input == NULL)
2495 {
fcd698d7
ML
2496 /* For -fpre-include file, current_file is NULL. */
2497 if (current_file)
2498 fprintf (stderr, "%s:%d: Error: Can't open included file '%s'\n",
2499 current_file->filename, current_file->line, filename);
2500 else
2501 fprintf (stderr, "Error: Can't open pre-included file '%s'\n",
2502 filename);
2503
524af0d6 2504 return false;
d4fa05b9 2505 }
44e66a77 2506 stat_result = stat (realfilename, &st);
5803aa7c 2507 if (stat_result == 0 && !S_ISREG(st.st_mode))
44e66a77
JD
2508 {
2509 fprintf (stderr, "%s:%d: Error: Included path '%s'"
2510 " is not a regular file\n",
2511 current_file->filename, current_file->line, filename);
2512 fclose (input);
2513 return false;
2514 }
d4fa05b9
TS
2515 }
2516
892a371f 2517 /* Load the file.
d4fa05b9 2518
892a371f
DS
2519 A "non-initial" file means a file that is being included. In
2520 that case we are creating an LC_ENTER map.
2521
2522 An "initial" file means a main file; one that is not included.
2523 That file has already got at least one (surely more) line map(s)
2524 created by gfc_init. So the subsequent map created in that case
2525 must have LC_RENAME reason.
2526
2527 This latter case is not true for a preprocessed file. In that
2528 case, although the file is "initial", the line maps created by
2529 gfc_init was used during the preprocessing of the file. Now that
2530 the preprocessing is over and we are being fed the result of that
2531 preprocessing, we need to create a brand new line map for the
2532 preprocessed file, so the reason is going to be LC_ENTER. */
2533
2534 f = get_file (filename, (initial && !preprocessed_p) ? LC_RENAME : LC_ENTER);
1b271c9b
JJ
2535 if (!initial)
2536 add_file_change (f->filename, f->inclusion_line);
d4fa05b9
TS
2537 current_file = f;
2538 current_file->line = 1;
f56c5d5d 2539 line = NULL;
d1e3d6ae 2540 line_len = 0;
caef7872 2541 first_line = true;
d4fa05b9 2542
2d7c7df6
JJ
2543 if (initial && gfc_src_preprocessor_lines[0])
2544 {
2545 preprocessor_line (gfc_src_preprocessor_lines[0]);
cede9502 2546 free (gfc_src_preprocessor_lines[0]);
2d7c7df6
JJ
2547 gfc_src_preprocessor_lines[0] = NULL;
2548 if (gfc_src_preprocessor_lines[1])
2549 {
2550 preprocessor_line (gfc_src_preprocessor_lines[1]);
cede9502 2551 free (gfc_src_preprocessor_lines[1]);
2d7c7df6
JJ
2552 gfc_src_preprocessor_lines[1] = NULL;
2553 }
2554 }
2555
16ab8e74 2556 for (;;)
d4fa05b9 2557 {
f2f5443c 2558 int trunc = load_line (input, &line, &line_len, NULL);
7c74e813 2559 int inc_line;
d4fa05b9 2560
8fc541d3 2561 len = gfc_wide_strlen (line);
6de9cd9a
DN
2562 if (feof (input) && len == 0)
2563 break;
2564
caef7872
FXC
2565 /* If this is the first line of the file, it can contain a byte
2566 order mark (BOM), which we will ignore:
2567 FF FE is UTF-16 little endian,
2568 FE FF is UTF-16 big endian,
2569 EF BB BF is UTF-8. */
2570 if (first_line
8fc541d3
FXC
2571 && ((line_len >= 2 && line[0] == (unsigned char) '\xFF'
2572 && line[1] == (unsigned char) '\xFE')
2573 || (line_len >= 2 && line[0] == (unsigned char) '\xFE'
2574 && line[1] == (unsigned char) '\xFF')
2575 || (line_len >= 3 && line[0] == (unsigned char) '\xEF'
2576 && line[1] == (unsigned char) '\xBB'
2577 && line[2] == (unsigned char) '\xBF')))
caef7872 2578 {
8fc541d3 2579 int n = line[1] == (unsigned char) '\xBB' ? 3 : 2;
7b901ac4 2580 gfc_char_t *new_char = gfc_get_wide_string (line_len);
caef7872 2581
7b901ac4 2582 wide_strcpy (new_char, &line[n]);
cede9502 2583 free (line);
7b901ac4 2584 line = new_char;
caef7872
FXC
2585 len -= n;
2586 }
2587
d4fa05b9
TS
2588 /* There are three things this line can be: a line of Fortran
2589 source, an include line or a C preprocessor directive. */
6de9cd9a 2590
d4fa05b9
TS
2591 if (line[0] == '#')
2592 {
9e8a6720
FXC
2593 /* When -g3 is specified, it's possible that we emit #define
2594 and #undef lines, which we need to pass to the middle-end
2595 so that it can emit correct debug info. */
2596 if (debug_info_level == DINFO_LEVEL_VERBOSE
8fc541d3
FXC
2597 && (wide_strncmp (line, "#define ", 8) == 0
2598 || wide_strncmp (line, "#undef ", 7) == 0))
9e8a6720
FXC
2599 ;
2600 else
2601 {
2602 preprocessor_line (line);
2603 continue;
2604 }
d4fa05b9 2605 }
6de9cd9a 2606
caef7872 2607 /* Preprocessed files have preprocessor lines added before the byte
7c74e813 2608 order mark, so first_line is not about the first line of the file
caef7872
FXC
2609 but the first line that's not a preprocessor line. */
2610 first_line = false;
2611
7c74e813
JJ
2612 inc_line = include_line (line);
2613 if (inc_line > 0)
d4fa05b9
TS
2614 {
2615 current_file->line++;
2616 continue;
6de9cd9a
DN
2617 }
2618
d4fa05b9
TS
2619 /* Add line. */
2620
f7d2e5d4
JB
2621 b = XCNEWVAR (gfc_linebuf, gfc_linebuf_header_size
2622 + (len + 1) * sizeof (gfc_char_t));
d4fa05b9 2623
c4100eae 2624
c8cc8542 2625 b->location
b93c0722
MLI
2626 = linemap_line_start (line_table, current_file->line++, len);
2627 /* ??? We add the location for the maximum column possible here,
2628 because otherwise if the next call creates a new line-map, it
2629 will not reserve space for any offset. */
2630 if (len > 0)
2631 linemap_position_for_column (line_table, len);
2632
d4fa05b9 2633 b->file = current_file;
ba1defa5 2634 b->truncated = trunc;
8fc541d3 2635 wide_strcpy (b->line, line);
d4fa05b9
TS
2636
2637 if (line_head == NULL)
2638 line_head = b;
2639 else
2640 line_tail->next = b;
2641
2642 line_tail = b;
1b271c9b
JJ
2643
2644 while (file_changes_cur < file_changes_count)
2645 file_changes[file_changes_cur++].lb = b;
7c74e813
JJ
2646
2647 if (flag_dec_include)
2648 {
2649 if (include_b && b != include_b)
2650 {
2651 int inc_line2 = include_stmt (include_b);
2652 if (inc_line2 == 0)
2653 include_b = NULL;
2654 else if (inc_line2 > 0)
2655 {
2656 do
2657 {
2658 if (gfc_current_form == FORM_FIXED)
2659 {
2660 for (gfc_char_t *p = include_b->line; *p; p++)
2661 *p = ' ';
2662 }
2663 else
2664 include_b->line[0] = '\0';
2665 if (include_b == b)
2666 break;
2667 include_b = include_b->next;
2668 }
2669 while (1);
2670 include_b = NULL;
2671 }
2672 }
2673 if (inc_line == -1 && !include_b)
2674 include_b = b;
2675 }
6de9cd9a 2676 }
d4fa05b9 2677
f56c5d5d 2678 /* Release the line buffer allocated in load_line. */
cede9502 2679 free (line);
f56c5d5d 2680
d4fa05b9
TS
2681 fclose (input);
2682
1b271c9b
JJ
2683 if (!initial)
2684 add_file_change (NULL, current_file->inclusion_line + 1);
d4fa05b9 2685 current_file = current_file->up;
5ffeb913 2686 linemap_add (line_table, LC_LEAVE, 0, NULL, 0);
524af0d6 2687 return true;
6de9cd9a
DN
2688}
2689
2690
524af0d6
JB
2691/* Open a new file and start scanning from that file. Returns true
2692 if everything went OK, false otherwise. If form == FORM_UNKNOWN
d4fa05b9
TS
2693 it tries to determine the source form from the filename, defaulting
2694 to free form. */
6de9cd9a 2695
524af0d6 2696bool
e0bcf78c 2697gfc_new_file (void)
6de9cd9a 2698{
524af0d6 2699 bool result;
6de9cd9a 2700
facf0354
ML
2701 if (flag_pre_include != NULL
2702 && !load_file (flag_pre_include, NULL, false))
2703 exit (FATAL_EXIT_CODE);
2704
670637ee
DF
2705 if (gfc_cpp_enabled ())
2706 {
2707 result = gfc_cpp_preprocess (gfc_source_file);
2708 if (!gfc_cpp_preprocess_only ())
e513a086 2709 result = load_file (gfc_cpp_temporary_file (), gfc_source_file, true);
670637ee
DF
2710 }
2711 else
e513a086 2712 result = load_file (gfc_source_file, NULL, true);
6de9cd9a 2713
63645982
TS
2714 gfc_current_locus.lb = line_head;
2715 gfc_current_locus.nextc = (line_head == NULL) ? NULL : line_head->line;
6de9cd9a 2716
d4fa05b9
TS
2717#if 0 /* Debugging aid. */
2718 for (; line_head; line_head = line_head->next)
6c1abb5c
FXC
2719 printf ("%s:%3d %s\n", LOCATION_FILE (line_head->location),
2720 LOCATION_LINE (line_head->location), line_head->line);
6de9cd9a 2721
abba1823 2722 exit (SUCCESS_EXIT_CODE);
d4fa05b9 2723#endif
6de9cd9a 2724
d4fa05b9 2725 return result;
6de9cd9a 2726}
2d7c7df6
JJ
2727
2728static char *
2729unescape_filename (const char *ptr)
2730{
2731 const char *p = ptr, *s;
2732 char *d, *ret;
2733 int escaped, unescape = 0;
2734
2735 /* Make filename end at quote. */
2736 escaped = false;
2737 while (*p && ! (! escaped && *p == '"'))
2738 {
2739 if (escaped)
2740 escaped = false;
2741 else if (*p == '\\')
2742 {
2743 escaped = true;
2744 unescape++;
2745 }
2746 ++p;
2747 }
2748
edf1eac2 2749 if (!*p || p[1])
2d7c7df6
JJ
2750 return NULL;
2751
2752 /* Undo effects of cpp_quote_string. */
2753 s = ptr;
ece3f663 2754 d = XCNEWVEC (char, p + 1 - ptr - unescape);
2d7c7df6
JJ
2755 ret = d;
2756
2757 while (s != p)
2758 {
2759 if (*s == '\\')
2760 *d++ = *++s;
2761 else
2762 *d++ = *s;
2763 s++;
2764 }
2765 *d = '\0';
2766 return ret;
2767}
2768
2769/* For preprocessed files, if the first tokens are of the form # NUM.
2770 handle the directives so we know the original file name. */
2771
2772const char *
2773gfc_read_orig_filename (const char *filename, const char **canon_source_file)
2774{
2775 int c, len;
8fc541d3 2776 char *dirname, *tmp;
2d7c7df6
JJ
2777
2778 gfc_src_file = gfc_open_file (filename);
2779 if (gfc_src_file == NULL)
2780 return NULL;
2781
c4da1827 2782 c = getc (gfc_src_file);
2d7c7df6
JJ
2783
2784 if (c != '#')
2785 return NULL;
2786
2787 len = 0;
f2f5443c 2788 load_line (gfc_src_file, &gfc_src_preprocessor_lines[0], &len, &c);
2d7c7df6 2789
8fc541d3 2790 if (wide_strncmp (gfc_src_preprocessor_lines[0], "# 1 \"", 5) != 0)
2d7c7df6
JJ
2791 return NULL;
2792
00660189 2793 tmp = gfc_widechar_to_char (&gfc_src_preprocessor_lines[0][5], -1);
8fc541d3 2794 filename = unescape_filename (tmp);
cede9502 2795 free (tmp);
2d7c7df6
JJ
2796 if (filename == NULL)
2797 return NULL;
2798
c4da1827 2799 c = getc (gfc_src_file);
2d7c7df6
JJ
2800
2801 if (c != '#')
2802 return filename;
2803
2804 len = 0;
f2f5443c 2805 load_line (gfc_src_file, &gfc_src_preprocessor_lines[1], &len, &c);
2d7c7df6 2806
8fc541d3 2807 if (wide_strncmp (gfc_src_preprocessor_lines[1], "# 1 \"", 5) != 0)
2d7c7df6
JJ
2808 return filename;
2809
00660189 2810 tmp = gfc_widechar_to_char (&gfc_src_preprocessor_lines[1][5], -1);
8fc541d3 2811 dirname = unescape_filename (tmp);
cede9502 2812 free (tmp);
2d7c7df6
JJ
2813 if (dirname == NULL)
2814 return filename;
2815
2816 len = strlen (dirname);
2817 if (len < 3 || dirname[len - 1] != '/' || dirname[len - 2] != '/')
2818 {
cede9502 2819 free (dirname);
2d7c7df6
JJ
2820 return filename;
2821 }
2822 dirname[len - 2] = '\0';
2823 set_src_pwd (dirname);
2824
2825 if (! IS_ABSOLUTE_PATH (filename))
2826 {
ece3f663 2827 char *p = XCNEWVEC (char, len + strlen (filename));
2d7c7df6
JJ
2828
2829 memcpy (p, dirname, len - 2);
2830 p[len - 2] = '/';
2831 strcpy (p + len - 1, filename);
2832 *canon_source_file = p;
2833 }
2834
cede9502 2835 free (dirname);
2d7c7df6
JJ
2836 return filename;
2837}