a44421a79fb36cc2036fe116b97ea3bc9590cd0c braney Fri Dec 2 09:34:39 2011 -0800 removed rcsid (#295) diff --git src/lib/rle.c src/lib/rle.c index 6207f54..58ff09b 100644 --- src/lib/rle.c +++ src/lib/rle.c @@ -1,103 +1,102 @@ /* rle - byte oriented run length encoding. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "rle.h" -static char const rcsid[] = "$Id: rle.c,v 1.6 2005/05/10 00:50:16 markd Exp $"; static int countSameAsStart(signed char *s, int max) /* Count number of signed chars that are the same as first. */ { signed char v = *s; int i; if (max > 127) max = 127; for (i=1; i<max; ++i) if (s[i] != v) break; return i; } int rleCompress(void *vIn, int inSize, signed char *out) /* Compress in to out. Out should be at least inSize * 1.5. * Returns compressed size. */ { signed char *in = vIn; signed char *endIn = in + inSize; signed char *s = in, *d = out; signed char *uncStart = in; int uncSize, sameCount; int sizeLeft; while ((sizeLeft = (endIn - s)) != 0) { sameCount = countSameAsStart(s, sizeLeft); uncSize = s - uncStart; if (sameCount >= 3) { int uncSize = s - uncStart; while (uncSize > 0) { int size = uncSize; if (size > 127) size = 127; *d++ = size; memcpy(d, uncStart, size); d += size; uncSize -= size; uncStart += size; } *d++ = -sameCount; *d++ = *s; s += sameCount; uncStart = s; } else s += sameCount; } uncSize = s - uncStart; while (uncSize > 0) { int size = uncSize; if (size > 127) size = 127; *d++ = size; memcpy(d, uncStart, size); d += size; uncSize -= size; uncStart += size; } return d - out; } void rleUncompress(signed char *in, int inSize, void *vOut, int outSize) /* Uncompress in to out. */ { int count; signed char *out = vOut; signed char *endOut = out + outSize; #ifndef NDEBUG signed char *endIn = in + inSize; #endif while (out < endOut) { count = *in++; if (count > 0) { memcpy(out, in, count); in += count; out += count; } else { count = -count; memset(out, *in++, count); out += count; } } assert(out == endOut && in == endIn); }