diff options
author | doko <doko@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-07-06 21:40:08 +0000 |
---|---|---|
committer | doko <doko@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-07-06 21:40:08 +0000 |
commit | 1f445250410fd24b8185675685c85d401fb9538d (patch) | |
tree | cede115c5e69e77d0b68edda7dfceb560ccb5b15 /fastjar/shift.c | |
parent | 5e611c5f37d48ca2c450c2cbd1a28f7be2422863 (diff) | |
download | ppe42-gcc-1f445250410fd24b8185675685c85d401fb9538d.tar.gz ppe42-gcc-1f445250410fd24b8185675685c85d401fb9538d.zip |
2004-07-06 Matthias Klose <doko@debian.org>
* Makefile.in: Regenerate.
* fastjar.texi: Update for '-u'.
2004-05-19 Casey Marshall <csm@gnu.org>
PR 7854
* Makefile.am
(jar_SOURCES): added shift.c, shift.h.
(jar_CPPFLAGS): define WITH_SHIFT_DOWN.
* compress.c
Added FSF copyright.
(write_data): new function.
(compress_file): call write_data.
* jartool.c
Updated copyright year.
(progname): new variable.
(end_of_entries): new variable.
(main): open and read file when updating.
(find_entry): new function.
(looks_like_dir): new function.
(read_entries): new function.
(make_manifest): added parameter `updating'.
Call `add_file_to_jar' with `updating'.
(add_to_jar_with_dir): added parameter `updating'.
Call `add_to_jar' with `updating'.
(add_to_jar): added parameter `updating'.
Call `add_file_to_jar' with `updating'.
Don't add directories if they already exist.
(add_file_to_jar): added parameter `updating'.
Update entries if they already exist.
* jartool.h
Added #ifndef __FASTJAR_JARTOOL_H__.
(struct zipentry): added `flags'.
* shift.c: new file.
* shift.h: new file.
* zipfile.h
(CEN_FLAGS): new constant.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@84171 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'fastjar/shift.c')
-rw-r--r-- | fastjar/shift.c | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/fastjar/shift.c b/fastjar/shift.c new file mode 100644 index 00000000000..dde90358719 --- /dev/null +++ b/fastjar/shift.c @@ -0,0 +1,166 @@ +/* shift.c -- utilities to move regions of data in a file. + Copyright (C) 2004 Free Software Foundation, Inc. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or (at +your option) any later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +USA. */ + + +#include <sys/types.h> +#include <unistd.h> +#include <stdio.h> +#include "jartool.h" +#include "shift.h" + +#define BUFFER_SIZE 1024 + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) + +/* + * Shift the contents of a file up by `amount' bytes, starting at `begin'. + * The file is not truncated, data from `amount' to `begin - amount' is + * overwritten. The current file pointer of `fd' is preserved. Note that + * this might be past the new "end" of the file. + * + * If this function is passed a `struct zipentry', then all `offset' + * fields from that entry down the list that are greater than or equal + * to `begin' will be decreased by `amount'. + * + * fd - The file descriptor. + * begin - The offset of the first byte that should be shifted. + * amount - The number of bytes to shift by. + * ze - A pointer into a list of zip entries that should be updated + * to reflect the modified offset. + */ +int +shift_up (int fd, off_t begin, off_t amount, struct zipentry *ze) +{ + extern off_t end_of_entries; + int len, moved = 0; + ub1 buffer[BUFFER_SIZE]; + off_t where, end, save; + + if (amount <= 0) + return 0; + + if ((save = lseek (fd, 0, SEEK_CUR)) == -1) + return 1; + if ((end = lseek (fd, 0, SEEK_END)) == -1) + return 1; + if (end < begin) + return 0; + + where = begin; + + do + { + if (lseek (fd, where, SEEK_SET) < 0) + return 1; + if ((len = read (fd, buffer, BUFFER_SIZE)) < 0) + return 1; + if (len == 0) + break; + if (lseek (fd, where - amount, SEEK_SET) < 0) + return 1; + if (write (fd, buffer, len) < 0) + return 1; + where += len; + } + while (where < end); + + for (; ze; ze = ze->next_entry) + { + if (ze->offset >= begin) + { + ze->offset -= amount; + moved = 1; + } + } + if (moved) + end_of_entries -= amount; + + if (lseek (fd, save, SEEK_SET) == -1) + return 1; + return 0; +} + +/* + * Shift the contents of this file down by `amount' bytes, extending the + * end of file, starting at `begin'. This function will preserve the + * current file pointer of `fd'. Naturally, this function will fail if + * `fd' is not seekable. + * + * If this function is passed a `struct zipentry', then all `offset' + * fields from that entry down the list that are greater than or equal + * to `begin' will be increased by `amount'. + * + * fd - The file descriptor. + * begin - The offset of the first byte that should be shifted. + * amount - The number of bytes to shift by. + * ze - A pointer into a list of zip entries that should be updated + * to reflect the modified offset. + */ +int +shift_down (int fd, off_t begin, off_t amount, struct zipentry *ze) +{ + extern off_t end_of_entries; + int off, len, moved = 0; + ub1 buffer[BUFFER_SIZE]; + off_t where, save; + + if (amount <= 0) + return 0; + + if ((save = lseek (fd, 0, SEEK_CUR)) == -1) + return 1; + if ((where = lseek (fd, 0, SEEK_END)) == -1) + return 1; + if (where < begin) + return 0; + off = (where - begin) % BUFFER_SIZE; + if (off == 0) + where -= BUFFER_SIZE; + else + where -= off; + + do + { + if (lseek (fd, where, SEEK_SET) < 0) + return 1; + if ((len = read (fd, buffer, BUFFER_SIZE)) < 0) + return 1; + if (lseek (fd, where + amount, SEEK_SET) < 0) + return 1; + if (write (fd, buffer, len) < 0) + return 1; + where -= BUFFER_SIZE; + } + while (where >= begin); + + for (; ze; ze = ze->next_entry) + { + if (ze->offset >= begin) + { + ze->offset += amount; + moved = 1; + } + } + if (moved) + end_of_entries += amount; + + if (lseek (fd, save, SEEK_SET) == -1) + return 1; + + return 0; +} |