Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 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); } |