diff options
Diffstat (limited to 'scripts/dtc/srcpos.h')
| -rw-r--r-- | scripts/dtc/srcpos.h | 141 | 
1 files changed, 87 insertions, 54 deletions
diff --git a/scripts/dtc/srcpos.h b/scripts/dtc/srcpos.h index e17c7c04db8..93a27123c2e 100644 --- a/scripts/dtc/srcpos.h +++ b/scripts/dtc/srcpos.h @@ -17,69 +17,102 @@   *                                                                   USA   */ -/* - * Augment the standard YYLTYPE with a filenum index into an - * array of all opened filenames. - */ +#ifndef _SRCPOS_H_ +#define _SRCPOS_H_  #include <stdio.h> -struct dtc_file { +struct srcfile_state { +	FILE *f; +	char *name;  	char *dir; -	const char *name; -	FILE *file; +	int lineno, colno; +	struct srcfile_state *prev;  }; -#if ! defined(YYLTYPE) && ! defined(YYLTYPE_IS_DECLARED) -typedef struct YYLTYPE { +extern FILE *depfile; /* = NULL */ +extern struct srcfile_state *current_srcfile; /* = NULL */ + +/** + * 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 + */ +FILE *srcfile_relative_open(const char *fname, char **fullnamep); + +void srcfile_push(const char *fname); +int srcfile_pop(void); + +/** + * 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); + +struct srcpos {      int first_line;      int first_column;      int last_line;      int last_column; -    struct dtc_file *file; -} YYLTYPE; - -#define YYLTYPE_IS_DECLARED	1 -#define YYLTYPE_IS_TRIVIAL	1 -#endif - -/* Cater to old parser templates. */ -#ifndef YYID -#define YYID(n)	(n) -#endif - -#define YYLLOC_DEFAULT(Current, Rhs, N)					\ -    do									\ -      if (YYID (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 (YYID (0)) - - - -extern void yyerror(char const *); -extern void yyerrorf(char const *, ...) __attribute__((format(printf, 1, 2))); - -extern struct dtc_file *srcpos_file; - -struct search_path { -	const char *dir; /* NULL for current directory */ -	struct search_path *prev, *next; +    struct srcfile_state *file;  }; -extern struct dtc_file *dtc_open_file(const char *fname, -                                      const struct search_path *search); -extern void dtc_close_file(struct dtc_file *file); +#define YYLTYPE struct srcpos + +#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) + + +/* + * 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; + +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); +extern void srcpos_dump(struct srcpos *pos); + +extern void srcpos_verror(struct srcpos *pos, char const *, va_list va) +     __attribute__((format(printf, 2, 0))); +extern void srcpos_error(struct srcpos *pos, char const *, ...) +     __attribute__((format(printf, 2, 3))); +extern void srcpos_warn(struct srcpos *pos, char const *, ...) +     __attribute__((format(printf, 2, 3))); + +extern void srcpos_set_line(char *f, int l); + +#endif /* _SRCPOS_H_ */  | 
