123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- /*
- * 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);
- }
|