Mercurial > libjeffpc
annotate buffer_static.c @ 712:8295148e8f44
buffer: rename internal 'used' member to a more obvious name
It really keeps track of the number of readable bytes in the buffer. In
other words, it keeps track of the size - hence the new name.
Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author | Josef 'Jeff' Sipek <jeffpc@josefsipek.net> |
---|---|
date | Tue, 19 Mar 2019 14:43:26 -0400 |
parents | 0fa2f6606c5e |
children | 1c4d7ff0a682 |
rev | line source |
---|---|
256
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
1 /* |
712
8295148e8f44
buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
611
diff
changeset
|
2 * Copyright (c) 2017-2019 Josef 'Jeff' Sipek <jeffpc@josefsipek.net> |
256
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
3 * |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
4 * Permission is hereby granted, free of charge, to any person obtaining a copy |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
5 * of this software and associated documentation files (the "Software"), to deal |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
6 * in the Software without restriction, including without limitation the rights |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
8 * copies of the Software, and to permit persons to whom the Software is |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
9 * furnished to do so, subject to the following conditions: |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
10 * |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
11 * The above copyright notice and this permission notice shall be included in |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
12 * all copies or substantial portions of the Software. |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
13 * |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
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 |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
20 * SOFTWARE. |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
21 */ |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
22 |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
23 #include "buffer_impl.h" |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
24 |
563
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
25 /* |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
26 * Static buffers |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
27 * |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
28 * Since we have a borrowed buffer we must never allow: |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
29 * |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
30 * - resizing of the buffer |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
31 * - freeing of the buffer |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
32 * |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
33 * Conveniently, if we leave the realloc op NULL, the generic code returns |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
34 * -ENOTSUP for us. Leaving the free op NULL turns it into a no-op. |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
35 * |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
36 * There is a slight difference between the read-only and read-write |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
37 * variants. Namely, the read-only variant does not support *any* writes or |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
38 * changes to the (apparent) buffer size. In both cases, -EROFS is |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
39 * returned. The read-write variant allows changes to the amount of used |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
40 * space, truncation, etc. as long as the result fits within the borrowed |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
41 * buffer. |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
42 */ |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
43 |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
44 static int static_buffer_check_append_ro(struct buffer *buffer, const void *data, |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
45 size_t size) |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
46 { |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
47 return -EROFS; |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
48 } |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
49 |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
50 static int static_buffer_check_append_rw(struct buffer *buffer, const void *data, |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
51 size_t size) |
256
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
52 { |
712
8295148e8f44
buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
611
diff
changeset
|
53 if ((buffer->size + size) <= buffer->allocsize) |
562
584def85123e
buffer: introduce a static read-write buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
261
diff
changeset
|
54 return 0; |
584def85123e
buffer: introduce a static read-write buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
261
diff
changeset
|
55 |
584def85123e
buffer: introduce a static read-write buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
261
diff
changeset
|
56 return -ENOSPC; |
256
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
57 } |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
58 |
563
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
59 static int static_buffer_check_truncate_ro(struct buffer *buffer, size_t size) |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
60 { |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
61 return -EROFS; |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
62 } |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
63 |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
64 static int static_buffer_check_truncate_rw(struct buffer *buffer, size_t size) |
261
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
65 { |
562
584def85123e
buffer: introduce a static read-write buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
261
diff
changeset
|
66 if (size <= buffer->allocsize) |
584def85123e
buffer: introduce a static read-write buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
261
diff
changeset
|
67 return 0; |
584def85123e
buffer: introduce a static read-write buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
261
diff
changeset
|
68 |
584def85123e
buffer: introduce a static read-write buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
261
diff
changeset
|
69 return -ENOSPC; |
261
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
70 } |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
71 |
611
0fa2f6606c5e
buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
563
diff
changeset
|
72 static int static_buffer_check_write_ro(struct buffer *buffer, const void *buf, |
0fa2f6606c5e
buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
563
diff
changeset
|
73 size_t len, size_t off) |
0fa2f6606c5e
buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
563
diff
changeset
|
74 { |
0fa2f6606c5e
buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
563
diff
changeset
|
75 return -EROFS; |
0fa2f6606c5e
buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
563
diff
changeset
|
76 } |
0fa2f6606c5e
buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
563
diff
changeset
|
77 |
0fa2f6606c5e
buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
563
diff
changeset
|
78 static int static_buffer_check_write_rw(struct buffer *buffer, const void *buf, |
0fa2f6606c5e
buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
563
diff
changeset
|
79 size_t len, size_t off) |
0fa2f6606c5e
buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
563
diff
changeset
|
80 { |
0fa2f6606c5e
buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
563
diff
changeset
|
81 if ((off + len) <= buffer->allocsize) |
0fa2f6606c5e
buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
563
diff
changeset
|
82 return 0; |
0fa2f6606c5e
buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
563
diff
changeset
|
83 |
0fa2f6606c5e
buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
563
diff
changeset
|
84 return -ENOSPC; |
0fa2f6606c5e
buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
563
diff
changeset
|
85 } |
0fa2f6606c5e
buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
563
diff
changeset
|
86 |
563
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
87 /* a read-only static buffer */ |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
88 const struct buffer_ops static_buffer_ro = { |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
89 .check_append = static_buffer_check_append_ro, |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
90 .check_truncate = static_buffer_check_truncate_ro, |
611
0fa2f6606c5e
buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
563
diff
changeset
|
91 .check_write = static_buffer_check_write_ro, |
256
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
92 |
563
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
93 .clear = generic_buffer_clear_panic, |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
94 .copyin = generic_buffer_copyin_panic, |
611
0fa2f6606c5e
buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
563
diff
changeset
|
95 .copyout = generic_buffer_copyout_memcpy, |
563
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
96 }; |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
97 |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
98 /* a read-write static buffer */ |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
99 const struct buffer_ops static_buffer_rw = { |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
100 .check_append = static_buffer_check_append_rw, |
bc0841b964fb
buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
562
diff
changeset
|
101 .check_truncate = static_buffer_check_truncate_rw, |
611
0fa2f6606c5e
buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
563
diff
changeset
|
102 .check_write = static_buffer_check_write_rw, |
256
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
103 |
562
584def85123e
buffer: introduce a static read-write buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
261
diff
changeset
|
104 .clear = generic_buffer_clear_memset, |
584def85123e
buffer: introduce a static read-write buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
261
diff
changeset
|
105 .copyin = generic_buffer_copyin_memcpy, |
611
0fa2f6606c5e
buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
563
diff
changeset
|
106 .copyout = generic_buffer_copyout_memcpy, |
256
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
107 }; |