Project

General

Profile

Feature #839 ยป add_code_output.diff

rogerdpack (Roger Pack), 12/08/2008 06:29 PM

View differences:

eval_error.c (working copy)
rb_funcall(info, rb_intern("set_backtrace"), 1, bt);
}
static void
print_line_from_file(char *filename_and_line_number) {
char *c;
char *filename;
char *line_number_string;
FILE *test;
int bytes_read;
int done = 0;
int byte_at;
int line_number = 0;
int am_within_preceding_whitespace = 1;
int line_at = 1;
char read_buffer[100];
/* find filename from string filename:line:more */
filename = alloca(strlen(filename_and_line_number) + 1);
strcpy(filename, filename_and_line_number );
for(c = &filename[0]; *c != 0 && *c != ':'; c++) { }
*c = 0;
test = fopen(filename, "r");
if(!test)
return; // file not found
c++;
line_number_string = c;
for(; *c != 0 && *c != ':'; c++) { }
*c = 0;
line_number = atoi(line_number_string);
if(!line_number)
return;
warn_printf("\t\t ");
while(!done) {
char current;
bytes_read = fread(&read_buffer[0], sizeof(char), 99, test);
read_buffer[bytes_read] = 0;
for(byte_at = 0; byte_at < bytes_read; byte_at++) {
current = read_buffer[byte_at];
if(current == '\n')
line_at += 1;
if(line_at == line_number && current != '\r' && current != '\n') {
if(!(am_within_preceding_whitespace && (current == '\t' || current == ' '))) {
am_within_preceding_whitespace = 0;
printf("%c", current);
}
}
}
if(bytes_read < 99) // EOF
done = 1;
if(line_at > line_number)
done = 1;
}
fclose(test);
warn_printf("\n");
}
static void
error_print(void)
{
......
goto error;
if (eclass == rb_eRuntimeError && elen == 0) {
warn_print(": unhandled exception\n");
if (!NIL_P(errat))
print_line_from_file(RSTRING_PTR( RARRAY_PTR(errat)[0]));
}
else {
VALUE epath;
......
for (i = 1; i < len; i++) {
if (TYPE(ptr[i]) == T_STRING) {
warn_printf("\tfrom %s\n", RSTRING_PTR(ptr[i]));
print_line_from_file(RSTRING_PTR(ptr[i]));
}
if (skip && i == TRACE_HEAD && len > TRACE_MAX) {
warn_printf("\t ... %ld levels...\n",
    (1-1/1)