aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Raeburn <raeburn@cygnus>1993-03-23 13:54:41 +0000
committerKen Raeburn <raeburn@cygnus>1993-03-23 13:54:41 +0000
commit0d552306f86139d51caa7afe407e7d5096d311db (patch)
tree4e6e08b5190dad292d893fda5963a0420695503f
parent30d17c7e227e0ff15b66c336d5ff34ebd64a62be (diff)
downloadgdb-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.h4
-rw-r--r--bfd/libbfd.c87
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 */