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;
190ea4d754fcb81fced7bd1f33ad67f7b50d5fbb291Marco Nelissen  if (b->head && r->length) {
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
220ea4d754fcb81fced7bd1f33ad67f7b50d5fbb291Marco Nelissen  if (!b->headptr) return 0;
221ea4d754fcb81fced7bd1f33ad67f7b50d5fbb291Marco Nelissen
2227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  bits+=b->headbit;
2237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(bits >= b->headend<<3){
2257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    int            end=b->headend;
2267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    unsigned char *ptr=b->headptr;
2277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    ogg_reference *head=b->head;
2287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
229b46673f19ebfff0984b7cbc69554239992ea21bbDouglas Leung    if(end<0)return 0;
230b46673f19ebfff0984b7cbc69554239992ea21bbDouglas Leung    if (!head || !end)return 0;
2317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(bits){
2337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      _lookspan();
2347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      ret=*ptr++>>b->headbit;
2357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      if(bits>8){
2367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        --end;
2377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        _lookspan();
2387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        ret|=*ptr++<<(8-b->headbit);
2397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        if(bits>16){
2407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          --end;
2417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          _lookspan();
2427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          ret|=*ptr++<<(16-b->headbit);
2437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          if(bits>24){
2447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            --end;
2457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            _lookspan();
2467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            ret|=*ptr++<<(24-b->headbit);
2477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            if(bits>32 && b->headbit){
2487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang              --end;
2497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang              _lookspan();
2507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang              ret|=*ptr<<(32-b->headbit);
2517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            }
2527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          }
2537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        }
2547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      }
2557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
2567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }else{
2587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    /* make this a switch jump-table */
2607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    ret=b->headptr[0]>>b->headbit;
2617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(bits>8){
2627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      ret|=b->headptr[1]<<(8-b->headbit);
2637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      if(bits>16){
2647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        ret|=b->headptr[2]<<(16-b->headbit);
2657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        if(bits>24){
2667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          ret|=b->headptr[3]<<(24-b->headbit);
2677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          if(bits>32 && b->headbit)
2687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            ret|=b->headptr[4]<<(32-b->headbit);
2697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        }
2707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      }
2717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
2727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
2737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  ret&=m;
2757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fprintf(stderr,
2767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        "Look: buffer=(%d,%x,%d,%d) %02x%02x%02x%02x%02x%02x%02x%02x (%d bits) return=%x\n",
2777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headbit, b->headptr, b->headend, b->count,
2787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headptr[7], b->headptr[6], b->headptr[5], b->headptr[4],
2797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headptr[3], b->headptr[2], b->headptr[1], b->headptr[0],
2807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        BITS, ret);
2817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fflush(stderr);
2827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  return ret;
2837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
2847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang/* limited to 32 at a time */
2867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid oggpack_adv(oggpack_buffer *b,int bits){
2877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    int BITS=bits;
2887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  bits+=b->headbit;
2897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  b->headbit=bits&7;
2907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  b->headend-=(bits>>3);
2917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  b->headptr+=(bits>>3);
2927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(b->headend<1)_span(b);
2937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fprintf(stderr, "Adv: buffer=(%d,%x,%d,%d) %02x%02x%02x%02x%02x%02x%02x%02x (%d bits)\n",
2947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headbit, b->headptr, b->headend,b->count,
2957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headptr[7], b->headptr[6], b->headptr[5], b->headptr[4],
2967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headptr[3], b->headptr[2], b->headptr[1], b->headptr[0],
2977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        BITS);
2987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fflush(stderr);
2997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
3007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint oggpack_eop(oggpack_buffer *b){
3027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int ret;
3037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(b->headend<0)ret= -1;
3047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  else ret = 0;
3057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fprintf(stderr, "EOP %d\n", ret);
3067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fflush(stderr);
3077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  return ret;
3087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
3097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_bytes(oggpack_buffer *b){
3117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  long ret;
3127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(b->headend<0) ret = b->count+b->head->length;
3137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  ret = b->count + b->head->length-b->headend + (b->headbit+7)/8;
3147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fprintf(stderr, "Bytes: buffer=(%d,%x,%d,%d) %02x%02x%02x%02x%02x%02x%02x%02x (%d bytes)\n",
3157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headbit, b->headptr, b->headend, b->count,
3167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headptr[7], b->headptr[6], b->headptr[5], b->headptr[4],
3177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headptr[3], b->headptr[2], b->headptr[1], b->headptr[0],
3187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        ret);
3197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fflush(stderr);
3207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  return ret;
3217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
3227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_bits(oggpack_buffer *b){
3247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  long ret;
3257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(b->headend<0) ret = (b->count+b->head->length)*8;
3267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  else ret = (b->count + b->head->length-b->headend)*8 + b->headbit;
3277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fprintf(stderr, "Bits: buffer=(%x,%x,%x) %02x%02x%02x%02x%02x%02x%02x%02x (%d bits)\n",
3287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headbit, b->headptr, b->headend,
3297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headptr[7], b->headptr[6], b->headptr[5], b->headptr[4],
3307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        b->headptr[3], b->headptr[2], b->headptr[1], b->headptr[0],
3317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //        ret);
3327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  //fflush(stderr);
3337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  return ret;
3347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
3357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang/* bits <= 32 */
3377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_read(oggpack_buffer *b,int bits){
3387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  long ret=oggpack_look(b,bits);
3397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  oggpack_adv(b,bits);
3407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  return(ret);
3417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
3427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif
3447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang/* Self test of the bitwise routines; everything else is based on
3467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang   them, so they damned well better be solid. */
3477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef _V_BIT_TEST
3497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <string.h>
3507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <stdlib.h>
3517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <stdio.h>
3527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "framing.c"
3537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangstatic int ilog(unsigned long v){
3557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int ret=0;
3567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  while(v){
3577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    ret++;
3587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    v>>=1;
3597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
3607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  return(ret);
3617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
3627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangoggpack_buffer r;
3647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangoggpack_buffer o;
3657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangogg_buffer_state *bs;
3667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangogg_reference *or;
3677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#define TESTWORDS 256
3687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid report(char *in){
3707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"%s",in);
3717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  exit(1);
3727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
3737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint getbyte(ogg_reference *or,int position){
3757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  while(or && position>=or->length){
3767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    position-=or->length;
3777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or=or->next;
3787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(or==NULL){
3797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      fprintf(stderr,"\n\tERROR: getbyte ran off end of buffer.\n");
3807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      exit(1);
3817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
3827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
3837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if((position+or->begin)&1)
3857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    return (or->buffer->data[(position+or->begin)>>1])&0xff;
3867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  else
3877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    return (or->buffer->data[(position+or->begin)>>1]>>8)&0xff;
3887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
3897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid cliptest(unsigned long *b,int vals,int bits,int *comp,int compsize){
3917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  long i,bitcount=0;
3927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  ogg_reference *or=ogg_buffer_alloc(bs,64);
3937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  for(i=0;i<compsize;i++)
3947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or->buffer->data[i]= comp[i];
3957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  or->length=i;
3967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  oggpack_readinit(&r,or);
3987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  for(i=0;i<vals;i++){
3997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    unsigned long test;
4007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    int tbit=bits?bits:ilog(b[i]);
4017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if((test=oggpack_look(&r,tbit))==0xffffffff)
4027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("out of data!\n");
4037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(test!=(b[i]&mask[tbit])){
4047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      fprintf(stderr,"%ld) %lx %lx\n",i,(b[i]&mask[tbit]),test);
4057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("looked at incorrect value!\n");
4067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
4077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if((test=oggpack_read(&r,tbit))==0xffffffff){
4087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("premature end of data when reading!\n");
4097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
4107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(test!=(b[i]&mask[tbit])){
4117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      fprintf(stderr,"%ld) %lx %lx\n",i,(b[i]&mask[tbit]),test);
4127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("read incorrect value!\n");
4137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
4147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    bitcount+=tbit;
4157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(bitcount!=oggpack_bits(&r))
4177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("wrong number of bits while reading!\n");
4187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if((bitcount+7)/8!=oggpack_bytes(&r))
4197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("wrong number of bytes while reading!\n");
4207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
4227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(oggpack_bytes(&r)!=(bitcount+7)/8){
4237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      fprintf(stderr, "%d vs %d\n", oggpack_bytes(&r), (bitcount+7)/8);
4247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("leftover bytes after read!\n");
4257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
4267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  ogg_buffer_release(or);
4277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
4287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid _end_verify(int count){
4307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int i;
4317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* are the proper number of bits left over? */
4337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int leftover=count*8-oggpack_bits(&o);
4347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(leftover>7)
4357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("\nERROR: too many bits reported left over.\n");
4367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* does reading to exactly byte alignment *not* trip EOF? */
4387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(oggpack_read(&o,leftover)==-1)
4397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("\nERROR: read to but not past exact end tripped EOF.\n");
4407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(oggpack_bits(&o)!=count*8)
4417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("\nERROR: read to but not past exact end reported bad bitcount.\n");
4427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* does EOF trip properly after a single additional bit? */
4447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(oggpack_read(&o,1)!=-1)
4457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("\nERROR: read past exact end did not trip EOF.\n");
4467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(oggpack_bits(&o)!=count*8)
4477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("\nERROR: read past exact end reported bad bitcount.\n");
4487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* does EOF stay set over additional bit reads? */
4507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  for(i=0;i<=32;i++){
4517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(oggpack_read(&o,i)!=-1)
4527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("\nERROR: EOF did not stay set on stream.\n");
4537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(oggpack_bits(&o)!=count*8)
4547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("\nERROR: read past exact end reported bad bitcount.\n");
4557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
4567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
4577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid _end_verify2(int count){
4597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int i;
4607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* are the proper number of bits left over? */
4627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int leftover=count*8-oggpack_bits(&o);
4637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(leftover>7)
4647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("\nERROR: too many bits reported left over.\n");
4657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* does reading to exactly byte alignment *not* trip EOF? */
4677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  oggpack_adv(&o,leftover);
4687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef ARM_LITTLE_ENDIAN
4697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(o.bitsLeftInSegment!=0)
4707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#else
4717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(o.headend!=0)
4727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif
4737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("\nERROR: read to but not past exact end tripped EOF.\n");
4747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(oggpack_bits(&o)!=count*8)
4757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("\nERROR: read to but not past exact end reported bad bitcount.\n");
4767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* does EOF trip properly after a single additional bit? */
4787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  oggpack_adv(&o,1);
4797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef ARM_LITTLE_ENDIAN
4807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(o.bitsLeftInSegment>=0)
4817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#else
4827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(o.headend>=0)
4837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif
4847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("\nERROR: read past exact end did not trip EOF.\n");
4857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(oggpack_bits(&o)!=count*8)
4867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("\nERROR: read past exact end reported bad bitcount.\n");
4877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* does EOF stay set over additional bit reads? */
4897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  for(i=0;i<=32;i++){
4907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    oggpack_adv(&o,i);
4917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef ARM_LITTLE_ENDIAN
4927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(o.bitsLeftInSegment>=0)
4937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#else
4947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(o.headend>=0)
4957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif
4967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("\nERROR: EOF did not stay set on stream.\n");
4977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(oggpack_bits(&o)!=count*8)
4987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("\nERROR: read past exact end reported bad bitcount.\n");
4997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
5007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
5017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong ogg_buffer_length(ogg_reference *or){
5037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int count=0;
5047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  while(or){
5057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    count+=or->length;
5067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or=or->next;
5077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
5087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  return count;
5097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
5107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangogg_reference *ogg_buffer_extend(ogg_reference *or,long bytes){
5127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(or){
5137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    while(or->next){
5147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      or=or->next;
5157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
5167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or->next=ogg_buffer_alloc(or->buffer->ptr.owner,bytes);
5177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    return(or->next);
5187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
5197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  return 0;
5207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
5217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid ogg_buffer_posttruncate(ogg_reference *or,long pos){
5237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* walk to the point where we want to begin truncate */
5247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  while(or && pos>or->length){
5257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    pos-=or->length;
5267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or=or->next;
5277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
5287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(or){
5297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    ogg_buffer_release(or->next);
5307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or->next=0;
5317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or->length=pos;
5327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
5337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
5347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint main(void){
5367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  long i;
5377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  static unsigned long testbuffer1[]=
5387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    {18,12,103948,4325,543,76,432,52,3,65,4,56,32,42,34,21,1,23,32,546,456,7,
5397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang       567,56,8,8,55,3,52,342,341,4,265,7,67,86,2199,21,7,1,5,1,4};
5407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int test1size=43;
5417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  static unsigned long testbuffer2[]=
5437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    {216531625L,1237861823,56732452,131,3212421,12325343,34547562,12313212,
5447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang       1233432,534,5,346435231,14436467,7869299,76326614,167548585,
5457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang       85525151,0,12321,1,349528352};
5467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int test2size=21;
5477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  static unsigned long testbuffer3[]=
5497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria 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,
5507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang       0,1,30,1,1,1,0,0,1,0,0,0,12,0,11,0,1,0,0,1};
5517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int test3size=56;
5527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  static unsigned long large[]=
5547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    {2136531625L,2137861823,56732452,131,3212421,12325343,34547562,12313212,
5557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang       1233432,534,5,2146435231,14436467,7869299,76326614,167548585,
5567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang       85525151,0,12321,1,2146528352};
5577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int onesize=33;
5597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  static int one[33]={146,25,44,151,195,15,153,176,233,131,196,65,85,172,47,40,
5607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                    34,242,223,136,35,222,211,86,171,50,225,135,214,75,172,
5617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                    223,4};
5627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int twosize=6;
5647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  static int two[6]={61,255,255,251,231,29};
5657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int threesize=54;
5677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  static int three[54]={169,2,232,252,91,132,156,36,89,13,123,176,144,32,254,
5687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                      142,224,85,59,121,144,79,124,23,67,90,90,216,79,23,83,
5697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                      58,135,196,61,55,129,183,54,101,100,170,37,127,126,10,
5707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                      100,52,4,14,18,86,77,1};
5717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int foursize=38;
5737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  static int four[38]={18,6,163,252,97,194,104,131,32,1,7,82,137,42,129,11,72,
5747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                     132,60,220,112,8,196,109,64,179,86,9,137,195,208,122,169,
5757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                     28,2,133,0,1};
5767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int fivesize=45;
5787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  static int five[45]={169,2,126,139,144,172,30,4,80,72,240,59,130,218,73,62,
5797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                     241,24,210,44,4,20,0,248,116,49,135,100,110,130,181,169,
5807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                     84,75,159,2,1,0,132,192,8,0,0,18,22};
5817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  int sixsize=7;
5837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  static int six[7]={17,177,170,242,169,19,148};
5847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* Test read/write together */
5867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* Later we test against pregenerated bitstreams */
5877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  bs=ogg_buffer_create();
5887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"\nSmall preclipped packing (LSb): ");
5907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  cliptest(testbuffer1,test1size,0,one,onesize);
5917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"ok.");
5927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"\nNull bit call (LSb): ");
5947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  cliptest(testbuffer3,test3size,0,two,twosize);
5957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"ok.");
5967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
5977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"\nLarge preclipped packing (LSb): ");
5987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  cliptest(testbuffer2,test2size,0,three,threesize);
5997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"ok.");
6007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"\n32 bit preclipped packing (LSb): ");
6027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  or=ogg_buffer_alloc(bs,128);
6047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  for(i=0;i<test2size;i++){
6057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or->buffer->data[i*4]  = large[i]&0xff;
6067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or->buffer->data[i*4+1]  = (large[i]>>8)&0xff;
6077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or->buffer->data[i*4+2]  = (large[i]>>16)&0xff;
6087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    or->buffer->data[i*4+3]  = (large[i]>>24)&0xff;
6097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
6107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  or->length=test2size*4;
6117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  oggpack_readinit(&r,or);
6127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  for(i=0;i<test2size;i++){
6137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    unsigned long test;
6147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if((test=oggpack_look(&r,32))==0xffffffffUL)report("out of data. failed!");
6157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(test!=large[i]){
6167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      fprintf(stderr,"%ld != %ld (%lx!=%lx):",test,large[i],
6177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang              test,large[i]);
6187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      report("read incorrect value!\n");
6197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
6207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    oggpack_adv(&r,32);
6217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
6227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  ogg_buffer_release(or);
6237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  if(oggpack_bytes(&r)!=test2size*4){
6247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    fprintf(stderr, "%d vs %d\n", oggpack_bytes(&r), test2size*4);
6257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    report("leftover bytes after read!\n");
6267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
6277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"ok.");
6287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"\nSmall unclipped packing (LSb): ");
6307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  cliptest(testbuffer1,test1size,7,four,foursize);
6317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"ok.");
6327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"\nLarge unclipped packing (LSb): ");
6347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  cliptest(testbuffer2,test2size,17,five,fivesize);
6357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"ok.");
6367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"\nSingle bit unclipped packing (LSb): ");
6387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  cliptest(testbuffer3,test3size,1,six,sixsize);
6397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"ok.");
6407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"\nTesting read past end (LSb): ");
6427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  {
6437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    unsigned char dda[]={0,0,0,0};
6447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    ogg_buffer lob={dda,8,0,{0}};
6457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    ogg_reference lor={&lob,0,8,0};
6467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    oggpack_readinit(&r,&lor);
6487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    for(i=0;i<64;i++){
6497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      if(oggpack_read(&r,1)<0){
6507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        fprintf(stderr,"failed; got -1 prematurely.\n");
6517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        exit(1);
6527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      }
6537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
6547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if(oggpack_look(&r,1)!=-1 ||
6557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang       oggpack_read(&r,1)!=-1){
6567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      fprintf(stderr,"failed; read past end without -1.\n");
6577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      exit(1);
6587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
6597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
6607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  {
6617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    unsigned char dda[]={0,0,0,0};
6627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    ogg_buffer lob={dda,8,0,{0}};
6637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    ogg_reference lor={&lob,0,8,0};
6647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    unsigned long test;
6657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    oggpack_readinit(&r,&lor);
6677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if((test=oggpack_read(&r,30))==0xffffffffUL ||
6687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang       (test=oggpack_read(&r,16))==0xffffffffUL){
6697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      fprintf(stderr,"failed 2; got -1 prematurely.\n");
6707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      exit(1);
6717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
6727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if((test=oggpack_look(&r,18))==0xffffffffUL){
6747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      fprintf(stderr,"failed 3; got -1 prematurely.\n");
6757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      exit(1);
6767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
6777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if((test=oggpack_look(&r,19))!=0xffffffffUL){
6787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      fprintf(stderr,"failed; read past end without -1.\n");
6797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      exit(1);
6807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
6817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    if((test=oggpack_look(&r,32))!=0xffffffffUL){
6827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      fprintf(stderr,"failed; read past end without -1.\n");
6837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      exit(1);
6847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
6857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
6867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"ok.\n");
6877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  /* now the scary shit: randomized testing */
6897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  for(i=0;i<10000;i++){
6917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    long j,count=0,count2=0,bitcount=0;
6927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    unsigned long values[TESTWORDS];
6937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    int len[TESTWORDS];
6947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    unsigned char flat[4*TESTWORDS]; /* max possible needed size */
6957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    memset(flat,0,sizeof(flat));
6977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    fprintf(stderr,"\rRandomized testing (LSb)... (%ld)   ",10000-i);
6987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
6997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    /* generate a list of words and lengths */
7007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    /* write the required number of bits out to packbuffer */
7017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    {
7027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      long word=0;
7037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      long bit=0;
7047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      int k;
7057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      for(j=0;j<TESTWORDS;j++){
7077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	values[j]=rand();
7087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	len[j]=(rand()%33);
7097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	for(k=0;k<len[j];k++){
7117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	  flat[word] |= ((values[j]>>k)&0x1)<<bit;
7127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	  bit++;
7137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	  bitcount++;
7147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	  if(bit>7){
7157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	    bit=0;
7167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	    word++;
7177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	  }
7187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	}
7197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      }
7207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
7217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    count2=(bitcount+7)>>3;
7227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    /* construct random-length buffer chain from flat vector; random
7247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang       byte starting offset within the length of the vector */
7257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    {
7267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      ogg_reference *or=NULL,*orl=NULL;
7277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      long pos=0;
7287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      /* build buffer chain */
7307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      while(count2){
7317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        int ilen=(rand()%32),k;
7327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        int ibegin=(rand()%32);
7337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        if(ilen>count2)ilen=count2;
7367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        if(or)
7387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          orl=ogg_buffer_extend(orl,64);
7397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        else
7407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          or=orl=ogg_buffer_alloc(bs,64);
7417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        orl->length=ilen;
7437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        orl->begin=ibegin;
7447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	for(k=0;k<ilen;k++)
7467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	  orl->buffer->data[ibegin++]= flat[pos++];
7477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        count2-=ilen;
7497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      }
7507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      if(ogg_buffer_length(or)!=(bitcount+7)/8){
7527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        fprintf(stderr,"\nERROR: buffer length incorrect after build.\n");
7537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        exit(1);
7547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      }
7557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      {
7587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        int begin=0; //=(rand()%TESTWORDS);
7597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        int ilen=(rand()%(TESTWORDS-begin));
7607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        int bitoffset,bitcount=0;
7617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        unsigned long temp;
7627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        for(j=0;j<begin;j++)
7647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          bitcount+=len[j];
7657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        or=ogg_buffer_pretruncate(or,bitcount/8);
7667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        bitoffset=bitcount%=8;
7677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        for(;j<begin+ilen;j++)
7687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          bitcount+=len[j];
7697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        ogg_buffer_posttruncate(or,((bitcount+7)/8));
7707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        if((count=ogg_buffer_length(or))!=(bitcount+7)/8){
7727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          fprintf(stderr,"\nERROR: buffer length incorrect after truncate.\n");
7737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          exit(1);
7747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        }
7757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        oggpack_readinit(&o,or);
7777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        /* verify bit count */
7797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        if(oggpack_bits(&o)!=0){
7807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          fprintf(stderr,"\nERROR: Read bitcounter not zero!\n");
7817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          exit(1);
7827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        }
7837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        if(oggpack_bytes(&o)!=0){
7847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          fprintf(stderr,"\nERROR: Read bytecounter not zero!\n");
7857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          exit(1);
7867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        }
7877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        bitcount=bitoffset;
7897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        oggpack_read(&o,bitoffset);
7907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
7917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        /* read and compare to original list */
7927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        for(j=begin;j<begin+ilen;j++){
7937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	  temp=oggpack_read(&o,len[j]);
7947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          if(temp==0xffffffffUL){
7957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            fprintf(stderr,"\nERROR: End of stream too soon! word: %ld,%d\n",
7967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                    j-begin,ilen);
7977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            exit(1);
7987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          }
7997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          if(temp!=(values[j]&mask[len[j]])){
8007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            fprintf(stderr,"\nERROR: Incorrect read %lx != %lx, word %ld, len %d\n"
8017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang,
8027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                    values[j]&mask[len[j]],temp,j-begin,len[j]);
8037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            exit(1);
8047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          }
8057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          bitcount+=len[j];
8067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          if(oggpack_bits(&o)!=bitcount){
8077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            fprintf(stderr,"\nERROR: Read bitcounter %d != %ld!\n",
8087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                    bitcount,oggpack_bits(&o));
8097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            exit(1);
8107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          }
8117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          if(oggpack_bytes(&o)!=(bitcount+7)/8){
8127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            fprintf(stderr,"\nERROR: Read bytecounter %d != %ld!\n",
8137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                    (bitcount+7)/8,oggpack_bytes(&o));
8147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            exit(1);
8157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          }
8167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
8177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        }
8187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        _end_verify(count);
8197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
8207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        /* look/adv version */
8217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        oggpack_readinit(&o,or);
8227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        bitcount=bitoffset;
8237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        oggpack_adv(&o,bitoffset);
8247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
8257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        /* read and compare to original list */
8267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        for(j=begin;j<begin+ilen;j++){
8277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	  temp=oggpack_look(&o,len[j]);
8287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
8297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          if(temp==0xffffffffUL){
8307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            fprintf(stderr,"\nERROR: End of stream too soon! word: %ld\n",
8317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                    j-begin);
8327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            exit(1);
8337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          }
8347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          if(temp!=(values[j]&mask[len[j]])){
8357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            fprintf(stderr,"\nERROR: Incorrect look %lx != %lx, word %ld, len %d\n"
8367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang,
8377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                    values[j]&mask[len[j]],temp,j-begin,len[j]);
8387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            exit(1);
8397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          }
8407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	  oggpack_adv(&o,len[j]);
8417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          bitcount+=len[j];
8427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          if(oggpack_bits(&o)!=bitcount){
8437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            fprintf(stderr,"\nERROR: Look/Adv bitcounter %d != %ld!\n",
8447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                    bitcount,oggpack_bits(&o));
8457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            exit(1);
8467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          }
8477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          if(oggpack_bytes(&o)!=(bitcount+7)/8){
8487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            fprintf(stderr,"\nERROR: Look/Adv bytecounter %d != %ld!\n",
8497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang                    (bitcount+7)/8,oggpack_bytes(&o));
8507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang            exit(1);
8517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang          }
8527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
8537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        }
8547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang        _end_verify2(count);
8557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
8567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      }
8577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang      ogg_buffer_release(or);
8587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    }
8597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  }
8607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  fprintf(stderr,"\rRandomized testing (LSb)... ok.   \n");
8617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
8627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang  return(0);
8637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
8647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
8657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef _WIN32_WCE
8667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint WinMain(void){
8677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    return main();
8687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}
8697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif
8707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
8717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif
872