]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/dtc/srcpos.h
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / dtc / srcpos.h
1 /*
2  * Copyright 2007 Jon Loeliger, Freescale Semiconductor, Inc.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or (at your option) any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  *  General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program; if not, write to the Free Software
16  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
17  *                                                                   USA
18  */
19
20 #ifndef _SRCPOS_H_
21 #define _SRCPOS_H_
22
23 /*
24  * Augment the standard YYLTYPE with a filenum index into an
25  * array of all opened filenames.
26  */
27
28 #include <stdio.h>
29
30 struct dtc_file {
31         char *dir;
32         const char *name;
33         FILE *file;
34 };
35
36 #if ! defined(YYLTYPE) && ! defined(YYLTYPE_IS_DECLARED)
37 typedef struct YYLTYPE {
38     int first_line;
39     int first_column;
40     int last_line;
41     int last_column;
42     struct dtc_file *file;
43 } YYLTYPE;
44
45 #define YYLTYPE_IS_DECLARED     1
46 #define YYLTYPE_IS_TRIVIAL      1
47 #endif
48
49 /* Cater to old parser templates. */
50 #ifndef YYID
51 #define YYID(n) (n)
52 #endif
53
54 #define YYLLOC_DEFAULT(Current, Rhs, N)                                 \
55     do                                                                  \
56       if (YYID (N))                                                     \
57         {                                                               \
58           (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
59           (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
60           (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
61           (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
62           (Current).file         = YYRHSLOC (Rhs, N).file;              \
63         }                                                               \
64       else                                                              \
65         {                                                               \
66           (Current).first_line   = (Current).last_line   =              \
67             YYRHSLOC (Rhs, 0).last_line;                                \
68           (Current).first_column = (Current).last_column =              \
69             YYRHSLOC (Rhs, 0).last_column;                              \
70           (Current).file         = YYRHSLOC (Rhs, 0).file;              \
71         }                                                               \
72     while (YYID (0))
73
74
75 typedef YYLTYPE srcpos;
76
77 /*
78  * Fictional source position used for IR nodes that are
79  * created without otherwise knowing a true source position.
80  * For example,constant definitions from the command line.
81  */
82 extern srcpos srcpos_empty;
83
84 extern struct dtc_file *srcpos_file;
85
86 struct search_path {
87         const char *dir; /* NULL for current directory */
88         struct search_path *prev, *next;
89 };
90
91 extern struct dtc_file *dtc_open_file(const char *fname,
92                                       const struct search_path *search);
93 extern void dtc_close_file(struct dtc_file *file);
94
95 extern srcpos *srcpos_copy(srcpos *pos);
96 extern char *srcpos_string(srcpos *pos);
97 extern void srcpos_dump(srcpos *pos);
98
99 extern void srcpos_error(srcpos *pos, char const *, ...)
100      __attribute__((format(printf, 2, 3)));
101 extern void srcpos_warn(srcpos *pos, char const *, ...)
102      __attribute__((format(printf, 2, 3)));
103
104 #endif /* _SRCPOS_H_ */