eb/ebzip/zipinfofile.c
2016-10-28 20:02:30 -07:00

186 lines
5.2 KiB
C

/* -*- C -*-
* Copyright (c) 1998-2006 Motoyuki Kasahara
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include "ebzip.h"
#include "samefile.h"
#include "yesno.h"
/*
* Tricks for gettext.
*/
#ifdef ENABLE_NLS
#define _(string) gettext(string)
#ifdef gettext_noop
#define N_(string) gettext_noop(string)
#else
#define N_(string) (string)
#endif
#else
#define _(string) (string)
#define N_(string) (string)
#endif
/*
* Unexported functions.
*/
static int ebzip_zipinfo_file_internal(const char *in_file_name,
Zio_Code in_zio_code, int index_page);
/*
* Output status of a file `in_file_name'.
* For START file, use ebzip_zipinfo_start_file() instead.
* If it succeeds, 0 is returned. Otherwise -1 is returned.
*/
int
ebzip_zipinfo_file(const char *in_file_name, Zio_Code in_zio_code)
{
return ebzip_zipinfo_file_internal(in_file_name, in_zio_code, 0);
}
/*
* Output status of START file `in_file_name'.
* If it succeeds, 0 is returned. Otherwise -1 is returned.
*/
int
ebzip_zipinfo_start_file(const char *in_file_name, Zio_Code in_zio_code,
int index_page)
{
return ebzip_zipinfo_file_internal(in_file_name, in_zio_code, index_page);
}
/*
* Output status of a file `file_name'.
* If it succeeds, 0 is returned. Otherwise -1 is returned.
*/
static int
ebzip_zipinfo_file_internal(const char *in_file_name, Zio_Code in_zio_code,
int index_page)
{
Zio in_zio;
int in_file = -1;
struct stat in_status;
/*
* Output file name information.
*/
printf("==> %s <==\n", in_file_name);
fflush(stdout);
/*
* Open the file.
*/
zio_initialize(&in_zio);
if (stat(in_file_name, &in_status) == 0 && S_ISREG(in_status.st_mode))
in_file = zio_open(&in_zio, in_file_name, in_zio_code);
if (in_file < 0) {
fprintf(stderr, _("%s: failed to open the file: %s\n"),
invoked_name, in_file_name);
goto failed;
}
if (in_zio_code == ZIO_SEBXA) {
off_t index_location;
off_t index_base;
off_t zio_start_location;
off_t zio_end_location;
if (get_sebxa_indexes(in_file_name, index_page, &index_location,
&index_base, &zio_start_location, &zio_end_location) < 0) {
goto failed;
}
zio_set_sebxa_mode(&in_zio, index_location, index_base,
zio_start_location, zio_end_location);
}
/*
* Close the file.
*/
zio_close(&in_zio);
/*
* Output information.
*/
if (in_zio.code == ZIO_PLAIN) {
#if defined(PRINTF_LL_MODIFIER)
printf(_("%llu bytes (not compressed)\n"),
(unsigned long long) in_status.st_size);
#elif defined(PRINTF_I64_MODIFIER)
printf(_("%I64u bytes (not compressed)\n"),
(unsigned __int64) in_status.st_size);
#else
printf(_("%lu bytes (not compressed)\n"),
(unsigned long) in_status.st_size);
#endif
} else {
#if defined(PRINTF_LL_MODIFIER)
printf(_("%llu -> %llu bytes "),
(unsigned long long) in_zio.file_size,
(unsigned long long) in_status.st_size);
#elif defined(PRINTF_I64_MODIFIER)
printf(_("%I64u -> %I64u bytes "),
(unsigned __int64) in_zio.file_size,
(unsigned __int64) in_status.st_size);
#else
printf(_("%lu -> %lu bytes "),
(unsigned long) in_zio.file_size,
(unsigned long) in_status.st_size);
#endif
if (in_zio.file_size == 0)
fputs(_("(empty original file, "), stdout);
else {
printf("(%4.1f%%, ", (double)in_status.st_size * 100.0
/ (double)in_zio.file_size);
}
if (in_zio.code == ZIO_EBZIP1)
printf(_("ebzip level %d compression)\n"), in_zio.zip_level);
else if (in_zio.code == ZIO_SEBXA)
printf(_("S-EBXA compression)\n"));
else
printf(_("EPWING compression)\n"));
}
fputc('\n', stdout);
fflush(stdout);
return 0;
/*
* An error occurs...
*/
failed:
if (0 <= in_file)
close(in_file);
fputc('\n', stderr);
fflush(stderr);
return -1;
}