ar71xx: add library code for RLE decoding
It will be used for the MikroTik boards. SVN-Revision: 33337
This commit is contained in:
parent
f4be8a76de
commit
73df240bb3
2 changed files with 115 additions and 0 deletions
|
@ -188,6 +188,7 @@ CONFIG_PCI_DOMAINS=y
|
||||||
CONFIG_PERF_USE_VMALLOC=y
|
CONFIG_PERF_USE_VMALLOC=y
|
||||||
CONFIG_PHYLIB=y
|
CONFIG_PHYLIB=y
|
||||||
# CONFIG_PREEMPT_RCU is not set
|
# CONFIG_PREEMPT_RCU is not set
|
||||||
|
# CONFIG_RLE_DECOMPRESS is not set
|
||||||
CONFIG_RTL8306_PHY=y
|
CONFIG_RTL8306_PHY=y
|
||||||
CONFIG_RTL8366RB_PHY=y
|
CONFIG_RTL8366RB_PHY=y
|
||||||
CONFIG_RTL8366S_PHY=y
|
CONFIG_RTL8366S_PHY=y
|
||||||
|
|
|
@ -0,0 +1,114 @@
|
||||||
|
--- a/lib/Kconfig
|
||||||
|
+++ b/lib/Kconfig
|
||||||
|
@@ -124,6 +124,9 @@ config LZMA_COMPRESS
|
||||||
|
config LZMA_DECOMPRESS
|
||||||
|
tristate
|
||||||
|
|
||||||
|
+config RLE_DECOMPRESS
|
||||||
|
+ tristate
|
||||||
|
+
|
||||||
|
#
|
||||||
|
# These all provide a common interface (hence the apparent duplication with
|
||||||
|
# ZLIB_INFLATE; DECOMPRESS_GZIP is just a wrapper.)
|
||||||
|
--- a/lib/Makefile
|
||||||
|
+++ b/lib/Makefile
|
||||||
|
@@ -85,6 +85,7 @@ obj-$(CONFIG_XZ_DEC) += xz/
|
||||||
|
obj-$(CONFIG_RAID6_PQ) += raid6/
|
||||||
|
obj-$(CONFIG_LZMA_COMPRESS) += lzma/
|
||||||
|
obj-$(CONFIG_LZMA_DECOMPRESS) += lzma/
|
||||||
|
+obj-$(CONFIG_RLE_DECOMPRESS) += rle.o
|
||||||
|
|
||||||
|
lib-$(CONFIG_DECOMPRESS_GZIP) += decompress_inflate.o
|
||||||
|
lib-$(CONFIG_DECOMPRESS_BZIP2) += decompress_bunzip2.o
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/include/linux/rle.h
|
||||||
|
@@ -0,0 +1,8 @@
|
||||||
|
+#ifndef _RLE_H_
|
||||||
|
+#define _RLE_H_
|
||||||
|
+
|
||||||
|
+int rle_decode(const unsigned char *src, size_t srclen,
|
||||||
|
+ unsigned char *dst, size_t dstlen,
|
||||||
|
+ size_t *src_done, size_t *dst_done);
|
||||||
|
+
|
||||||
|
+#endif /* _RLE_H_ */
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/lib/rle.c
|
||||||
|
@@ -0,0 +1,78 @@
|
||||||
|
+/*
|
||||||
|
+ * RLE decoding routine
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2012 Gabor Juhos <juhosg@openwrt.org>
|
||||||
|
+ *
|
||||||
|
+ * This program is free software; you can redistribute it and/or modify it
|
||||||
|
+ * under the terms of the GNU General Public License version 2 as published
|
||||||
|
+ * by the Free Software Foundation.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <linux/kernel.h>
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/rle.h>
|
||||||
|
+
|
||||||
|
+int rle_decode(const unsigned char *src, size_t srclen,
|
||||||
|
+ unsigned char *dst, size_t dstlen,
|
||||||
|
+ size_t *src_done, size_t *dst_done)
|
||||||
|
+{
|
||||||
|
+ size_t srcpos, dstpos;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ srcpos = 0;
|
||||||
|
+ dstpos = 0;
|
||||||
|
+ ret = -EINVAL;
|
||||||
|
+
|
||||||
|
+ /* sanity checks */
|
||||||
|
+ if (!src || !srclen || !dst || !dstlen)
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
+ while (1) {
|
||||||
|
+ char count;
|
||||||
|
+
|
||||||
|
+ if (srcpos >= srclen)
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ count = (char) src[srcpos++];
|
||||||
|
+ if (count == 0) {
|
||||||
|
+ ret = 0;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (count > 0) {
|
||||||
|
+ unsigned char c;
|
||||||
|
+
|
||||||
|
+ if (srcpos >= srclen)
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ c = src[srcpos++];
|
||||||
|
+
|
||||||
|
+ while (count--) {
|
||||||
|
+ if (dstpos >= dstlen)
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ dst[dstpos++] = c;
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ count *= -1;
|
||||||
|
+
|
||||||
|
+ while (count--) {
|
||||||
|
+ if (srcpos >= srclen)
|
||||||
|
+ break;
|
||||||
|
+ if (dstpos >= dstlen)
|
||||||
|
+ break;
|
||||||
|
+ dst[dstpos++] = src[srcpos++];
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+out:
|
||||||
|
+ if (src_done)
|
||||||
|
+ *src_done = srcpos;
|
||||||
|
+ if (dst_done)
|
||||||
|
+ *dst_done = dstpos;
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+EXPORT_SYMBOL_GPL(rle_decode);
|
Loading…
Reference in a new issue