2019-05-27 09:55:05 +03:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2007-12-18 07:06:42 +03:00
/*
* Copyright 2007 Jon Loeliger , Freescale Semiconductor , Inc .
*/
2018-02-28 02:40:38 +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 ;
2018-11-29 03:37:35 +03:00
struct srcpos * next ;
2010-11-18 02:28:20 +03:00
} ;
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 ; \
} \
2018-11-29 03:37:35 +03:00
( Current ) . next = NULL ; \
2010-11-18 02:28:20 +03:00
} while ( 0 )
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 ) ;
2018-11-29 03:37:35 +03:00
extern struct srcpos * srcpos_extend ( struct srcpos * new_srcpos ,
struct srcpos * old_srcpos ) ;
2010-11-18 02:28:20 +03:00
extern char * srcpos_string ( struct srcpos * pos ) ;
2018-11-29 03:37:35 +03:00
extern char * srcpos_string_first ( struct srcpos * pos , int level ) ;
extern char * srcpos_string_last ( struct srcpos * pos , int level ) ;
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 ) ;
2018-02-28 02:40:38 +03:00
# endif /* SRCPOS_H */