OSDN Git Service

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