summaryrefslogtreecommitdiff
path: root/epan/compress
diff options
context:
space:
mode:
authorMatthieu Patou <mat@matws.net>2014-10-10 16:53:20 -0400
committerMichael Mann <mmann78@netscape.net>2014-10-30 15:28:47 +0000
commitcda985d3eb637454fb773157893d4d8cb18313a2 (patch)
tree04a5c56720817e7a40ad5984fdbdd89da8525827 /epan/compress
parentfea733e82b290882b592adfef4b8ae621245f5cd (diff)
downloadwireshark-cda985d3eb637454fb773157893d4d8cb18313a2.tar.gz
Create the compress module for compression functions.
For the moment there is only the lzxpress compression used by DRS Bug: 10546 Change-Id: Ifc7e1767934224c0198f0b09caa3efbad979ca1f Reviewed-on: https://code.wireshark.org/review/4600 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan/compress')
-rw-r--r--epan/compress/Makefile.am55
-rw-r--r--epan/compress/Makefile.common30
-rw-r--r--epan/compress/Makefile.nmake31
-rw-r--r--epan/compress/lzxpress.c136
-rw-r--r--epan/compress/lzxpress.h46
5 files changed, 298 insertions, 0 deletions
diff --git a/epan/compress/Makefile.am b/epan/compress/Makefile.am
new file mode 100644
index 0000000000..9f86830c5e
--- /dev/null
+++ b/epan/compress/Makefile.am
@@ -0,0 +1,55 @@
+# Makefile.am
+# Automake file for the compress for Wireshark
+#
+# $Id$
+#
+# Wireshark - Network traffic analyzer
+# By Gerald Combs <gerald@wireshark.org>
+# Copyright 1998 Gerald Combs
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+include Makefile.common
+
+if HAVE_WARNINGS_AS_ERRORS
+AM_CFLAGS = -Werror
+endif
+
+AM_CPPFLAGS = \
+ -I$(top_srcdir)
+
+noinst_LTLIBRARIES = liblzxpress.la
+
+CLEANFILES = \
+ liblzxpress.a \
+ liblzxpress.la \
+ *~
+
+DISTCLEANFILES =
+
+MAINTAINERCLEANFILES = \
+ Makefile.in
+
+liblzxpress_la_SOURCES = \
+ $(LIBLZXPRESS_SRC) \
+ $(LIBLZXPRESS_INCLUDES)
+
+EXTRA_DIST = \
+ Makefile.common \
+ Makefile.nmake
+
+checkapi:
+ $(PERL) ../../tools/checkAPIs.pl -g termoutput -build \
+ $(LIBLZXPRESS_SRC)
diff --git a/epan/compress/Makefile.common b/epan/compress/Makefile.common
new file mode 100644
index 0000000000..0dd8673e87
--- /dev/null
+++ b/epan/compress/Makefile.common
@@ -0,0 +1,30 @@
+# Makefile.common
+# Contains the stuff from Makefile.am and Makefile.nmake that is
+# a) common to both files and
+# b) portable between both files
+#
+# $Id$
+#
+# Wireshark - Network traffic analyzer
+# By Gerald Combs <gerald@wireshark.org>
+# Copyright 1998 Gerald Combs
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+LIBLZXPRESS_SRC = \
+ lzxpress.c
+
+LIBLZXPRESS_INCLUDES = \
+ lzxpress.h
diff --git a/epan/compress/Makefile.nmake b/epan/compress/Makefile.nmake
new file mode 100644
index 0000000000..cb9615bfad
--- /dev/null
+++ b/epan/compress/Makefile.nmake
@@ -0,0 +1,31 @@
+## Makefile for building lzxpress.lib with Microsoft C and nmake
+## Use: $(MAKE) /$(MAKEFLAGS) -f makefile.nmake
+#
+# $Id$
+
+include ..\..\config.nmake
+include Makefile.common
+
+############### no need to modify below this line #########
+
+CFLAGS=$(WARNINGS_ARE_ERRORS) $(STANDARD_CFLAGS) \
+ /I../.. $(GLIB_CFLAGS) -DWS_BUILD_DLL
+
+.c.obj::
+ $(CC) $(CFLAGS) -Fd.\ -c $<
+
+LZXPRESS_OBJECTS = $(LIBLZXPRESS_SRC:.c=.obj)
+
+lzxpress.lib: $(LZXPRESS_OBJECTS)
+ link /lib /out:lzxpress.lib $(LZXPRESS_OBJECTS)
+
+clean:
+ rm -f $(LZXPRESS_OBJECTS) lzxpress.lib *.pdb *.sbr
+
+distclean: clean
+
+maintainer-clean: distclean
+
+checkapi:
+ $(PERL) ../../tools/checkAPIs.pl -g termoutput -build \
+ $(LZXPRESS_OBJECTS)
diff --git a/epan/compress/lzxpress.c b/epan/compress/lzxpress.c
new file mode 100644
index 0000000000..2e8883a407
--- /dev/null
+++ b/epan/compress/lzxpress.c
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) Matthieu Suiche 2008
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the author nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include "lzxpress.h"
+
+#define __BUF_POS_CONST(buf,ofs)(((const guint8 *)buf)+(ofs))
+#define __PULL_BYTE(buf,ofs) \
+ ((guint8)((*__BUF_POS_CONST(buf,ofs)) & 0xFF))
+
+#ifndef PULL_LE_UINT16
+#define PULL_LE_UINT16(buf,ofs) ((guint16)( \
+ ((guint16)(((guint16)(__PULL_BYTE(buf,(ofs)+0))) << 0)) | \
+ ((guint16)(((guint16)(__PULL_BYTE(buf,(ofs)+1))) << 8)) \
+))
+#endif
+
+#ifndef PULL_LE_UINT32
+#define PULL_LE_UINT32(buf,ofs) ((guint32)( \
+ ((guint32)(((guint32)(__PULL_BYTE(buf,(ofs)+0))) << 0)) | \
+ ((guint32)(((guint32)(__PULL_BYTE(buf,(ofs)+1))) << 8)) | \
+ ((guint32)(((guint32)(__PULL_BYTE(buf,(ofs)+2))) << 16)) | \
+ ((guint32)(((guint32)(__PULL_BYTE(buf,(ofs)+3))) << 24)) \
+))
+#endif
+
+gssize lzxpress_decompress(const guint8 *input,
+ guint32 input_size,
+ guint8 *output,
+ guint32 max_output_size)
+{
+ guint32 output_index, input_index;
+ guint32 indicator, indicator_bit;
+ guint32 length;
+ guint32 offset;
+ guint32 nibble_index;
+
+ output_index = 0;
+ input_index = 0;
+ indicator = 0;
+ indicator_bit = 0;
+ length = 0;
+ offset = 0;
+ nibble_index = 0;
+
+ do {
+ if (indicator_bit == 0) {
+ indicator = PULL_LE_UINT32(input, input_index);
+ input_index += sizeof(guint32);
+ indicator_bit = 32;
+ }
+ indicator_bit--;
+
+ /*
+ * check whether the bit specified by indicator_bit is set or not
+ * set in indicator. For example, if indicator_bit has value 4
+ * check whether the 4th bit of the value in indicator is set
+ */
+ if (((indicator >> indicator_bit) & 1) == 0) {
+ output[output_index] = input[input_index];
+ input_index += sizeof(guint8);
+ output_index += sizeof(guint8);
+ } else {
+ length = PULL_LE_UINT16(input, input_index);
+ input_index += sizeof(guint16);
+ offset = length / 8;
+ length = length % 8;
+
+ if (length == 7) {
+ if (nibble_index == 0) {
+ nibble_index = input_index;
+ length = input[input_index] % 16;
+ input_index += sizeof(guint8);
+ } else {
+ length = input[nibble_index] / 16;
+ nibble_index = 0;
+ }
+
+ if (length == 15) {
+ length = input[input_index];
+ input_index += sizeof(guint8);
+ if (length == 255) {
+ length = PULL_LE_UINT16(input, input_index);
+ input_index += sizeof(guint16);
+ length -= (15 + 7);
+ }
+ length += 15;
+ }
+ length += 7;
+ }
+
+ length += 3;
+
+ do {
+ if ((output_index >= max_output_size) || ((offset + 1) > output_index)) break;
+
+ output[output_index] = output[output_index - offset - 1];
+
+ output_index += sizeof(guint8);
+ length -= sizeof(guint8);
+ } while (length != 0);
+ }
+ } while ((output_index < max_output_size) && (input_index < (input_size)));
+
+ return output_index;
+}
diff --git a/epan/compress/lzxpress.h b/epan/compress/lzxpress.h
new file mode 100644
index 0000000000..d54972ebfa
--- /dev/null
+++ b/epan/compress/lzxpress.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) Matthieu Suiche 2008
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the author nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#ifndef _LZXPRESS_H
+#define _LZXPRESS_H
+
+#define XPRESS_BLOCK_SIZE 0x10000
+#include <glib.h>
+
+gssize lzxpress_decompress(const guint8 *input,
+ guint32 input_size,
+ guint8 *output,
+ guint32 max_output_size);
+
+#endif /* _LZXPRESS_H */