X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fstaging%2Fwigyori.git;a=blobdiff_plain;f=package%2Futils%2Frbextract%2Fsrc%2Frle.c;fp=package%2Futils%2Frbextract%2Fsrc%2Frle.c;h=ca198ee9fcaaefe6f47d7e5d8398b484955449db;hp=0000000000000000000000000000000000000000;hb=ba730d61af3b860e5d5a086a318a6c2a84e68c9c;hpb=51526bcf1e4f67dae8d6d0266dd6b740cb3ae364 diff --git a/package/utils/rbextract/src/rle.c b/package/utils/rbextract/src/rle.c new file mode 100644 index 0000000000..ca198ee9fc --- /dev/null +++ b/package/utils/rbextract/src/rle.c @@ -0,0 +1,80 @@ +/* + * RLE decoding routine + * + * Copyright (C) 2012 Gabor Juhos + * + * 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 +#include +#include +#include +#include + +#include "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 = 1; + + /* sanity checks */ + if (!src || !srclen || !dst || !dstlen) + goto out; + + while (1) { + signed char count; + + if (srcpos >= srclen) + break; + + count = (signed 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; +}