summaryrefslogtreecommitdiff
path: root/src/compress.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/compress.c')
-rw-r--r--src/compress.c398
1 files changed, 398 insertions, 0 deletions
diff --git a/src/compress.c b/src/compress.c
new file mode 100644
index 0000000..eaa9407
--- /dev/null
+++ b/src/compress.c
@@ -0,0 +1,398 @@
+/* compress.c --
+
+ This file is part of the lzop file compressor.
+
+ Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer
+ All Rights Reserved.
+
+ lzop and the LZO library are free software; you can redistribute them
+ and/or modify them 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; see the file COPYING.
+ If not, write to the Free Software Foundation, Inc.,
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Markus F.X.J. Oberhumer
+ <markus@oberhumer.com>
+ http://www.oberhumer.com/opensource/lzop/
+ */
+
+
+#include "conf.h"
+
+
+/*************************************************************************
+//
+**************************************************************************/
+
+int x_set_method(int m, int l)
+{
+ int r = -1;
+
+#if defined(WITH_LZO)
+ r = lzo_set_method(m,l);
+ if (r >= 0)
+ return r;
+#endif
+#if defined(WITH_NRV)
+ r = nrv_set_method(m,l);
+ if (r >= 0)
+ return r;
+#endif
+#if defined(WITH_ZLIB)
+ r = zlib_set_method(m,l);
+ if (r >= 0)
+ return r;
+#endif
+
+ UNUSED(r);
+ return -1;
+}
+
+
+int x_get_method(header_t *h)
+{
+ int r = -1;
+
+#if defined(WITH_LZO)
+ r = lzo_get_method(h);
+ if (r >= 0)
+ return r;
+#endif
+#if defined(WITH_NRV)
+ r = nrv_get_method(h);
+ if (r >= 0)
+ return r;
+#endif
+#if defined(WITH_ZLIB)
+ r = zlib_get_method(h);
+ if (r >= 0)
+ return 0;
+#endif
+
+ UNUSED(r);
+ return 14;
+}
+
+
+/*************************************************************************
+// memory setup
+**************************************************************************/
+
+lzo_bool x_enter(const header_t *h)
+{
+ if (h == NULL)
+ {
+ lzo_bool ok = 1;
+#if defined(WITH_LZO)
+ ok &= lzo_enter(NULL);
+#endif
+#if defined(WITH_NRV)
+ ok &= nrv_enter(NULL);
+#endif
+#if defined(WITH_ZLIB)
+ ok &= zlib_enter(NULL);
+#endif
+ return ok;
+ }
+
+ switch (h->method)
+ {
+#if defined(WITH_LZO)
+ case M_LZO1X_1:
+ case M_LZO1X_1_15:
+ case M_LZO1X_999:
+ return lzo_enter(h);
+#endif
+#if defined(WITH_NRV)
+ case M_NRV1A:
+ case M_NRV1B:
+ case M_NRV2A:
+ case M_NRV2B:
+ return nrv_enter(h);
+#endif
+#if defined(WITH_ZLIB)
+ case M_ZLIB:
+ return zlib_enter(h);
+#endif
+ }
+ return 0;
+}
+
+
+void x_leave(const header_t *h)
+{
+ if (h == NULL)
+ {
+#if defined(WITH_ZLIB)
+ zlib_leave(NULL);
+#endif
+#if defined(WITH_NRV)
+ nrv_leave(NULL);
+#endif
+#if defined(WITH_LZO)
+ lzo_leave(NULL);
+#endif
+ return;
+ }
+
+ switch (h->method)
+ {
+#if defined(WITH_LZO)
+ case M_LZO1X_1:
+ case M_LZO1X_1_15:
+ case M_LZO1X_999:
+ lzo_leave(h);
+ break;
+#endif
+#if defined(WITH_NRV)
+ case M_NRV1A:
+ case M_NRV1B:
+ case M_NRV2A:
+ case M_NRV2B:
+ nrv_leave(h);
+ break;
+#endif
+#if defined(WITH_ZLIB)
+ case M_ZLIB:
+ zlib_leave(h);
+ break;
+#endif
+ }
+}
+
+
+/*************************************************************************
+// compress a file
+**************************************************************************/
+
+lzo_bool x_compress(file_t *fip, file_t *fop, header_t *h)
+{
+ lzo_bool ok = 0;
+
+ init_compress_header(h,fip,fop);
+ switch (h->method)
+ {
+#if defined(WITH_LZO)
+ case M_LZO1X_1:
+ case M_LZO1X_1_15:
+ case M_LZO1X_999:
+ lzo_init_compress_header(h);
+ break;
+#endif
+#if defined(WITH_NRV)
+ case M_NRV1A:
+ case M_NRV1B:
+ case M_NRV2A:
+ case M_NRV2B:
+ nrv_init_compress_header(h);
+ break;
+#endif
+#if defined(WITH_ZLIB)
+ case M_ZLIB:
+ zlib_init_compress_header(h);
+ break;
+#endif
+ default:
+ fatal(fip,"Internal error");
+ break;
+ }
+
+ if (!x_enter(h))
+ e_memory();
+
+ if (opt_verbose > 1)
+ {
+ if (opt_unlink)
+ fprintf(con_term,"replacing %s with %s", fip->name, fop->name);
+ else
+ fprintf(con_term,"compressing %s into %s", fip->name, fop->name);
+ fflush(con_term);
+ set_err_nl(1);
+ }
+
+ write_header(fop,h);
+
+ fip->bytes_processed = fop->bytes_processed = 0;
+
+ switch (h->method)
+ {
+#if defined(WITH_LZO)
+ case M_LZO1X_1:
+ case M_LZO1X_1_15:
+ case M_LZO1X_999:
+ ok = lzo_compress(fip,fop,h);
+ break;
+#endif
+#if defined(WITH_NRV)
+ case M_NRV1A:
+ case M_NRV1B:
+ case M_NRV2A:
+ case M_NRV2B:
+ ok = nrv_compress(fip,fop,h);
+ break;
+#endif
+#if defined(WITH_ZLIB)
+ case M_ZLIB:
+ ok = zlib_compress(fip,fop,h);
+ break;
+#endif
+ default:
+ fatal(fip,"Internal error");
+ ok = 0;
+ break;
+ }
+
+ if (opt_cmd == CMD_COMPRESS && opt_verbose > 1)
+ {
+ fprintf(con_term, ok ? "\n" : " FAILED\n");
+ fflush(con_term);
+ }
+ set_err_nl(0);
+
+ x_leave(h);
+ return ok;
+}
+
+
+/*************************************************************************
+// decompress a file
+**************************************************************************/
+
+lzo_bool x_decompress(file_t *fip, file_t *fop,
+ const header_t *h, lzo_bool skip)
+{
+ lzo_bool ok = 0;
+
+ if (!x_enter(h))
+ e_memory();
+
+ if (skip)
+ {
+ assert(opt_cmd != CMD_TEST);
+ assert(fop->fd < 0);
+ if (opt_cmd == CMD_DECOMPRESS && opt_verbose > 0)
+ fprintf(con_term,"skipping %s [%s]", fip->name, fop->name);
+ fflush(con_term);
+ set_err_nl(1);
+ }
+ else if (opt_cmd == CMD_DECOMPRESS && opt_verbose > 1)
+ {
+ if (opt_unlink)
+ fprintf(con_term,"restoring %s into %s", fip->name, fop->name);
+ else
+ fprintf(con_term,"decompressing %s into %s", fip->name, fop->name);
+ fflush(con_term);
+ set_err_nl(1);
+ }
+ else if (opt_cmd == CMD_TEST && opt_verbose > 0)
+ {
+ /* note: gzip is quiet by default when testing, lzop is not */
+ if (opt_verbose > 2)
+ fprintf(con_term,"testing %s [%s]", fip->name, fop->name);
+ else
+ fprintf(con_term,"testing %s", fip->name);
+ fflush(con_term);
+ set_err_nl(1);
+ }
+
+ fip->bytes_processed = fop->bytes_processed = 0;
+
+ switch (h->method)
+ {
+#if defined(WITH_LZO)
+ case M_LZO1X_1:
+ case M_LZO1X_1_15:
+ case M_LZO1X_999:
+ ok = lzo_decompress(fip,fop,h,skip);
+ break;
+#endif
+#if defined(WITH_NRV)
+ case M_NRV1A:
+ case M_NRV1B:
+ case M_NRV2A:
+ case M_NRV2B:
+ ok = nrv_decompress(fip,fop,h,skip);
+ break;
+#endif
+#if defined(WITH_ZLIB)
+ case M_ZLIB:
+ ok = zlib_decompress(fip,fop,h,skip);
+ break;
+#endif
+ default:
+ fatal(fip,"Internal error");
+ ok = 0;
+ break;
+ }
+
+ if (skip && opt_cmd == CMD_DECOMPRESS && opt_verbose > 0)
+ {
+ fprintf(con_term, ok ? "\n" : " FAILED\n");
+ fflush(con_term);
+ }
+ else if (opt_cmd == CMD_DECOMPRESS && opt_verbose > 1)
+ {
+ fprintf(con_term, ok ? "\n" : " FAILED\n");
+ fflush(con_term);
+ }
+ else if (opt_cmd == CMD_TEST && opt_verbose > 0)
+ {
+ fprintf(con_term, ok ? " OK\n" : " FAILED\n");
+ fflush(con_term);
+ }
+ set_err_nl(0);
+
+ if (ok && opt_cmd == CMD_TEST)
+ do_test(h,fop->bytes_processed,fip->bytes_processed);
+ if (ok && opt_cmd == CMD_LIST)
+ do_list(h,fop->bytes_processed,fip->bytes_processed);
+ if (ok && opt_cmd == CMD_LS)
+ do_ls(h,fop->bytes_processed,fip->bytes_processed);
+ if (ok && opt_cmd == CMD_INFO)
+ do_info(h,fop->bytes_processed,fip->bytes_processed);
+
+ x_leave(h);
+ return ok;
+}
+
+
+/*************************************************************************
+//
+**************************************************************************/
+
+void x_filter(lzo_bytep p, lzo_uint l, const header_t *h)
+{
+ unsigned f = (unsigned) h->filter;
+ lzo_bool c = (opt_cmd == CMD_COMPRESS);
+
+ if (f == 0 || l <= 0)
+ return;
+ if (f == 1)
+ {
+ if (c) t_sub1(p,l); else t_add1(p,l);
+ }
+ else if (f <= 16)
+ {
+ if (c) t_sub(p,l,f); else t_add(p,l,f);
+ }
+ else
+ {
+ fatal(NULL,"Invalid filter");
+ }
+}
+
+
+
+/*
+vi:ts=4:et
+*/
+