bitwise.c revision d52f6d76f66e2e419bd18cc09395a0008edd649c
137fe158a8611dd11ec0253ab1552399b780988dcGloria Wang/************************************************************************
22da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * Copyright (C) 2002-2009, Xiph.org Foundation
32da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * Copyright (C) 2010, Robin Watts for Pinknoise Productions Ltd
437fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * All rights reserved.
537fe158a8611dd11ec0253ab1552399b780988dcGloria Wang *
637fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * Redistribution and use in source and binary forms, with or without
72da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * modification, are permitted provided that the following conditions
82da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * are met:
937fe158a8611dd11ec0253ab1552399b780988dcGloria Wang *
1037fe158a8611dd11ec0253ab1552399b780988dcGloria Wang *     * Redistributions of source code must retain the above copyright
1137fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * notice, this list of conditions and the following disclaimer.
1237fe158a8611dd11ec0253ab1552399b780988dcGloria Wang *     * Redistributions in binary form must reproduce the above
1337fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * copyright notice, this list of conditions and the following disclaimer
1437fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * in the documentation and/or other materials provided with the
1537fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * distribution.
162da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang *     * Neither the names of the Xiph.org Foundation nor Pinknoise
172da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * Productions Ltd nor the names of its contributors may be used to
182da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * endorse or promote products derived from this software without
192da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * specific prior written permission.
2037fe158a8611dd11ec0253ab1552399b780988dcGloria Wang *
2137fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2237fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2337fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2437fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2537fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2637fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2737fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2837fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2937fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3037fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3137fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3237fe158a8611dd11ec0253ab1552399b780988dcGloria Wang ************************************************************************
337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  function: packing variable sized words into an octet stream
357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3637fe158a8611dd11ec0253ab1552399b780988dcGloria Wang ************************************************************************/
377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang/* We're 'LSb' endian; if we write a word but read individual bits,
397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang   then we'll read the lsb first */
407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <string.h>
427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <stdlib.h>
437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "misc.h"
447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "ogg.h"
457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <stdio.h>
477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#if !defined(ARM_LITTLE_ENDIAN) || defined(_V_BIT_TEST)
507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangstatic unsigned long mask[]=
517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang{0x00000000,0x00000001,0x00000003,0x00000007,0x0000000f,
527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 0x0000001f,0x0000003f,0x0000007f,0x000000ff,0x000001ff,
537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 0x000003ff,0x000007ff,0x00000fff,0x00001fff,0x00003fff,
547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 0x00007fff,0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff,
557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 0x000fffff,0x001fffff,0x003fffff,0x007fffff,0x00ffffff,
567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,0x1fffffff,
577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 0x3fffffff,0x7fffffff,0xffffffff };
587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif
597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef ARM_LITTLE_ENDIAN
617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef DEBUGGING_BITWISE
637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangextern void oggpack_readinitARM(oggpack_buffer *b,ogg_reference *r);
647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid oggpack_readinit(oggpack_buffer *b,ogg_reference *r){
667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    oggpack_readinitARM(b,r);
677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //fprintf(stderr, "Init: buffer=(%d,%x,%d,%d) %08x%08x\n",
687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //        b->bitsLeftInSegment, b->ptr, b->bitsLeftInWord, b->count,
697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //        b->ptr[1], b->ptr[0]);
707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //fflush(stderr);
717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangextern long oggpack_lookARM(oggpack_buffer *b,int bits);
747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_look(oggpack_buffer *b,int bits){
767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    long l;
777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //fprintf(stderr, "PreLook: buffer=(%x,%x,%x) %08x%08x (%d bits)\n",
797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //        b->bitsLeftInSegment, b->ptr, b->bitsLeftInWord,
807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //        b->ptr[1], b->ptr[0], bits);
817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //fflush(stderr);
827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    l = oggpack_lookARM(b,bits);
837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //fprintf(stderr, "Look: buffer=(%d,%x,%d,%d) %08x%08x (%d bits) (result=%x)\n",
847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //        b->bitsLeftInSegment, b->ptr, b->bitsLeftInWord, b->count,
857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //        b->ptr[1], b->ptr[0], bits, l);
867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //fflush(stderr);
877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    return l;
897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangextern void oggpack_advARM(oggpack_buffer *b,int bits);
927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid oggpack_adv(oggpack_buffer *b,int bits){
947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //fprintf(stderr, "Adv before: buffer=(%x,%x,%x) %08x%08x (%d bits)\n",
957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //        b->bitsLeftInSegment, b->ptr, b->bitsLeftInWord,
967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //        b->ptr[1], b->ptr[0],bits);
977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //fflush(stderr);
987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    oggpack_advARM(b,bits);
997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //fprintf(stderr, "Adv: buffer=(%d,%x,%d,%d) %08x%08x\n",
1007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //        b->bitsLeftInSegment, b->ptr, b->bitsLeftInWord, b->count,
1017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //        b->ptr[1], b->ptr[0]);
1027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //fflush(stderr);
1037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
1047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangextern long oggpack_readARM(oggpack_buffer *b,int bits);
1067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang/* bits <= 32 */
1087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_read(oggpack_buffer *b,int bits){
1097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    long l;
1107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //fprintf(stderr, "PreRead: buffer=(%d,%x,%d,%d) %08x%08x (%d bits)\n",
1127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //        b->bitsLeftInSegment, b->ptr, b->bitsLeftInWord, b->count,
1137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //        b->ptr[1], b->ptr[0], bits);
1147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //fflush(stderr);
1157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    l = oggpack_readARM(b,bits);
1167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //fprintf(stderr, "Read: buffer=(%d,%x,%d,%d) %08x%08x (%d bits) (result=%x)\n",
1177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //       b->bitsLeftInSegment, b->ptr, b->bitsLeftInWord, b->count,
1187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //       b->ptr[1], b->ptr[0], bits, l);
1197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    //fflush(stderr);
1207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    return l;
1227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
1237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif
1247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint oggpack_eop(oggpack_buffer *b){
1267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int ret;
1277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(b->bitsLeftInSegment<0)ret= -1;
1287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  else ret = 0;
1297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fprintf(stderr, "EOP %d\n", ret);
1307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fflush(stderr);
1317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  return ret;
1327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
1337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_bytes(oggpack_buffer *b){
1357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  long ret;
1367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(b->bitsLeftInSegment<0) ret = b->count+b->head->length;
1377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  else ret = b->count + b->head->length - (b->bitsLeftInSegment)/8;
1387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fprintf(stderr, "count=%d length=%d bitsLeftInSegment=%d\n",
1397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->count, b->head->length, b->bitsLeftInSegment);
1407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fflush(stderr);
1417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  return ret;
1427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
1437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_bits(oggpack_buffer *b){
1457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  long ret;
1467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(b->bitsLeftInSegment<0) ret=(b->count+b->head->length)*8;
1477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  else ret = b->count*8 + b->head->length*8 - b->bitsLeftInSegment;
1487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fprintf(stderr, "count=%d length=%d bitsLeftInSegment=%d\n",
1497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->count, b->head->length, b->bitsLeftInSegment);
1507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fflush(stderr);
1517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  return ret;
1527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
1537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#else
1557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang/* spans forward, skipping as many bytes as headend is negative; if
1577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang   headend is zero, simply finds next byte.  If we're up to the end
1587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang   of the buffer, leaves headend at zero.  If we've read past the end,
1597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang   halt the decode process. */
1607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangstatic void _span(oggpack_buffer *b){
1627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  while(b->headend-(b->headbit>>3)<1){
1637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    b->headend-=b->headbit>>3;
1647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    b->headbit&=0x7;
1657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(b->head && b->head->next){
1677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      b->count+=b->head->length;
1687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      b->head=b->head->next;
1697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      if(b->headend+b->head->length>0)
1717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	b->headptr=b->head->buffer->data+b->head->begin-b->headend;
1727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      b->headend+=b->head->length;
1747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }else{
1757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      /* we've either met the end of decode, or gone past it. halt
1767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	 only if we're past */
1777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      if(b->headend*8<b->headbit)
1787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	/* read has fallen off the end */
1797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	b->headend=-1;
1807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        break;
1817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
1827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
1837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
1847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid oggpack_readinit(oggpack_buffer *b,ogg_reference *r){
1867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  memset(b,0,sizeof(*b));
1877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  b->tail=b->head=r;
1897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  b->count=0;
1907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if (b->head) {
1917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    b->headptr=b->head->buffer->data+b->head->begin;
1927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    b->headend=b->head->length;
1937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  } else {
1947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    b->headptr=0;
1957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    b->headend=0;
1967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
1977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  _span(b);
1987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fprintf(stderr,
2007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        "Init: buffer=(%d,%x,%d,%d) %02x%02x%02x%02x%02x%02x%02x%02x\n",
2017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headbit, b->headptr, b->headend, b->count,
2027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headptr[7], b->headptr[6], b->headptr[5], b->headptr[4],
2037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headptr[3], b->headptr[2], b->headptr[1], b->headptr[0]);
2047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fflush(stderr);
2057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
2067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#define _lookspan()   while(!end){\
2087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                        head=head->next;\
2097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                        if(!head) return -1;\
2107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                        ptr=head->buffer->data + head->begin;\
2117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                        end=head->length;\
2127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                      }
2137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang/* Read in bits without advancing the bitptr; bits <= 32 */
2157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_look(oggpack_buffer *b,int bits){
2167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  unsigned long m=mask[bits];
217d52f6d76f66e2e419bd18cc09395a0008edd649cBruce Beare  unsigned long ret = 0;
2187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int BITS = bits;
2197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  bits+=b->headbit;
2217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(bits >= b->headend<<3){
2237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    int            end=b->headend;
2247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    unsigned char *ptr=b->headptr;
2257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    ogg_reference *head=b->head;
2267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(end<0)return -1;
2287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if (!head || !end)return -1;
2297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(bits){
2317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      _lookspan();
2327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      ret=*ptr++>>b->headbit;
2337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      if(bits>8){
2347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        --end;
2357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        _lookspan();
2367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        ret|=*ptr++<<(8-b->headbit);
2377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        if(bits>16){
2387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          --end;
2397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          _lookspan();
2407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          ret|=*ptr++<<(16-b->headbit);
2417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          if(bits>24){
2427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            --end;
2437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            _lookspan();
2447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            ret|=*ptr++<<(24-b->headbit);
2457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            if(bits>32 && b->headbit){
2467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang              --end;
2477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang              _lookspan();
2487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang              ret|=*ptr<<(32-b->headbit);
2497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            }
2507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          }
2517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        }
2527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      }
2537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
2547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }else{
2567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    /* make this a switch jump-table */
2587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    ret=b->headptr[0]>>b->headbit;
2597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(bits>8){
2607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      ret|=b->headptr[1]<<(8-b->headbit);
2617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      if(bits>16){
2627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        ret|=b->headptr[2]<<(16-b->headbit);
2637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        if(bits>24){
2647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          ret|=b->headptr[3]<<(24-b->headbit);
2657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          if(bits>32 && b->headbit)
2667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            ret|=b->headptr[4]<<(32-b->headbit);
2677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        }
2687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      }
2697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
2707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
2717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  ret&=m;
2737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fprintf(stderr,
2747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        "Look: buffer=(%d,%x,%d,%d) %02x%02x%02x%02x%02x%02x%02x%02x (%d bits) return=%x\n",
2757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headbit, b->headptr, b->headend, b->count,
2767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headptr[7], b->headptr[6], b->headptr[5], b->headptr[4],
2777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headptr[3], b->headptr[2], b->headptr[1], b->headptr[0],
2787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        BITS, ret);
2797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fflush(stderr);
2807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  return ret;
2817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
2827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang/* limited to 32 at a time */
2847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid oggpack_adv(oggpack_buffer *b,int bits){
2857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    int BITS=bits;
2867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  bits+=b->headbit;
2877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  b->headbit=bits&7;
2887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  b->headend-=(bits>>3);
2897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  b->headptr+=(bits>>3);
2907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(b->headend<1)_span(b);
2917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fprintf(stderr, "Adv: buffer=(%d,%x,%d,%d) %02x%02x%02x%02x%02x%02x%02x%02x (%d bits)\n",
2927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headbit, b->headptr, b->headend,b->count,
2937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headptr[7], b->headptr[6], b->headptr[5], b->headptr[4],
2947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headptr[3], b->headptr[2], b->headptr[1], b->headptr[0],
2957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        BITS);
2967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fflush(stderr);
2977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
2987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint oggpack_eop(oggpack_buffer *b){
3007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int ret;
3017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(b->headend<0)ret= -1;
3027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  else ret = 0;
3037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fprintf(stderr, "EOP %d\n", ret);
3047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fflush(stderr);
3057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  return ret;
3067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
3077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_bytes(oggpack_buffer *b){
3097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  long ret;
3107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(b->headend<0) ret = b->count+b->head->length;
3117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  ret = b->count + b->head->length-b->headend + (b->headbit+7)/8;
3127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fprintf(stderr, "Bytes: buffer=(%d,%x,%d,%d) %02x%02x%02x%02x%02x%02x%02x%02x (%d bytes)\n",
3137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headbit, b->headptr, b->headend, b->count,
3147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headptr[7], b->headptr[6], b->headptr[5], b->headptr[4],
3157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headptr[3], b->headptr[2], b->headptr[1], b->headptr[0],
3167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        ret);
3177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fflush(stderr);
3187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  return ret;
3197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
3207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_bits(oggpack_buffer *b){
3227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  long ret;
3237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(b->headend<0) ret = (b->count+b->head->length)*8;
3247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  else ret = (b->count + b->head->length-b->headend)*8 + b->headbit;
3257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fprintf(stderr, "Bits: buffer=(%x,%x,%x) %02x%02x%02x%02x%02x%02x%02x%02x (%d bits)\n",
3267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headbit, b->headptr, b->headend,
3277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headptr[7], b->headptr[6], b->headptr[5], b->headptr[4],
3287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headptr[3], b->headptr[2], b->headptr[1], b->headptr[0],
3297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        ret);
3307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fflush(stderr);
3317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  return ret;
3327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
3337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang/* bits <= 32 */
3357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_read(oggpack_buffer *b,int bits){
3367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  long ret=oggpack_look(b,bits);
3377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  oggpack_adv(b,bits);
3387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  return(ret);
3397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
3407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif
3427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang/* Self test of the bitwise routines; everything else is based on
3447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang   them, so they damned well better be solid. */
3457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef _V_BIT_TEST
3477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <string.h>
3487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <stdlib.h>
3497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <stdio.h>
3507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "framing.c"
3517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangstatic int ilog(unsigned long v){
3537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int ret=0;
3547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  while(v){
3557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    ret++;
3567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    v>>=1;
3577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
3587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  return(ret);
3597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
3607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangoggpack_buffer r;
3627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangoggpack_buffer o;
3637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangogg_buffer_state *bs;
3647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangogg_reference *or;
3657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#define TESTWORDS 256
3667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid report(char *in){
3687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"%s",in);
3697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  exit(1);
3707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
3717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint getbyte(ogg_reference *or,int position){
3737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  while(or && position>=or->length){
3747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    position-=or->length;
3757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or=or->next;
3767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(or==NULL){
3777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      fprintf(stderr,"\n\tERROR: getbyte ran off end of buffer.\n");
3787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      exit(1);
3797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
3807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
3817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if((position+or->begin)&1)
3837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    return (or->buffer->data[(position+or->begin)>>1])&0xff;
3847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  else
3857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    return (or->buffer->data[(position+or->begin)>>1]>>8)&0xff;
3867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
3877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid cliptest(unsigned long *b,int vals,int bits,int *comp,int compsize){
3897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  long i,bitcount=0;
3907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  ogg_reference *or=ogg_buffer_alloc(bs,64);
3917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  for(i=0;i<compsize;i++)
3927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or->buffer->data[i]= comp[i];
3937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  or->length=i;
3947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  oggpack_readinit(&r,or);
3967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  for(i=0;i<vals;i++){
3977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    unsigned long test;
3987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    int tbit=bits?bits:ilog(b[i]);
3997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if((test=oggpack_look(&r,tbit))==0xffffffff)
4007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("out of data!\n");
4017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(test!=(b[i]&mask[tbit])){
4027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      fprintf(stderr,"%ld) %lx %lx\n",i,(b[i]&mask[tbit]),test);
4037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("looked at incorrect value!\n");
4047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
4057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if((test=oggpack_read(&r,tbit))==0xffffffff){
4067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("premature end of data when reading!\n");
4077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
4087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(test!=(b[i]&mask[tbit])){
4097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      fprintf(stderr,"%ld) %lx %lx\n",i,(b[i]&mask[tbit]),test);
4107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("read incorrect value!\n");
4117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
4127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    bitcount+=tbit;
4137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(bitcount!=oggpack_bits(&r))
4157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("wrong number of bits while reading!\n");
4167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if((bitcount+7)/8!=oggpack_bytes(&r))
4177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("wrong number of bytes while reading!\n");
4187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
4207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(oggpack_bytes(&r)!=(bitcount+7)/8){
4217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      fprintf(stderr, "%d vs %d\n", oggpack_bytes(&r), (bitcount+7)/8);
4227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("leftover bytes after read!\n");
4237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
4247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  ogg_buffer_release(or);
4257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
4267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid _end_verify(int count){
4287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int i;
4297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* are the proper number of bits left over? */
4317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int leftover=count*8-oggpack_bits(&o);
4327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(leftover>7)
4337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("\nERROR: too many bits reported left over.\n");
4347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* does reading to exactly byte alignment *not* trip EOF? */
4367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(oggpack_read(&o,leftover)==-1)
4377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("\nERROR: read to but not past exact end tripped EOF.\n");
4387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(oggpack_bits(&o)!=count*8)
4397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("\nERROR: read to but not past exact end reported bad bitcount.\n");
4407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* does EOF trip properly after a single additional bit? */
4427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(oggpack_read(&o,1)!=-1)
4437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("\nERROR: read past exact end did not trip EOF.\n");
4447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(oggpack_bits(&o)!=count*8)
4457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("\nERROR: read past exact end reported bad bitcount.\n");
4467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* does EOF stay set over additional bit reads? */
4487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  for(i=0;i<=32;i++){
4497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(oggpack_read(&o,i)!=-1)
4507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("\nERROR: EOF did not stay set on stream.\n");
4517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(oggpack_bits(&o)!=count*8)
4527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("\nERROR: read past exact end reported bad bitcount.\n");
4537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
4547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
4557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid _end_verify2(int count){
4577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int i;
4587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* are the proper number of bits left over? */
4607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int leftover=count*8-oggpack_bits(&o);
4617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(leftover>7)
4627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("\nERROR: too many bits reported left over.\n");
4637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* does reading to exactly byte alignment *not* trip EOF? */
4657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  oggpack_adv(&o,leftover);
4667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef ARM_LITTLE_ENDIAN
4677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(o.bitsLeftInSegment!=0)
4687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#else
4697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(o.headend!=0)
4707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif
4717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("\nERROR: read to but not past exact end tripped EOF.\n");
4727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(oggpack_bits(&o)!=count*8)
4737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("\nERROR: read to but not past exact end reported bad bitcount.\n");
4747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* does EOF trip properly after a single additional bit? */
4767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  oggpack_adv(&o,1);
4777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef ARM_LITTLE_ENDIAN
4787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(o.bitsLeftInSegment>=0)
4797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#else
4807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(o.headend>=0)
4817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif
4827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("\nERROR: read past exact end did not trip EOF.\n");
4837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(oggpack_bits(&o)!=count*8)
4847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("\nERROR: read past exact end reported bad bitcount.\n");
4857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* does EOF stay set over additional bit reads? */
4877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  for(i=0;i<=32;i++){
4887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    oggpack_adv(&o,i);
4897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef ARM_LITTLE_ENDIAN
4907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(o.bitsLeftInSegment>=0)
4917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#else
4927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(o.headend>=0)
4937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif
4947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("\nERROR: EOF did not stay set on stream.\n");
4957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(oggpack_bits(&o)!=count*8)
4967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("\nERROR: read past exact end reported bad bitcount.\n");
4977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
4987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
4997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong ogg_buffer_length(ogg_reference *or){
5017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int count=0;
5027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  while(or){
5037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    count+=or->length;
5047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or=or->next;
5057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
5067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  return count;
5077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
5087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangogg_reference *ogg_buffer_extend(ogg_reference *or,long bytes){
5107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(or){
5117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    while(or->next){
5127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      or=or->next;
5137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
5147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or->next=ogg_buffer_alloc(or->buffer->ptr.owner,bytes);
5157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    return(or->next);
5167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
5177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  return 0;
5187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
5197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid ogg_buffer_posttruncate(ogg_reference *or,long pos){
5217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* walk to the point where we want to begin truncate */
5227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  while(or && pos>or->length){
5237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    pos-=or->length;
5247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or=or->next;
5257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
5267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(or){
5277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    ogg_buffer_release(or->next);
5287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or->next=0;
5297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or->length=pos;
5307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
5317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
5327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint main(void){
5347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  long i;
5357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  static unsigned long testbuffer1[]=
5367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    {18,12,103948,4325,543,76,432,52,3,65,4,56,32,42,34,21,1,23,32,546,456,7,
5377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang       567,56,8,8,55,3,52,342,341,4,265,7,67,86,2199,21,7,1,5,1,4};
5387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int test1size=43;
5397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  static unsigned long testbuffer2[]=
5417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    {216531625L,1237861823,56732452,131,3212421,12325343,34547562,12313212,
5427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang       1233432,534,5,346435231,14436467,7869299,76326614,167548585,
5437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang       85525151,0,12321,1,349528352};
5447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int test2size=21;
5457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  static unsigned long testbuffer3[]=
5477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    {1,0,14,0,1,0,12,0,1,0,0,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1,1,1,1,1,0,0,1,
5487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang       0,1,30,1,1,1,0,0,1,0,0,0,12,0,11,0,1,0,0,1};
5497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int test3size=56;
5507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  static unsigned long large[]=
5527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    {2136531625L,2137861823,56732452,131,3212421,12325343,34547562,12313212,
5537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang       1233432,534,5,2146435231,14436467,7869299,76326614,167548585,
5547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang       85525151,0,12321,1,2146528352};
5557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int onesize=33;
5577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  static int one[33]={146,25,44,151,195,15,153,176,233,131,196,65,85,172,47,40,
5587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                    34,242,223,136,35,222,211,86,171,50,225,135,214,75,172,
5597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                    223,4};
5607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int twosize=6;
5627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  static int two[6]={61,255,255,251,231,29};
5637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int threesize=54;
5657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  static int three[54]={169,2,232,252,91,132,156,36,89,13,123,176,144,32,254,
5667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                      142,224,85,59,121,144,79,124,23,67,90,90,216,79,23,83,
5677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                      58,135,196,61,55,129,183,54,101,100,170,37,127,126,10,
5687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                      100,52,4,14,18,86,77,1};
5697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int foursize=38;
5717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  static int four[38]={18,6,163,252,97,194,104,131,32,1,7,82,137,42,129,11,72,
5727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                     132,60,220,112,8,196,109,64,179,86,9,137,195,208,122,169,
5737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                     28,2,133,0,1};
5747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int fivesize=45;
5767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  static int five[45]={169,2,126,139,144,172,30,4,80,72,240,59,130,218,73,62,
5777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                     241,24,210,44,4,20,0,248,116,49,135,100,110,130,181,169,
5787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                     84,75,159,2,1,0,132,192,8,0,0,18,22};
5797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int sixsize=7;
5817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  static int six[7]={17,177,170,242,169,19,148};
5827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* Test read/write together */
5847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* Later we test against pregenerated bitstreams */
5857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  bs=ogg_buffer_create();
5867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"\nSmall preclipped packing (LSb): ");
5887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  cliptest(testbuffer1,test1size,0,one,onesize);
5897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"ok.");
5907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"\nNull bit call (LSb): ");
5927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  cliptest(testbuffer3,test3size,0,two,twosize);
5937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"ok.");
5947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"\nLarge preclipped packing (LSb): ");
5967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  cliptest(testbuffer2,test2size,0,three,threesize);
5977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"ok.");
5987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"\n32 bit preclipped packing (LSb): ");
6007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  or=ogg_buffer_alloc(bs,128);
6027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  for(i=0;i<test2size;i++){
6037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or->buffer->data[i*4]  = large[i]&0xff;
6047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or->buffer->data[i*4+1]  = (large[i]>>8)&0xff;
6057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or->buffer->data[i*4+2]  = (large[i]>>16)&0xff;
6067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or->buffer->data[i*4+3]  = (large[i]>>24)&0xff;
6077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
6087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  or->length=test2size*4;
6097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  oggpack_readinit(&r,or);
6107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  for(i=0;i<test2size;i++){
6117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    unsigned long test;
6127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if((test=oggpack_look(&r,32))==0xffffffffUL)report("out of data. failed!");
6137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(test!=large[i]){
6147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      fprintf(stderr,"%ld != %ld (%lx!=%lx):",test,large[i],
6157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang              test,large[i]);
6167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("read incorrect value!\n");
6177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
6187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    oggpack_adv(&r,32);
6197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
6207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  ogg_buffer_release(or);
6217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(oggpack_bytes(&r)!=test2size*4){
6227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    fprintf(stderr, "%d vs %d\n", oggpack_bytes(&r), test2size*4);
6237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("leftover bytes after read!\n");
6247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
6257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"ok.");
6267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"\nSmall unclipped packing (LSb): ");
6287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  cliptest(testbuffer1,test1size,7,four,foursize);
6297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"ok.");
6307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"\nLarge unclipped packing (LSb): ");
6327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  cliptest(testbuffer2,test2size,17,five,fivesize);
6337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"ok.");
6347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"\nSingle bit unclipped packing (LSb): ");
6367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  cliptest(testbuffer3,test3size,1,six,sixsize);
6377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"ok.");
6387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"\nTesting read past end (LSb): ");
6407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  {
6417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    unsigned char dda[]={0,0,0,0};
6427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    ogg_buffer lob={dda,8,0,{0}};
6437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    ogg_reference lor={&lob,0,8,0};
6447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    oggpack_readinit(&r,&lor);
6467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    for(i=0;i<64;i++){
6477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      if(oggpack_read(&r,1)<0){
6487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        fprintf(stderr,"failed; got -1 prematurely.\n");
6497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        exit(1);
6507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      }
6517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
6527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(oggpack_look(&r,1)!=-1 ||
6537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang       oggpack_read(&r,1)!=-1){
6547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      fprintf(stderr,"failed; read past end without -1.\n");
6557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      exit(1);
6567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
6577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
6587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  {
6597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    unsigned char dda[]={0,0,0,0};
6607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    ogg_buffer lob={dda,8,0,{0}};
6617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    ogg_reference lor={&lob,0,8,0};
6627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    unsigned long test;
6637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    oggpack_readinit(&r,&lor);
6657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if((test=oggpack_read(&r,30))==0xffffffffUL ||
6667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang       (test=oggpack_read(&r,16))==0xffffffffUL){
6677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      fprintf(stderr,"failed 2; got -1 prematurely.\n");
6687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      exit(1);
6697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
6707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if((test=oggpack_look(&r,18))==0xffffffffUL){
6727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      fprintf(stderr,"failed 3; got -1 prematurely.\n");
6737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      exit(1);
6747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
6757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if((test=oggpack_look(&r,19))!=0xffffffffUL){
6767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      fprintf(stderr,"failed; read past end without -1.\n");
6777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      exit(1);
6787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
6797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if((test=oggpack_look(&r,32))!=0xffffffffUL){
6807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      fprintf(stderr,"failed; read past end without -1.\n");
6817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      exit(1);
6827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
6837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
6847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"ok.\n");
6857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* now the scary shit: randomized testing */
6877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  for(i=0;i<10000;i++){
6897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    long j,count=0,count2=0,bitcount=0;
6907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    unsigned long values[TESTWORDS];
6917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    int len[TESTWORDS];
6927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    unsigned char flat[4*TESTWORDS]; /* max possible needed size */
6937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    memset(flat,0,sizeof(flat));
6957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    fprintf(stderr,"\rRandomized testing (LSb)... (%ld)   ",10000-i);
6967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    /* generate a list of words and lengths */
6987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    /* write the required number of bits out to packbuffer */
6997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    {
7007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      long word=0;
7017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      long bit=0;
7027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      int k;
7037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      for(j=0;j<TESTWORDS;j++){
7057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	values[j]=rand();
7067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	len[j]=(rand()%33);
7077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	for(k=0;k<len[j];k++){
7097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	  flat[word] |= ((values[j]>>k)&0x1)<<bit;
7107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	  bit++;
7117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	  bitcount++;
7127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	  if(bit>7){
7137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	    bit=0;
7147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	    word++;
7157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	  }
7167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	}
7177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      }
7187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
7197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    count2=(bitcount+7)>>3;
7207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    /* construct random-length buffer chain from flat vector; random
7227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang       byte starting offset within the length of the vector */
7237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    {
7247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      ogg_reference *or=NULL,*orl=NULL;
7257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      long pos=0;
7267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      /* build buffer chain */
7287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      while(count2){
7297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        int ilen=(rand()%32),k;
7307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        int ibegin=(rand()%32);
7317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        if(ilen>count2)ilen=count2;
7347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        if(or)
7367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          orl=ogg_buffer_extend(orl,64);
7377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        else
7387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          or=orl=ogg_buffer_alloc(bs,64);
7397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        orl->length=ilen;
7417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        orl->begin=ibegin;
7427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	for(k=0;k<ilen;k++)
7447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	  orl->buffer->data[ibegin++]= flat[pos++];
7457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        count2-=ilen;
7477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      }
7487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      if(ogg_buffer_length(or)!=(bitcount+7)/8){
7507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        fprintf(stderr,"\nERROR: buffer length incorrect after build.\n");
7517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        exit(1);
7527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      }
7537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      {
7567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        int begin=0; //=(rand()%TESTWORDS);
7577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        int ilen=(rand()%(TESTWORDS-begin));
7587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        int bitoffset,bitcount=0;
7597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        unsigned long temp;
7607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        for(j=0;j<begin;j++)
7627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          bitcount+=len[j];
7637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        or=ogg_buffer_pretruncate(or,bitcount/8);
7647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        bitoffset=bitcount%=8;
7657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        for(;j<begin+ilen;j++)
7667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          bitcount+=len[j];
7677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        ogg_buffer_posttruncate(or,((bitcount+7)/8));
7687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        if((count=ogg_buffer_length(or))!=(bitcount+7)/8){
7707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          fprintf(stderr,"\nERROR: buffer length incorrect after truncate.\n");
7717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          exit(1);
7727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        }
7737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        oggpack_readinit(&o,or);
7757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        /* verify bit count */
7777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        if(oggpack_bits(&o)!=0){
7787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          fprintf(stderr,"\nERROR: Read bitcounter not zero!\n");
7797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          exit(1);
7807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        }
7817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        if(oggpack_bytes(&o)!=0){
7827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          fprintf(stderr,"\nERROR: Read bytecounter not zero!\n");
7837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          exit(1);
7847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        }
7857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        bitcount=bitoffset;
7877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        oggpack_read(&o,bitoffset);
7887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        /* read and compare to original list */
7907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        for(j=begin;j<begin+ilen;j++){
7917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	  temp=oggpack_read(&o,len[j]);
7927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          if(temp==0xffffffffUL){
7937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            fprintf(stderr,"\nERROR: End of stream too soon! word: %ld,%d\n",
7947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                    j-begin,ilen);
7957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            exit(1);
7967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          }
7977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          if(temp!=(values[j]&mask[len[j]])){
7987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            fprintf(stderr,"\nERROR: Incorrect read %lx != %lx, word %ld, len %d\n"
7997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang,
8007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                    values[j]&mask[len[j]],temp,j-begin,len[j]);
8017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            exit(1);
8027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          }
8037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          bitcount+=len[j];
8047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          if(oggpack_bits(&o)!=bitcount){
8057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            fprintf(stderr,"\nERROR: Read bitcounter %d != %ld!\n",
8067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                    bitcount,oggpack_bits(&o));
8077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            exit(1);
8087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          }
8097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          if(oggpack_bytes(&o)!=(bitcount+7)/8){
8107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            fprintf(stderr,"\nERROR: Read bytecounter %d != %ld!\n",
8117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                    (bitcount+7)/8,oggpack_bytes(&o));
8127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            exit(1);
8137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          }
8147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
8157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        }
8167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        _end_verify(count);
8177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
8187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        /* look/adv version */
8197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        oggpack_readinit(&o,or);
8207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        bitcount=bitoffset;
8217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        oggpack_adv(&o,bitoffset);
8227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
8237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        /* read and compare to original list */
8247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        for(j=begin;j<begin+ilen;j++){
8257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	  temp=oggpack_look(&o,len[j]);
8267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
8277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          if(temp==0xffffffffUL){
8287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            fprintf(stderr,"\nERROR: End of stream too soon! word: %ld\n",
8297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                    j-begin);
8307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            exit(1);
8317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          }
8327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          if(temp!=(values[j]&mask[len[j]])){
8337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            fprintf(stderr,"\nERROR: Incorrect look %lx != %lx, word %ld, len %d\n"
8347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang,
8357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                    values[j]&mask[len[j]],temp,j-begin,len[j]);
8367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            exit(1);
8377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          }
8387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	  oggpack_adv(&o,len[j]);
8397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          bitcount+=len[j];
8407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          if(oggpack_bits(&o)!=bitcount){
8417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            fprintf(stderr,"\nERROR: Look/Adv bitcounter %d != %ld!\n",
8427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                    bitcount,oggpack_bits(&o));
8437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            exit(1);
8447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          }
8457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          if(oggpack_bytes(&o)!=(bitcount+7)/8){
8467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            fprintf(stderr,"\nERROR: Look/Adv bytecounter %d != %ld!\n",
8477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                    (bitcount+7)/8,oggpack_bytes(&o));
8487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            exit(1);
8497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          }
8507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
8517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        }
8527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        _end_verify2(count);
8537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
8547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      }
8557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      ogg_buffer_release(or);
8567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
8577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
8587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"\rRandomized testing (LSb)... ok.   \n");
8597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
8607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  return(0);
8617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
8627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
8637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef _WIN32_WCE
8647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint WinMain(void){
8657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    return main();
8667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
8677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif
8687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
8697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif
870