libbfd.c: Maintain `where' field of BFD with current position while BFD is
in use. If FILE_OFFSET_IS_CHAR_INDEX, assume arithmetic can be done on it, and ignore SEEK_SET requests that move to the current position. hosts/sparc.h: Define FILE_OFFSET_IS_CHAR_INDEX.
This commit is contained in:
parent
30d17c7e22
commit
0d552306f8
2 changed files with 56 additions and 35 deletions
|
@ -1,11 +1,11 @@
|
|||
#define STDC_HEADERS
|
||||
#define FILE_OFFSET_IS_CHAR_INDEX
|
||||
#if defined(__STDC__) && __GNUC__ >= 2
|
||||
#define abort __hide_abort
|
||||
#define exit __hide_exit
|
||||
#endif
|
||||
#include "hosts/std-host.h"
|
||||
#include <alloca.h>
|
||||
#include <memory.h>
|
||||
#undef exit
|
||||
#undef abort
|
||||
|
||||
|
||||
|
|
83
bfd/libbfd.c
83
bfd/libbfd.c
|
@ -1,5 +1,5 @@
|
|||
/* libbfd.c -- random BFD support routines, only used internally.
|
||||
Copyright (C) 1990-1991 Free Software Foundation, Inc.
|
||||
/* Assorted BFD support routines, only used internally.
|
||||
Copyright 1990, 1991, 1992 Free Software Foundation, Inc.
|
||||
Written by Cygnus Support.
|
||||
|
||||
This file is part of BFD, the Binary File Descriptor library.
|
||||
|
@ -188,7 +188,13 @@ DEFUN(bfd_read,(ptr, size, nitems, abfd),
|
|||
bfd_size_type nitems AND
|
||||
bfd *abfd)
|
||||
{
|
||||
return (bfd_size_type)real_read (ptr, 1, (int)(size*nitems), bfd_cache_lookup(abfd));
|
||||
int nread;
|
||||
nread = real_read (ptr, 1, (int)(size*nitems), bfd_cache_lookup(abfd));
|
||||
#ifdef FILE_OFFSET_IS_CHAR_INDEX
|
||||
if (nread > 0)
|
||||
abfd->where += nread;
|
||||
#endif
|
||||
return nread;
|
||||
}
|
||||
|
||||
bfd_size_type
|
||||
|
@ -198,7 +204,12 @@ DEFUN(bfd_write,(ptr, size, nitems, abfd),
|
|||
bfd_size_type nitems AND
|
||||
bfd *abfd)
|
||||
{
|
||||
return fwrite (ptr, 1, (int)(size*nitems), bfd_cache_lookup(abfd));
|
||||
int nwrote = fwrite (ptr, 1, (int)(size*nitems), bfd_cache_lookup(abfd));
|
||||
#ifdef FILE_OFFSET_IS_CHAR_INDEX
|
||||
if (nwrote > 0)
|
||||
abfd->where += nwrote;
|
||||
#endif
|
||||
return nwrote;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -224,33 +235,6 @@ DEFUN(bfd_write_bigendian_4byte_int,(abfd, i),
|
|||
bfd_write((PTR)buffer, 4, 1, abfd);
|
||||
}
|
||||
|
||||
int
|
||||
DEFUN(bfd_seek,(abfd, position, direction),
|
||||
bfd * CONST abfd AND
|
||||
CONST file_ptr position AND
|
||||
CONST int direction)
|
||||
{
|
||||
/* For the time being, a BFD may not seek to it's end. The
|
||||
problem is that we don't easily have a way to recognize
|
||||
the end of an element in an archive. */
|
||||
|
||||
BFD_ASSERT(direction == SEEK_SET
|
||||
|| direction == SEEK_CUR);
|
||||
|
||||
if (direction == SEEK_SET && abfd->my_archive != NULL)
|
||||
{
|
||||
/* This is a set within an archive, so we need to
|
||||
add the base of the object within the archive */
|
||||
return(fseek(bfd_cache_lookup(abfd),
|
||||
position + abfd->origin,
|
||||
direction));
|
||||
}
|
||||
else
|
||||
{
|
||||
return(fseek(bfd_cache_lookup(abfd), position, direction));
|
||||
}
|
||||
}
|
||||
|
||||
long
|
||||
DEFUN(bfd_tell,(abfd),
|
||||
bfd *abfd)
|
||||
|
@ -261,8 +245,45 @@ DEFUN(bfd_tell,(abfd),
|
|||
|
||||
if (abfd->my_archive)
|
||||
ptr -= abfd->origin;
|
||||
abfd->where = ptr;
|
||||
return ptr;
|
||||
}
|
||||
|
||||
int
|
||||
DEFUN(bfd_seek,(abfd, position, direction),
|
||||
bfd * CONST abfd AND
|
||||
CONST file_ptr position AND
|
||||
CONST int direction)
|
||||
{
|
||||
int result;
|
||||
FILE *f;
|
||||
/* For the time being, a BFD may not seek to it's end. The problem
|
||||
is that we don't easily have a way to recognize the end of an
|
||||
element in an archive. */
|
||||
|
||||
BFD_ASSERT (direction == SEEK_SET || direction == SEEK_CUR);
|
||||
|
||||
if (direction == SEEK_SET && position == 0)
|
||||
return 0;
|
||||
#ifdef FILE_OFFSET_IS_CHAR_INDEX
|
||||
if (x > 0 && direction == SEEK_SET && position == abfd->where)
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
f = bfd_cache_lookup (abfd);
|
||||
if (direction == SEEK_SET && abfd->my_archive != NULL)
|
||||
{
|
||||
/* This is a set within an archive, so we need to
|
||||
add the base of the object within the archive */
|
||||
result = fseek (f, position + abfd->origin, direction);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = fseek (f, position, direction);
|
||||
}
|
||||
/* Force redetermination of `where' field. */
|
||||
bfd_tell (abfd);
|
||||
}
|
||||
|
||||
/** Make a string table */
|
||||
|
||||
|
|
Loading…
Reference in a new issue