annotate buffer.c @ 442:0d09c7592828

buffer: introduce a stdio buffer type Instead of buffering the appended data, the data is written to a FILE * using fwrite(3). Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Sun, 01 Apr 2018 14:24:56 -0400
parents df90b1b883d8
children 584def85123e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
1 /*
440
df90b1b883d8 buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 278
diff changeset
2 * Copyright (c) 2017-2018 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
3 *
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
5 * of this software and associated documentation files (the "Software"), to deal
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
6 * in the Software without restriction, including without limitation the rights
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
8 * copies of the Software, and to permit persons to whom the Software is
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
9 * furnished to do so, subject to the following conditions:
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
10 *
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
11 * The above copyright notice and this permission notice shall be included in
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
12 * all copies or substantial portions of the Software.
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
13 *
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
20 * SOFTWARE.
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
21 */
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
22
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
23 #include <stdbool.h>
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
24
260
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
25 #include <jeffpc/int.h>
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
26
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
27 #include "buffer_impl.h"
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
28
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
29 struct buffer *buffer_alloc(size_t expected_size)
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
30 {
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
31 struct buffer *buffer;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
32
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
33 buffer = malloc(sizeof(struct buffer));
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
34 if (!buffer)
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
35 return ERR_PTR(-ENOMEM);
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
36
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
37 buffer->data = malloc(expected_size ? expected_size : 1);
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
38 if (!buffer->data) {
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
39 free(buffer);
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
40 return ERR_PTR(-ENOMEM);
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
41 }
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
42
260
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
43 buffer->off = 0;
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
44 buffer->used = 0;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
45 buffer->allocsize = expected_size;
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
46 buffer->ops = &heap_buffer;
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
47
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
48 return buffer;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
49 }
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
50
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
51 void buffer_free(struct buffer *buffer)
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
52 {
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
53 if (!buffer)
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
54 return;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
55
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
56 if (buffer->ops->free)
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
57 buffer->ops->free(buffer->data);
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
58
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
59 free(buffer);
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
60 }
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
61
251
5f9eebf77662 buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 250
diff changeset
62 void buffer_init_sink(struct buffer *buffer)
5f9eebf77662 buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 250
diff changeset
63 {
5f9eebf77662 buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 250
diff changeset
64 buffer->data = NULL;
260
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
65 buffer->off = 0;
251
5f9eebf77662 buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 250
diff changeset
66 buffer->used = 0;
5f9eebf77662 buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 250
diff changeset
67 buffer->allocsize = SIZE_MAX;
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
68 buffer->ops = &sink_buffer;
254
de0709ff0895 buffer: add a borrowed-const-data buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 251
diff changeset
69 }
de0709ff0895 buffer: add a borrowed-const-data buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 251
diff changeset
70
de0709ff0895 buffer: add a borrowed-const-data buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 251
diff changeset
71 void buffer_init_const(struct buffer *buffer, const void *data, size_t size)
de0709ff0895 buffer: add a borrowed-const-data buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 251
diff changeset
72 {
de0709ff0895 buffer: add a borrowed-const-data buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 251
diff changeset
73 buffer->data = (void *) data;
260
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
74 buffer->off = 0;
254
de0709ff0895 buffer: add a borrowed-const-data buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 251
diff changeset
75 buffer->used = size;
de0709ff0895 buffer: add a borrowed-const-data buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 251
diff changeset
76 buffer->allocsize = size;
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
77 buffer->ops = &const_buffer;
251
5f9eebf77662 buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 250
diff changeset
78 }
5f9eebf77662 buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 250
diff changeset
79
442
0d09c7592828 buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 440
diff changeset
80 void buffer_init_stdio(struct buffer *buffer, FILE *f)
0d09c7592828 buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 440
diff changeset
81 {
0d09c7592828 buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 440
diff changeset
82 buffer->data = NULL;
0d09c7592828 buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 440
diff changeset
83 buffer->off = 0;
0d09c7592828 buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 440
diff changeset
84 buffer->used = 0;
0d09c7592828 buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 440
diff changeset
85 buffer->allocsize = SIZE_MAX;
0d09c7592828 buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 440
diff changeset
86 buffer->ops = &stdio_buffer;
0d09c7592828 buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 440
diff changeset
87 buffer->private = f;
0d09c7592828 buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 440
diff changeset
88 }
0d09c7592828 buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 440
diff changeset
89
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
90 static int resize(struct buffer *buffer, size_t newsize)
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
91 {
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
92 void *tmp;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
93
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
94 if (newsize <= buffer->allocsize)
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
95 return 0;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
96
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
97 if (!buffer->ops->realloc)
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
98 return -ENOTSUP;
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
99
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
100 tmp = buffer->ops->realloc(buffer->data, newsize);
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
101 if (!tmp)
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
102 return -ENOMEM;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
103
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
104 buffer->data = tmp;
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
105 buffer->allocsize = newsize;
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
106
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
107 return 0;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
108 }
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
109
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
110 int buffer_append(struct buffer *buffer, const void *data, size_t size)
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
111 {
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
112 int ret;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
113
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
114 if (!buffer)
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
115 return -EINVAL;
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
116
278
47df3cfdeca7 buffer: allow zero length append
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 261
diff changeset
117 if (!data && size)
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
118 return -EINVAL;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
119
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
120 if (buffer->ops->check_append) {
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
121 ret = buffer->ops->check_append(buffer, data, size);
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
122 if (ret)
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
123 return ret;
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
124 }
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
125
278
47df3cfdeca7 buffer: allow zero length append
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 261
diff changeset
126 if (!size)
47df3cfdeca7 buffer: allow zero length append
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 261
diff changeset
127 return 0; /* append(..., 0) is a no-op */
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
128
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
129 ret = resize(buffer, buffer->used + size);
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
130 if (ret)
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
131 return ret;
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
132
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
133 buffer->ops->copyin(buffer, buffer->used, data, size);
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
134
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
135 buffer->used += size;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
136
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
137 return 0;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
138 }
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
139
260
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
140 ssize_t buffer_seek(struct buffer *buffer, off_t offset, int whence)
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
141 {
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
142 size_t newoff;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
143
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
144 if (!buffer)
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
145 return -EINVAL;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
146
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
147 switch (whence) {
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
148 case SEEK_SET:
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
149 if (offset < 0)
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
150 return -EINVAL;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
151 if (offset > buffer->used)
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
152 return -EINVAL;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
153
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
154 newoff = offset;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
155 break;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
156 case SEEK_CUR:
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
157 if ((offset > 0) &&
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
158 (offset > buffer->used - buffer->off))
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
159 return -EINVAL;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
160 if ((offset < 0) && (-offset > buffer->off))
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
161 return -EINVAL;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
162
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
163 newoff = buffer->off + offset;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
164 break;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
165 case SEEK_END:
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
166 if (offset > 0)
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
167 return -EINVAL;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
168 if (-offset > buffer->used)
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
169 return -EINVAL;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
170
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
171 newoff = buffer->off + offset;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
172 break;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
173 default:
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
174 return -EINVAL;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
175 }
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
176
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
177 if (newoff > SSIZE_MAX)
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
178 return -EOVERFLOW;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
179
440
df90b1b883d8 buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 278
diff changeset
180 if (buffer->ops->check_seek) {
df90b1b883d8 buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 278
diff changeset
181 ssize_t ret;
df90b1b883d8 buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 278
diff changeset
182
df90b1b883d8 buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 278
diff changeset
183 ret = buffer->ops->check_seek(buffer, offset, whence, newoff);
df90b1b883d8 buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 278
diff changeset
184 if (ret)
df90b1b883d8 buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 278
diff changeset
185 return ret;
df90b1b883d8 buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 278
diff changeset
186 }
df90b1b883d8 buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 278
diff changeset
187
260
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
188 buffer->off = newoff;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
189
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
190 return newoff;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
191 }
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
192
261
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
193 int buffer_truncate(struct buffer *buffer, size_t size)
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
194 {
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
195 int ret;
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
196
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
197 if (!buffer)
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
198 return -EINVAL;
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
199
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
200 if (buffer->ops->check_truncate) {
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
201 ret = buffer->ops->check_truncate(buffer, size);
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
202 if (ret)
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
203 return ret;
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
204 }
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
205
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
206 ret = resize(buffer, size);
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
207 if (ret)
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
208 return ret;
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
209
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
210 if (buffer->used < size)
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
211 buffer->ops->clear(buffer, buffer->used, size - buffer->used);
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
212
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
213 buffer->used = size;
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
214
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
215 return 0;
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
216 }
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
217
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
218 /*
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
219 * Generic implementations
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
220 */
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
221
261
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
222 /* clear implementations */
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
223 void generic_buffer_clear_memset(struct buffer *buffer, size_t off, size_t len)
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
224 {
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
225 memset(buffer->data + off, 0, len);
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
226 }
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
227
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
228 void generic_buffer_clear_nop(struct buffer *buffer, size_t off, size_t len)
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
229 {
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
230 }
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
231
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
232 void generic_buffer_clear_panic(struct buffer *buffer, size_t off, size_t len)
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
233 {
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
234 panic("buffer clear called");
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
235 }
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
236
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
237 /* copyin implementations */
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
238 void generic_buffer_copyin_memcpy(struct buffer *buffer, size_t off,
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
239 const void *newdata, size_t newdatalen)
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
240 {
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
241 memcpy(buffer->data + off, newdata, newdatalen);
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
242 }
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
243
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
244 void generic_buffer_copyin_nop(struct buffer *buffer, size_t off,
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
245 const void *newdata, size_t newdatalen)
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
246 {
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
247 }
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
248
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
249 void generic_buffer_copyin_panic(struct buffer *buffer, size_t off,
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
250 const void *newdata, size_t newdatalen)
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
251 {
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
252 panic("buffer copyin called");
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
253 }