invoke.texi (powerpc msdata-data): Static data doesn't go in small data sections.
[official-gcc.git] / gcc / fortran / scanner.c
blob883576166ffa6ad9bc953d7bdf590a45c2594c2b
1 /* Character scanner.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005
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"
49 /* Structure for holding module and include file search path. */
50 typedef struct gfc_directorylist
52 char *path;
53 struct gfc_directorylist *next;
55 gfc_directorylist;
57 /* List of include file search directories. */
58 static gfc_directorylist *include_dirs;
60 static gfc_file *file_head, *current_file;
62 static int continue_flag, end_flag;
64 gfc_source_form gfc_current_form;
65 static gfc_linebuf *line_head, *line_tail;
67 locus gfc_current_locus;
68 const char *gfc_source_file;
71 /* Main scanner initialization. */
73 void
74 gfc_scanner_init_1 (void)
76 file_head = NULL;
77 line_head = NULL;
78 line_tail = NULL;
80 end_flag = 0;
84 /* Main scanner destructor. */
86 void
87 gfc_scanner_done_1 (void)
89 gfc_linebuf *lb;
90 gfc_file *f;
92 while(line_head != NULL)
94 lb = line_head->next;
95 gfc_free(line_head);
96 line_head = lb;
99 while(file_head != NULL)
101 f = file_head->next;
102 gfc_free(file_head->filename);
103 gfc_free(file_head);
104 file_head = f;
110 /* Adds path to the list pointed to by list. */
112 void
113 gfc_add_include_path (const char *path)
115 gfc_directorylist *dir;
116 const char *p;
118 p = path;
119 while (*p == ' ' || *p == '\t') /* someone might do 'gfortran "-I include"' */
120 if (*p++ == '\0')
121 return;
123 dir = include_dirs;
124 if (!dir)
126 dir = include_dirs = gfc_getmem (sizeof (gfc_directorylist));
128 else
130 while (dir->next)
131 dir = dir->next;
133 dir->next = gfc_getmem (sizeof (gfc_directorylist));
134 dir = dir->next;
137 dir->next = NULL;
138 dir->path = gfc_getmem (strlen (p) + 2);
139 strcpy (dir->path, p);
140 strcat (dir->path, "/"); /* make '/' last character */
144 /* Release resources allocated for options. */
146 void
147 gfc_release_include_path (void)
149 gfc_directorylist *p;
151 gfc_free (gfc_option.module_dir);
152 while (include_dirs != NULL)
154 p = include_dirs;
155 include_dirs = include_dirs->next;
156 gfc_free (p->path);
157 gfc_free (p);
161 /* Opens file for reading, searching through the include directories
162 given if necessary. If the include_cwd argument is true, we try
163 to open the file in the current directory first. */
165 FILE *
166 gfc_open_included_file (const char *name, const bool include_cwd)
168 char *fullname;
169 gfc_directorylist *p;
170 FILE *f;
172 if (include_cwd)
174 f = gfc_open_file (name);
175 if (f != NULL)
176 return f;
179 for (p = include_dirs; p; p = p->next)
181 fullname = (char *) alloca(strlen (p->path) + strlen (name) + 1);
182 strcpy (fullname, p->path);
183 strcat (fullname, name);
185 f = gfc_open_file (fullname);
186 if (f != NULL)
187 return f;
190 return NULL;
193 /* Test to see if we're at the end of the main source file. */
196 gfc_at_end (void)
199 return end_flag;
203 /* Test to see if we're at the end of the current file. */
206 gfc_at_eof (void)
209 if (gfc_at_end ())
210 return 1;
212 if (line_head == NULL)
213 return 1; /* Null file */
215 if (gfc_current_locus.lb == NULL)
216 return 1;
218 return 0;
222 /* Test to see if we're at the beginning of a new line. */
225 gfc_at_bol (void)
227 if (gfc_at_eof ())
228 return 1;
230 return (gfc_current_locus.nextc == gfc_current_locus.lb->line);
234 /* Test to see if we're at the end of a line. */
237 gfc_at_eol (void)
240 if (gfc_at_eof ())
241 return 1;
243 return (*gfc_current_locus.nextc == '\0');
247 /* Advance the current line pointer to the next line. */
249 void
250 gfc_advance_line (void)
252 if (gfc_at_end ())
253 return;
255 if (gfc_current_locus.lb == NULL)
257 end_flag = 1;
258 return;
261 gfc_current_locus.lb = gfc_current_locus.lb->next;
263 if (gfc_current_locus.lb != NULL)
264 gfc_current_locus.nextc = gfc_current_locus.lb->line;
265 else
267 gfc_current_locus.nextc = NULL;
268 end_flag = 1;
273 /* Get the next character from the input, advancing gfc_current_file's
274 locus. When we hit the end of the line or the end of the file, we
275 start returning a '\n' in order to complete the current statement.
276 No Fortran line conventions are implemented here.
278 Requiring explicit advances to the next line prevents the parse
279 pointer from being on the wrong line if the current statement ends
280 prematurely. */
282 static int
283 next_char (void)
285 int c;
287 if (gfc_current_locus.nextc == NULL)
288 return '\n';
290 c = *gfc_current_locus.nextc++;
291 if (c == '\0')
293 gfc_current_locus.nextc--; /* Remain on this line. */
294 c = '\n';
297 return c;
300 /* Skip a comment. When we come here the parse pointer is positioned
301 immediately after the comment character. If we ever implement
302 compiler directives withing comments, here is where we parse the
303 directive. */
305 static void
306 skip_comment_line (void)
308 char c;
312 c = next_char ();
314 while (c != '\n');
316 gfc_advance_line ();
320 /* Comment lines are null lines, lines containing only blanks or lines
321 on which the first nonblank line is a '!'. */
323 static void
324 skip_free_comments (void)
326 locus start;
327 char c;
329 for (;;)
331 start = gfc_current_locus;
332 if (gfc_at_eof ())
333 break;
337 c = next_char ();
339 while (gfc_is_whitespace (c));
341 if (c == '\n')
343 gfc_advance_line ();
344 continue;
347 if (c == '!')
349 skip_comment_line ();
350 continue;
353 break;
356 gfc_current_locus = start;
360 /* Skip comment lines in fixed source mode. We have the same rules as
361 in skip_free_comment(), except that we can have a 'c', 'C' or '*'
362 in column 1, and a '!' cannot be in column 6. Also, we deal with
363 lines with 'd' or 'D' in column 1, if the user requested this. */
365 static void
366 skip_fixed_comments (void)
368 locus start;
369 int col;
370 char c;
372 for (;;)
374 start = gfc_current_locus;
375 if (gfc_at_eof ())
376 break;
378 c = next_char ();
379 if (c == '\n')
381 gfc_advance_line ();
382 continue;
385 if (c == '!' || c == 'c' || c == 'C' || c == '*')
387 skip_comment_line ();
388 continue;
391 if (gfc_option.flag_d_lines != -1 && (c == 'd' || c == 'D'))
393 if (gfc_option.flag_d_lines == 0)
395 skip_comment_line ();
396 continue;
398 else
399 *start.nextc = c = ' ';
402 col = 1;
404 while (gfc_is_whitespace (c))
406 c = next_char ();
407 col++;
410 if (c == '\n')
412 gfc_advance_line ();
413 continue;
416 if (col != 6 && c == '!')
418 skip_comment_line ();
419 continue;
422 break;
425 gfc_current_locus = start;
429 /* Skips the current line if it is a comment. Assumes that we are at
430 the start of the current line. */
432 void
433 gfc_skip_comments (void)
436 if (!gfc_at_bol () || gfc_current_form == FORM_FREE)
437 skip_free_comments ();
438 else
439 skip_fixed_comments ();
443 /* Get the next character from the input, taking continuation lines
444 and end-of-line comments into account. This implies that comment
445 lines between continued lines must be eaten here. For higher-level
446 subroutines, this flattens continued lines into a single logical
447 line. The in_string flag denotes whether we're inside a character
448 context or not. */
451 gfc_next_char_literal (int in_string)
453 locus old_loc;
454 int i, c;
456 continue_flag = 0;
458 restart:
459 c = next_char ();
460 if (gfc_at_end ())
461 return c;
463 if (gfc_current_form == FORM_FREE)
466 if (!in_string && c == '!')
468 /* This line can't be continued */
471 c = next_char ();
473 while (c != '\n');
475 /* Avoid truncation warnings for comment ending lines. */
476 gfc_current_locus.lb->truncated = 0;
478 goto done;
481 if (c != '&')
482 goto done;
484 /* If the next nonblank character is a ! or \n, we've got a
485 continuation line. */
486 old_loc = gfc_current_locus;
488 c = next_char ();
489 while (gfc_is_whitespace (c))
490 c = next_char ();
492 /* Character constants to be continued cannot have commentary
493 after the '&'. */
495 if (in_string && c != '\n')
497 gfc_current_locus = old_loc;
498 c = '&';
499 goto done;
502 if (c != '!' && c != '\n')
504 gfc_current_locus = old_loc;
505 c = '&';
506 goto done;
509 continue_flag = 1;
510 if (c == '!')
511 skip_comment_line ();
512 else
513 gfc_advance_line ();
515 /* We've got a continuation line and need to find where it continues.
516 First eat any comment lines. */
517 gfc_skip_comments ();
519 /* Now that we have a non-comment line, probe ahead for the
520 first non-whitespace character. If it is another '&', then
521 reading starts at the next character, otherwise we must back
522 up to where the whitespace started and resume from there. */
524 old_loc = gfc_current_locus;
526 c = next_char ();
527 while (gfc_is_whitespace (c))
528 c = next_char ();
530 if (c != '&')
531 gfc_current_locus = old_loc;
534 else
536 /* Fixed form continuation. */
537 if (!in_string && c == '!')
539 /* Skip comment at end of line. */
542 c = next_char ();
544 while (c != '\n');
546 /* Avoid truncation warnings for comment ending lines. */
547 gfc_current_locus.lb->truncated = 0;
550 if (c != '\n')
551 goto done;
553 continue_flag = 1;
554 old_loc = gfc_current_locus;
556 gfc_advance_line ();
557 gfc_skip_comments ();
559 /* See if this line is a continuation line. */
560 for (i = 0; i < 5; i++)
562 c = next_char ();
563 if (c != ' ')
564 goto not_continuation;
567 c = next_char ();
568 if (c == '0' || c == ' ')
569 goto not_continuation;
572 /* Ready to read first character of continuation line, which might
573 be another continuation line! */
574 goto restart;
576 not_continuation:
577 c = '\n';
578 gfc_current_locus = old_loc;
580 done:
581 continue_flag = 0;
582 return c;
586 /* Get the next character of input, folded to lowercase. In fixed
587 form mode, we also ignore spaces. When matcher subroutines are
588 parsing character literals, they have to call
589 gfc_next_char_literal(). */
592 gfc_next_char (void)
594 int c;
598 c = gfc_next_char_literal (0);
600 while (gfc_current_form == FORM_FIXED && gfc_is_whitespace (c));
602 return TOLOWER (c);
607 gfc_peek_char (void)
609 locus old_loc;
610 int c;
612 old_loc = gfc_current_locus;
613 c = gfc_next_char ();
614 gfc_current_locus = old_loc;
616 return c;
620 /* Recover from an error. We try to get past the current statement
621 and get lined up for the next. The next statement follows a '\n'
622 or a ';'. We also assume that we are not within a character
623 constant, and deal with finding a '\'' or '"'. */
625 void
626 gfc_error_recovery (void)
628 char c, delim;
630 if (gfc_at_eof ())
631 return;
633 for (;;)
635 c = gfc_next_char ();
636 if (c == '\n' || c == ';')
637 break;
639 if (c != '\'' && c != '"')
641 if (gfc_at_eof ())
642 break;
643 continue;
645 delim = c;
647 for (;;)
649 c = next_char ();
651 if (c == delim)
652 break;
653 if (c == '\n')
654 return;
655 if (c == '\\')
657 c = next_char ();
658 if (c == '\n')
659 return;
662 if (gfc_at_eof ())
663 break;
668 /* Read ahead until the next character to be read is not whitespace. */
670 void
671 gfc_gobble_whitespace (void)
673 locus old_loc;
674 int c;
678 old_loc = gfc_current_locus;
679 c = gfc_next_char_literal (0);
681 while (gfc_is_whitespace (c));
683 gfc_current_locus = old_loc;
687 /* Load a single line into pbuf.
689 If pbuf points to a NULL pointer, it is allocated.
690 We truncate lines that are too long, unless we're dealing with
691 preprocessor lines or if the option -ffixed-line-length-none is set,
692 in which case we reallocate the buffer to fit the entire line, if
693 need be.
694 In fixed mode, we expand a tab that occurs within the statement
695 label region to expand to spaces that leave the next character in
696 the source region.
697 load_line returns wether the line was truncated. */
699 static int
700 load_line (FILE * input, char **pbuf, int *pbuflen)
702 int c, maxlen, i, preprocessor_flag, buflen = *pbuflen;
703 int trunc_flag = 0;
704 char *buffer;
706 /* Determine the maximum allowed line length. */
707 if (gfc_current_form == FORM_FREE)
708 maxlen = GFC_MAX_LINE;
709 else
710 maxlen = gfc_option.fixed_line_length;
712 if (*pbuf == NULL)
714 /* Allocate the line buffer, storing its length into buflen. */
715 if (maxlen > 0)
716 buflen = maxlen;
717 else
718 buflen = GFC_MAX_LINE;
720 *pbuf = gfc_getmem (buflen + 1);
723 i = 0;
724 buffer = *pbuf;
726 preprocessor_flag = 0;
727 c = fgetc (input);
728 if (c == '#')
729 /* In order to not truncate preprocessor lines, we have to
730 remember that this is one. */
731 preprocessor_flag = 1;
732 ungetc (c, input);
734 for (;;)
736 c = fgetc (input);
738 if (c == EOF)
739 break;
740 if (c == '\n')
741 break;
743 if (c == '\r')
744 continue; /* Gobble characters. */
745 if (c == '\0')
746 continue;
748 if (c == '\032')
750 /* Ctrl-Z ends the file. */
751 while (fgetc (input) != EOF);
752 break;
755 if (gfc_current_form == FORM_FIXED && c == '\t' && i <= 6)
756 { /* Tab expansion. */
757 while (i <= 6)
759 *buffer++ = ' ';
760 i++;
763 continue;
766 *buffer++ = c;
767 i++;
769 if (maxlen == 0 || preprocessor_flag)
771 if (i >= buflen)
773 /* Reallocate line buffer to double size to hold the
774 overlong line. */
775 buflen = buflen * 2;
776 *pbuf = xrealloc (*pbuf, buflen + 1);
777 buffer = (*pbuf)+i;
780 else if (i >= maxlen)
782 /* Truncate the rest of the line. */
783 for (;;)
785 c = fgetc (input);
786 if (c == '\n' || c == EOF)
787 break;
789 trunc_flag = 1;
792 ungetc ('\n', input);
796 /* Pad lines to the selected line length in fixed form. */
797 if (gfc_current_form == FORM_FIXED
798 && gfc_option.fixed_line_length > 0
799 && !preprocessor_flag
800 && c != EOF)
801 while (i++ < gfc_option.fixed_line_length)
802 *buffer++ = ' ';
804 *buffer = '\0';
805 *pbuflen = buflen;
807 return trunc_flag;
811 /* Get a gfc_file structure, initialize it and add it to
812 the file stack. */
814 static gfc_file *
815 get_file (const char *name, enum lc_reason reason ATTRIBUTE_UNUSED)
817 gfc_file *f;
819 f = gfc_getmem (sizeof (gfc_file));
821 f->filename = gfc_getmem (strlen (name) + 1);
822 strcpy (f->filename, name);
824 f->next = file_head;
825 file_head = f;
827 f->included_by = current_file;
828 if (current_file != NULL)
829 f->inclusion_line = current_file->line;
831 #ifdef USE_MAPPED_LOCATION
832 linemap_add (&line_table, reason, false, f->filename, 1);
833 #endif
835 return f;
838 /* Deal with a line from the C preprocessor. The
839 initial octothorp has already been seen. */
841 static void
842 preprocessor_line (char *c)
844 bool flag[5];
845 int i, line;
846 char *filename;
847 gfc_file *f;
848 int escaped;
850 c++;
851 while (*c == ' ' || *c == '\t')
852 c++;
854 if (*c < '0' || *c > '9')
855 goto bad_cpp_line;
857 line = atoi (c);
859 c = strchr (c, ' ');
860 if (c == NULL)
862 /* No file name given. Set new line number. */
863 current_file->line = line;
864 return;
867 /* Skip spaces. */
868 while (*c == ' ' || *c == '\t')
869 c++;
871 /* Skip quote. */
872 if (*c != '"')
873 goto bad_cpp_line;
874 ++c;
876 filename = c;
878 /* Make filename end at quote. */
879 escaped = false;
880 while (*c && ! (! escaped && *c == '"'))
882 if (escaped)
883 escaped = false;
884 else
885 escaped = *c == '\\';
886 ++c;
889 if (! *c)
890 /* Preprocessor line has no closing quote. */
891 goto bad_cpp_line;
893 *c++ = '\0';
897 /* Get flags. */
899 flag[1] = flag[2] = flag[3] = flag[4] = false;
901 for (;;)
903 c = strchr (c, ' ');
904 if (c == NULL)
905 break;
907 c++;
908 i = atoi (c);
910 if (1 <= i && i <= 4)
911 flag[i] = true;
914 /* Interpret flags. */
916 if (flag[1]) /* Starting new file. */
918 f = get_file (filename, LC_RENAME);
919 f->up = current_file;
920 current_file = f;
923 if (flag[2]) /* Ending current file. */
925 if (!current_file->up
926 || strcmp (current_file->up->filename, filename) != 0)
928 gfc_warning_now ("%s:%d: file %s left but not entered",
929 current_file->filename, current_file->line,
930 filename);
931 return;
933 current_file = current_file->up;
936 /* The name of the file can be a temporary file produced by
937 cpp. Replace the name if it is different. */
939 if (strcmp (current_file->filename, filename) != 0)
941 gfc_free (current_file->filename);
942 current_file->filename = gfc_getmem (strlen (filename) + 1);
943 strcpy (current_file->filename, filename);
946 /* Set new line number. */
947 current_file->line = line;
948 return;
950 bad_cpp_line:
951 gfc_warning_now ("%s:%d: Illegal preprocessor directive",
952 current_file->filename, current_file->line);
953 current_file->line++;
957 static try load_file (const char *, bool);
959 /* include_line()-- Checks a line buffer to see if it is an include
960 line. If so, we call load_file() recursively to load the included
961 file. We never return a syntax error because a statement like
962 "include = 5" is perfectly legal. We return false if no include was
963 processed or true if we matched an include. */
965 static bool
966 include_line (char *line)
968 char quote, *c, *begin, *stop;
970 c = line;
971 while (*c == ' ' || *c == '\t')
972 c++;
974 if (strncasecmp (c, "include", 7))
975 return false;
977 c += 7;
978 while (*c == ' ' || *c == '\t')
979 c++;
981 /* Find filename between quotes. */
983 quote = *c++;
984 if (quote != '"' && quote != '\'')
985 return false;
987 begin = c;
989 while (*c != quote && *c != '\0')
990 c++;
992 if (*c == '\0')
993 return false;
995 stop = c++;
997 while (*c == ' ' || *c == '\t')
998 c++;
1000 if (*c != '\0' && *c != '!')
1001 return false;
1003 /* We have an include line at this point. */
1005 *stop = '\0'; /* It's ok to trash the buffer, as this line won't be
1006 read by anything else. */
1008 load_file (begin, false);
1009 return true;
1012 /* Load a file into memory by calling load_line until the file ends. */
1014 static try
1015 load_file (const char *filename, bool initial)
1017 char *line;
1018 gfc_linebuf *b;
1019 gfc_file *f;
1020 FILE *input;
1021 int len, line_len;
1023 for (f = current_file; f; f = f->up)
1024 if (strcmp (filename, f->filename) == 0)
1026 gfc_error_now ("File '%s' is being included recursively", filename);
1027 return FAILURE;
1030 if (initial)
1032 input = gfc_open_file (filename);
1033 if (input == NULL)
1035 gfc_error_now ("Can't open file '%s'", filename);
1036 return FAILURE;
1039 else
1041 input = gfc_open_included_file (filename, false);
1042 if (input == NULL)
1044 gfc_error_now ("Can't open included file '%s'", filename);
1045 return FAILURE;
1049 /* Load the file. */
1051 f = get_file (filename, initial ? LC_RENAME : LC_ENTER);
1052 f->up = current_file;
1053 current_file = f;
1054 current_file->line = 1;
1055 line = NULL;
1056 line_len = 0;
1058 for (;;)
1060 int trunc = load_line (input, &line, &line_len);
1062 len = strlen (line);
1063 if (feof (input) && len == 0)
1064 break;
1066 /* There are three things this line can be: a line of Fortran
1067 source, an include line or a C preprocessor directive. */
1069 if (line[0] == '#')
1071 preprocessor_line (line);
1072 continue;
1075 if (include_line (line))
1077 current_file->line++;
1078 continue;
1081 /* Add line. */
1083 b = gfc_getmem (gfc_linebuf_header_size + len + 1);
1085 #ifdef USE_MAPPED_LOCATION
1086 b->location
1087 = linemap_line_start (&line_table, current_file->line++, 120);
1088 #else
1089 b->linenum = current_file->line++;
1090 #endif
1091 b->file = current_file;
1092 b->truncated = trunc;
1093 strcpy (b->line, line);
1095 if (line_head == NULL)
1096 line_head = b;
1097 else
1098 line_tail->next = b;
1100 line_tail = b;
1103 /* Release the line buffer allocated in load_line. */
1104 gfc_free (line);
1106 fclose (input);
1108 current_file = current_file->up;
1109 #ifdef USE_MAPPED_LOCATION
1110 linemap_add (&line_table, LC_LEAVE, 0, NULL, 0);
1111 #endif
1112 return SUCCESS;
1116 /* Open a new file and start scanning from that file. Returns SUCCESS
1117 if everything went OK, FAILURE otherwise. If form == FORM_UKNOWN
1118 it tries to determine the source form from the filename, defaulting
1119 to free form. */
1122 gfc_new_file (void)
1124 try result;
1126 result = load_file (gfc_source_file, true);
1128 gfc_current_locus.lb = line_head;
1129 gfc_current_locus.nextc = (line_head == NULL) ? NULL : line_head->line;
1131 #if 0 /* Debugging aid. */
1132 for (; line_head; line_head = line_head->next)
1133 gfc_status ("%s:%3d %s\n", line_head->file->filename,
1134 #ifdef USE_MAPPED_LOCATION
1135 LOCATION_LINE (line_head->location),
1136 #else
1137 line_head->linenum,
1138 #endif
1139 line_head->line);
1141 exit (0);
1142 #endif
1144 return result;