1 | /*- |
---|
2 | * Copyright (c) 2000-2008 Poul-Henning Kamp |
---|
3 | * Copyright (c) 2000-2008 Dag-Erling Coïdan SmÞrgrav |
---|
4 | * All rights reserved. |
---|
5 | * |
---|
6 | * Redistribution and use in source and binary forms, with or without |
---|
7 | * modification, are permitted provided that the following conditions |
---|
8 | * are met: |
---|
9 | * 1. Redistributions of source code must retain the above copyright |
---|
10 | * notice, this list of conditions and the following disclaimer |
---|
11 | * in this position and unchanged. |
---|
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 AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
---|
17 | * 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 AUTHOR OR CONTRIBUTORS BE LIABLE |
---|
20 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
---|
21 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
---|
22 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
---|
23 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
---|
24 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
---|
25 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
---|
26 | * SUCH DAMAGE. |
---|
27 | * |
---|
28 | * $FreeBSD$ |
---|
29 | */ |
---|
30 | |
---|
31 | #ifndef _SYS_SBUF_H_ |
---|
32 | #define _SYS_SBUF_H_ |
---|
33 | |
---|
34 | #include <sys/_types.h> |
---|
35 | |
---|
36 | struct sbuf; |
---|
37 | typedef int (sbuf_drain_func)(void *, const char *, int); |
---|
38 | |
---|
39 | /* |
---|
40 | * Structure definition |
---|
41 | */ |
---|
42 | struct sbuf { |
---|
43 | char *s_buf; /* storage buffer */ |
---|
44 | sbuf_drain_func *s_drain_func; /* drain function */ |
---|
45 | void *s_drain_arg; /* user-supplied drain argument */ |
---|
46 | int s_error; /* current error code */ |
---|
47 | ssize_t s_size; /* size of storage buffer */ |
---|
48 | ssize_t s_len; /* current length of string */ |
---|
49 | #define SBUF_FIXEDLEN 0x00000000 /* fixed length buffer (default) */ |
---|
50 | #define SBUF_AUTOEXTEND 0x00000001 /* automatically extend buffer */ |
---|
51 | #define SBUF_USRFLAGMSK 0x0000ffff /* mask of flags the user may specify */ |
---|
52 | #define SBUF_DYNAMIC 0x00010000 /* s_buf must be freed */ |
---|
53 | #define SBUF_FINISHED 0x00020000 /* set by sbuf_finish() */ |
---|
54 | #define SBUF_DYNSTRUCT 0x00080000 /* sbuf must be freed */ |
---|
55 | #define SBUF_INSECTION 0x00100000 /* set by sbuf_start_section() */ |
---|
56 | int s_flags; /* flags */ |
---|
57 | ssize_t s_sect_len; /* current length of section */ |
---|
58 | }; |
---|
59 | |
---|
60 | __BEGIN_DECLS |
---|
61 | /* |
---|
62 | * API functions |
---|
63 | */ |
---|
64 | struct sbuf *sbuf_new(struct sbuf *, char *, int, int); |
---|
65 | #define sbuf_new_auto() \ |
---|
66 | sbuf_new(NULL, NULL, 0, SBUF_AUTOEXTEND) |
---|
67 | void sbuf_clear(struct sbuf *); |
---|
68 | int sbuf_setpos(struct sbuf *, ssize_t); |
---|
69 | int sbuf_bcat(struct sbuf *, const void *, size_t); |
---|
70 | int sbuf_bcpy(struct sbuf *, const void *, size_t); |
---|
71 | int sbuf_cat(struct sbuf *, const char *); |
---|
72 | int sbuf_cpy(struct sbuf *, const char *); |
---|
73 | int sbuf_printf(struct sbuf *, const char *, ...) |
---|
74 | __printflike(2, 3); |
---|
75 | int sbuf_vprintf(struct sbuf *, const char *, __va_list) |
---|
76 | __printflike(2, 0); |
---|
77 | int sbuf_putc(struct sbuf *, int); |
---|
78 | void sbuf_set_drain(struct sbuf *, sbuf_drain_func *, void *); |
---|
79 | int sbuf_trim(struct sbuf *); |
---|
80 | int sbuf_error(const struct sbuf *); |
---|
81 | int sbuf_finish(struct sbuf *); |
---|
82 | char *sbuf_data(struct sbuf *); |
---|
83 | ssize_t sbuf_len(struct sbuf *); |
---|
84 | int sbuf_done(const struct sbuf *); |
---|
85 | void sbuf_delete(struct sbuf *); |
---|
86 | void sbuf_start_section(struct sbuf *, ssize_t *); |
---|
87 | ssize_t sbuf_end_section(struct sbuf *, ssize_t, size_t, int); |
---|
88 | |
---|
89 | #ifdef _KERNEL |
---|
90 | struct uio; |
---|
91 | struct sbuf *sbuf_uionew(struct sbuf *, struct uio *, int *); |
---|
92 | int sbuf_bcopyin(struct sbuf *, const void *, size_t); |
---|
93 | int sbuf_copyin(struct sbuf *, const void *, size_t); |
---|
94 | #endif |
---|
95 | __END_DECLS |
---|
96 | |
---|
97 | #endif |
---|