Make stack traces print absolute filenames

darcs-hash:20060202152356-ac50b-9e6ab31c03d5f49824ccca7eee3b8e62d66b0009.gz
This commit is contained in:
axel 2006-02-03 01:23:56 +10:00
parent 5942a6d6c1
commit 06fd1aa9f8
9 changed files with 121 additions and 22 deletions

View file

@ -2001,7 +2001,6 @@ static int builtin_source( wchar_t ** argv )
argc = builtin_count_args( argv ); argc = builtin_count_args( argv );
if( argc != 2 ) if( argc != 2 )
{ {
sb_printf( sb_err, _( L"%ls: Expected exactly one argument, got %d\n" ), argv[0], argc ); sb_printf( sb_err, _( L"%ls: Expected exactly one argument, got %d\n" ), argv[0], argc );
@ -2029,10 +2028,23 @@ static int builtin_source( wchar_t ** argv )
} }
else else
{ {
parser_push_block( SOURCE ); wchar_t *fn = wrealpath( argv[1], 0 );
reader_push_current_filename( argv[1] ); const wchar_t *fn_intern;
current_block->param1.source_dest = wcsdup( argv[1] ); if( !fn )
{
fn_intern = intern( argv[1] );
}
else
{
fn_intern = intern(fn);
free( fn );
}
parser_push_block( SOURCE );
reader_push_current_filename( fn_intern );
current_block->param1.source_dest = fn_intern;
res = reader_read( fd ); res = reader_read( fd );
parser_pop_block(); parser_pop_block();

View file

@ -18,6 +18,7 @@ for i in /usr/pkg /sw; do
else else
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
fi fi
done done
# If needed, run autoheader automatically # If needed, run autoheader automatically
@ -163,6 +164,23 @@ else
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
fi fi
# Check if realpath accepts null for its second argument
AC_MSG_CHECKING([if realpath accepts null for its second argument])
AC_RUN_IFELSE(
[AC_LANG_PROGRAM([#include <limits.h>
#include <stdlib.h>],
[int status; char *res; res = realpath( "foo", 0 ); status = (res && (strlen(res)>3))?0:1; free(res); exit( status );])],
[have_realpath_null=yes],
[have_realpath_null=no] )
if test "$have_realpath_null" = yes; then
AC_MSG_RESULT(yes)
AC_DEFINE([HAVE_REALPATH_NULL], [1],
[Define to 1 if realpath accepts null for its second argument.])
else
AC_MSG_RESULT(no)
fi
# Check for libraries # Check for libraries
AC_CHECK_LIB(socket, connect) AC_CHECK_LIB(socket, connect)

10
main.c
View file

@ -244,6 +244,7 @@ int main( int argc, char **argv )
int i; int i;
string_buffer_t sb; string_buffer_t sb;
int fd; int fd;
wchar_t *rel_filename, *abs_filename;
if( ( fd = open(file, O_RDONLY) ) == -1 ) if( ( fd = open(file, O_RDONLY) ) == -1 )
{ {
@ -268,7 +269,12 @@ int main( int argc, char **argv )
sb_destroy( &sb ); sb_destroy( &sb );
} }
reader_push_current_filename( str2wcs( file ) ); rel_filename = str2wcs( file );
abs_filename = wrealpath( rel_filename, 0 );
reader_push_current_filename( intern( abs_filename ) );
free( rel_filename );
free( abs_filename );
res = reader_read( fd ); res = reader_read( fd );
if( res ) if( res )
@ -277,7 +283,7 @@ int main( int argc, char **argv )
_(L"Error while reading file %ls\n"), _(L"Error while reading file %ls\n"),
reader_current_filename()?reader_current_filename(): _(L"Standard input") ); reader_current_filename()?reader_current_filename(): _(L"Standard input") );
} }
free(reader_pop_current_filename()); reader_pop_current_filename();
} }
} }
} }

View file

