2007-12-18 07:06:42 +03:00
/*
* 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 .
*/
2008-08-07 06:24:17 +04:00
struct dtc_file * srcpos_file ;
2007-12-18 07:06:42 +03:00
2008-08-07 06:24:17 +04:00
static int dtc_open_one ( struct dtc_file * file ,
const char * search ,
const char * fname )
2007-12-18 07:06:42 +03:00
{
2008-08-07 06:24:17 +04:00
char * fullname ;
2007-12-18 07:06:42 +03:00
2008-08-07 06:24:17 +04:00
if ( search ) {
fullname = xmalloc ( strlen ( search ) + strlen ( fname ) + 2 ) ;
2007-12-18 07:06:42 +03:00
2008-08-07 06:24:17 +04:00
strcpy ( fullname , search ) ;
strcat ( fullname , " / " ) ;
strcat ( fullname , fname ) ;
} else {
fullname = strdup ( fname ) ;
}
2007-12-18 07:06:42 +03:00
2008-08-07 06:24:17 +04:00
file - > file = fopen ( fullname , " r " ) ;
if ( ! file - > file ) {
free ( fullname ) ;
return 0 ;
}
2007-12-18 07:06:42 +03:00
2008-08-07 06:24:17 +04:00
file - > name = fullname ;
return 1 ;
2007-12-18 07:06:42 +03:00
}
2008-08-07 06:24:17 +04:00
struct dtc_file * dtc_open_file ( const char * fname ,
const struct search_path * search )
{
static const struct search_path default_search = { NULL , NULL , NULL } ;
2007-12-18 07:06:42 +03:00
2008-08-07 06:24:17 +04:00
struct dtc_file * file ;
const char * slash ;
2007-12-18 07:06:42 +03:00
2008-08-07 06:24:17 +04:00
file = xmalloc ( sizeof ( struct dtc_file ) ) ;
2007-12-18 07:06:42 +03:00
2008-08-07 06:24:17 +04:00
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 ;
2007-12-18 07:06:42 +03:00
}
2008-08-07 06:24:17 +04:00
if ( streq ( fname , " - " ) ) {
file - > name = " stdin " ;
file - > file = stdin ;
return file ;
2007-12-18 07:06:42 +03:00
}
2008-08-07 06:24:17 +04:00
if ( fname [ 0 ] = = ' / ' ) {
file - > file = fopen ( fname , " r " ) ;
if ( ! file - > file )
goto fail ;
file - > name = strdup ( fname ) ;
return file ;
}
2007-12-18 07:06:42 +03:00
2008-08-07 06:24:17 +04:00
if ( ! search )
search = & default_search ;
2007-12-18 07:06:42 +03:00
2008-08-07 06:24:17 +04:00
while ( search ) {
if ( dtc_open_one ( file , search - > dir , fname ) )
return file ;
if ( errno ! = ENOENT )
goto fail ;
search = search - > next ;
2007-12-18 07:06:42 +03:00
}
2008-08-07 06:24:17 +04:00
fail :
die ( " Couldn't open \" %s \" : %s \n " , fname , strerror ( errno ) ) ;
2007-12-18 07:06:42 +03:00
}
2008-08-07 06:24:17 +04:00
void dtc_close_file ( struct dtc_file * file )
2007-12-18 07:06:42 +03:00
{
2008-08-07 06:24:17 +04:00
if ( fclose ( file - > file ) )
die ( " Error closing \" %s \" : %s \n " , file - > name , strerror ( errno ) ) ;
free ( file - > dir ) ;
free ( file ) ;
2007-12-18 07:06:42 +03:00
}