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:
Ken Raeburn
1993-03-23 13:54:41 +00:00
parent 30d17c7e22
commit 0d552306f8
2 changed files with 56 additions and 35 deletions

View File

@ -1,11 +1,11 @@
#define STDC_HEADERS #define STDC_HEADERS
#define FILE_OFFSET_IS_CHAR_INDEX
#if defined(__STDC__) && __GNUC__ >= 2 #if defined(__STDC__) && __GNUC__ >= 2
#define abort __hide_abort #define abort __hide_abort
#define exit __hide_exit #define exit __hide_exit
#endif #endif
#include "hosts/std-host.h" #include "hosts/std-host.h"
#include <alloca.h> #include <alloca.h>
#include <memory.h>
#undef exit #undef exit
#undef abort #undef abort

View File

@ -1,5 +1,5 @@
/* libbfd.c -- random BFD support routines, only used internally. /* Assorted BFD support routines, only used internally.
Copyright (C) 1990-1991 Free Software Foundation, Inc. Copyright 1990, 1991, 1992 Free Software Foundation, Inc.
Written by Cygnus Support. Written by Cygnus Support.
This file is part of BFD, the Binary File Descriptor library. 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_size_type nitems AND
bfd *abfd) 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 bfd_size_type
@ -198,7 +204,12 @@ DEFUN(bfd_write,(ptr, size, nitems, abfd),
bfd_size_type nitems AND bfd_size_type nitems AND
bfd *abfd) 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,44 +235,54 @@ DEFUN(bfd_write_bigendian_4byte_int,(abfd, i),
bfd_write((PTR)buffer, 4, 1, abfd); bfd_write((PTR)buffer, 4, 1, abfd);
} }
long
DEFUN(bfd_tell,(abfd),
bfd *abfd)
{
file_ptr ptr;
ptr = ftell (bfd_cache_lookup(abfd));
if (abfd->my_archive)
ptr -= abfd->origin;
abfd->where = ptr;
return ptr;
}
int int
DEFUN(bfd_seek,(abfd, position, direction), DEFUN(bfd_seek,(abfd, position, direction),
bfd * CONST abfd AND bfd * CONST abfd AND
CONST file_ptr position AND CONST file_ptr position AND
CONST int direction) CONST int direction)
{ {
/* For the time being, a BFD may not seek to it's end. The int result;
problem is that we don't easily have a way to recognize FILE *f;
the end of an element in an archive. */ /* 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 BFD_ASSERT (direction == SEEK_SET || direction == SEEK_CUR);
|| direction == SEEK_CUR);
if (direction == SEEK_SET && abfd->my_archive != NULL) if (direction == SEEK_SET && position == 0)
{ return 0;
/* This is a set within an archive, so we need to #ifdef FILE_OFFSET_IS_CHAR_INDEX
add the base of the object within the archive */ if (x > 0 && direction == SEEK_SET && position == abfd->where)
return(fseek(bfd_cache_lookup(abfd), return 0;
position + abfd->origin, #endif
direction));
}
else
{
return(fseek(bfd_cache_lookup(abfd), position, direction));
}
}
long f = bfd_cache_lookup (abfd);
DEFUN(bfd_tell,(abfd), if (direction == SEEK_SET && abfd->my_archive != NULL)
bfd *abfd) {
{ /* This is a set within an archive, so we need to
file_ptr ptr; add the base of the object within the archive */
result = fseek (f, position + abfd->origin, direction);
ptr = ftell (bfd_cache_lookup(abfd)); }
else
if (abfd->my_archive) {
ptr -= abfd->origin; result = fseek (f, position, direction);
return ptr; }
/* Force redetermination of `where' field. */
bfd_tell (abfd);
} }
/** Make a string table */ /** Make a string table */