2007-12-18 07:06:42 +03:00
/*
* Copyright 2007 Jon Loeliger , Freescale Semiconductor , Inc .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation ; either version 2 of the
* License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307
* USA
*/
2010-11-18 02:28:20 +03:00
# ifndef _SRCPOS_H_
# define _SRCPOS_H_
2007-12-18 07:06:42 +03:00
2008-08-07 06:24:17 +04:00
# include <stdio.h>
2015-04-30 00:00:05 +03:00
# include <stdbool.h>
2017-03-21 17:01:08 +03:00
# include "util.h"
2008-08-07 06:24:17 +04:00
2010-11-18 02:28:20 +03:00
struct srcfile_state {
FILE * f ;
char * name ;
2008-08-07 06:24:17 +04:00
char * dir ;
2010-11-18 02:28:20 +03:00
int lineno , colno ;
struct srcfile_state * prev ;
2008-08-07 06:24:17 +04:00
} ;
2012-01-11 04:27:52 +04:00
extern FILE * depfile ; /* = NULL */
2010-11-18 02:28:20 +03:00
extern struct srcfile_state * current_srcfile ; /* = NULL */
2012-09-29 01:25:59 +04:00
/**
* Open a source file .
*
* If the source file is a relative pathname , then it is searched for in the
* current directory ( the directory of the last source file read ) and after
* that in the search path .
*
* We work through the search path in order from the first path specified to
* the last .
*
* If the file is not found , then this function does not return , but calls
* die ( ) .
*
* @ param fname Filename to search
* @ param fullnamep If non - NULL , it is set to the allocated filename of the
* file that was opened . The caller is then responsible
* for freeing the pointer .
* @ return pointer to opened FILE
*/
2010-11-18 02:28:20 +03:00
FILE * srcfile_relative_open ( const char * fname , char * * fullnamep ) ;
2012-09-29 01:25:59 +04:00
2010-11-18 02:28:20 +03:00
void srcfile_push ( const char * fname ) ;
2015-04-30 00:00:05 +03:00
bool srcfile_pop ( void ) ;
2010-11-18 02:28:20 +03:00
2012-09-29 01:25:59 +04:00
/**
* Add a new directory to the search path for input files
*
* The new path is added at the end of the list .
*
* @ param dirname Directory to add
*/
void srcfile_add_search_path ( const char * dirname ) ;
2010-11-18 02:28:20 +03:00
struct srcpos {
2007-12-18 07:06:42 +03:00
int first_line ;
int first_column ;
int last_line ;
int last_column ;
2010-11-18 02:28:20 +03:00
struct srcfile_state * file ;
} ;
2007-12-18 07:06:42 +03:00
2010-11-18 02:28:20 +03:00
# define YYLTYPE struct srcpos
2007-12-18 07:06:42 +03:00
2010-11-18 02:28:20 +03:00
# define YYLLOC_DEFAULT(Current, Rhs, N) \
do { \
if ( N ) { \
( Current ) . first_line = YYRHSLOC ( Rhs , 1 ) . first_line ; \
( Current ) . first_column = YYRHSLOC ( Rhs , 1 ) . first_column ; \
( Current ) . last_line = YYRHSLOC ( Rhs , N ) . last_line ; \
( Current ) . last_column = YYRHSLOC ( Rhs , N ) . last_column ; \
( Current ) . file = YYRHSLOC ( Rhs , N ) . file ; \
} else { \
( Current ) . first_line = ( Current ) . last_line = \
YYRHSLOC ( Rhs , 0 ) . last_line ; \
( Current ) . first_column = ( Current ) . last_column = \
YYRHSLOC ( Rhs , 0 ) . last_column ; \
( Current ) . file = YYRHSLOC ( Rhs , 0 ) . file ; \
} \
} while ( 0 )
2007-12-18 07:06:42 +03:00
2010-11-18 02:28:20 +03:00
/*
* Fictional source position used for IR nodes that are
* created without otherwise knowing a true source position .
* For example , constant definitions from the command line .
*/
extern struct srcpos srcpos_empty ;
2007-12-18 07:06:42 +03:00
2010-11-18 02:28:20 +03:00
extern void srcpos_update ( struct srcpos * pos , const char * text , int len ) ;
extern struct srcpos * srcpos_copy ( struct srcpos * pos ) ;
extern char * srcpos_string ( struct srcpos * pos ) ;
2007-12-18 07:06:42 +03:00
2017-03-21 17:01:08 +03:00
extern void PRINTF ( 3 , 0 ) srcpos_verror ( struct srcpos * pos , const char * prefix ,
const char * fmt , va_list va ) ;
extern void PRINTF ( 3 , 4 ) srcpos_error ( struct srcpos * pos , const char * prefix ,
const char * fmt , . . . ) ;
2007-12-18 07:06:42 +03:00
2012-09-29 01:25:59 +04:00
extern void srcpos_set_line ( char * f , int l ) ;
2010-11-18 02:28:20 +03:00
# endif /* _SRCPOS_H_ */