vcrle.c revision 3f54fd611f536639ec30dd53c48e5ec1897cc7d9
a79fe3aad8743ea57e473ea5f66a723244cb9c0eMarkus Roggenbach/***********************************************************************
e071fb22ea9923a2a4ff41184d80ca46b55ee932Till Mossakowski* This software is part of the ast package *
e85b224577b78d08ba5c39fe9dcc2e53995454a2Christian Maeder* Copyright (c) 2003-2011 AT&T Intellectual Property *
97018cf5fa25b494adffd7e9b4e87320dae6bf47Christian Maeder* and is licensed under the *
a79fe3aad8743ea57e473ea5f66a723244cb9c0eMarkus Roggenbach* Eclipse Public License, Version 1.0 *
b4fbc96e05117839ca409f5f20f97b3ac872d1edTill Mossakowski* by AT&T Intellectual Property *
a79fe3aad8743ea57e473ea5f66a723244cb9c0eMarkus Roggenbach* A copy of the License is available at *
a79fe3aad8743ea57e473ea5f66a723244cb9c0eMarkus Roggenbach* http://www.eclipse.org/org/documents/epl-v10.html *
d326dac41dadbe2b84bb7021cbfd91f4dd4a19bcAndy Gimblett* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
a79fe3aad8743ea57e473ea5f66a723244cb9c0eMarkus Roggenbach* Information and Software Systems Research *
a79fe3aad8743ea57e473ea5f66a723244cb9c0eMarkus Roggenbach* AT&T Research *
a79fe3aad8743ea57e473ea5f66a723244cb9c0eMarkus Roggenbach* Florham Park NJ *
90047eafd2de482c67bcd13103c6064e9b0cb254Andy Gimblett* Phong Vo <kpv@research.att.com> *
d326dac41dadbe2b84bb7021cbfd91f4dd4a19bcAndy Gimblett***********************************************************************/
a731366827a80af216ce6bfd4aa6388260577791Andy Gimblett/* Various run-length-encoding methods.
1538a6e8d77301d6de757616ffc69ee61f1482e4Andy Gimblett** Written by Kiem-Phong Vo (kpv@research.att.com)
e771539425f4a0abef9f94cf4b63690f3603f682Andy Gimblett/* arguments to select type of run length coder */
d297a45fc73aa6c4a1f9d073c3170611415f324bAndy Gimblett{ { "0", "Run-length-encoding: 0-sequences only.", (Void_t*)rle0 },
e771539425f4a0abef9f94cf4b63690f3603f682Andy Gimblett { "1", "Run-length-encoding: 0&1-sequences only.", (Void_t*)rle1 },
41486a487c9b065d4d9d1a8adf63c00925cd455bAndy Gimblett { "2", "Run-length-encoding: Alphabet has only two letters.", (Void_t*)rle2 },
e771539425f4a0abef9f94cf4b63690f3603f682Andy Gimblett { 0 , "General run-length-encoding.", (Void_t*)rleg }
eeaf0a8a1dc535d105904a2190f26c0835ecf429Andy Gimblett/* Encoding 0-run's only. Useful for sequences undergone entropy reduction
e771539425f4a0abef9f94cf4b63690f3603f682Andy Gimblett transforms such as Burrows-Wheele + MTF or the column prediction method.
d326dac41dadbe2b84bb7021cbfd91f4dd4a19bcAndy Gimblett { if((c = *dt) == 0)
fbc0c2baf563fe5b664f0152674a8d3acecca58cAndy Gimblett { if(z >= 0) /* encode the 0-run */
d297a45fc73aa6c4a1f9d073c3170611415f324bAndy Gimblett if(z >= 0) /* final 0-run if any */
d297a45fc73aa6c4a1f9d073c3170611415f324bAndy Gimblett if(o >= endo || c < RL_ZERO) /* corrupted data */
d297a45fc73aa6c4a1f9d073c3170611415f324bAndy Gimblett else if(c == 0 || c == RL_ZERO)
d297a45fc73aa6c4a1f9d073c3170611415f324bAndy Gimblett z = vcioget2(&io, 0, RL_ZERO); /**/DEBUG_PRINT(9,"%d\n",z);
d326dac41dadbe2b84bb7021cbfd91f4dd4a19bcAndy Gimblett for(; z >= 0; --z)
d326dac41dadbe2b84bb7021cbfd91f4dd4a19bcAndy Gimblett/* Like rle0() but including 1-run's as well as 0-runs */
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett if(o >= endo || c < RL_ONE) /* corrupted data */
a09bfcbcb0fba5663fca1968aa82daebf2e092c4Andy Gimblett else if(c == 0 || c == RL_ZERO || c == 1 || c == RL_ONE)
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett if(c == 0 || c == RL_ZERO)
a731366827a80af216ce6bfd4aa6388260577791Andy Gimblett if(c == 0 || c == RL_ZERO)
f18cf8a4e7d512a2f57365ab1e9e7fdbb98ba257Andy Gimblett/* Encoding a sequence with at most two distinct letters */
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett { dt = rle->ibuf; sz = rle->isiz; /**/DEBUG_ASSERT(sz >= 1);
a09bfcbcb0fba5663fca1968aa82daebf2e092c4Andy Gimblett else /* end of current run */
f18cf8a4e7d512a2f57365ab1e9e7fdbb98ba257Andy Gimblett vcioputu(&io, n-1); /* output length of last run */
f18cf8a4e7d512a2f57365ab1e9e7fdbb98ba257Andy Gimblett { for(n = vciogetu(&io); n >= 0 && dt < enddt; --n, ++dt)
31f039ffdb33d78cb31d24b71d3155b11a323975Andy Gimblett c = c == c1 ? c2 : c1; /* alternate run letters */
a09bfcbcb0fba5663fca1968aa82daebf2e092c4Andy Gimblett/* General rl-encoding using escape codes */
9582375827616730f146b77f9d5a4fd0cc78bc47Andy Gimblett Vcchar_t c, *chr, *run, *dt, *enddt, *endb, *nextb;
9582375827616730f146b77f9d5a4fd0cc78bc47Andy Gimblett /* set buffers for runs and data */
fbc0c2baf563fe5b664f0152674a8d3acecca58cAndy Gimblett { for(c = *dt, nextb = dt+1; nextb < endb; ++nextb)
9582375827616730f146b77f9d5a4fd0cc78bc47Andy Gimblett { /* in-line small cases here for speed */
31f039ffdb33d78cb31d24b71d3155b11a323975Andy Gimblett return (rle->osiz = chr - rle->obuf) + (rle->asiz = run - rle->abuf);
9582375827616730f146b77f9d5a4fd0cc78bc47Andy Gimblett for(endb = (chr = rle->ibuf) + rle->isiz; chr < endb; )
31f039ffdb33d78cb31d24b71d3155b11a323975Andy Gimblett else for(c = *chr++; r > 0; --r)
f18cf8a4e7d512a2f57365ab1e9e7fdbb98ba257Andy Gimblettstatic ssize_t vcrle(Vcodex_t* vc, const Void_t* data, size_t size, Void_t** out)
if(out)
return sz;
#if __STD_C
if(size == 0)
if(out)
return sz;
#if __STD_C
ssize_t n;
if(datap)
#if __STD_C
#if __STD_C
int type;
char *data;
if(!arg)
{ vcrle,