1 /*
2 **  OSSP al -- Assembly Line
3 **  Copyright (c) 2002-2005 The OSSP Project <http://www.ossp.org/>
4 **  Copyright (c) 2002-2005 Cable & Wireless <http://www.cw.com/>
5 **  Copyright (c) 2002-2005 Ralf S. Engelschall <rse@engelschall.com>
6 **  Copyright (c) 2002-2005 Michael van Elst <mlelstv@serpens.de>
7 **
8 **  This file is part of OSSP al, an abstract datatype of a data buffer
9 **  that can assemble, move and truncate data but avoids actual copying
10 **  and which can be found at http://www.ossp.org/pkg/lib/al/.
11 **
12 **  Permission to use, copy, modify, and distribute this software for
13 **  any purpose with or without fee is hereby granted, provided that
14 **  the above copyright notice and this permission notice appear in all
15 **  copies.
16 **
17 **  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
18 **  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 **  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 **  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
21 **  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 **  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 **  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24 **  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 **  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26 **  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
27 **  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 **  SUCH DAMAGE.
29 **
30 **  al.h: assembly line public API definition
31 */
32 
33 #ifndef __AL_H__
34 #define __AL_H__
35 
36 typedef enum {
37     AL_OK,
38     AL_ERR_ARG,
39     AL_ERR_MEM,
40     AL_ERR_EOF,
41     AL_ERR_INT
42 } al_rc_t;
43 
44 struct al_st;
45 typedef struct al_st al_t;
46 
47 struct al_chunk_st;
48 typedef struct al_chunk_st al_chunk_t;
49 
50 typedef void *al_label_t;
51 
52 typedef enum {
53     AL_FORWARD,
54     AL_BACKWARD,
55     AL_FORWARD_SPAN,
56     AL_BACKWARD_SPAN
57 } al_td_t;
58 
59 struct al_tx_st;
60 typedef struct al_tx_st al_tx_t;
61 
62 al_rc_t al_create       (al_t **alp);
63 al_rc_t al_destroy      (al_t *al);
64 al_rc_t al_append_bytes (al_t *al, const char *src, size_t n, al_label_t label);
65 al_rc_t al_prepend_bytes(al_t *al, const char *src, size_t n, al_label_t label);
66 al_rc_t al_attach_buffer(al_t *al, char *p, size_t n, al_label_t label, void (*freemem)(char *, size_t, void *), void *u);
67 al_rc_t al_txalloc      (al_t *al, al_tx_t **txp);
68 al_rc_t al_txfree       (al_t *al, al_tx_t *tx);
69 al_rc_t al_traverse     (al_t *al, size_t off, size_t n, al_td_t dir, al_label_t label, al_tx_t *tx);
70 al_rc_t al_traverse_next(al_t *al, al_tx_t *tx, al_chunk_t **alcp);
71 al_rc_t al_traverse_end (al_t *al, al_tx_t *tx, int final);
72 al_rc_t al_traverse_cb  (al_t *al, size_t off, size_t n, al_td_t dir, al_label_t label, al_rc_t (*cb)(al_chunk_t *, void *), void *u);
73 al_rc_t al_copy         (al_t *al, size_t off, size_t n, al_label_t label, al_t *tal);
74 al_rc_t al_splice       (al_t *al, size_t off, size_t n, al_t *nal, al_t *tal);
75 al_rc_t al_setlabel     (al_t *al, size_t off, size_t n, al_label_t oldlabel, al_label_t newlabel);
76 al_rc_t al_flatten      (al_t *al, size_t off, size_t n, al_td_t dir, al_label_t label, char *dst, size_t *lenp);
77 al_rc_t al_firstlabel   (al_t *al, size_t off, size_t n, al_td_t dir, al_label_t label, al_label_t *labelp);
78 al_rc_t al_spanlabel    (al_t *al, size_t off, size_t n, al_label_t label, size_t *offp, size_t *spanp);
79 
80 size_t     al_bytes      (const al_t *al);
81 size_t     al_chunk_len  (al_chunk_t *alc);
82 al_label_t al_chunk_label(al_chunk_t *alc);
83 int        al_same_label (al_chunk_t *alc, al_label_t label);
84 size_t     al_chunk_span (al_chunk_t *alc, size_t off, size_t n);
85 char      *al_chunk_ptr  (al_chunk_t *alc, size_t off);
86 
87 const char *al_error      (al_rc_t rc);
88 
89 #endif /* __AL_H__ */
90 
91