diff options
| author | Robert Richter <robert.richter@amd.com> | 2009-06-10 21:47:10 +0200 | 
|---|---|---|
| committer | Robert Richter <robert.richter@amd.com> | 2009-06-10 21:47:10 +0200 | 
| commit | 0886751c5d8b19fcee2e65d34ae21c9111e652a9 (patch) | |
| tree | 015e8c2b3d44d46e9e8fccd016340c51bc876d3b /scripts/dtc/srcpos.c | |
| parent | 7e4e0bd50e80df2fe5501f48f872448376cdd997 (diff) | |
| parent | 07a2039b8eb0af4ff464efd3dfd95de5c02648c6 (diff) | |
Merge commit 'v2.6.30' into oprofile/master
Diffstat (limited to 'scripts/dtc/srcpos.c')
| -rw-r--r-- | scripts/dtc/srcpos.c | 116 | 
1 files changed, 116 insertions, 0 deletions
diff --git a/scripts/dtc/srcpos.c b/scripts/dtc/srcpos.c new file mode 100644 index 00000000000..9641b7628b4 --- /dev/null +++ b/scripts/dtc/srcpos.c @@ -0,0 +1,116 @@ +/* + * 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 + */ + +#include "dtc.h" +#include "srcpos.h" + +/* + * Like yylineno, this is the current open file pos. + */ + +struct dtc_file *srcpos_file; + +static int dtc_open_one(struct dtc_file *file, +                        const char *search, +                        const char *fname) +{ +	char *fullname; + +	if (search) { +		fullname = xmalloc(strlen(search) + strlen(fname) + 2); + +		strcpy(fullname, search); +		strcat(fullname, "/"); +		strcat(fullname, fname); +	} else { +		fullname = strdup(fname); +	} + +	file->file = fopen(fullname, "r"); +	if (!file->file) { +		free(fullname); +		return 0; +	} + +	file->name = fullname; +	return 1; +} + + +struct dtc_file *dtc_open_file(const char *fname, +                               const struct search_path *search) +{ +	static const struct search_path default_search = { NULL, NULL, NULL }; + +	struct dtc_file *file; +	const char *slash; + +	file = xmalloc(sizeof(struct dtc_file)); + +	slash = strrchr(fname, '/'); +	if (slash) { +		char *dir = xmalloc(slash - fname + 1); + +		memcpy(dir, fname, slash - fname); +		dir[slash - fname] = 0; +		file->dir = dir; +	} else { +		file->dir = NULL; +	} + +	if (streq(fname, "-")) { +		file->name = "stdin"; +		file->file = stdin; +		return file; +	} + +	if (fname[0] == '/') { +		file->file = fopen(fname, "r"); +		if (!file->file) +			goto fail; + +		file->name = strdup(fname); +		return file; +	} + +	if (!search) +		search = &default_search; + +	while (search) { +		if (dtc_open_one(file, search->dir, fname)) +			return file; + +		if (errno != ENOENT) +			goto fail; + +		search = search->next; +	} + +fail: +	die("Couldn't open \"%s\": %s\n", fname, strerror(errno)); +} + +void dtc_close_file(struct dtc_file *file) +{ +	if (fclose(file->file)) +		die("Error closing \"%s\": %s\n", file->name, strerror(errno)); + +	free(file->dir); +	free(file); +}  | 
