diff options
author | Ken Raeburn <raeburn@cygnus> | 1993-03-23 13:54:41 +0000 |
---|---|---|
committer | Ken Raeburn <raeburn@cygnus> | 1993-03-23 13:54:41 +0000 |
commit | 0d552306f86139d51caa7afe407e7d5096d311db (patch) | |
tree | 4e6e08b5190dad292d893fda5963a0420695503f | |
parent | 30d17c7e227e0ff15b66c336d5ff34ebd64a62be (diff) | |
download | gdb-0d552306f86139d51caa7afe407e7d5096d311db.zip gdb-0d552306f86139d51caa7afe407e7d5096d311db.tar.gz gdb-0d552306f86139d51caa7afe407e7d5096d311db.tar.bz2 |
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.
-rw-r--r-- | bfd/hosts/sparc.h | 4 | ||||
-rw-r--r-- | bfd/libbfd.c | 87 |
2 files changed, 56 insertions, 35 deletions
diff --git a/bfd/hosts/sparc.h b/bfd/hosts/sparc.h index 7b05902..c32da58 100644 --- a/bfd/hosts/sparc.h +++ b/bfd/hosts/sparc.h @@ -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 - - diff --git a/bfd/libbfd.c b/bfd/libbfd.c index f48b78f..ceae2c7 100644 --- a/bfd/libbfd.c +++ b/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,44 +235,54 @@ DEFUN(bfd_write_bigendian_4byte_int,(abfd, i), 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 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)); - } -} + 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. */ -long -DEFUN(bfd_tell,(abfd), - bfd *abfd) -{ - file_ptr ptr; + BFD_ASSERT (direction == SEEK_SET || direction == SEEK_CUR); - ptr = ftell (bfd_cache_lookup(abfd)); + 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 - if (abfd->my_archive) - ptr -= abfd->origin; - return ptr; + 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 */ |