srcpos.h revision e5c8e1dcd7f2d3784194498e5ea916e7b48fe33a
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
30struct dtc_file {
31	char *dir;
32	const char *name;
33	FILE *file;
34};
35
36#if ! defined(YYLTYPE) && ! defined(YYLTYPE_IS_DECLARED)
37typedef 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
75typedef 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 */
82extern srcpos srcpos_empty;
83
84extern struct dtc_file *srcpos_file;
85
86struct search_path {
87	const char *dir; /* NULL for current directory */
88	struct search_path *prev, *next;
89};
90
91extern struct dtc_file *dtc_open_file(const char *fname,
92                                      const struct search_path *search);
93extern void dtc_close_file(struct dtc_file *file);
94
95extern srcpos *srcpos_copy(srcpos *pos);
96extern char *srcpos_string(srcpos *pos);
97extern void srcpos_dump(srcpos *pos);
98
99extern void srcpos_error(srcpos *pos, char const *, ...)
100     __attribute__((format(printf, 2, 3)));
101extern void srcpos_warn(srcpos *pos, char const *, ...)
102     __attribute__((format(printf, 2, 3)));
103
104#endif /* _SRCPOS_H_ */
105