PR fortran/29097
[official-gcc.git] / gcc / fortran / scanner.c
blobe79fa37b922269a37febf5f2fab123432f6f3cb8
1 /* Character scanner.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006
3 Free Software Foundation, Inc.
4 Contributed by Andy Vaught
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
21 02110-1301, USA. */
23 /* Set of subroutines to (ultimately) return the next character to the
24 various matching subroutines. This file's job is to read files and
25 build up lines that are parsed by the parser. This means that we
26 handle continuation lines and "include" lines.
28 The first thing the scanner does is to load an entire file into
29 memory. We load the entire file into memory for a couple reasons.
30 The first is that we want to be able to deal with nonseekable input
31 (pipes, stdin) and there is a lot of backing up involved during
32 parsing.
34 The second is that we want to be able to print the locus of errors,
35 and an error on line 999999 could conflict with something on line
36 one. Given nonseekable input, we've got to store the whole thing.
38 One thing that helps are the column truncation limits that give us
39 an upper bound on the size of individual lines. We don't store the
40 truncated stuff.
42 From the scanner's viewpoint, the higher level subroutines ask for
43 new characters and do a lot of jumping backwards. */
45 #include "config.h"
46 #include "system.h"
47 #include "gfortran.h"
48 #include "toplev.h"
50 /* Structure for holding module and include file search path. */
51 typedef struct gfc_directorylist
53 char *path;
54 struct gfc_directorylist *next;
56 gfc_directorylist;
58 /* List of include file search directories. */
59 static gfc_directorylist *include_dirs;
61 static gfc_file *file_head, *current_file;
63 static int continue_flag, end_flag, openmp_flag;
64 static locus openmp_locus;
66 gfc_source_form gfc_current_form;
67 static gfc_linebuf *line_head, *line_tail;
69 locus gfc_current_locus;
70 const char *gfc_source_file;
71 static FILE *gfc_src_file;
72 static char *gfc_src_preprocessor_lines[2];
75 /* Main scanner initialization. */
77 void
78 gfc_scanner_init_1 (void)
80 file_head = NULL;
81 line_head = NULL;
82 line_tail = NULL;
84 end_flag = 0;
88 /* Main scanner destructor. */
90 void
91 gfc_scanner_done_1 (void)
93 gfc_linebuf *lb;
94 gfc_file *f;
96 while(line_head != NULL)
98 lb = line_head->next;
99 gfc_free(line_head);
100 line_head = lb;
103 while(file_head != NULL)
105 f = file_head->next;
106 gfc_free(file_head->filename);
107 gfc_free(file_head);
108 file_head = f;
114 /* Adds path to the list pointed to by list. */
116 void
117 gfc_add_include_path (const char *path)
119 gfc_directorylist *dir;
120 const char *p;
122 p = path;
123 while (*p == ' ' || *p == '\t') /* someone might do 'gfortran "-I include"' */
124 if (*p++ == '\0')
125 return;
127 dir = include_dirs;
128 if (!dir)
130 dir = include_dirs = gfc_getmem (sizeof (gfc_directorylist));
132 else
134 while (dir->next)
135 dir = dir->next;
137 dir->next = gfc_getmem (sizeof (gfc_directorylist));
138 dir = dir->next;
141 dir->next = NULL;
142 dir->path = gfc_getmem (strlen (p) + 2);
143 strcpy (dir->path, p);
144 strcat (dir->path, "/"); /* make '/' last character */
148 /* Release resources allocated for options. */
150 void
151 gfc_release_include_path (void)
153 gfc_directorylist *p;
155 gfc_free (gfc_option.module_dir);
156 while (include_dirs != NULL)
158 p = include_dirs;
159 include_dirs = include_dirs->next;
160 gfc_free (p->path);
161 gfc_free (p);
165 /* Opens file for reading, searching through the include directories
166 given if necessary. If the include_cwd argument is true, we try
167 to open the file in the current directory first. */
169 FILE *
170 gfc_open_included_file (const char *name, const bool include_cwd)
172 char *fullname;
173 gfc_directorylist *p;
174 FILE *f;
176 if (include_cwd)
178 f = gfc_open_file (name);
179 if (f != NULL)
180 return f;
183 for (p = include_dirs; p; p = p->next)
185 fullname = (char *) alloca(strlen (p->path) + strlen (name) + 1);
186 strcpy (fullname, p->path);
187 strcat (fullname, name);
189 f = gfc_open_file (fullname);
190 if (f != NULL)
191 return f;
194 return NULL;
197 /* Test to see if we're at the end of the main source file. */
200 gfc_at_end (void)
203 return end_flag;
207 /* Test to see if we're at the end of the current file. */
210 gfc_at_eof (void)
213 if (gfc_at_end ())
214 return 1;
216 if (line_head == NULL)
217 return 1; /* Null file */
219 if (gfc_current_locus.lb == NULL)
220 return 1;
222 return 0;
226 /* Test to see if we're at the beginning of a new line. */
229 gfc_at_bol (void)
231 if (gfc_at_eof ())
232 return 1;
234 return (gfc_current_locus.nextc == gfc_current_locus.lb->line);
238 /* Test to see if we're at the end of a line. */
241 gfc_at_eol (void)
244 if (gfc_at_eof ())
245 return 1;
247 return (*gfc_current_locus.nextc == '\0');
251 /* Advance the current line pointer to the next line. */
253 void
254 gfc_advance_line (void)
256 if (gfc_at_end ())
257 return;
259 if (gfc_current_locus.lb == NULL)
261 end_flag = 1;
262 return;
265 gfc_current_locus.lb = gfc_current_locus.lb->next;
267 if (gfc_current_locus.lb != NULL)
268 gfc_current_locus.nextc = gfc_current_locus.lb->line;
269 else
271 gfc_current_locus.nextc = NULL;
272 end_flag = 1;
277 /* Get the next character from the input, advancing gfc_current_file's
278 locus. When we hit the end of the line or the end of the file, we
279 start returning a '\n' in order to complete the current statement.
280 No Fortran line conventions are implemented here.
282 Requiring explicit advances to the next line prevents the parse
283 pointer from being on the wrong line if the current statement ends
284 prematurely. */
286 static int
287 next_char (void)
289 int c;
291 if (gfc_current_locus.nextc == NULL)
292 return '\n';
294 c = *gfc_current_locus.nextc++;
295 if (c == '\0')
297 gfc_current_locus.nextc--; /* Remain on this line. */
298 c = '\n';
301 return c;
304 /* Skip a comment. When we come here the parse pointer is positioned
305 immediately after the comment character. If we ever implement
306 compiler directives withing comments, here is where we parse the
307 directive. */
309 static void
310 skip_comment_line (void)
312 char c;
316 c = next_char ();
318 while (c != '\n');
320 gfc_advance_line ();
324 /* Comment lines are null lines, lines containing only blanks or lines
325 on which the first nonblank line is a '!'. */
327 static void
328 skip_free_comments (void)
330 locus start;
331 char c;
332 int at_bol;
334 for (;;)
336 at_bol = gfc_at_bol ();
337 start = gfc_current_locus;
338 if (gfc_at_eof ())
339 break;
342 c = next_char ();
343 while (gfc_is_whitespace (c));
345 if (c == '\n')
347 gfc_advance_line ();
348 continue;
351 if (c == '!')
353 /* If -fopenmp, we need to handle here 2 things:
354 1) don't treat !$omp as comments, but directives
355 2) handle OpenMP conditional compilation, where
356 !$ should be treated as 2 spaces (for initial lines
357 only if followed by space). */
358 if (gfc_option.flag_openmp && at_bol)
360 locus old_loc = gfc_current_locus;
361 if (next_char () == '$')
363 c = next_char ();
364 if (c == 'o' || c == 'O')
366 if (((c = next_char ()) == 'm' || c == 'M')
367 && ((c = next_char ()) == 'p' || c == 'P')
368 && ((c = next_char ()) == ' ' || continue_flag))
370 while (gfc_is_whitespace (c))
371 c = next_char ();
372 if (c != '\n' && c != '!')
374 openmp_flag = 1;
375 openmp_locus = old_loc;
376 gfc_current_locus = start;
377 return;
380 gfc_current_locus = old_loc;
381 next_char ();
382 c = next_char ();
384 if (continue_flag || c == ' ')
386 gfc_current_locus = old_loc;
387 next_char ();
388 return;
391 gfc_current_locus = old_loc;
393 skip_comment_line ();
394 continue;
397 break;
400 if (openmp_flag && at_bol)
401 openmp_flag = 0;
402 gfc_current_locus = start;
406 /* Skip comment lines in fixed source mode. We have the same rules as
407 in skip_free_comment(), except that we can have a 'c', 'C' or '*'
408 in column 1, and a '!' cannot be in column 6. Also, we deal with
409 lines with 'd' or 'D' in column 1, if the user requested this. */
411 static void
412 skip_fixed_comments (void)
414 locus start;
415 int col;
416 char c;
418 if (! gfc_at_bol ())
420 start = gfc_current_locus;
421 if (! gfc_at_eof ())
424 c = next_char ();
425 while (gfc_is_whitespace (c));
427 if (c == '\n')
428 gfc_advance_line ();
429 else if (c == '!')
430 skip_comment_line ();
433 if (! gfc_at_bol ())
435 gfc_current_locus = start;
436 return;
440 for (;;)
442 start = gfc_current_locus;
443 if (gfc_at_eof ())
444 break;
446 c = next_char ();
447 if (c == '\n')
449 gfc_advance_line ();
450 continue;
453 if (c == '!' || c == 'c' || c == 'C' || c == '*')
455 /* If -fopenmp, we need to handle here 2 things:
456 1) don't treat !$omp|c$omp|*$omp as comments, but directives
457 2) handle OpenMP conditional compilation, where
458 !$|c$|*$ should be treated as 2 spaces if the characters
459 in columns 3 to 6 are valid fixed form label columns
460 characters. */
461 if (gfc_option.flag_openmp)
463 if (next_char () == '$')
465 c = next_char ();
466 if (c == 'o' || c == 'O')
468 if (((c = next_char ()) == 'm' || c == 'M')
469 && ((c = next_char ()) == 'p' || c == 'P'))
471 c = next_char ();
472 if (c != '\n'
473 && ((openmp_flag && continue_flag)
474 || c == ' ' || c == '0'))
476 c = next_char ();
477 while (gfc_is_whitespace (c))
478 c = next_char ();
479 if (c != '\n' && c != '!')
481 /* Canonicalize to *$omp. */
482 *start.nextc = '*';
483 openmp_flag = 1;
484 gfc_current_locus = start;
485 return;
490 else
492 int digit_seen = 0;
494 for (col = 3; col < 6; col++, c = next_char ())
495 if (c == ' ')
496 continue;
497 else if (c < '0' || c > '9')
498 break;
499 else
500 digit_seen = 1;
502 if (col == 6 && c != '\n'
503 && ((continue_flag && !digit_seen)
504 || c == ' ' || c == '0'))
506 gfc_current_locus = start;
507 start.nextc[0] = ' ';
508 start.nextc[1] = ' ';
509 continue;
513 gfc_current_locus = start;
515 skip_comment_line ();
516 continue;
519 if (gfc_option.flag_d_lines != -1 && (c == 'd' || c == 'D'))
521 if (gfc_option.flag_d_lines == 0)
523 skip_comment_line ();
524 continue;
526 else
527 *start.nextc = c = ' ';
530 col = 1;
532 while (gfc_is_whitespace (c))
534 c = next_char ();
535 col++;
538 if (c == '\n')
540 gfc_advance_line ();
541 continue;
544 if (col != 6 && c == '!')
546 skip_comment_line ();
547 continue;
550 break;
553 openmp_flag = 0;
554 gfc_current_locus = start;
558 /* Skips the current line if it is a comment. */
560 void
561 gfc_skip_comments (void)
563 if (gfc_current_form == FORM_FREE)
564 skip_free_comments ();
565 else
566 skip_fixed_comments ();
570 /* Get the next character from the input, taking continuation lines
571 and end-of-line comments into account. This implies that comment
572 lines between continued lines must be eaten here. For higher-level
573 subroutines, this flattens continued lines into a single logical
574 line. The in_string flag denotes whether we're inside a character
575 context or not. */
578 gfc_next_char_literal (int in_string)
580 locus old_loc;
581 int i, c, prev_openmp_flag;
583 continue_flag = 0;
585 restart:
586 c = next_char ();
587 if (gfc_at_end ())
588 return c;
590 if (gfc_current_form == FORM_FREE)
592 if (!in_string && c == '!')
594 if (openmp_flag
595 && memcmp (&gfc_current_locus, &openmp_locus,
596 sizeof (gfc_current_locus)) == 0)
597 goto done;
599 /* This line can't be continued */
602 c = next_char ();
604 while (c != '\n');
606 /* Avoid truncation warnings for comment ending lines. */
607 gfc_current_locus.lb->truncated = 0;
609 goto done;
612 if (c != '&')
613 goto done;
615 /* If the next nonblank character is a ! or \n, we've got a
616 continuation line. */
617 old_loc = gfc_current_locus;
619 c = next_char ();
620 while (gfc_is_whitespace (c))
621 c = next_char ();
623 /* Character constants to be continued cannot have commentary
624 after the '&'. */
626 if (in_string && c != '\n')
628 gfc_current_locus = old_loc;
629 c = '&';
630 goto done;
633 if (c != '!' && c != '\n')
635 gfc_current_locus = old_loc;
636 c = '&';
637 goto done;
640 prev_openmp_flag = openmp_flag;
641 continue_flag = 1;
642 if (c == '!')
643 skip_comment_line ();
644 else
645 gfc_advance_line ();
647 /* We've got a continuation line and need to find where it continues.
648 First eat any comment lines. */
649 gfc_skip_comments ();
651 if (prev_openmp_flag != openmp_flag)
653 gfc_current_locus = old_loc;
654 openmp_flag = prev_openmp_flag;
655 c = '&';
656 goto done;
659 /* Now that we have a non-comment line, probe ahead for the
660 first non-whitespace character. If it is another '&', then
661 reading starts at the next character, otherwise we must back
662 up to where the whitespace started and resume from there. */
664 old_loc = gfc_current_locus;
666 c = next_char ();
667 while (gfc_is_whitespace (c))
668 c = next_char ();
670 if (openmp_flag)
672 for (i = 0; i < 5; i++, c = next_char ())
674 gcc_assert (TOLOWER (c) == "!$omp"[i]);
675 if (i == 4)
676 old_loc = gfc_current_locus;
678 while (gfc_is_whitespace (c))
679 c = next_char ();
682 if (c != '&')
684 if (in_string && gfc_option.warn_ampersand)
685 gfc_warning ("Missing '&' in continued character constant at %C");
687 gfc_current_locus.nextc--;
690 else
692 /* Fixed form continuation. */
693 if (!in_string && c == '!')
695 /* Skip comment at end of line. */
698 c = next_char ();
700 while (c != '\n');
702 /* Avoid truncation warnings for comment ending lines. */
703 gfc_current_locus.lb->truncated = 0;
706 if (c != '\n')
707 goto done;
709 prev_openmp_flag = openmp_flag;
710 continue_flag = 1;
711 old_loc = gfc_current_locus;
713 gfc_advance_line ();
714 gfc_skip_comments ();
716 /* See if this line is a continuation line. */
717 if (openmp_flag != prev_openmp_flag)
719 openmp_flag = prev_openmp_flag;
720 goto not_continuation;
723 if (!openmp_flag)
724 for (i = 0; i < 5; i++)
726 c = next_char ();
727 if (c != ' ')
728 goto not_continuation;
730 else
731 for (i = 0; i < 5; i++)
733 c = next_char ();
734 if (TOLOWER (c) != "*$omp"[i])
735 goto not_continuation;
738 c = next_char ();
739 if (c == '0' || c == ' ' || c == '\n')
740 goto not_continuation;
743 /* Ready to read first character of continuation line, which might
744 be another continuation line! */
745 goto restart;
747 not_continuation:
748 c = '\n';
749 gfc_current_locus = old_loc;
751 done:
752 continue_flag = 0;
753 return c;
757 /* Get the next character of input, folded to lowercase. In fixed
758 form mode, we also ignore spaces. When matcher subroutines are
759 parsing character literals, they have to call
760 gfc_next_char_literal(). */
763 gfc_next_char (void)
765 int c;
769 c = gfc_next_char_literal (0);
771 while (gfc_current_form == FORM_FIXED && gfc_is_whitespace (c));
773 return TOLOWER (c);
778 gfc_peek_char (void)
780 locus old_loc;
781 int c;
783 old_loc = gfc_current_locus;
784 c = gfc_next_char ();
785 gfc_current_locus = old_loc;
787 return c;
791 /* Recover from an error. We try to get past the current statement
792 and get lined up for the next. The next statement follows a '\n'
793 or a ';'. We also assume that we are not within a character
794 constant, and deal with finding a '\'' or '"'. */
796 void
797 gfc_error_recovery (void)
799 char c, delim;
801 if (gfc_at_eof ())
802 return;
804 for (;;)
806 c = gfc_next_char ();
807 if (c == '\n' || c == ';')
808 break;
810 if (c != '\'' && c != '"')
812 if (gfc_at_eof ())
813 break;
814 continue;
816 delim = c;
818 for (;;)
820 c = next_char ();
822 if (c == delim)
823 break;
824 if (c == '\n')
825 return;
826 if (c == '\\')
828 c = next_char ();
829 if (c == '\n')
830 return;
833 if (gfc_at_eof ())
834 break;
839 /* Read ahead until the next character to be read is not whitespace. */
841 void
842 gfc_gobble_whitespace (void)
844 static int linenum = 0;
845 locus old_loc;
846 int c;
850 old_loc = gfc_current_locus;
851 c = gfc_next_char_literal (0);
852 /* Issue a warning for nonconforming tabs. We keep track of the line
853 number because the Fortran matchers will often back up and the same
854 line will be scanned multiple times. */
855 if (!gfc_option.warn_tabs && c == '\t')
857 #ifdef USE_MAPPED_LOCATION
858 int cur_linenum = LOCATION_LINE (gfc_current_locus.lb->location);
859 #else
860 int cur_linenum = gfc_current_locus.lb->linenum;
861 #endif
862 if (cur_linenum != linenum)
864 linenum = cur_linenum;
865 gfc_warning_now ("Nonconforming tab character at %C");
869 while (gfc_is_whitespace (c));
871 gfc_current_locus = old_loc;
875 /* Load a single line into pbuf.
877 If pbuf points to a NULL pointer, it is allocated.
878 We truncate lines that are too long, unless we're dealing with
879 preprocessor lines or if the option -ffixed-line-length-none is set,
880 in which case we reallocate the buffer to fit the entire line, if
881 need be.
882 In fixed mode, we expand a tab that occurs within the statement
883 label region to expand to spaces that leave the next character in
884 the source region.
885 load_line returns whether the line was truncated. */
887 static int
888 load_line (FILE * input, char **pbuf, int *pbuflen)
890 static int linenum = 0, current_line = 1;
891 int c, maxlen, i, preprocessor_flag, buflen = *pbuflen;
892 int trunc_flag = 0, seen_comment = 0;
893 char *buffer;
895 /* Determine the maximum allowed line length.
896 The default for free-form is GFC_MAX_LINE, for fixed-form or for
897 unknown form it is 72. Refer to the documentation in gfc_option_t. */
898 if (gfc_current_form == FORM_FREE)
900 if (gfc_option.free_line_length == -1)
901 maxlen = GFC_MAX_LINE;
902 else
903 maxlen = gfc_option.free_line_length;
905 else if (gfc_current_form == FORM_FIXED)
907 if (gfc_option.fixed_line_length == -1)
908 maxlen = 72;
909 else
910 maxlen = gfc_option.fixed_line_length;
912 else
913 maxlen = 72;
915 if (*pbuf == NULL)
917 /* Allocate the line buffer, storing its length into buflen. */
918 if (maxlen > 0)
919 buflen = maxlen;
920 else
921 buflen = GFC_MAX_LINE;
923 *pbuf = gfc_getmem (buflen + 1);
926 i = 0;
927 buffer = *pbuf;
929 preprocessor_flag = 0;
930 c = fgetc (input);
931 if (c == '#')
932 /* In order to not truncate preprocessor lines, we have to
933 remember that this is one. */
934 preprocessor_flag = 1;
935 ungetc (c, input);
937 for (;;)
939 c = fgetc (input);
941 if (c == EOF)
942 break;
943 if (c == '\n')
944 break;
946 if (c == '\r')
947 continue; /* Gobble characters. */
948 if (c == '\0')
949 continue;
951 if (c == '\032')
953 /* Ctrl-Z ends the file. */
954 while (fgetc (input) != EOF);
955 break;
958 /* Is this a fixed-form comment? */
959 if (gfc_current_form == FORM_FIXED && i == 0
960 && (c == '*' || c == 'c' || c == 'd'))
961 seen_comment = 1;
963 if (gfc_current_form == FORM_FIXED && c == '\t' && i <= 6)
965 /* The error machinery isn't available at this point, so we can't
966 easily report line and column numbers consistent with other
967 parts of gfortran. */
968 if (!gfc_option.warn_tabs && seen_comment == 0
969 && current_line != linenum)
971 linenum = current_line;
972 gfc_warning_now (
973 "Nonconforming tab character in column 1 of line %d", linenum);
976 while (i <= 6)
978 *buffer++ = ' ';
979 i++;
982 continue;
985 *buffer++ = c;
986 i++;
988 if (maxlen == 0 || preprocessor_flag)
990 if (i >= buflen)
992 /* Reallocate line buffer to double size to hold the
993 overlong line. */
994 buflen = buflen * 2;
995 *pbuf = xrealloc (*pbuf, buflen + 1);
996 buffer = (*pbuf)+i;
999 else if (i >= maxlen)
1001 /* Truncate the rest of the line. */
1002 for (;;)
1004 c = fgetc (input);
1005 if (c == '\n' || c == EOF)
1006 break;
1008 trunc_flag = 1;
1011 ungetc ('\n', input);
1015 /* Pad lines to the selected line length in fixed form. */
1016 if (gfc_current_form == FORM_FIXED
1017 && gfc_option.fixed_line_length != 0
1018 && !preprocessor_flag
1019 && c != EOF)
1021 while (i++ < maxlen)
1022 *buffer++ = ' ';
1025 *buffer = '\0';
1026 *pbuflen = buflen;
1027 current_line++;
1029 return trunc_flag;
1033 /* Get a gfc_file structure, initialize it and add it to
1034 the file stack. */
1036 static gfc_file *
1037 get_file (const char *name, enum lc_reason reason ATTRIBUTE_UNUSED)
1039 gfc_file *f;
1041 f = gfc_getmem (sizeof (gfc_file));
1043 f->filename = gfc_getmem (strlen (name) + 1);
1044 strcpy (f->filename, name);
1046 f->next = file_head;
1047 file_head = f;
1049 f->included_by = current_file;
1050 if (current_file != NULL)
1051 f->inclusion_line = current_file->line;
1053 #ifdef USE_MAPPED_LOCATION
1054 linemap_add (&line_table, reason, false, f->filename, 1);
1055 #endif
1057 return f;
1060 /* Deal with a line from the C preprocessor. The
1061 initial octothorp has already been seen. */
1063 static void
1064 preprocessor_line (char *c)
1066 bool flag[5];
1067 int i, line;
1068 char *filename;
1069 gfc_file *f;
1070 int escaped, unescape;
1072 c++;
1073 while (*c == ' ' || *c == '\t')
1074 c++;
1076 if (*c < '0' || *c > '9')
1077 goto bad_cpp_line;
1079 line = atoi (c);
1081 c = strchr (c, ' ');
1082 if (c == NULL)
1084 /* No file name given. Set new line number. */
1085 current_file->line = line;
1086 return;
1089 /* Skip spaces. */
1090 while (*c == ' ' || *c == '\t')
1091 c++;
1093 /* Skip quote. */
1094 if (*c != '"')
1095 goto bad_cpp_line;
1096 ++c;
1098 filename = c;
1100 /* Make filename end at quote. */
1101 unescape = 0;
1102 escaped = false;
1103 while (*c && ! (! escaped && *c == '"'))
1105 if (escaped)
1106 escaped = false;
1107 else if (*c == '\\')
1109 escaped = true;
1110 unescape++;
1112 ++c;
1115 if (! *c)
1116 /* Preprocessor line has no closing quote. */
1117 goto bad_cpp_line;
1119 *c++ = '\0';
1121 /* Undo effects of cpp_quote_string. */
1122 if (unescape)
1124 char *s = filename;
1125 char *d = gfc_getmem (c - filename - unescape);
1127 filename = d;
1128 while (*s)
1130 if (*s == '\\')
1131 *d++ = *++s;
1132 else
1133 *d++ = *s;
1134 s++;
1136 *d = '\0';
1139 /* Get flags. */
1141 flag[1] = flag[2] = flag[3] = flag[4] = false;
1143 for (;;)
1145 c = strchr (c, ' ');
1146 if (c == NULL)
1147 break;
1149 c++;
1150 i = atoi (c);
1152 if (1 <= i && i <= 4)
1153 flag[i] = true;
1156 /* Interpret flags. */
1158 if (flag[1]) /* Starting new file. */
1160 f = get_file (filename, LC_RENAME);
1161 f->up = current_file;
1162 current_file = f;
1165 if (flag[2]) /* Ending current file. */
1167 if (!current_file->up
1168 || strcmp (current_file->up->filename, filename) != 0)
1170 gfc_warning_now ("%s:%d: file %s left but not entered",
1171 current_file->filename, current_file->line,
1172 filename);
1173 if (unescape)
1174 gfc_free (filename);
1175 return;
1177 current_file = current_file->up;
1180 /* The name of the file can be a temporary file produced by
1181 cpp. Replace the name if it is different. */
1183 if (strcmp (current_file->filename, filename) != 0)
1185 gfc_free (current_file->filename);
1186 current_file->filename = gfc_getmem (strlen (filename) + 1);
1187 strcpy (current_file->filename, filename);
1190 /* Set new line number. */
1191 current_file->line = line;
1192 if (unescape)
1193 gfc_free (filename);
1194 return;
1196 bad_cpp_line:
1197 gfc_warning_now ("%s:%d: Illegal preprocessor directive",
1198 current_file->filename, current_file->line);
1199 current_file->line++;
1203 static try load_file (const char *, bool);
1205 /* include_line()-- Checks a line buffer to see if it is an include
1206 line. If so, we call load_file() recursively to load the included
1207 file. We never return a syntax error because a statement like
1208 "include = 5" is perfectly legal. We return false if no include was
1209 processed or true if we matched an include. */
1211 static bool
1212 include_line (char *line)
1214 char quote, *c, *begin, *stop;
1216 c = line;
1218 if (gfc_option.flag_openmp)
1220 if (gfc_current_form == FORM_FREE)
1222 while (*c == ' ' || *c == '\t')
1223 c++;
1224 if (*c == '!' && c[1] == '$' && (c[2] == ' ' || c[2] == '\t'))
1225 c += 3;
1227 else
1229 if ((*c == '!' || *c == 'c' || *c == 'C' || *c == '*')
1230 && c[1] == '$' && (c[2] == ' ' || c[2] == '\t'))
1231 c += 3;
1235 while (*c == ' ' || *c == '\t')
1236 c++;
1238 if (strncasecmp (c, "include", 7))
1239 return false;
1241 c += 7;
1242 while (*c == ' ' || *c == '\t')
1243 c++;
1245 /* Find filename between quotes. */
1247 quote = *c++;
1248 if (quote != '"' && quote != '\'')
1249 return false;
1251 begin = c;
1253 while (*c != quote && *c != '\0')
1254 c++;
1256 if (*c == '\0')
1257 return false;
1259 stop = c++;
1261 while (*c == ' ' || *c == '\t')
1262 c++;
1264 if (*c != '\0' && *c != '!')
1265 return false;
1267 /* We have an include line at this point. */
1269 *stop = '\0'; /* It's ok to trash the buffer, as this line won't be
1270 read by anything else. */
1272 load_file (begin, false);
1273 return true;
1276 /* Load a file into memory by calling load_line until the file ends. */
1278 static try
1279 load_file (const char *filename, bool initial)
1281 char *line;
1282 gfc_linebuf *b;
1283 gfc_file *f;
1284 FILE *input;
1285 int len, line_len;
1287 for (f = current_file; f; f = f->up)
1288 if (strcmp (filename, f->filename) == 0)
1290 gfc_error_now ("File '%s' is being included recursively", filename);
1291 return FAILURE;
1294 if (initial)
1296 if (gfc_src_file)
1298 input = gfc_src_file;
1299 gfc_src_file = NULL;
1301 else
1302 input = gfc_open_file (filename);
1303 if (input == NULL)
1305 gfc_error_now ("Can't open file '%s'", filename);
1306 return FAILURE;
1309 else
1311 input = gfc_open_included_file (filename, false);
1312 if (input == NULL)
1314 gfc_error_now ("Can't open included file '%s'", filename);
1315 return FAILURE;
1319 /* Load the file. */
1321 f = get_file (filename, initial ? LC_RENAME : LC_ENTER);
1322 f->up = current_file;
1323 current_file = f;
1324 current_file->line = 1;
1325 line = NULL;
1326 line_len = 0;
1328 if (initial && gfc_src_preprocessor_lines[0])
1330 preprocessor_line (gfc_src_preprocessor_lines[0]);
1331 gfc_free (gfc_src_preprocessor_lines[0]);
1332 gfc_src_preprocessor_lines[0] = NULL;
1333 if (gfc_src_preprocessor_lines[1])
1335 preprocessor_line (gfc_src_preprocessor_lines[1]);
1336 gfc_free (gfc_src_preprocessor_lines[1]);
1337 gfc_src_preprocessor_lines[1] = NULL;
1341 for (;;)
1343 int trunc = load_line (input, &line, &line_len);
1345 len = strlen (line);
1346 if (feof (input) && len == 0)
1347 break;
1349 /* There are three things this line can be: a line of Fortran
1350 source, an include line or a C preprocessor directive. */
1352 if (line[0] == '#')
1354 preprocessor_line (line);
1355 continue;
1358 if (include_line (line))
1360 current_file->line++;
1361 continue;
1364 /* Add line. */
1366 b = gfc_getmem (gfc_linebuf_header_size + len + 1);
1368 #ifdef USE_MAPPED_LOCATION
1369 b->location
1370 = linemap_line_start (&line_table, current_file->line++, 120);
1371 #else
1372 b->linenum = current_file->line++;
1373 #endif
1374 b->file = current_file;
1375 b->truncated = trunc;
1376 strcpy (b->line, line);
1378 if (line_head == NULL)
1379 line_head = b;
1380 else
1381 line_tail->next = b;
1383 line_tail = b;
1386 /* Release the line buffer allocated in load_line. */
1387 gfc_free (line);
1389 fclose (input);
1391 current_file = current_file->up;
1392 #ifdef USE_MAPPED_LOCATION
1393 linemap_add (&line_table, LC_LEAVE, 0, NULL, 0);
1394 #endif
1395 return SUCCESS;
1399 /* Open a new file and start scanning from that file. Returns SUCCESS
1400 if everything went OK, FAILURE otherwise. If form == FORM_UKNOWN
1401 it tries to determine the source form from the filename, defaulting
1402 to free form. */
1405 gfc_new_file (void)
1407 try result;
1409 result = load_file (gfc_source_file, true);
1411 gfc_current_locus.lb = line_head;
1412 gfc_current_locus.nextc = (line_head == NULL) ? NULL : line_head->line;
1414 #if 0 /* Debugging aid. */
1415 for (; line_head; line_head = line_head->next)
1416 gfc_status ("%s:%3d %s\n", line_head->file->filename,
1417 #ifdef USE_MAPPED_LOCATION
1418 LOCATION_LINE (line_head->location),
1419 #else
1420 line_head->linenum,
1421 #endif
1422 line_head->line);
1424 exit (0);
1425 #endif
1427 return result;
1430 static char *
1431 unescape_filename (const char *ptr)
1433 const char *p = ptr, *s;
1434 char *d, *ret;
1435 int escaped, unescape = 0;
1437 /* Make filename end at quote. */
1438 escaped = false;
1439 while (*p && ! (! escaped && *p == '"'))
1441 if (escaped)
1442 escaped = false;
1443 else if (*p == '\\')
1445 escaped = true;
1446 unescape++;
1448 ++p;
1451 if (! *p || p[1])
1452 return NULL;
1454 /* Undo effects of cpp_quote_string. */
1455 s = ptr;
1456 d = gfc_getmem (p + 1 - ptr - unescape);
1457 ret = d;
1459 while (s != p)
1461 if (*s == '\\')
1462 *d++ = *++s;
1463 else
1464 *d++ = *s;
1465 s++;
1467 *d = '\0';
1468 return ret;
1471 /* For preprocessed files, if the first tokens are of the form # NUM.
1472 handle the directives so we know the original file name. */
1474 const char *
1475 gfc_read_orig_filename (const char *filename, const char **canon_source_file)
1477 int c, len;
1478 char *dirname;
1480 gfc_src_file = gfc_open_file (filename);
1481 if (gfc_src_file == NULL)
1482 return NULL;
1484 c = fgetc (gfc_src_file);
1485 ungetc (c, gfc_src_file);
1487 if (c != '#')
1488 return NULL;
1490 len = 0;
1491 load_line (gfc_src_file, &gfc_src_preprocessor_lines[0], &len);
1493 if (strncmp (gfc_src_preprocessor_lines[0], "# 1 \"", 5) != 0)
1494 return NULL;
1496 filename = unescape_filename (gfc_src_preprocessor_lines[0] + 5);
1497 if (filename == NULL)
1498 return NULL;
1500 c = fgetc (gfc_src_file);
1501 ungetc (c, gfc_src_file);
1503 if (c != '#')
1504 return filename;
1506 len = 0;
1507 load_line (gfc_src_file, &gfc_src_preprocessor_lines[1], &len);
1509 if (strncmp (gfc_src_preprocessor_lines[1], "# 1 \"", 5) != 0)
1510 return filename;
1512 dirname = unescape_filename (gfc_src_preprocessor_lines[1] + 5);
1513 if (dirname == NULL)
1514 return filename;
1516 len = strlen (dirname);
1517 if (len < 3 || dirname[len - 1] != '/' || dirname[len - 2] != '/')
1519 gfc_free (dirname);
1520 return filename;
1522 dirname[len - 2] = '\0';
1523 set_src_pwd (dirname);
1525 if (! IS_ABSOLUTE_PATH (filename))
1527 char *p = gfc_getmem (len + strlen (filename));
1529 memcpy (p, dirname, len - 2);
1530 p[len - 2] = '/';
1531 strcpy (p + len - 1, filename);
1532 *canon_source_file = p;
1535 gfc_free (dirname);
1536 return filename;