1 /***********************************************************************
2 *                                                                      *
3 *               This software is part of the ast package               *
4 *          Copyright (c) 1995-2012 AT&T Intellectual Property          *
5 *                      and is licensed under the                       *
6 *                 Eclipse Public License, Version 1.0                  *
7 *                    by AT&T Intellectual Property                     *
8 *                                                                      *
9 *                A copy of the License is available at                 *
10 *          http://www.eclipse.org/org/documents/epl-v10.html           *
11 *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12 *                                                                      *
13 *              Information and Software Systems Research               *
14 *                            AT&T Research                             *
15 *                           Florham Park NJ                            *
16 *                                                                      *
17 *                   Phong Vo <kpv@research.att.com>                    *
18 *                                                                      *
19 ***********************************************************************/
20 #include	"vdelhdr.h"
21 
22 /*	IO subsystem for the delta routines
23 **
24 **	Written by Kiem-Phong Vo (12/15/94)
25 */
26 
27 #if __STD_C
_vdinit(reg Vdio_t * io)28 static void _vdinit(reg Vdio_t* io)
29 #else
30 static void _vdinit(io)
31 reg Vdio_t*	io;
32 #endif
33 {
34 	if((io->data = (uchar*)io->delta->data) )
35 		io->size = io->delta->size;
36 	else
37 	{	io->data = io->buf;
38 		io->size = sizeof(io->buf);
39 	}
40 	io->next = io->data;
41 	io->endb = io->data + io->size;
42 	io->left = io->delta->size;
43 }
44 
45 #if __STD_C
_vdfilbuf(reg Vdio_t * io)46 static int _vdfilbuf(reg Vdio_t* io)
47 #else
48 static int _vdfilbuf(io)
49 reg Vdio_t*	io;
50 #endif
51 {	reg int	n;
52 
53 	if(!io->data)
54 		_vdinit(io);
55 
56 	if(io->data != io->buf)	/* all data was given in core */
57 		return REMAIN(io);
58 
59 	if ((n = SIZE(io)) > LEFT(io))
60 		n = LEFT(io);
61 	if((n = (*READF(io))(DATA(io),n,HERE(io),DELTA(io))) > 0)
62 	{	ENDB(io) = (NEXT(io) = DATA(io)) + n;
63 		HERE(io) += n;
64 		LEFT(io) -= n;
65 	}
66 	return n;
67 }
68 
69 #if __STD_C
_vdflsbuf(reg Vdio_t * io)70 static int _vdflsbuf(reg Vdio_t* io)
71 #else
72 static int _vdflsbuf(io)
73 reg Vdio_t*	io;
74 #endif
75 {	reg int n;
76 
77 	if(!io->data )
78 		_vdinit(io);
79 
80 	if(io->data != io->buf)	/* all space was given	*/
81 		return REMAIN(io);
82 
83 	if((n = NEXT(io) - DATA(io)) > 0 &&
84 	   (*WRITEF(io))(DATA(io),n,HERE(io),DELTA(io)) != n)
85 		return -1;
86 
87 	HERE(io) += n;
88 	NEXT(io) = DATA(io);
89 	return SIZE(io);
90 }
91 
92 #if __STD_C
_vdgetu(reg Vdio_t * io,reg ulong v)93 static ulong _vdgetu(reg Vdio_t* io, reg ulong v)
94 #else
95 static ulong _vdgetu(io,v)
96 reg Vdio_t*	io;
97 reg ulong	v;
98 #endif
99 {	reg int		c;
100 
101 	for(v &= I_MORE-1;;)
102 	{	if((c = VDGETC(io)) < 0)
103 			return (ulong)(-1L);
104 		if(!(c&I_MORE) )
105 			return ((v<<I_SHIFT) | c);
106 		v = (v<<I_SHIFT) | (c & (I_MORE-1));
107 	}
108 }
109 
110 #if __STD_C
_vdputu(reg Vdio_t * io,ulong v)111 static int _vdputu(reg Vdio_t* io, ulong v)
112 #else
113 static int _vdputu(io, v)
114 reg Vdio_t*	io;
115 reg ulong	v;
116 #endif
117 {
118 	reg uchar	*s, *next;
119 	reg int		len;
120 	uchar		c[sizeof(ulong)+1];
121 
122 	s = next = &c[sizeof(c)-1];
123 	*s = I_CODE(v);
124 	while((v >>= I_SHIFT) )
125 		*--s = I_CODE(v)|I_MORE;
126 	len = (next-s) + 1;
127 
128 	if(REMAIN(io) < len && _vdflsbuf(io) < len)
129 		return -1;
130 
131 	next = io->next;
132 	switch(len)
133 	{
134 	default: memcpy((Void_t*)next,(Void_t*)s,len); next += len; break;
135 	case 3:	*next++ = *s++;
136 	case 2:	*next++ = *s++;
137 	case 1:	*next++ = *s;
138 	}
139 	io->next = next;
140 
141 	return len;
142 }
143 
144 #if __STD_C
_vdread(Vdio_t * io,reg uchar * s,reg int n)145 static int _vdread(Vdio_t* io, reg uchar* s, reg int n)
146 #else
147 static int _vdread(io, s, n)
148 Vdio_t*		io;
149 reg uchar*	s;
150 reg int		n;
151 #endif
152 {
153 	reg uchar*	next;
154 	reg int		r, m;
155 
156 	for(m = n; m > 0; )
157 	{	if((r = REMAIN(io)) <= 0 && (r = _vdfilbuf(io)) <= 0)
158 			break;
159 		if(r > m)
160 			r = m;
161 
162 		next = io->next;
163 		MEMCPY(s,next,r);
164 		io->next = next;
165 
166 		m -= r;
167 	}
168 	return n-m;
169 }
170 
171 #if __STD_C
_vdwrite(Vdio_t * io,reg uchar * s,reg int n)172 static int _vdwrite(Vdio_t* io, reg uchar* s, reg int n)
173 #else
174 static int _vdwrite(io, s, n)
175 Vdio_t*		io;
176 reg uchar*	s;
177 reg int		n;
178 #endif
179 {
180 	reg uchar*	next;
181 	reg int		w, m;
182 
183 	for(m = n; m > 0; )
184 	{	if((w = REMAIN(io)) <= 0 && (w = _vdflsbuf(io)) <= 0)
185 			break;
186 		if(w > m)
187 			w = m;
188 
189 		next = io->next;
190 		MEMCPY(next,s,w);
191 		io->next = next;
192 
193 		m -= w;
194 	}
195 	return n-m;
196 }
197 
198 
199 Vdbufio_t	_Vdbufio =
200 {	_vdfilbuf,
201 	_vdflsbuf,
202 	_vdgetu,
203 	_vdputu,
204 	_vdread,
205 	_vdwrite
206 };
207