Report errors if key files don't exist!
[u/mdw/catacomb] / buf.h
CommitLineData
6b80b6c4 1/* -*-c-*-
2 *
3 * $Id: buf.h,v 1.1 2003/10/11 21:02:33 mdw Exp $
4 *
5 * [Reading and writing packet buffers *
6 * (c) 2001 Straylight/Edgeware
7 */
8
9/*----- Licensing notice --------------------------------------------------*
10 *
11 * This file is part of Catacomb.
12 *
13 * Catacomb is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU Library General Public License as
15 * published by the Free Software Foundation; either version 2 of the
16 * License, or (at your option) any later version.
17 *
18 * Catacomb is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Library General Public License for more details.
22 *
23 * You should have received a copy of the GNU Library General Public
24 * License along with Catacomb; if not, write to the Free
25 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
26 * MA 02111-1307, USA.
27 */
28
29/*----- Revision history --------------------------------------------------*
30 *
31 * $Log: buf.h,v $
32 * Revision 1.1 2003/10/11 21:02:33 mdw
33 * Import buf stuff from tripe.
34 *
35 * Revision 1.1 2001/06/19 22:09:54 mdw
36 * Expose interface, for use in the proxy.
37 *
38 */
39
40#ifndef BUF_H
41#define BUF_H
42
43#ifdef __cplusplus
44 extern "C" {
45#endif
46
47/*----- Header files ------------------------------------------------------*/
48
49#include <stddef.h>
50
51#include <mLib/bits.h>
52
53#include <catacomb/mp.h>
54
55/*----- Data structures ---------------------------------------------------*/
56
57/* --- Buffers --- *
58 *
59 * Buffers provide a simple stream-like interface for building and parsing
60 * packets.
61 */
62
63typedef struct buf {
64 octet *base, *p, *limit; /* Pointers to the buffer */
65 unsigned f; /* Various flags */
66} buf;
67
68#define BF_BROKEN 1u /* Buffer is broken */
69
70/*----- Useful macros -----------------------------------------------------*/
71
72#define BBASE(b) ((b)->base)
73#define BLIM(b) ((b)->limit)
74#define BCUR(b) ((b)->p)
75#define BSZ(b) ((b)->limit - (b)->base)
76#define BLEN(b) ((b)->p - (b)->base)
77#define BLEFT(b) ((b)->limit - (b)->p)
78#define BSTEP(b, sz) ((b)->p += (sz))
79#define BBAD(b) ((b)->f & BF_BROKEN)
80#define BOK(b) (!BBAD(b))
81
82#define BENSURE(b, sz) \
83 (BBAD(b) ? -1 : (sz) > BLEFT(b) ? (b)->f |= BF_BROKEN, -1 : 0)
84
85/*----- Functions provided ------------------------------------------------*/
86
87/* --- @buf_init@ --- *
88 *
89 * Arguments: @buf *b@ = pointer to a buffer block
90 * @void *p@ = pointer to a buffer
91 * @size_t sz@ = size of the buffer
92 *
93 * Returns: ---
94 *
95 * Use: Initializes the buffer block appropriately.
96 */
97
98extern void buf_init(buf */*b*/, void */*p*/, size_t /*sz*/);
99
100/* --- @buf_break@ --- *
101 *
102 * Arguments: @buf *b@ = pointer to a buffer block
103 *
104 * Returns: Some negative value.
105 *
106 * Use: Marks a buffer as broken.
107 */
108
109extern int buf_break(buf */*b*/);
110
111/* --- @buf_flip@ --- *
112 *
113 * Arguments: @buf *b@ = pointer to a buffer block
114 *
115 * Returns: ---
116 *
117 * Use: Flips a buffer so that if you've just been writing to it,
118 * you can now read from the bit you've written.
119 */
120
121extern void buf_flip(buf */*b*/);
122
123/* --- @buf_ensure@ --- *
124 *
125 * Arguments: @buf *b@ = pointer to a buffer block
126 * @size_t sz@ = size of data wanted
127 *
128 * Returns: Zero if it worked, nonzero if there wasn't enough space.
129 *
130 * Use: Ensures that there are @sz@ bytes still in the buffer.
131 */
132
133extern int buf_ensure(buf */*b*/, size_t /*sz*/);
134
135/* --- @buf_get@ --- *
136 *
137 * Arguments: @buf *b@ = pointer to a buffer block
138 * @size_t sz@ = size of the buffer
139 *
140 * Returns: Pointer to the place in the buffer.
141 *
142 * Use: Reserves a space in the buffer of the requested size, and
143 * returns its start address.
144 */
145
146extern void *buf_get(buf */*b*/, size_t /*sz*/);
147
148/* --- @buf_put@ --- *
149 *
150 * Arguments: @buf *b@ = pointer to a buffer block
151 * @const void *p@ = pointer to a buffer
152 * @size_t sz@ = size of the buffer
153 *
154 * Returns: Zero if it worked, nonzero if there wasn't enough space.
155 *
156 * Use: Fetches data from some place and puts it in the buffer
157 */
158
159extern int buf_put(buf */*b*/, const void */*p*/, size_t /*sz*/);
160
161/* --- @buf_getbyte@ --- *
162 *
163 * Arguments: @buf *b@ = pointer to a buffer block
164 *
165 * Returns: A byte, or less than zero if there wasn't a byte there.
166 *
167 * Use: Gets a single byte from a buffer.
168 */
169
170extern int buf_getbyte(buf */*b*/);
171
172/* --- @buf_putbyte@ --- *
173 *
174 * Arguments: @buf *b@ = pointer to a buffer block
175 * @int ch@ = byte to write
176 *
177 * Returns: Zero if OK, nonzero if there wasn't enough space.
178 *
179 * Use: Puts a single byte in a buffer.
180 */
181
182extern int buf_putbyte(buf */*b*/, int /*ch*/);
183
184/* --- @buf_getu16@ --- *
185 *
186 * Arguments: @buf *b@ = pointer to a buffer block
187 * @uint16 *w@ = where to put the word
188 *
189 * Returns: Zero if OK, or nonzero if there wasn't a word there.
190 *
191 * Use: Gets a 16-bit word from a buffer.
192 */
193
194extern int buf_getu16(buf */*b*/, uint16 */*w*/);
195
196/* --- @buf_putu16@ --- *
197 *
198 * Arguments: @buf *b@ = pointer to a buffer block
199 * @uint16 w@ = word to write
200 *
201 * Returns: Zero if OK, nonzero if there wasn't enough space.
202 *
203 * Use: Puts a 16-but word in a buffer.
204 */
205
206extern int buf_putu16(buf */*b*/, uint16 /*w*/);
207
208/* --- @buf_getu32@ --- *
209 *
210 * Arguments: @buf *b@ = pointer to a buffer block
211 * @uint32 *w@ = where to put the word
212 *
213 * Returns: Zero if OK, or nonzero if there wasn't a word there.
214 *
215 * Use: Gets a 32-bit word from a buffer.
216 */
217
218extern int buf_getu32(buf */*b*/, uint32 */*w*/);
219
220/* --- @buf_putu32@ --- *
221 *
222 * Arguments: @buf *b@ = pointer to a buffer block
223 * @uint32 w@ = word to write
224 *
225 * Returns: Zero if OK, nonzero if there wasn't enough space.
226 *
227 * Use: Puts a 32-but word in a buffer.
228 */
229
230extern int buf_putu32(buf */*b*/, uint32 /*w*/);
231
232/* --- @buf_getmp@ --- *
233 *
234 * Arguments: @buf *b@ = pointer to a buffer block
235 *
236 * Returns: A multiprecision integer, or null if there wasn't one there.
237 *
238 * Use: Gets a multiprecision integer from a buffer.
239 */
240
241extern mp *buf_getmp(buf */*b*/);
242
243/* --- @buf_putmp@ --- *
244 *
245 * Arguments: @buf *b@ = pointer to a buffer block
246 * @mp *m@ = a multiprecision integer
247 *
248 * Returns: Zero if it worked, nonzero if there wasn't enough space.
249 *
250 * Use: Puts a multiprecision integer to a buffer.
251 */
252
253extern int buf_putmp(buf */*b*/, mp */*m*/);
254
255/*----- That's all, folks -------------------------------------------------*/
256
257#ifdef __cplusplus
258 }
259#endif
260
261#endif