@ -36,6 +36,7 @@ The fish parser. Contains functions for parsing code.
#include "env_universal.h" #include "env_universal.h"
#include "event.h" #include "event.h"
#include "translate.h" #include "translate.h"
#include "intern.h"
/** /**
Maximum number of block levels in code. This is not the same as Maximum number of block levels in code. This is not the same as
@ -339,7 +340,7 @@ void parser_push_block( int type )
block_t *new = calloc( 1, sizeof( block_t )); block_t *new = calloc( 1, sizeof( block_t ));
new->src_lineno = parser_get_lineno(); new->src_lineno = parser_get_lineno();
new->src_filename = parser_current_filename()?wcsdup(parser_current_filename()):0; new->src_filename = parser_current_filename()?intern(parser_current_filename()):0;
debug( 3, L"Block push %ls %d\n", parser_get_block_desc(type), block_count( current_block)+1 ); debug( 3, L"Block push %ls %d\n", parser_get_block_desc(type), block_count( current_block)+1 );
@ -418,12 +419,6 @@ void parser_pop_block()
break; break;
} }
case SOURCE:
{
free( current_block->param1.source_dest );
break;
}
} }
for( eb=current_block->first_event_block; eb; eb=eb_next ) for( eb=current_block->first_event_block; eb; eb=eb_next )
@ -432,8 +427,6 @@ void parser_pop_block()
free(eb); free(eb);
} }
free( current_block->src_filename );
block_t *old = current_block; block_t *old = current_block;
current_block = current_block->outer; current_block = current_block->outer;
free( old ); free( old );

View file

@ -65,7 +65,7 @@ typedef struct block
int if_state; /**< The state of the if block */ int if_state; /**< The state of the if block */
wchar_t *switch_value; /**< The value to test in a switch block */ wchar_t *switch_value; /**< The value to test in a switch block */
wchar_t *function_name; /**< The name of the function to define or the function called*/ wchar_t *function_name; /**< The name of the function to define or the function called*/
wchar_t *source_dest; /**< The name of the file to source*/ const wchar_t *source_dest; /**< The name of the file to source*/
event_t *event; /**<The event that triggered this block */ event_t *event; /**<The event that triggered this block */
} param1; } param1;
@ -99,7 +99,7 @@ typedef struct block
/** /**
Name of file that created this block Name of file that created this block
*/ */
wchar_t *src_filename; const wchar_t *src_filename;
/** /**
Line number where this block was created Line number where this block was created

View file

@ -390,7 +390,7 @@ wchar_t *reader_current_filename()
} }
void reader_push_current_filename( wchar_t *fn ) void reader_push_current_filename( const wchar_t *fn )
{ {
al_push( &current_filename, fn ); al_push( &current_filename, fn );
} }
@ -2678,7 +2678,6 @@ wchar_t *reader_readline()
(last_char != R_HISTORY_TOKEN_SEARCH_FORWARD) ) (last_char != R_HISTORY_TOKEN_SEARCH_FORWARD) )
{ {
reset=1; reset=1;
} }
handle_token_history( 0, reset ); handle_token_history( 0, reset );

View file

@ -48,7 +48,7 @@ wchar_t *reader_current_filename();
\param fn The fileanme to push \param fn The fileanme to push
*/ */
void reader_push_current_filename( wchar_t *fn ); void reader_push_current_filename( const wchar_t *fn );
/** /**
Pop the current filename from the stack of read files Pop the current filename from the stack of read files
*/ */

63
wutil.c
View file

@ -26,6 +26,14 @@
#define TMP_LEN_MIN 256 #define TMP_LEN_MIN 256
#ifndef PATH_MAX
#ifdef MAXPATHLEN
#define PATH_MAX MAXPATHLEN
#else
#define PATH_MAX 4096
#endif
#endif
/** /**
Buffer for converting wide arguments to narrow arguments, used by Buffer for converting wide arguments to narrow arguments, used by
the \c wutil_wcs2str() function. the \c wutil_wcs2str() function.
@ -219,6 +227,61 @@ void wperror(const wchar_t *s)
fwprintf( stderr, L"%s\n", strerror( errno ) ); fwprintf( stderr, L"%s\n", strerror( errno ) );
} }
#ifdef HAVE_REALPATH_NULL
wchar_t *wrealpath(const wchar_t *pathname, wchar_t *resolved_path)
{
char *tmp = wutil_wcs2str(pathname);
char *narrow_res = realpath( tmp, 0 );
wchar_t *res;
if( !narrow_res )
return 0;
if( resolved_path )
{
wchar_t *tmp2 = str2wcs( narrow_res );
wcslcpy( resolved_path, tmp2, PATH_MAX );
free( tmp2 );
res = resolved_path;
}
else
{
res = str2wcs( narrow_res );
}
free( narrow_res );
return res;
}
#else
wchar_t *wrealpath(const wchar_t *pathname, wchar_t *resolved_path)
{
char *tmp =wutil_wcs2str(name);
char narrow[PATH_MAX];
char *narrow_res = realpath( tmp, narrow );
wchar_t *res;
if( !narrow_res )
return 0;
if( resolved_path )
{
wchar_t *tmp2 = str2wcs( narrow_res );
wcslcpy( resolved_path, tmp2, PATH_MAX );
free( tmp2 );
res = resolved_path;
}
else
{
res = str2wcs( narrow_res );
}
return res;
}
#endif
#if !HAVE_FWPRINTF #if !HAVE_FWPRINTF

View file

@ -81,6 +81,14 @@ wchar_t *wgetcwd( wchar_t *buff, size_t sz );
*/ */
int wchdir( const wchar_t * dir ); int wchdir( const wchar_t * dir );
/**
Wide character verion of realpath function. Just like the GNU
version of realpath, wrealpath will accept 0 as the value for the
second argument, in which case the result will be allocated using
malloc, and must be free'd by the user.
*/
wchar_t *wrealpath(const wchar_t *pathname, wchar_t *resolved_path);
/* /*
Here follows the prototypes for fallback implementations of various Here follows the prototypes for fallback implementations of various
standarcs libc functions relating to wide character support. Some of standarcs libc functions relating to wide character support. Some of