OSDN Git Service

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