diff options
author | Anas Nashif <anas.nashif@intel.com> | 2012-11-06 22:57:13 -0800 |
---|---|---|
committer | Anas Nashif <anas.nashif@intel.com> | 2012-11-06 22:57:13 -0800 |
commit | 1bb1ce141783168d44a38cd1bb6b822eb13114fc (patch) | |
tree | b72d5afb9da6d9e92e685fb7a689342491600180 /examples | |
download | lzo-1bb1ce141783168d44a38cd1bb6b822eb13114fc.tar.gz lzo-1bb1ce141783168d44a38cd1bb6b822eb13114fc.tar.bz2 lzo-1bb1ce141783168d44a38cd1bb6b822eb13114fc.zip |
Imported Upstream version 2.03upstream/2.03
Diffstat (limited to 'examples')
-rw-r--r-- | examples/Makefile.am | 21 | ||||
-rw-r--r-- | examples/Makefile.in | 491 | ||||
-rw-r--r-- | examples/dict.c | 278 | ||||
-rw-r--r-- | examples/lzopack.c | 642 | ||||
-rw-r--r-- | examples/overlap.c | 337 | ||||
-rw-r--r-- | examples/portab.h | 162 | ||||
-rw-r--r-- | examples/portab_a.h | 128 | ||||
-rw-r--r-- | examples/precomp.c | 345 | ||||
-rw-r--r-- | examples/precomp2.c | 397 | ||||
-rw-r--r-- | examples/simple.c | 168 |
10 files changed, 2969 insertions, 0 deletions
diff --git a/examples/Makefile.am b/examples/Makefile.am new file mode 100644 index 0000000..2c5b527 --- /dev/null +++ b/examples/Makefile.am @@ -0,0 +1,21 @@ +## Process this file with automake to create Makefile.in +# +# Copyright (C) 1996-2008 Markus F.X.J. Oberhumer +# + +INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir) + +noinst_PROGRAMS = dict lzopack overlap precomp precomp2 simple + +dict_SOURCES = dict.c +lzopack_SOURCES = lzopack.c +overlap_SOURCES = overlap.c +precomp_SOURCES = precomp.c +precomp2_SOURCES = precomp2.c +simple_SOURCES = simple.c + +LDADD = ../src/liblzo2.la +DEPENDENCIES = ../src/liblzo2.la + +EXTRA_DIST = portab.h portab_a.h + diff --git a/examples/Makefile.in b/examples/Makefile.in new file mode 100644 index 0000000..4199078 --- /dev/null +++ b/examples/Makefile.in @@ -0,0 +1,491 @@ +# Makefile.in generated by automake 1.9.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# Copyright (C) 1996-2008 Markus F.X.J. Oberhumer +# + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +noinst_PROGRAMS = dict$(EXEEXT) lzopack$(EXEEXT) overlap$(EXEEXT) \ + precomp$(EXEEXT) precomp2$(EXEEXT) simple$(EXEEXT) +subdir = examples +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/autoconf/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_dict_OBJECTS = dict.$(OBJEXT) +dict_OBJECTS = $(am_dict_OBJECTS) +dict_LDADD = $(LDADD) +dict_DEPENDENCIES = ../src/liblzo2.la +am_lzopack_OBJECTS = lzopack.$(OBJEXT) +lzopack_OBJECTS = $(am_lzopack_OBJECTS) +lzopack_LDADD = $(LDADD) +lzopack_DEPENDENCIES = ../src/liblzo2.la +am_overlap_OBJECTS = overlap.$(OBJEXT) +overlap_OBJECTS = $(am_overlap_OBJECTS) +overlap_LDADD = $(LDADD) +overlap_DEPENDENCIES = ../src/liblzo2.la +am_precomp_OBJECTS = precomp.$(OBJEXT) +precomp_OBJECTS = $(am_precomp_OBJECTS) +precomp_LDADD = $(LDADD) +precomp_DEPENDENCIES = ../src/liblzo2.la +am_precomp2_OBJECTS = precomp2.$(OBJEXT) +precomp2_OBJECTS = $(am_precomp2_OBJECTS) +precomp2_LDADD = $(LDADD) +precomp2_DEPENDENCIES = ../src/liblzo2.la +am_simple_OBJECTS = simple.$(OBJEXT) +simple_OBJECTS = $(am_simple_OBJECTS) +simple_LDADD = $(LDADD) +simple_DEPENDENCIES = ../src/liblzo2.la +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/autoconf/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(dict_SOURCES) $(lzopack_SOURCES) $(overlap_SOURCES) \ + $(precomp_SOURCES) $(precomp2_SOURCES) $(simple_SOURCES) +DIST_SOURCES = $(dict_SOURCES) $(lzopack_SOURCES) $(overlap_SOURCES) \ + $(precomp_SOURCES) $(precomp2_SOURCES) $(simple_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LZO_ASM_VPATH = @LZO_ASM_VPATH@ +LZO_CFLAGS = @LZO_CFLAGS@ +LZO_CPPFLAGS = @LZO_CPPFLAGS@ +LZO_EXTRA_CFLAGS = @LZO_EXTRA_CFLAGS@ +LZO_EXTRA_CPPFLAGS = @LZO_EXTRA_CPPFLAGS@ +LZO_USE_ASM_FALSE = @LZO_USE_ASM_FALSE@ +LZO_USE_ASM_TRUE = @LZO_USE_ASM_TRUE@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +configure_CFLAGS = @configure_CFLAGS@ +configure_CPPFLAGS = @configure_CPPFLAGS@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir) +dict_SOURCES = dict.c +lzopack_SOURCES = lzopack.c +overlap_SOURCES = overlap.c +precomp_SOURCES = precomp.c +precomp2_SOURCES = precomp2.c +simple_SOURCES = simple.c +LDADD = ../src/liblzo2.la +DEPENDENCIES = ../src/liblzo2.la +EXTRA_DIST = portab.h portab_a.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu examples/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +dict$(EXEEXT): $(dict_OBJECTS) $(dict_DEPENDENCIES) + @rm -f dict$(EXEEXT) + $(LINK) $(dict_LDFLAGS) $(dict_OBJECTS) $(dict_LDADD) $(LIBS) +lzopack$(EXEEXT): $(lzopack_OBJECTS) $(lzopack_DEPENDENCIES) + @rm -f lzopack$(EXEEXT) + $(LINK) $(lzopack_LDFLAGS) $(lzopack_OBJECTS) $(lzopack_LDADD) $(LIBS) +overlap$(EXEEXT): $(overlap_OBJECTS) $(overlap_DEPENDENCIES) + @rm -f overlap$(EXEEXT) + $(LINK) $(overlap_LDFLAGS) $(overlap_OBJECTS) $(overlap_LDADD) $(LIBS) +precomp$(EXEEXT): $(precomp_OBJECTS) $(precomp_DEPENDENCIES) + @rm -f precomp$(EXEEXT) + $(LINK) $(precomp_LDFLAGS) $(precomp_OBJECTS) $(precomp_LDADD) $(LIBS) +precomp2$(EXEEXT): $(precomp2_OBJECTS) $(precomp2_DEPENDENCIES) + @rm -f precomp2$(EXEEXT) + $(LINK) $(precomp2_LDFLAGS) $(precomp2_OBJECTS) $(precomp2_LDADD) $(LIBS) +simple$(EXEEXT): $(simple_OBJECTS) $(simple_DEPENDENCIES) + @rm -f simple$(EXEEXT) + $(LINK) $(simple_LDFLAGS) $(simple_OBJECTS) $(simple_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dict.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzopack.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/overlap.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/precomp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/precomp2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/examples/dict.c b/examples/dict.c new file mode 100644 index 0000000..eec7675 --- /dev/null +++ b/examples/dict.c @@ -0,0 +1,278 @@ +/* dict.c -- example program: how to use preset dictionaries + + This file is part of the LZO real-time data compression library. + + Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer + All Rights Reserved. + + The LZO library 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. + + The LZO library 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 the LZO library; see the file COPYING. + If not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + Markus F.X.J. Oberhumer + <markus@oberhumer.com> + http://www.oberhumer.com/opensource/lzo/ + */ + + +/************************************************************************* +// This program shows how to use preset dictionaries. +// +// Please study LZO.FAQ and simple.c first. +**************************************************************************/ + +#include "lzo/lzoconf.h" +#include "lzo/lzo1x.h" + +/* portability layer */ +#define WANT_LZO_MALLOC 1 +#define WANT_LZO_FREAD 1 +#define WANT_LZO_WILDARGV 1 +#include "examples/portab.h" + + +static const char *progname = NULL; + +#define DICT_LEN 0xbfff +static lzo_bytep dict; +static lzo_uint dict_len = 0; +static lzo_uint32 dict_adler32; + + +/************************************************************************* +// +**************************************************************************/ + +static lzo_uint total_n = 0; +static lzo_uint total_c_len = 0; +static lzo_uint total_d_len = 0; + +static void print_file ( const char *name, lzo_uint d_len, lzo_uint c_len ) +{ + double perc; + + perc = (d_len > 0) ? c_len * 100.0 / d_len : 0; + printf(" | %-30s %9ld -> %9ld %7.2f%% |\n", + name, (long) d_len, (long) c_len, perc); + + total_n++; + total_c_len += c_len; + total_d_len += d_len; +} + + +/************************************************************************* +// +**************************************************************************/ + +int do_file ( const char *in_name, int level ) +{ + int r; + lzo_bytep in; + lzo_bytep out; + lzo_bytep newb; + lzo_bytep wrkmem; + lzo_uint in_len; + lzo_uint out_len; + lzo_uint new_len; + long l; + FILE *f; + +/* + * Step 1: open the input file + */ + f = fopen(in_name,"rb"); + if (f == 0) + { + printf("%s: cannot open file %s\n", progname, in_name); + return 0; /* no error */ + } + fseek(f,0,SEEK_END); + l = ftell(f); + fseek(f,0,SEEK_SET); + if (l <= 0) + { + printf("%s: %s: empty file -- skipping\n", progname, in_name); + fclose(f); + return 0; + } + in_len = (lzo_uint) l; + +/* + * Step 2: allocate compression buffers and read the file + */ + in = (lzo_bytep) lzo_malloc(in_len); + out = (lzo_bytep) lzo_malloc(in_len + in_len / 16 + 64 + 3); + newb = (lzo_bytep) lzo_malloc(in_len); + wrkmem = (lzo_bytep) lzo_malloc(LZO1X_999_MEM_COMPRESS); + if (in == NULL || out == NULL || newb == NULL || wrkmem == NULL) + { + printf("%s: out of memory\n", progname); + exit(1); + } + in_len = (lzo_uint) lzo_fread(f,in,in_len); + fclose(f); + +/* + * Step 3: compress from `in' to `out' with LZO1X-999 + */ + r = lzo1x_999_compress_level(in,in_len,out,&out_len,wrkmem, + dict, dict_len, 0, level); + if (r != LZO_E_OK) + { + /* this should NEVER happen */ + printf("internal error - compression failed: %d\n", r); + return 1; + } + + print_file(in_name,in_len,out_len); + +/* + * Step 4: decompress again, now going from `out' to `newb' + */ + new_len = in_len; + r = lzo1x_decompress_dict_safe(out,out_len,newb,&new_len,NULL,dict,dict_len); + if (r != LZO_E_OK) + { + /* this should NEVER happen */ + printf("internal error - decompression failed: %d\n", r); + return 1; + } + +/* + * Step 5: verify decompression + */ + if (new_len != in_len || lzo_memcmp(in,newb,in_len) != 0) + { + /* this should NEVER happen */ + printf("internal error - decompression data error\n"); + return 1; + } + + /* free buffers in reverse order to help malloc() */ + lzo_free(wrkmem); + lzo_free(newb); + lzo_free(out); + lzo_free(in); + return 0; +} + + +/************************************************************************* +// +**************************************************************************/ + +int __lzo_cdecl_main main(int argc, char *argv[]) +{ + int i = 1; + int r; + const char *dict_name; + FILE *f; + time_t t_total; + int level = 7; + + lzo_wildargv(&argc, &argv); + + printf("\nLZO real-time data compression library (v%s, %s).\n", + lzo_version_string(), lzo_version_date()); + printf("Copyright (C) 1996-2008 Markus Franz Xaver Johannes Oberhumer\nAll Rights Reserved.\n\n"); + + progname = argv[0]; + + if (i < argc && argv[i][0] == '-' && isdigit(argv[i][1])) + level = atoi(&argv[i++][1]); + + if (i + 1 >= argc || level < 1 || level > 9) + { + printf("usage: %s [-level] [ dictionary-file | -n ] file...\n", progname); + exit(1); + } + printf("Compression level is LZO1X-999/%d\n", level); + +/* + * Step 1: initialize the LZO library + */ + if (lzo_init() != LZO_E_OK) + { + printf("internal error - lzo_init() failed !!!\n"); + printf("(this usually indicates a compiler bug - try recompiling\nwithout optimizations, and enable `-DLZO_DEBUG' for diagnostics)\n"); + exit(1); + } + +/* + * Step 2: prepare the dictionary + */ + dict = (lzo_bytep) lzo_malloc(DICT_LEN); + if (dict == NULL) + { + printf("%s: out of memory\n", progname); + exit(1); + } + dict_name = argv[i++]; + if (strcmp(dict_name,"-n") == 0) + { + dict_name = "empty"; + dict_len = 0; + } + else + { + f = fopen(dict_name,"rb"); + if (!f) + { + printf("%s: cannot open dictionary file %s\n", progname, dict_name); + exit(1); + } + dict_len = (lzo_uint) lzo_fread(f,dict,DICT_LEN); + fclose(f); + } + + dict_adler32 = lzo_adler32(0,NULL,0); + dict_adler32 = lzo_adler32(dict_adler32,dict,dict_len); + printf("Using dictionary '%s', %ld bytes, ID 0x%08lx.\n", + dict_name, (long) dict_len, (long) dict_adler32); + +/* + * Step 3: process files + */ + t_total = time(NULL); + for (r = 0; r == 0 && i < argc; i++) + r = do_file(argv[i], level); + t_total = time(NULL) - t_total; + + lzo_free(dict); + + if (total_n > 1) + print_file("***TOTALS***",total_d_len,total_c_len); + + printf("Dictionary compression test %s, execution time %lu seconds.\n", + r == 0 ? "passed" : "FAILED", (unsigned long) t_total); + return r; +} + +/* +vi:ts=4:et +*/ + diff --git a/examples/lzopack.c b/examples/lzopack.c new file mode 100644 index 0000000..6a3d848 --- /dev/null +++ b/examples/lzopack.c @@ -0,0 +1,642 @@ +/* lzopack.c -- LZO example program: a simple file packer + + This file is part of the LZO real-time data compression library. + + Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer + All Rights Reserved. + + The LZO library 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. + + The LZO library 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 the LZO library; see the file COPYING. + If not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + Markus F.X.J. Oberhumer + <markus@oberhumer.com> + http://www.oberhumer.com/opensource/lzo/ + */ + + +/************************************************************************* +// NOTE: this is an example program, so do not use to backup your data. +// +// This program lacks things like sophisticated file handling but is +// pretty complete regarding compression - it should provide a good +// starting point for adaption for your applications. +// +// Please study LZO.FAQ and simple.c first. +**************************************************************************/ + +#include "lzo/lzoconf.h" +#include "lzo/lzo1x.h" + +/* portability layer */ +#define WANT_LZO_MALLOC 1 +#define WANT_LZO_FREAD 1 +#define WANT_LZO_WILDARGV 1 +#include "examples/portab.h" + + +static const char *progname = NULL; + +static unsigned long total_in = 0; +static unsigned long total_out = 0; +static lzo_bool opt_debug = 0; + +/* magic file header for lzopack-compressed files */ +static const unsigned char magic[7] = + { 0x00, 0xe9, 0x4c, 0x5a, 0x4f, 0xff, 0x1a }; + + +/************************************************************************* +// file IO +**************************************************************************/ + +lzo_uint xread(FILE *fp, lzo_voidp buf, lzo_uint len, lzo_bool allow_eof) +{ + lzo_uint l; + + l = (lzo_uint) lzo_fread(fp, buf, len); + if (l > len) + { + fprintf(stderr, "\nsomething's wrong with your C library !!!\n"); + exit(1); + } + if (l != len && !allow_eof) + { + fprintf(stderr, "\nread error - premature end of file\n"); + exit(1); + } + total_in += (unsigned long) l; + return l; +} + +lzo_uint xwrite(FILE *fp, const lzo_voidp buf, lzo_uint len) +{ + if (fp != NULL && lzo_fwrite(fp, buf, len) != len) + { + fprintf(stderr, "\nwrite error (disk full ?)\n"); + exit(1); + } + total_out += (unsigned long) len; + return len; +} + + +int xgetc(FILE *fp) +{ + unsigned char c; + xread(fp, (lzo_voidp) &c, 1, 0); + return c; +} + +void xputc(FILE *fp, int c) +{ + unsigned char cc = (unsigned char) (c & 0xff); + xwrite(fp, (const lzo_voidp) &cc, 1); +} + +/* read and write portable 32-bit integers */ + +lzo_uint32 xread32(FILE *fp) +{ + unsigned char b[4]; + lzo_uint32 v; + + xread(fp, b, 4, 0); + v = (lzo_uint32) b[3] << 0; + v |= (lzo_uint32) b[2] << 8; + v |= (lzo_uint32) b[1] << 16; + v |= (lzo_uint32) b[0] << 24; + return v; +} + +void xwrite32(FILE *fp, lzo_xint v) +{ + unsigned char b[4]; + + b[3] = (unsigned char) ((v >> 0) & 0xff); + b[2] = (unsigned char) ((v >> 8) & 0xff); + b[1] = (unsigned char) ((v >> 16) & 0xff); + b[0] = (unsigned char) ((v >> 24) & 0xff); + xwrite(fp, b, 4); +} + + +/************************************************************************* +// compress +// +// possible improvement: we could use overlapping compression to +// save some memory - see overlap.c. This would require some minor +// changes in the decompression code as well, because if a block +// turns out to be incompressible we would still have to store it in its +// "compressed" (i.e. then slightly enlarged) form because the original +// (uncompressed) data would have been lost during the overlapping +// compression. +**************************************************************************/ + +int do_compress(FILE *fi, FILE *fo, int level, lzo_uint block_size) +{ + int r = 0; + lzo_bytep in = NULL; + lzo_bytep out = NULL; + lzo_bytep wrkmem = NULL; + lzo_uint in_len; + lzo_uint out_len; + lzo_uint32 wrk_len = 0; + lzo_uint32 flags = 1; /* do compute a checksum */ + int method = 1; /* compression method: LZO1X */ + lzo_uint32 checksum; + + total_in = total_out = 0; + +/* + * Step 1: write magic header, flags & block size, init checksum + */ + xwrite(fo, magic, sizeof(magic)); + xwrite32(fo, flags); + xputc(fo, method); /* compression method */ + xputc(fo, level); /* compression level */ + xwrite32(fo, block_size); + checksum = lzo_adler32(0, NULL, 0); + +/* + * Step 2: allocate compression buffers and work-memory + */ + in = (lzo_bytep) lzo_malloc(block_size); + out = (lzo_bytep) lzo_malloc(block_size + block_size / 16 + 64 + 3); + if (level == 9) + wrk_len = LZO1X_999_MEM_COMPRESS; + else + wrk_len = LZO1X_1_MEM_COMPRESS; + wrkmem = (lzo_bytep) lzo_malloc(wrk_len); + if (in == NULL || out == NULL || wrkmem == NULL) + { + printf("%s: out of memory\n", progname); + r = 1; + goto err; + } + +/* + * Step 3: process blocks + */ + for (;;) + { + /* read block */ + in_len = xread(fi, in, block_size, 1); + if (in_len <= 0) + break; + + /* update checksum */ + if (flags & 1) + checksum = lzo_adler32(checksum, in, in_len); + + /* clear wrkmem (not needed, only for debug/benchmark purposes) */ + if (opt_debug) + lzo_memset(wrkmem, 0xff, wrk_len); + + /* compress block */ + if (level == 9) + r = lzo1x_999_compress(in, in_len, out, &out_len, wrkmem); + else + r = lzo1x_1_compress(in, in_len, out, &out_len, wrkmem); + if (r != LZO_E_OK || out_len > in_len + in_len / 16 + 64 + 3) + { + /* this should NEVER happen */ + printf("internal error - compression failed: %d\n", r); + r = 2; + goto err; + } + + /* write uncompressed block size */ + xwrite32(fo, in_len); + + if (out_len < in_len) + { + /* write compressed block */ + xwrite32(fo, out_len); + xwrite(fo, out, out_len); + } + else + { + /* not compressible - write uncompressed block */ + xwrite32(fo, in_len); + xwrite(fo, in, in_len); + } + } + + /* write EOF marker */ + xwrite32(fo, 0); + + /* write checksum */ + if (flags & 1) + xwrite32(fo, checksum); + + r = 0; +err: + lzo_free(wrkmem); + lzo_free(out); + lzo_free(in); + return r; +} + + +/************************************************************************* +// decompress / test +// +// We are using overlapping (in-place) decompression to save some +// memory - see overlap.c. +**************************************************************************/ + +int do_decompress(FILE *fi, FILE *fo) +{ + int r = 0; + lzo_bytep buf = NULL; + lzo_uint buf_len; + unsigned char m [ sizeof(magic) ]; + lzo_uint32 flags; + int method; + int level; + lzo_uint block_size; + lzo_uint32 checksum; + + total_in = total_out = 0; + +/* + * Step 1: check magic header, read flags & block size, init checksum + */ + if (xread(fi, m, sizeof(magic),1) != sizeof(magic) || + memcmp(m, magic, sizeof(magic)) != 0) + { + printf("%s: header error - this file is not compressed by lzopack\n", progname); + r = 1; + goto err; + } + flags = xread32(fi); + method = xgetc(fi); + level = xgetc(fi); + if (method != 1) + { + printf("%s: header error - invalid method %d (level %d)\n", + progname, method, level); + r = 2; + goto err; + } + block_size = xread32(fi); + if (block_size < 1024 || block_size > 8*1024*1024L) + { + printf("%s: header error - invalid block size %ld\n", + progname, (long) block_size); + r = 3; + goto err; + } + checksum = lzo_adler32(0,NULL,0); + +/* + * Step 2: allocate buffer for in-place decompression + */ + buf_len = block_size + block_size / 16 + 64 + 3; + buf = (lzo_bytep) lzo_malloc(buf_len); + if (buf == NULL) + { + printf("%s: out of memory\n", progname); + r = 4; + goto err; + } + +/* + * Step 3: process blocks + */ + for (;;) + { + lzo_bytep in; + lzo_bytep out; + lzo_uint in_len; + lzo_uint out_len; + + /* read uncompressed size */ + out_len = xread32(fi); + + /* exit if last block (EOF marker) */ + if (out_len == 0) + break; + + /* read compressed size */ + in_len = xread32(fi); + + /* sanity check of the size values */ + if (in_len > block_size || out_len > block_size || + in_len == 0 || in_len > out_len) + { + printf("%s: block size error - data corrupted\n", progname); + r = 5; + goto err; + } + + /* place compressed block at the top of the buffer */ + in = buf + buf_len - in_len; + out = buf; + + /* read compressed block data */ + xread(fi, in, in_len, 0); + + if (in_len < out_len) + { + /* decompress - use safe decompressor as data might be corrupted + * during a file transfer */ + lzo_uint new_len = out_len; + + r = lzo1x_decompress_safe(in, in_len, out, &new_len, NULL); + if (r != LZO_E_OK || new_len != out_len) + { + printf("%s: compressed data violation\n", progname); + r = 6; + goto err; + } + /* write decompressed block */ + xwrite(fo, out, out_len); + /* update checksum */ + if (flags & 1) + checksum = lzo_adler32(checksum, out, out_len); + } + else + { + /* write original (incompressible) block */ + xwrite(fo, in, in_len); + /* update checksum */ + if (flags & 1) + checksum = lzo_adler32(checksum, in, in_len); + } + } + + /* read and verify checksum */ + if (flags & 1) + { + lzo_uint32 c = xread32(fi); + if (c != checksum) + { + printf("%s: checksum error - data corrupted\n", progname); + r = 7; + goto err; + } + } + + r = 0; +err: + lzo_free(buf); + return r; +} + + +/************************************************************************* +// +**************************************************************************/ + +static void usage(void) +{ + printf("usage: %s [-9] input-file output-file (compress)\n", progname); + printf("usage: %s -d input-file output-file (decompress)\n", progname); + printf("usage: %s -t input-file... (test)\n", progname); + exit(1); +} + + +/* open input file */ +static FILE *xopen_fi(const char *name) +{ + FILE *fp; + + fp = fopen(name, "rb"); + if (fp == NULL) + { + printf("%s: cannot open input file %s\n", progname, name); + exit(1); + } +#if defined(HAVE_STAT) && defined(S_ISREG) + { + struct stat st; + int is_regular = 1; + if (stat(name, &st) != 0 || !S_ISREG(st.st_mode)) + is_regular = 0; + if (!is_regular) + { + printf("%s: %s is not a regular file\n", progname, name); + fclose(fp); fp = NULL; + exit(1); + } + } +#endif + return fp; +} + + +/* open output file */ +static FILE *xopen_fo(const char *name) +{ + FILE *fp; + +#if 0 + /* this is an example program, so make sure we don't overwrite a file */ + fp = fopen(name, "rb"); + if (fp != NULL) + { + printf("%s: file %s already exists -- not overwritten\n", progname, name); + fclose(fp); fp = NULL; + exit(1); + } +#endif + fp = fopen(name, "wb"); + if (fp == NULL) + { + printf("%s: cannot open output file %s\n", progname, name); + exit(1); + } + return fp; +} + + +/* close file */ +static void xclose(FILE *fp) +{ + if (fp) + { + int err; + err = ferror(fp); + if (fclose(fp) != 0) + err = 1; + if (err) + { + printf("%s: error while closing file\n", progname); + exit(1); + } + } +} + + +/************************************************************************* +// +**************************************************************************/ + +int __lzo_cdecl_main main(int argc, char *argv[]) +{ + int i = 1; + int r = 0; + FILE *fi = NULL; + FILE *fo = NULL; + const char *in_name = NULL; + const char *out_name = NULL; + lzo_bool opt_decompress = 0; + lzo_bool opt_test = 0; + int opt_level = 1; + lzo_uint opt_block_size; + const char *s; + + lzo_wildargv(&argc, &argv); + + progname = argv[0]; + for (s = progname; *s; s++) + if ((*s == '/' || *s == '\\') && s[1]) + progname = s + 1; + + printf("\nLZO real-time data compression library (v%s, %s).\n", + lzo_version_string(), lzo_version_date()); + printf("Copyright (C) 1996-2008 Markus Franz Xaver Johannes Oberhumer\nAll Rights Reserved.\n\n"); + +#if 0 + printf( +"*** DISCLAIMER ***\n" +" This is an example program, do not use to backup your data !\n" +" Get LZOP if you're interested into a full-featured packer.\n" +" See http://www.oberhumer.com/opensource/lzop/\n" +"\n"); +#endif + + +/* + * Step 1: initialize the LZO library + */ + if (lzo_init() != LZO_E_OK) + { + printf("internal error - lzo_init() failed !!!\n"); + printf("(this usually indicates a compiler bug - try recompiling\nwithout optimizations, and enable `-DLZO_DEBUG' for diagnostics)\n"); + exit(1); + } + + +/* + * Step 2: setup memory + */ + opt_block_size = 256 * 1024L; + +#if defined(ACC_MM_AHSHIFT) + /* reduce memory requirements for ancient 16-bit DOS 640kB real-mode */ + if (ACC_MM_AHSHIFT != 3) + opt_block_size = 16 * 1024L; +#endif + + +/* + * Step 3: get options + */ + + while (i < argc && argv[i][0] == '-') + { + if (strcmp(argv[i],"-d") == 0) + opt_decompress = 1; + else if (strcmp(argv[i],"-t") == 0) + opt_test = 1; + else if (strcmp(argv[i],"-9") == 0) + opt_level = 9; + else if (argv[i][1] == 'b' && argv[i][2]) + { + long b = atol(&argv[i][2]); + if (b >= 1024L && b <= 8*1024*1024L) + opt_block_size = (lzo_uint) b; + else + { + printf("%s: invalid block_size in option `%s'.\n", progname, argv[i]); + usage(); + } + } + else if (strcmp(argv[i],"--debug") == 0) + opt_debug += 1; + else + usage(); + i++; + } + if (opt_test && i >= argc) + usage(); + if (!opt_test && i + 2 != argc) + usage(); + + +/* + * Step 4: process file(s) + */ + + if (opt_test) + { + while (i < argc && r == 0) + { + in_name = argv[i++]; + fi = xopen_fi(in_name); + r = do_decompress(fi, NULL); + if (r == 0) + printf("%s: %s tested ok (%lu -> %lu bytes)\n", + progname, in_name, total_in, total_out); + xclose(fi); fi = NULL; + } + } + else if (opt_decompress) + { + in_name = argv[i++]; + out_name = argv[i++]; + fi = xopen_fi(in_name); + fo = xopen_fo(out_name); + r = do_decompress(fi, fo); + if (r == 0) + printf("%s: decompressed %lu into %lu bytes\n", + progname, total_in, total_out); + } + else /* compress */ + { + in_name = argv[i++]; + out_name = argv[i++]; + fi = xopen_fi(in_name); + fo = xopen_fo(out_name); + r = do_compress(fi, fo, opt_level, opt_block_size); + if (r == 0) + printf("%s: compressed %lu into %lu bytes\n", + progname, total_in, total_out); + } + + xclose(fi); fi = NULL; + xclose(fo); fo = NULL; + return r; +} + +/* +vi:ts=4:et +*/ + diff --git a/examples/overlap.c b/examples/overlap.c new file mode 100644 index 0000000..7eeb52f --- /dev/null +++ b/examples/overlap.c @@ -0,0 +1,337 @@ +/* overlap.c -- example program: overlapping (de)compression + + This file is part of the LZO real-time data compression library. + + Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer + All Rights Reserved. + + The LZO library 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. + + The LZO library 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 the LZO library; see the file COPYING. + If not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + Markus F.X.J. Oberhumer + <markus@oberhumer.com> + http://www.oberhumer.com/opensource/lzo/ + */ + + +/************************************************************************* +// This program shows how to do overlapping compression and +// in-place decompression. +// +// Please study LZO.FAQ and simple.c first. +**************************************************************************/ + +#include "lzo/lzoconf.h" +#include "lzo/lzo1x.h" + +/* portability layer */ +#define WANT_LZO_MALLOC 1 +#define WANT_LZO_FREAD 1 +#define WANT_LZO_WILDARGV 1 +#include "examples/portab.h" + + +/* Overhead (in bytes) for the in-place decompression buffer. + * Most files need only 16 ! + * (try `overlap -16 file' or even `overlap -8 file') + * + * Worst case (for files that are compressible by only a few bytes) + * is 'in_len / 16 + 64 + 3'. See step 5a) below. + * + * For overlapping compression '0xbfff + in_len / 16 + 64 + 3' bytes + * will be needed. See step 4a) below. + */ + +static lzo_uint opt_overhead = 0; /* assume worst case */ + + +#if 0 && defined(LZO_USE_ASM) + /* just for testing */ +# include <lzo_asm.h> +# define lzo1x_decompress lzo1x_decompress_asm_fast +#endif + + +/************************************************************************* +// +**************************************************************************/ + +static const char *progname = NULL; + +static unsigned long total_files = 0; +static unsigned long total_in = 0; + + +static lzo_bytep xmalloc(lzo_uint len) +{ + lzo_bytep p; + + p = (lzo_bytep) lzo_malloc(len > 0 ? len : 1); + if (p == NULL) + { + printf("%s: out of memory\n", progname); + exit(1); + } + return p; +} + + +/************************************************************************* +// +**************************************************************************/ + +int do_file ( const char *in_name ) +{ + int r; + FILE *f = NULL; + long l; + + lzo_bytep wrkmem = NULL; + + lzo_bytep in = NULL; + lzo_uint in_len; /* uncompressed length */ + + lzo_bytep out = NULL; + lzo_uint out_len; /* compressed length */ + + lzo_bytep overlap = NULL; + lzo_uint overhead; + lzo_uint offset; + + lzo_uint new_len = 0; + +/* + * Step 1: open the input file + */ + f = fopen(in_name,"rb"); + if (f == NULL) + { + printf("%s: %s: cannot open file\n", progname, in_name); + goto next_file; + } + fseek(f,0,SEEK_END); + l = ftell(f); + fseek(f,0,SEEK_SET); + if (l <= 0) + { + printf("%s: %s: empty file -- skipping\n", progname, in_name); + goto next_file; + } + in_len = (lzo_uint) l; + +/* + * Step 2: allocate compression buffers and read the file + */ + in = xmalloc(in_len); + out = xmalloc(in_len + in_len / 16 + 64 + 3); + wrkmem = xmalloc(LZO1X_1_MEM_COMPRESS); + in_len = (lzo_uint) lzo_fread(f,in,in_len); + fclose(f); f = NULL; + printf("%s: %s: read %ld bytes\n", progname, in_name, (long) in_len); + + total_files++; + total_in += (unsigned long) in_len; + +/* + * Step 3: compress from `in' to `out' with LZO1X-1 + */ + r = lzo1x_1_compress(in,in_len,out,&out_len,wrkmem); + if (r != LZO_E_OK || out_len > in_len + in_len / 16 + 64 + 3) + { + /* this should NEVER happen */ + printf("internal error - compression failed: %d\n", r); + exit(1); + } + printf("%-26s %8lu -> %8lu\n", "LZO1X-1:", (long) in_len, (long) out_len); + + +/***** Step 4: overlapping compression *****/ + +/* + * Step 4a: allocate the `overlap' buffer for overlapping compression + */ + overhead = in_len > 0xbfff ? 0xbfff : in_len; + overhead += in_len / 16 + 64 + 3; + overlap = xmalloc(in_len + overhead); + +/* + * Step 4b: prepare data in `overlap' buffer. + * copy uncompressed data at the top of the overlap buffer + */ + /*** offset = in_len + overhead - in_len; ***/ + offset = overhead; + lzo_memcpy(overlap + offset, in, in_len); + +/* + * Step 4c: do an in-place compression within the `overlap' buffer + */ + r = lzo1x_1_compress(overlap+offset,in_len,overlap,&new_len,wrkmem); + if (r != LZO_E_OK) + { + /* this should NEVER happen */ + printf("overlapping compression failed: %d\n", r); + exit(1); + } + +/* + * Step 4d: verify overlapping compression + */ + if (new_len != out_len || lzo_memcmp(out,overlap,out_len) != 0) + { + /* As compression is non-deterministic there can be a difference + * in the representation of the compressed data (but this usually + * happens very seldom). So we have to verify the overlapping + * compression by doing a temporary decompression. + */ + lzo_uint l = in_len; + lzo_bytep tmp = xmalloc(l); + r = lzo1x_decompress_safe(overlap,new_len,tmp,&l,NULL); + if (r != LZO_E_OK || l != in_len || lzo_memcmp(in,tmp,l) != 0) + { + /* this should NEVER happen */ + printf("overlapping compression data error\n"); + exit(1); + } + lzo_free(tmp); + } + + printf("overlapping compression: %8lu -> %8lu overhead: %7ld\n", + (long) in_len, (long) new_len, (long) overhead); + lzo_free(overlap); overlap = NULL; + + +/***** Step 5: overlapping decompression *****/ + +/* + * Step 5a: allocate the `overlap' buffer for in-place decompression + */ + if (opt_overhead == 0 || out_len >= in_len) + overhead = in_len / 16 + 64 + 3; + else + overhead = opt_overhead; + overlap = xmalloc(in_len + overhead); + +/* + * Step 5b: prepare data in `overlap' buffer. + * copy compressed data at the top of the overlap buffer + */ + offset = in_len + overhead - out_len; + lzo_memcpy(overlap + offset, out, out_len); + +/* + * Step 5c: do an in-place decompression within the `overlap' buffer + */ + new_len = in_len; + r = lzo1x_decompress(overlap+offset,out_len,overlap,&new_len,NULL); + if (r != LZO_E_OK) + { + /* this may happen if overhead is too small */ + printf("overlapping decompression failed: %d - increase `opt_overhead'\n", r); + exit(1); + } + +/* + * Step 5d: verify decompression + */ + if (new_len != in_len || lzo_memcmp(in,overlap,in_len) != 0) + { + /* this may happen if overhead is too small */ + printf("overlapping decompression data error - increase `opt_overhead'\n"); + exit(1); + } + printf("overlapping decompression: %8lu -> %8lu overhead: %7ld\n", + (long) out_len, (long) new_len, (long) overhead); + lzo_free(overlap); overlap = NULL; + + +next_file: + lzo_free(overlap); + lzo_free(wrkmem); + lzo_free(out); + lzo_free(in); + if (f) fclose(f); + + return 0; +} + + +/************************************************************************* +// +**************************************************************************/ + +int __lzo_cdecl_main main(int argc, char *argv[]) +{ + int r; + int i = 1; + + lzo_wildargv(&argc, &argv); + + printf("\nLZO real-time data compression library (v%s, %s).\n", + lzo_version_string(), lzo_version_date()); + printf("Copyright (C) 1996-2008 Markus Franz Xaver Johannes Oberhumer\nAll Rights Reserved.\n\n"); + + progname = argv[0]; + if (i < argc && argv[i][0] == '-') + opt_overhead = atoi(&argv[i++][1]); +#if 1 + if (opt_overhead != 0 && opt_overhead < 8) + { + printf("%s: invalid overhead value %ld\n", progname, (long)opt_overhead); + exit(1); + } +#endif + if (i >= argc) + { + printf("usage: %s [-overhead_in_bytes] file..\n", progname); + exit(1); + } + +/* + * Step 1: initialize the LZO library + */ + if (lzo_init() != LZO_E_OK) + { + printf("internal error - lzo_init() failed !!!\n"); + printf("(this usually indicates a compiler bug - try recompiling\nwithout optimizations, and enable `-DLZO_DEBUG' for diagnostics)\n"); + exit(1); + } + +/* + * Step 2: process files + */ + for (r = 0; r == 0 && i < argc; i++) + r = do_file(argv[i]); + + printf("\nDone. Successfully processed %lu bytes in %lu files.\n", + total_in, total_files); + return r; +} + +/* +vi:ts=4:et +*/ + diff --git a/examples/portab.h b/examples/portab.h new file mode 100644 index 0000000..1405b44 --- /dev/null +++ b/examples/portab.h @@ -0,0 +1,162 @@ +/* portab.h -- portability layer + + This file is part of the LZO real-time data compression library. + + Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer + All Rights Reserved. + + The LZO library 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. + + The LZO library 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 the LZO library; see the file COPYING. + If not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + Markus F.X.J. Oberhumer + <markus@oberhumer.com> + http://www.oberhumer.com/opensource/lzo/ + */ + + +#include "lzo/lzoconf.h" + +#if (LZO_CC_MSC && (_MSC_VER >= 1000 && _MSC_VER < 1200)) + /* avoid `-W4' warnings in system header files */ +# pragma warning(disable: 4201 4214 4514) +#endif +#if (LZO_CC_MSC && (_MSC_VER >= 1300)) + /* avoid `-Wall' warnings in system header files */ +# pragma warning(disable: 4163 4255 4820) + /* avoid warnings about inlining */ +# pragma warning(disable: 4710 4711) +#endif +#if (LZO_CC_MSC && (_MSC_VER >= 1400)) + /* avoid warnings when using "deprecated" POSIX functions */ +# pragma warning(disable: 4996) +#endif +#if (LZO_CC_PELLESC && (__POCC__ >= 290)) +# pragma warn(disable:2002) +#endif + + +/************************************************************************* +// +**************************************************************************/ + +#if defined(__LZO_MMODEL_HUGE) || !(defined(LZO_LIBC_ISOC90) || defined(LZO_LIBC_ISOC99)) + +#include "examples/portab_a.h" + +#else + +/* INFO: + * The "portab_a.h" version above uses the ACC library to add + * support for ancient systems (like 16-bit DOS) and to provide + * some gimmicks like Windows high-resolution timers. + * Still, on any halfway modern machine you can also use the + * following pure ANSI-C code instead. + */ + +#include <stddef.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <ctype.h> +#include <time.h> +#if defined(CLK_TCK) && !defined(CLOCKS_PER_SEC) +# define CLOCKS_PER_SEC CLK_TCK +#endif + +#if defined(WANT_LZO_MALLOC) +# define lzo_malloc(a) (malloc(a)) +# define lzo_free(a) (free(a)) +#endif +#if defined(WANT_LZO_FREAD) +# define lzo_fread(f,b,s) (fread(b,1,s,f)) +# define lzo_fwrite(f,b,s) (fwrite(b,1,s,f)) +#endif +#if defined(WANT_LZO_UCLOCK) +# define lzo_uclock_handle_t int +# define lzo_uclock_t double +# define lzo_uclock_open(a) ((void)(a)) +# define lzo_uclock_close(a) ((void)(a)) +# define lzo_uclock_read(a,b) *(b) = (clock() / (double)(CLOCKS_PER_SEC)) +# define lzo_uclock_get_elapsed(a,b,c) (*(c) - *(b)) +#endif +#if defined(WANT_LZO_WILDARGV) +# define lzo_wildargv(a,b) ((void)0) +#endif + +#endif + + +/************************************************************************* +// misc +**************************************************************************/ + +/* turn on assertions */ +#undef NDEBUG +#include <assert.h> + +/* just in case */ +#undef xmalloc +#undef xfree +#undef xread +#undef xwrite +#undef xputc +#undef xgetc +#undef xread32 +#undef xwrite32 + + +#if defined(WANT_LZO_UCLOCK) + +/* High quality benchmarking. + * + * Flush the CPU cache to get more accurate benchmark values. + * This needs custom kernel patches. As a result - in combination with + * the perfctr Linux kernel patches - accurate high-quality benchmarking + * is possible. + * + * All other methods (rdtsc, QueryPerformanceCounter, gettimeofday, ...) + * are completely unreliable for our purposes, and the only other + * option is to boot into a legacy single-task operating system + * like plain MSDOS and to directly reprogram the hardware clock. + * [The djgpp2 port of the gcc compiler has support functions for this.] + * + * Also, for embedded systems it's best to benchmark by using a + * CPU emulator/simulator software that can exactly count all + * virtual clock ticks. + */ + +#if !defined(lzo_uclock_flush_cpu_cache) +# define lzo_uclock_flush_cpu_cache(h,flags) ((void)(h)) +#endif + +#endif + + +/* +vi:ts=4:et +*/ + diff --git a/examples/portab_a.h b/examples/portab_a.h new file mode 100644 index 0000000..a58ba99 --- /dev/null +++ b/examples/portab_a.h @@ -0,0 +1,128 @@ +/* portab_a.h -- advanced portability layer + + This file is part of the LZO real-time data compression library. + + Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer + All Rights Reserved. + + The LZO library 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. + + The LZO library 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 the LZO library; see the file COPYING. + If not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + Markus F.X.J. Oberhumer + <markus@oberhumer.com> + http://www.oberhumer.com/opensource/lzo/ + */ + + +/************************************************************************* +// use the ACC library for the hard work +**************************************************************************/ + +#if defined(LZO_HAVE_CONFIG_H) +# define ACC_CONFIG_NO_HEADER 1 +#endif + +#define ACC_WANT_ACC_INCD_H 1 +#define ACC_WANT_ACC_INCE_H 1 +#if defined(__LZO_MMODEL_HUGE) || defined(WANT_LZO_UCLOCK) || defined(WANT_LZO_WILDARGV) +# define ACC_WANT_ACC_INCI_H 1 +# define ACC_WANT_ACC_LIB_H 1 +#endif +#include "src/miniacc.h" + +#if defined(WANT_LZO_MALLOC) +# if defined(__LZO_MMODEL_HUGE) +# define ACC_WANT_ACCLIB_HALLOC 1 +# else +# define acc_halloc(a) (malloc(a)) +# define acc_hfree(a) (free(a)) +# endif +#endif +#if defined(WANT_LZO_FREAD) +# if defined(__LZO_MMODEL_HUGE) +# define ACC_WANT_ACCLIB_HFREAD 1 +# else +# define acc_hfread(f,b,s) (fread(b,1,s,f)) +# define acc_hfwrite(f,b,s) (fwrite(b,1,s,f)) +# endif +#endif +#if defined(WANT_LZO_UCLOCK) +# define ACC_WANT_ACCLIB_PCLOCK 1 +# if 0 && (LZO_ARCH_AMD64 || LZO_ARCH_I386) +# define __ACCLIB_PCLOCK_USE_RDTSC 1 +# define ACC_WANT_ACCLIB_RDTSC 1 +# endif +#endif +#if defined(WANT_LZO_WILDARGV) +# define ACC_WANT_ACCLIB_WILDARGV 1 +#endif +#if defined(__ACCLIB_PCLOCK_USE_PERFCTR) +# include "src/fullacc.h" +# define lzo_uclock_flush_cpu_cache(h,flags) acc_pclock_flush_cpu_cache(h,flags) +#else +# include "src/miniacc.h" +#endif + +#if (__ACCLIB_REQUIRE_HMEMCPY_CH) && !defined(__ACCLIB_HMEMCPY_CH_INCLUDED) +# define ACC_WANT_ACCLIB_HMEMCPY 1 +# include "src/miniacc.h" +#endif + + +/************************************************************************* +// finally pull into the LZO namespace +**************************************************************************/ + +#undef lzo_malloc +#undef lzo_free +#undef lzo_fread +#undef lzo_fwrite +#if defined(WANT_LZO_MALLOC) +# define lzo_malloc(a) acc_halloc(a) +# define lzo_free(a) acc_hfree(a) +#endif +#if defined(WANT_LZO_FREAD) +# define lzo_fread(f,b,s) acc_hfread(f,b,s) +# define lzo_fwrite(f,b,s) acc_hfwrite(f,b,s) +#endif +#if defined(WANT_LZO_UCLOCK) +# define lzo_uclock_handle_t acc_pclock_handle_t +# define lzo_uclock_t acc_pclock_t +# define lzo_uclock_open(a) acc_pclock_open_default(a) +# define lzo_uclock_close(a) acc_pclock_close(a) +# define lzo_uclock_read(a,b) acc_pclock_read(a,b) +# define lzo_uclock_get_elapsed(a,b,c) acc_pclock_get_elapsed(a,b,c) +#endif +#if defined(WANT_LZO_WILDARGV) +# define lzo_wildargv(a,b) acc_wildargv(a,b) +#endif + + +/* +vi:ts=4:et +*/ + diff --git a/examples/precomp.c b/examples/precomp.c new file mode 100644 index 0000000..10f4e7f --- /dev/null +++ b/examples/precomp.c @@ -0,0 +1,345 @@ +/* precomp.c -- example program: how to generate pre-compressed data + + This file is part of the LZO real-time data compression library. + + Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer + All Rights Reserved. + + The LZO library 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. + + The LZO library 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 the LZO library; see the file COPYING. + If not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + Markus F.X.J. Oberhumer + <markus@oberhumer.com> + http://www.oberhumer.com/opensource/lzo/ + */ + + +/************************************************************************* +// This program shows how to generate pre-compressed data. +// +// Please study LZO.FAQ and simple.c first. +// +// We will be trying both LZO1X-999 and LZO1Y-999 and choose +// the algorithm that achieves the best compression ratio. +**************************************************************************/ + +#include "lzo/lzoconf.h" +#include "lzo/lzo1x.h" +#include "lzo/lzo1y.h" + +#define USE_LZO1X 1 +#define USE_LZO1Y 1 + +#define PARANOID 1 + + +/* portability layer */ +#define WANT_LZO_MALLOC 1 +#define WANT_LZO_FREAD 1 +#define WANT_LZO_WILDARGV 1 +#include "examples/portab.h" + + +/************************************************************************* +// +**************************************************************************/ + +int __lzo_cdecl_main main(int argc, char *argv[]) +{ + int r; + + lzo_bytep in; + lzo_uint in_len; + + lzo_bytep out; + lzo_uint out_bufsize; + lzo_uint out_len = 0; + + lzo_bytep wrkmem; + lzo_uint wrk_len; + + lzo_uint best_len; + int best_compress = -1; + + lzo_uint orig_len; + lzo_uint32 uncompressed_checksum; + lzo_uint32 compressed_checksum; + + FILE *f; + const char *progname = NULL; + const char *in_name = NULL; + const char *out_name = NULL; + long l; + + + lzo_wildargv(&argc, &argv); + + printf("\nLZO real-time data compression library (v%s, %s).\n", + lzo_version_string(), lzo_version_date()); + printf("Copyright (C) 1996-2008 Markus Franz Xaver Johannes Oberhumer\nAll Rights Reserved.\n\n"); + + progname = argv[0]; + if (argc < 2 || argc > 3) + { + printf("usage: %s file [output-file]\n", progname); + exit(1); + } + in_name = argv[1]; + if (argc > 2) out_name = argv[2]; + +/* + * Step 1: initialize the LZO library + */ + if (lzo_init() != LZO_E_OK) + { + printf("internal error - lzo_init() failed !!!\n"); + printf("(this usually indicates a compiler bug - try recompiling\nwithout optimizations, and enable `-DLZO_DEBUG' for diagnostics)\n"); + exit(1); + } + +/* + * Step 2: allocate the work-memory + */ + wrk_len = 1; +#ifdef USE_LZO1X + if (wrk_len < LZO1X_999_MEM_COMPRESS) + wrk_len = LZO1X_999_MEM_COMPRESS; +#endif +#ifdef USE_LZO1Y + if (wrk_len < LZO1Y_999_MEM_COMPRESS) + wrk_len = LZO1Y_999_MEM_COMPRESS; +#endif + wrkmem = (lzo_bytep) lzo_malloc(wrk_len); + if (wrkmem == NULL) + { + printf("%s: out of memory\n", progname); + exit(1); + } + +/* + * Step 3: open the input file + */ + f = fopen(in_name,"rb"); + if (f == NULL) + { + printf("%s: cannot open file %s\n", progname, in_name); + exit(1); + } + fseek(f,0,SEEK_END); + l = ftell(f); + fseek(f,0,SEEK_SET); + if (l <= 0) + { + printf("%s: %s: empty file\n", progname, in_name); + fclose(f); + exit(1); + } + in_len = (lzo_uint) l; + out_bufsize = in_len + in_len / 16 + 64 + 3; + best_len = in_len; + +/* + * Step 4: allocate compression buffers and read the file + */ + in = (lzo_bytep) lzo_malloc(in_len); + out = (lzo_bytep) lzo_malloc(out_bufsize); + if (in == NULL || out == NULL) + { + printf("%s: out of memory\n", progname); + exit(1); + } + in_len = (lzo_uint) lzo_fread(f,in,in_len); + printf("%s: loaded file %s: %ld bytes\n", progname, in_name, (long) in_len); + fclose(f); + +/* + * Step 5: compute a checksum of the uncompressed data + */ + uncompressed_checksum = lzo_adler32(0,NULL,0); + uncompressed_checksum = lzo_adler32(uncompressed_checksum,in,in_len); + +/* + * Step 6a: compress from `in' to `out' with LZO1X-999 + */ +#ifdef USE_LZO1X + out_len = out_bufsize; + r = lzo1x_999_compress(in,in_len,out,&out_len,wrkmem); + if (r != LZO_E_OK) + { + /* this should NEVER happen */ + printf("internal error - compression failed: %d\n", r); + exit(1); + } + printf("LZO1X-999: %8lu -> %8lu\n", (unsigned long) in_len, (unsigned long) out_len); + if (out_len < best_len) + { + best_len = out_len; + best_compress = 1; /* LZO1X-999 */ + } +#endif /* USE_LZO1X */ + +/* + * Step 6b: compress from `in' to `out' with LZO1Y-999 + */ +#ifdef USE_LZO1Y + out_len = out_bufsize; + r = lzo1y_999_compress(in,in_len,out,&out_len,wrkmem); + if (r != LZO_E_OK) + { + /* this should NEVER happen */ + printf("internal error - compression failed: %d\n", r); + exit(1); + } + printf("LZO1Y-999: %8lu -> %8lu\n", (unsigned long) in_len, (unsigned long) out_len); + if (out_len < best_len) + { + best_len = out_len; + best_compress = 2; /* LZO1Y-999 */ + } +#endif /* USE_LZO1Y */ + +/* + * Step 7: check if compressible + */ + if (best_len >= in_len) + { + printf("This file contains incompressible data.\n"); + return 0; + } + +/* + * Step 8: compress data again using the best compressor found + */ + out_len = out_bufsize; + if (best_compress == 1) + r = lzo1x_999_compress(in,in_len,out,&out_len,wrkmem); + else if (best_compress == 2) + r = lzo1y_999_compress(in,in_len,out,&out_len,wrkmem); + else + r = -100; + assert(r == LZO_E_OK); + assert(out_len == best_len); + +/* + * Step 9: optimize compressed data (compressed data is in `out' buffer) + */ +#if 1 + /* Optimization does not require any data in the buffer that will + * hold the uncompressed data. To prove this, we clear the buffer. + */ + lzo_memset(in,0,in_len); +#endif + + orig_len = in_len; + r = -100; +#ifdef USE_LZO1X + if (best_compress == 1) + r = lzo1x_optimize(out,out_len,in,&orig_len,NULL); +#endif +#ifdef USE_LZO1Y + if (best_compress == 2) + r = lzo1y_optimize(out,out_len,in,&orig_len,NULL); +#endif + if (r != LZO_E_OK || orig_len != in_len) + { + /* this should NEVER happen */ + printf("internal error - optimization failed: %d\n", r); + exit(1); + } + +/* + * Step 10: compute a checksum of the compressed data + */ + compressed_checksum = lzo_adler32(0,NULL,0); + compressed_checksum = lzo_adler32(compressed_checksum,out,out_len); + +/* + * Step 11: write compressed data to a file + */ + printf("%s: %s: %ld -> %ld, checksum 0x%08lx 0x%08lx\n", + progname, in_name, (long) in_len, (long) out_len, + (long) uncompressed_checksum, (long) compressed_checksum); + + if (out_name && out_name[0]) + { + printf("%s: writing to file %s\n", progname, out_name); + f = fopen(out_name,"wb"); + if (f == NULL) + { + printf("%s: cannot open output file %s\n", progname, out_name); + exit(1); + } + if (lzo_fwrite(f,out,out_len) != out_len || fclose(f) != 0) + { + printf("%s: write error !!\n", progname); + exit(1); + } + } + +/* + * Step 12: verify decompression + */ +#ifdef PARANOID + lzo_memset(in,0,in_len); /* paranoia - clear output buffer */ + orig_len = in_len; + r = -100; +#ifdef USE_LZO1X + if (best_compress == 1) + r = lzo1x_decompress_safe(out,out_len,in,&orig_len,NULL); +#endif +#ifdef USE_LZO1Y + if (best_compress == 2) + r = lzo1y_decompress_safe(out,out_len,in,&orig_len,NULL); +#endif + if (r != LZO_E_OK || orig_len != in_len) + { + /* this should NEVER happen */ + printf("internal error - decompression failed: %d\n", r); + exit(1); + } + if (uncompressed_checksum != lzo_adler32(lzo_adler32(0,NULL,0),in,in_len)) + { + /* this should NEVER happen */ + printf("internal error - decompression data error\n"); + exit(1); + } + /* Now you could also verify decompression under similar conditions as in + * your application, e.g. overlapping assembler decompression etc. + */ +#endif + + lzo_free(in); + lzo_free(out); + lzo_free(wrkmem); + + return 0; +} + +/* +vi:ts=4:et +*/ + diff --git a/examples/precomp2.c b/examples/precomp2.c new file mode 100644 index 0000000..44b066a --- /dev/null +++ b/examples/precomp2.c @@ -0,0 +1,397 @@ +/* precomp2.c -- example program: how to generate pre-compressed data + + This file is part of the LZO real-time data compression library. + + Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer + All Rights Reserved. + + The LZO library 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. + + The LZO library 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 the LZO library; see the file COPYING. + If not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + Markus F.X.J. Oberhumer + <markus@oberhumer.com> + http://www.oberhumer.com/opensource/lzo/ + */ + + +/************************************************************************* +// This program shows how to generate pre-compressed data. +// +// Please study precomp.c first. +// +// We will be trying LZO1X-999 and LZO1Y-999, and we will be trying +// various parameters using the internal interface to squeeze out +// a little bit of extra compression. +// +// NOTE: this program can be quite slow for highly redundant files +**************************************************************************/ + +#include "lzo/lzoconf.h" +#include "lzo/lzo1x.h" +#include "lzo/lzo1y.h" + +LZO_EXTERN(int) +lzo1x_999_compress_internal ( const lzo_bytep in , lzo_uint in_len, + lzo_bytep out, lzo_uintp out_len, + lzo_voidp wrkmem, + const lzo_bytep dict, lzo_uint dict_len, + lzo_callback_p cb, + int try_lazy, + lzo_uint good_length, + lzo_uint max_lazy, + lzo_uint nice_length, + lzo_uint max_chain, + lzo_uint32 flags ); + +LZO_EXTERN(int) +lzo1y_999_compress_internal ( const lzo_bytep in , lzo_uint in_len, + lzo_bytep out, lzo_uintp out_len, + lzo_voidp wrkmem, + const lzo_bytep dict, lzo_uint dict_len, + lzo_callback_p cb, + int try_lazy, + lzo_uint good_length, + lzo_uint max_lazy, + lzo_uint nice_length, + lzo_uint max_chain, + lzo_uint32 flags ); + +#define USE_LZO1X 1 +#define USE_LZO1Y 1 + +#define PARANOID 1 + + +/* portability layer */ +#define WANT_LZO_MALLOC 1 +#define WANT_LZO_FREAD 1 +#define WANT_LZO_WILDARGV 1 +#include "examples/portab.h" + + +/************************************************************************* +// +**************************************************************************/ + +int __lzo_cdecl_main main(int argc, char *argv[]) +{ + int r; + int lazy; + const int max_try_lazy = 5; + const lzo_uint big = 65536L; /* can result in very slow compression */ + const lzo_uint32 flags = 0x1; + + lzo_bytep in; + lzo_uint in_len; + + lzo_bytep out; + lzo_uint out_bufsize; + lzo_uint out_len = 0; + + lzo_bytep wrkmem; + lzo_uint wrk_len; + + lzo_uint best_len; + int best_compress = -1; + int best_lazy = -1; + + lzo_uint orig_len; + lzo_uint32 uncompressed_checksum; + lzo_uint32 compressed_checksum; + + FILE *f; + const char *progname = NULL; + const char *in_name = NULL; + const char *out_name = NULL; + long l; + + + lzo_wildargv(&argc, &argv); + + printf("\nLZO real-time data compression library (v%s, %s).\n", + lzo_version_string(), lzo_version_date()); + printf("Copyright (C) 1996-2008 Markus Franz Xaver Johannes Oberhumer\nAll Rights Reserved.\n\n"); + + progname = argv[0]; + if (argc < 2 || argc > 3) + { + printf("usage: %s file [output-file]\n", progname); + exit(1); + } + in_name = argv[1]; + if (argc > 2) out_name = argv[2]; + +/* + * Step 1: initialize the LZO library + */ + if (lzo_init() != LZO_E_OK) + { + printf("internal error - lzo_init() failed !!!\n"); + printf("(this usually indicates a compiler bug - try recompiling\nwithout optimizations, and enable `-DLZO_DEBUG' for diagnostics)\n"); + exit(1); + } + +/* + * Step 2: allocate the work-memory + */ + wrk_len = 1; +#ifdef USE_LZO1X + if (wrk_len < LZO1X_999_MEM_COMPRESS) + wrk_len = LZO1X_999_MEM_COMPRESS; +#endif +#ifdef USE_LZO1Y + if (wrk_len < LZO1Y_999_MEM_COMPRESS) + wrk_len = LZO1Y_999_MEM_COMPRESS; +#endif + wrkmem = (lzo_bytep) lzo_malloc(wrk_len); + if (wrkmem == NULL) + { + printf("%s: out of memory\n", progname); + exit(1); + } + +/* + * Step 3: open the input file + */ + f = fopen(in_name,"rb"); + if (f == NULL) + { + printf("%s: cannot open file %s\n", progname, in_name); + exit(1); + } + fseek(f,0,SEEK_END); + l = ftell(f); + fseek(f,0,SEEK_SET); + if (l <= 0) + { + printf("%s: %s: empty file\n", progname, in_name); + fclose(f); + exit(1); + } + in_len = (lzo_uint) l; + out_bufsize = in_len + in_len / 16 + 64 + 3; + best_len = in_len; + +/* + * Step 4: allocate compression buffers and read the file + */ + in = (lzo_bytep) lzo_malloc(in_len); + out = (lzo_bytep) lzo_malloc(out_bufsize); + if (in == NULL || out == NULL) + { + printf("%s: out of memory\n", progname); + exit(1); + } + in_len = (lzo_uint) lzo_fread(f,in,in_len); + printf("%s: loaded file %s: %ld bytes\n", progname, in_name, (long) in_len); + fclose(f); + +/* + * Step 5: compute a checksum of the uncompressed data + */ + uncompressed_checksum = lzo_adler32(0,NULL,0); + uncompressed_checksum = lzo_adler32(uncompressed_checksum,in,in_len); + +/* + * Step 6a: compress from `in' to `out' with LZO1X-999 + */ +#ifdef USE_LZO1X + for (lazy = 0; lazy <= max_try_lazy; lazy++) + { + out_len = out_bufsize; + r = lzo1x_999_compress_internal(in,in_len,out,&out_len,wrkmem, + NULL, 0, 0, + lazy, big, big, big, big, flags); + if (r != LZO_E_OK) + { + /* this should NEVER happen */ + printf("internal error - compression failed: %d\n", r); + exit(1); + } + printf("LZO1X-999: lazy =%2d: %8lu -> %8lu\n", + lazy, (unsigned long) in_len, (unsigned long) out_len); + if (out_len < best_len) + { + best_len = out_len; + best_lazy = lazy; + best_compress = 1; /* LZO1X-999 */ + } + } +#endif /* USE_LZO1X */ + +/* + * Step 6b: compress from `in' to `out' with LZO1Y-999 + */ +#ifdef USE_LZO1Y + for (lazy = 0; lazy <= max_try_lazy; lazy++) + { + out_len = out_bufsize; + r = lzo1y_999_compress_internal(in,in_len,out,&out_len,wrkmem, + NULL, 0, 0, + lazy, big, big, big, big, flags); + if (r != LZO_E_OK) + { + /* this should NEVER happen */ + printf("internal error - compression failed: %d\n", r); + exit(1); + } + printf("LZO1Y-999: lazy =%2d: %8lu -> %8lu\n", + lazy, (unsigned long) in_len, (unsigned long) out_len); + if (out_len < best_len) + { + best_len = out_len; + best_lazy = lazy; + best_compress = 2; /* LZO1Y-999 */ + } + } +#endif /* USE_LZO1Y */ + +/* + * Step 7: check if compressible + */ + if (best_len >= in_len) + { + printf("This file contains incompressible data.\n"); + return 0; + } + +/* + * Step 8: compress data again using the best compressor found + */ + out_len = out_bufsize; + if (best_compress == 1) + r = lzo1x_999_compress_internal(in,in_len,out,&out_len,wrkmem, + NULL, 0, 0, + best_lazy, big, big, big, big, flags); + else if (best_compress == 2) + r = lzo1y_999_compress_internal(in,in_len,out,&out_len,wrkmem, + NULL, 0, 0, + best_lazy, big, big, big, big, flags); + else + r = -100; + assert(r == LZO_E_OK); + assert(out_len == best_len); + +/* + * Step 9: optimize compressed data (compressed data is in `out' buffer) + */ +#if 1 + /* Optimization does not require any data in the buffer that will + * hold the uncompressed data. To prove this, we clear the buffer. + */ + lzo_memset(in,0,in_len); +#endif + + orig_len = in_len; + r = -100; +#ifdef USE_LZO1X + if (best_compress == 1) + r = lzo1x_optimize(out,out_len,in,&orig_len,NULL); +#endif +#ifdef USE_LZO1Y + if (best_compress == 2) + r = lzo1y_optimize(out,out_len,in,&orig_len,NULL); +#endif + if (r != LZO_E_OK || orig_len != in_len) + { + /* this should NEVER happen */ + printf("internal error - optimization failed: %d\n", r); + exit(1); + } + +/* + * Step 10: compute a checksum of the compressed data + */ + compressed_checksum = lzo_adler32(0,NULL,0); + compressed_checksum = lzo_adler32(compressed_checksum,out,out_len); + +/* + * Step 11: write compressed data to a file + */ + printf("%s: %s: %ld -> %ld, checksum 0x%08lx 0x%08lx\n", + progname, in_name, (long) in_len, (long) out_len, + (long) uncompressed_checksum, (long) compressed_checksum); + + if (out_name && out_name[0]) + { + printf("%s: writing to file %s\n", progname, out_name); + f = fopen(out_name,"wb"); + if (f == NULL) + { + printf("%s: cannot open output file %s\n", progname, out_name); + exit(1); + } + if (lzo_fwrite(f,out,out_len) != out_len || fclose(f) != 0) + { + printf("%s: write error !!\n", progname); + exit(1); + } + } + +/* + * Step 12: verify decompression + */ +#ifdef PARANOID + lzo_memset(in,0,in_len); /* paranoia - clear output buffer */ + orig_len = in_len; + r = -100; +#ifdef USE_LZO1X + if (best_compress == 1) + r = lzo1x_decompress_safe(out,out_len,in,&orig_len,NULL); +#endif +#ifdef USE_LZO1Y + if (best_compress == 2) + r = lzo1y_decompress_safe(out,out_len,in,&orig_len,NULL); +#endif + if (r != LZO_E_OK || orig_len != in_len) + { + /* this should NEVER happen */ + printf("internal error - decompression failed: %d\n", r); + exit(1); + } + if (uncompressed_checksum != lzo_adler32(lzo_adler32(0,NULL,0),in,in_len)) + { + /* this should NEVER happen */ + printf("internal error - decompression data error\n"); + exit(1); + } + /* Now you could also verify decompression under similar conditions as in + * your application, e.g. overlapping assembler decompression etc. + */ +#endif + + lzo_free(in); + lzo_free(out); + lzo_free(wrkmem); + + return 0; +} + +/* +vi:ts=4:et +*/ + diff --git a/examples/simple.c b/examples/simple.c new file mode 100644 index 0000000..15611c9 --- /dev/null +++ b/examples/simple.c @@ -0,0 +1,168 @@ +/* simple.c -- the annotated simple example program for the LZO library + + This file is part of the LZO real-time data compression library. + + Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer + All Rights Reserved. + + The LZO library 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. + + The LZO library 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 the LZO library; see the file COPYING. + If not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + Markus F.X.J. Oberhumer + <markus@oberhumer.com> + http://www.oberhumer.com/opensource/lzo/ + */ + + +/************************************************************************* +// This program shows the basic usage of the LZO library. +// We will compress a block of data and decompress again. +// +// See also LZO.FAQ +**************************************************************************/ + +/* We will be using the LZO1X-1 algorithm, so we have + * to include <lzo1x.h> + */ + +#include "lzo/lzoconf.h" +#include "lzo/lzo1x.h" + +/* portability layer */ +#define WANT_LZO_MALLOC 1 +#include "examples/portab.h" + + +/* We want to compress the data block at `in' with length `IN_LEN' to + * the block at `out'. Because the input block may be incompressible, + * we must provide a little more output space in case that compression + * is not possible. + */ + +#ifndef IN_LEN +#define IN_LEN (128*1024L) +#endif +#define OUT_LEN (IN_LEN + IN_LEN / 16 + 64 + 3) + + +/************************************************************************* +// +**************************************************************************/ + +int __lzo_cdecl_main main(int argc, char *argv[]) +{ + int r; + lzo_bytep in; + lzo_bytep out; + lzo_bytep wrkmem; + lzo_uint in_len; + lzo_uint out_len; + lzo_uint new_len; + + if (argc < 0 && argv == NULL) /* avoid warning about unused args */ + return 0; + + printf("\nLZO real-time data compression library (v%s, %s).\n", + lzo_version_string(), lzo_version_date()); + printf("Copyright (C) 1996-2008 Markus Franz Xaver Johannes Oberhumer\nAll Rights Reserved.\n\n"); + +/* + * Step 1: initialize the LZO library + */ + if (lzo_init() != LZO_E_OK) + { + printf("internal error - lzo_init() failed !!!\n"); + printf("(this usually indicates a compiler bug - try recompiling\nwithout optimizations, and enable `-DLZO_DEBUG' for diagnostics)\n"); + return 4; + } + +/* + * Step 2: allocate blocks and the work-memory + */ + in = (lzo_bytep) lzo_malloc(IN_LEN); + out = (lzo_bytep) lzo_malloc(OUT_LEN); + wrkmem = (lzo_bytep) lzo_malloc(LZO1X_1_MEM_COMPRESS); + if (in == NULL || out == NULL || wrkmem == NULL) + { + printf("out of memory\n"); + return 3; + } + +/* + * Step 3: prepare the input block that will get compressed. + * We just fill it with zeros in this example program, + * but you would use your real-world data here. + */ + in_len = IN_LEN; + lzo_memset(in,0,in_len); + +/* + * Step 4: compress from `in' to `out' with LZO1X-1 + */ + r = lzo1x_1_compress(in,in_len,out,&out_len,wrkmem); + if (r == LZO_E_OK) + printf("compressed %lu bytes into %lu bytes\n", + (unsigned long) in_len, (unsigned long) out_len); + else + { + /* this should NEVER happen */ + printf("internal error - compression failed: %d\n", r); + return 2; + } + /* check for an incompressible block */ + if (out_len >= in_len) + { + printf("This block contains incompressible data.\n"); + return 0; + } + +/* + * Step 5: decompress again, now going from `out' to `in' + */ + new_len = in_len; + r = lzo1x_decompress(out,out_len,in,&new_len,NULL); + if (r == LZO_E_OK && new_len == in_len) + printf("decompressed %lu bytes back into %lu bytes\n", + (unsigned long) out_len, (unsigned long) in_len); + else + { + /* this should NEVER happen */ + printf("internal error - decompression failed: %d\n", r); + return 1; + } + + lzo_free(wrkmem); + lzo_free(out); + lzo_free(in); + printf("Simple compression test passed.\n"); + return 0; +} + +/* +vi:ts=4:et +*/ + |