OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.5.1/] [gcc/] [fortran/] [scanner.c] - Blame information for rev 311

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.