Avoided ABI breakage
[openjpeg.git] / indexer_JPIP / bio.c
1 /*
2  * Copyright (c) 2001-2002, David Janssens
3  * Copyright (c) 2003, Yannick Verschueren
4  * Copyright (c) 2003,  Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  * POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #include "bio.h"
30 #include <setjmp.h>
31
32 static unsigned char *bio_start, *bio_end, *bio_bp;
33 static unsigned int bio_buf;
34 static int bio_ct;
35
36 extern jmp_buf j2k_error;
37
38 /// <summary>
39 /// Number of bytes written.
40 /// </summary>
41 int bio_numbytes() {
42     return bio_bp-bio_start;
43 }
44
45 /// <summary>
46 /// Init decoder.
47 /// </summary>
48 /// <param name="bp">Input buffer</param>
49 /// <param name="len">Input buffer length</param>
50 void bio_init_dec(unsigned char *bp, int len) {
51     bio_start=bp;
52     bio_end=bp+len;
53     bio_bp=bp;
54     bio_buf=0;
55     bio_ct=0;
56 }
57
58 int bio_byteout()
59 {
60         bio_buf = (bio_buf << 8) & 0xffff;
61         bio_ct = bio_buf == 0xff00 ? 7 : 8;
62         if (bio_bp >= bio_end)
63                 return 1;
64         *bio_bp++ = bio_buf >> 8;
65         return 0;
66 }
67
68 /// <summary>
69 /// Read byte. 
70 /// </summary>
71 int bio_bytein() {
72     bio_buf=(bio_buf<<8)&0xffff;
73     bio_ct=bio_buf==0xff00?7:8;
74     if (bio_bp>=bio_end) return 1; //longjmp(j2k_error, 1);
75     bio_buf|=*bio_bp++;
76     return 0;
77 }
78
79 /// <summary>
80 /// Read bit.
81 /// </summary>
82 int bio_getbit() {
83     if (bio_ct==0) {
84         bio_bytein();
85     }
86     bio_ct--;
87     return (bio_buf>>bio_ct)&1;
88 }
89
90 /// <summary>
91 /// Read bits.
92 /// </summary>
93 /// <param name="n">Number of bits to read</param>
94 int bio_read(int n) {
95     int i, v;
96     v=0;
97     for (i=n-1; i>=0; i--) {
98         v+=bio_getbit()<<i;
99     }
100     return v;
101 }
102
103 /// <summary>
104 /// Flush bits.
105 /// </summary>
106 int bio_flush() {
107     bio_ct=0;
108     bio_byteout();
109     if (bio_ct==7) {
110         bio_ct=0;
111        if ( bio_byteout()) return 1;;
112     }
113     return 0;
114 }
115
116 /// <summary>
117 /// </summary>
118 int bio_inalign() {
119     bio_ct=0;
120     if ((bio_buf&0xff)==0xff) {
121        if( bio_bytein()) return 1;
122         bio_ct=0;
123     }
124     return 0;
125 }