1*7a8d932bSJohn Chung /* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
2*7a8d932bSJohn Chung #ifndef PLDM_MSGBUF_HPP
3*7a8d932bSJohn Chung #define PLDM_MSGBUF_HPP
4*7a8d932bSJohn Chung
5*7a8d932bSJohn Chung #include <libpldm/compiler.h>
6*7a8d932bSJohn Chung
7*7a8d932bSJohn Chung #include "msgbuf/core.h"
8*7a8d932bSJohn Chung
9*7a8d932bSJohn Chung /*
10*7a8d932bSJohn Chung * Use the C++ Function Overload to keep pldm_msgbuf related function consistent
11*7a8d932bSJohn Chung * and to produce compile-time errors when the wrong pldm_msgbuf type is passed.
12*7a8d932bSJohn Chung *
13*7a8d932bSJohn Chung * Previously we cast away `const` in `pldm_msgbuf_init_error()`, which was a
14*7a8d932bSJohn Chung * hack. Instead, introduce:
15*7a8d932bSJohn Chung * - pldm_msgbuf_ro: read-only buffer with a `const` cursor
16*7a8d932bSJohn Chung * - pldm_msgbuf_rw: read-write buffer with a non-const cursor
17*7a8d932bSJohn Chung *
18*7a8d932bSJohn Chung * `pldm_msgbuf_ro` is used by decode APIs to extract payloads into PLDM
19*7a8d932bSJohn Chung * structures. `pldm_msgbuf_rw` is used by encode APIs to insert payloads from
20*7a8d932bSJohn Chung * PLDM structures.
21*7a8d932bSJohn Chung */
22*7a8d932bSJohn Chung
23*7a8d932bSJohn Chung #include <cstdint>
24*7a8d932bSJohn Chung #include <cstdio>
25*7a8d932bSJohn Chung #include <type_traits>
26*7a8d932bSJohn Chung
27*7a8d932bSJohn Chung // NOLINTBEGIN(bugprone-macro-parentheses)
28*7a8d932bSJohn Chung // NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
29*7a8d932bSJohn Chung #define PLDM__MSGBUF_DEFINE_P(name, mode) \
30*7a8d932bSJohn Chung struct pldm_msgbuf_##mode _##name LIBPLDM_CC_CLEANUP( \
31*7a8d932bSJohn Chung pldm__msgbuf_##mode##_cleanup) = {NULL, INTMAX_MIN}; \
32*7a8d932bSJohn Chung auto* name = &(_##name)
33*7a8d932bSJohn Chung // NOLINTEND(bugprone-macro-parentheses)
34*7a8d932bSJohn Chung
35*7a8d932bSJohn Chung #define PLDM_MSGBUF_RO_DEFINE_P(name) PLDM__MSGBUF_DEFINE_P(name, ro)
36*7a8d932bSJohn Chung #define PLDM_MSGBUF_RW_DEFINE_P(name) PLDM__MSGBUF_DEFINE_P(name, rw)
37*7a8d932bSJohn Chung
pldm_msgbuf_init_errno(struct pldm_msgbuf_ro * ctx,size_t minsize,const void * buf,size_t len)38*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int pldm_msgbuf_init_errno(struct pldm_msgbuf_ro* ctx,
39*7a8d932bSJohn Chung size_t minsize,
40*7a8d932bSJohn Chung const void* buf, size_t len)
41*7a8d932bSJohn Chung {
42*7a8d932bSJohn Chung return pldm_msgbuf_ro_init_errno(ctx, minsize, buf, len);
43*7a8d932bSJohn Chung }
44*7a8d932bSJohn Chung
pldm_msgbuf_init_errno(struct pldm_msgbuf_rw * ctx,size_t minsize,const void * buf,size_t len)45*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int pldm_msgbuf_init_errno(struct pldm_msgbuf_rw* ctx,
46*7a8d932bSJohn Chung size_t minsize,
47*7a8d932bSJohn Chung const void* buf, size_t len)
48*7a8d932bSJohn Chung {
49*7a8d932bSJohn Chung return pldm_msgbuf_rw_init_errno(ctx, minsize, buf, len);
50*7a8d932bSJohn Chung }
51*7a8d932bSJohn Chung
pldm_msgbuf_validate(struct pldm_msgbuf_ro * ctx)52*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int pldm_msgbuf_validate(struct pldm_msgbuf_ro* ctx)
53*7a8d932bSJohn Chung {
54*7a8d932bSJohn Chung return pldm_msgbuf_ro_validate(ctx);
55*7a8d932bSJohn Chung }
56*7a8d932bSJohn Chung
pldm_msgbuf_validate(struct pldm_msgbuf_rw * ctx)57*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int pldm_msgbuf_validate(struct pldm_msgbuf_rw* ctx)
58*7a8d932bSJohn Chung {
59*7a8d932bSJohn Chung return pldm_msgbuf_rw_validate(ctx);
60*7a8d932bSJohn Chung }
61*7a8d932bSJohn Chung
62*7a8d932bSJohn Chung // NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
pldm__msgbuf_invalidate(struct pldm_msgbuf_ro * ctx)63*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int pldm__msgbuf_invalidate(struct pldm_msgbuf_ro* ctx)
64*7a8d932bSJohn Chung {
65*7a8d932bSJohn Chung return pldm__msgbuf_ro_invalidate(ctx);
66*7a8d932bSJohn Chung }
67*7a8d932bSJohn Chung
68*7a8d932bSJohn Chung // NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
pldm__msgbuf_invalidate(struct pldm_msgbuf_rw * ctx)69*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int pldm__msgbuf_invalidate(struct pldm_msgbuf_rw* ctx)
70*7a8d932bSJohn Chung {
71*7a8d932bSJohn Chung return pldm__msgbuf_rw_invalidate(ctx);
72*7a8d932bSJohn Chung }
73*7a8d932bSJohn Chung
pldm_msgbuf_consumed(struct pldm_msgbuf_ro * ctx)74*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int pldm_msgbuf_consumed(struct pldm_msgbuf_ro* ctx)
75*7a8d932bSJohn Chung {
76*7a8d932bSJohn Chung return pldm_msgbuf_ro_consumed(ctx);
77*7a8d932bSJohn Chung }
78*7a8d932bSJohn Chung
pldm_msgbuf_consumed(struct pldm_msgbuf_rw * ctx)79*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int pldm_msgbuf_consumed(struct pldm_msgbuf_rw* ctx)
80*7a8d932bSJohn Chung {
81*7a8d932bSJohn Chung return pldm_msgbuf_rw_consumed(ctx);
82*7a8d932bSJohn Chung }
83*7a8d932bSJohn Chung
pldm_msgbuf_discard(struct pldm_msgbuf_ro * ctx,int error)84*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int pldm_msgbuf_discard(struct pldm_msgbuf_ro* ctx,
85*7a8d932bSJohn Chung int error)
86*7a8d932bSJohn Chung {
87*7a8d932bSJohn Chung return pldm_msgbuf_ro_discard(ctx, error);
88*7a8d932bSJohn Chung }
89*7a8d932bSJohn Chung
pldm_msgbuf_discard(struct pldm_msgbuf_rw * ctx,int error)90*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int pldm_msgbuf_discard(struct pldm_msgbuf_rw* ctx,
91*7a8d932bSJohn Chung int error)
92*7a8d932bSJohn Chung {
93*7a8d932bSJohn Chung return pldm_msgbuf_rw_discard(ctx, error);
94*7a8d932bSJohn Chung }
95*7a8d932bSJohn Chung
pldm_msgbuf_complete(struct pldm_msgbuf_ro * ctx)96*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int pldm_msgbuf_complete(struct pldm_msgbuf_ro* ctx)
97*7a8d932bSJohn Chung {
98*7a8d932bSJohn Chung return pldm_msgbuf_ro_complete(ctx);
99*7a8d932bSJohn Chung }
100*7a8d932bSJohn Chung
pldm_msgbuf_complete(struct pldm_msgbuf_rw * ctx)101*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int pldm_msgbuf_complete(struct pldm_msgbuf_rw* ctx)
102*7a8d932bSJohn Chung {
103*7a8d932bSJohn Chung return pldm_msgbuf_rw_complete(ctx);
104*7a8d932bSJohn Chung }
105*7a8d932bSJohn Chung
106*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int
pldm_msgbuf_complete_consumed(struct pldm_msgbuf_ro * ctx)107*7a8d932bSJohn Chung pldm_msgbuf_complete_consumed(struct pldm_msgbuf_ro* ctx)
108*7a8d932bSJohn Chung {
109*7a8d932bSJohn Chung return pldm_msgbuf_ro_complete_consumed(ctx);
110*7a8d932bSJohn Chung }
111*7a8d932bSJohn Chung
112*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int
pldm_msgbuf_complete_consumed(struct pldm_msgbuf_rw * ctx)113*7a8d932bSJohn Chung pldm_msgbuf_complete_consumed(struct pldm_msgbuf_rw* ctx)
114*7a8d932bSJohn Chung {
115*7a8d932bSJohn Chung return pldm_msgbuf_rw_complete_consumed(ctx);
116*7a8d932bSJohn Chung }
117*7a8d932bSJohn Chung
118*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int
pldm_msgbuf_span_required(struct pldm_msgbuf_ro * ctx,size_t required,const void ** cursor)119*7a8d932bSJohn Chung pldm_msgbuf_span_required(struct pldm_msgbuf_ro* ctx, size_t required,
120*7a8d932bSJohn Chung const void** cursor)
121*7a8d932bSJohn Chung {
122*7a8d932bSJohn Chung return pldm_msgbuf_ro_span_required(ctx, required, cursor);
123*7a8d932bSJohn Chung }
124*7a8d932bSJohn Chung
125*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int
pldm_msgbuf_span_required(struct pldm_msgbuf_rw * ctx,size_t required,void ** cursor)126*7a8d932bSJohn Chung pldm_msgbuf_span_required(struct pldm_msgbuf_rw* ctx, size_t required,
127*7a8d932bSJohn Chung void** cursor)
128*7a8d932bSJohn Chung {
129*7a8d932bSJohn Chung return pldm_msgbuf_rw_span_required(ctx, required, cursor);
130*7a8d932bSJohn Chung }
131*7a8d932bSJohn Chung
132*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int
pldm_msgbuf_span_string_ascii(struct pldm_msgbuf_rw * ctx,void ** cursor,size_t * length)133*7a8d932bSJohn Chung pldm_msgbuf_span_string_ascii(struct pldm_msgbuf_rw* ctx, void** cursor,
134*7a8d932bSJohn Chung size_t* length)
135*7a8d932bSJohn Chung {
136*7a8d932bSJohn Chung return pldm_msgbuf_rw_span_string_ascii(ctx, cursor, length);
137*7a8d932bSJohn Chung }
138*7a8d932bSJohn Chung
139*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int
pldm_msgbuf_span_string_ascii(struct pldm_msgbuf_ro * ctx,const void ** cursor,size_t * length)140*7a8d932bSJohn Chung pldm_msgbuf_span_string_ascii(struct pldm_msgbuf_ro* ctx,
141*7a8d932bSJohn Chung const void** cursor, size_t* length)
142*7a8d932bSJohn Chung {
143*7a8d932bSJohn Chung return pldm_msgbuf_ro_span_string_ascii(ctx, cursor, length);
144*7a8d932bSJohn Chung }
145*7a8d932bSJohn Chung
pldm_msgbuf_span_string_utf16(pldm_msgbuf_ro * ctx,const void ** cursor,size_t * length)146*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int pldm_msgbuf_span_string_utf16(pldm_msgbuf_ro* ctx,
147*7a8d932bSJohn Chung const void** cursor,
148*7a8d932bSJohn Chung size_t* length)
149*7a8d932bSJohn Chung {
150*7a8d932bSJohn Chung return pldm_msgbuf_ro_span_string_utf16(ctx, cursor, length);
151*7a8d932bSJohn Chung }
152*7a8d932bSJohn Chung
pldm_msgbuf_span_string_utf16(pldm_msgbuf_rw * ctx,void ** cursor,size_t * length)153*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int pldm_msgbuf_span_string_utf16(pldm_msgbuf_rw* ctx,
154*7a8d932bSJohn Chung void** cursor,
155*7a8d932bSJohn Chung size_t* length)
156*7a8d932bSJohn Chung {
157*7a8d932bSJohn Chung return pldm_msgbuf_rw_span_string_utf16(ctx, cursor, length);
158*7a8d932bSJohn Chung }
159*7a8d932bSJohn Chung
160*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int
pldm_msgbuf_span_remaining(struct pldm_msgbuf_rw * ctx,void ** cursor,size_t * len)161*7a8d932bSJohn Chung pldm_msgbuf_span_remaining(struct pldm_msgbuf_rw* ctx, void** cursor,
162*7a8d932bSJohn Chung size_t* len)
163*7a8d932bSJohn Chung {
164*7a8d932bSJohn Chung return pldm_msgbuf_rw_span_remaining(ctx, cursor, len);
165*7a8d932bSJohn Chung }
166*7a8d932bSJohn Chung
167*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int
pldm_msgbuf_span_remaining(struct pldm_msgbuf_ro * ctx,const void ** cursor,size_t * len)168*7a8d932bSJohn Chung pldm_msgbuf_span_remaining(struct pldm_msgbuf_ro* ctx, const void** cursor,
169*7a8d932bSJohn Chung size_t* len)
170*7a8d932bSJohn Chung {
171*7a8d932bSJohn Chung return pldm_msgbuf_ro_span_remaining(ctx, cursor, len);
172*7a8d932bSJohn Chung }
173*7a8d932bSJohn Chung
pldm_msgbuf_span_until(struct pldm_msgbuf_ro * ctx,size_t trailer,const void ** cursor,size_t * length)174*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int pldm_msgbuf_span_until(struct pldm_msgbuf_ro* ctx,
175*7a8d932bSJohn Chung size_t trailer,
176*7a8d932bSJohn Chung const void** cursor,
177*7a8d932bSJohn Chung size_t* length)
178*7a8d932bSJohn Chung {
179*7a8d932bSJohn Chung return pldm_msgbuf_ro_span_until(ctx, trailer, cursor, length);
180*7a8d932bSJohn Chung }
181*7a8d932bSJohn Chung
pldm_msgbuf_span_until(struct pldm_msgbuf_rw * ctx,size_t trailer,void ** cursor,size_t * length)182*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int pldm_msgbuf_span_until(struct pldm_msgbuf_rw* ctx,
183*7a8d932bSJohn Chung size_t trailer,
184*7a8d932bSJohn Chung void** cursor,
185*7a8d932bSJohn Chung size_t* length)
186*7a8d932bSJohn Chung {
187*7a8d932bSJohn Chung return pldm_msgbuf_rw_span_until(ctx, trailer, cursor, length);
188*7a8d932bSJohn Chung }
189*7a8d932bSJohn Chung
190*7a8d932bSJohn Chung #define pldm_msgbuf_extract_typecheck(ty, fn, dst, ...) \
191*7a8d932bSJohn Chung pldm_msgbuf_typecheck_##ty<decltype(dst)>(__VA_ARGS__)
192*7a8d932bSJohn Chung
193*7a8d932bSJohn Chung #define pldm_msgbuf_extract_uint8(ctx, dst) \
194*7a8d932bSJohn Chung pldm_msgbuf_extract_typecheck(uint8_t, pldm__msgbuf_extract_uint8, dst, \
195*7a8d932bSJohn Chung ctx, (void*)&(dst))
196*7a8d932bSJohn Chung
197*7a8d932bSJohn Chung #define pldm_msgbuf_extract_int8(ctx, dst) \
198*7a8d932bSJohn Chung pldm_msgbuf_extract_typecheck(int8_t, pldm__msgbuf_extract_int8, dst, ctx, \
199*7a8d932bSJohn Chung (void*)&(dst))
200*7a8d932bSJohn Chung
201*7a8d932bSJohn Chung #define pldm_msgbuf_extract_uint16(ctx, dst) \
202*7a8d932bSJohn Chung pldm_msgbuf_extract_typecheck(uint16_t, pldm__msgbuf_extract_uint16, dst, \
203*7a8d932bSJohn Chung ctx, (void*)&(dst))
204*7a8d932bSJohn Chung
205*7a8d932bSJohn Chung #define pldm_msgbuf_extract_int16(ctx, dst) \
206*7a8d932bSJohn Chung pldm_msgbuf_extract_typecheck(int16_t, pldm__msgbuf_extract_int16, dst, \
207*7a8d932bSJohn Chung ctx, (void*)&(dst))
208*7a8d932bSJohn Chung
209*7a8d932bSJohn Chung #define pldm_msgbuf_extract_uint32(ctx, dst) \
210*7a8d932bSJohn Chung pldm_msgbuf_extract_typecheck(uint32_t, pldm__msgbuf_extract_uint32, dst, \
211*7a8d932bSJohn Chung ctx, (void*)&(dst))
212*7a8d932bSJohn Chung
213*7a8d932bSJohn Chung #define pldm_msgbuf_extract_int32(ctx, dst) \
214*7a8d932bSJohn Chung pldm_msgbuf_extract_typecheck(int32_t, pldm__msgbuf_extract_int32, dst, \
215*7a8d932bSJohn Chung ctx, (void*)&(dst))
216*7a8d932bSJohn Chung
217*7a8d932bSJohn Chung #define pldm_msgbuf_extract_real32(ctx, dst) \
218*7a8d932bSJohn Chung pldm_msgbuf_extract_typecheck(real32_t, pldm__msgbuf_extract_real32, dst, \
219*7a8d932bSJohn Chung ctx, (void*)&(dst))
220*7a8d932bSJohn Chung
221*7a8d932bSJohn Chung template <typename T>
222*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int
pldm_msgbuf_typecheck_uint8_t(struct pldm_msgbuf_ro * ctx,void * buf)223*7a8d932bSJohn Chung pldm_msgbuf_typecheck_uint8_t(struct pldm_msgbuf_ro* ctx, void* buf)
224*7a8d932bSJohn Chung {
225*7a8d932bSJohn Chung static_assert(std::is_same<uint8_t, T>::value);
226*7a8d932bSJohn Chung return pldm__msgbuf_extract_uint8(ctx, buf);
227*7a8d932bSJohn Chung }
228*7a8d932bSJohn Chung
229*7a8d932bSJohn Chung template <typename T>
230*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int
pldm_msgbuf_typecheck_int8_t(struct pldm_msgbuf_ro * ctx,void * buf)231*7a8d932bSJohn Chung pldm_msgbuf_typecheck_int8_t(struct pldm_msgbuf_ro* ctx, void* buf)
232*7a8d932bSJohn Chung {
233*7a8d932bSJohn Chung static_assert(std::is_same<int8_t, T>::value);
234*7a8d932bSJohn Chung return pldm__msgbuf_extract_int8(ctx, buf);
235*7a8d932bSJohn Chung }
236*7a8d932bSJohn Chung
237*7a8d932bSJohn Chung template <typename T>
238*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int
pldm_msgbuf_typecheck_uint16_t(struct pldm_msgbuf_ro * ctx,void * buf)239*7a8d932bSJohn Chung pldm_msgbuf_typecheck_uint16_t(struct pldm_msgbuf_ro* ctx, void* buf)
240*7a8d932bSJohn Chung {
241*7a8d932bSJohn Chung static_assert(std::is_same<uint16_t, T>::value);
242*7a8d932bSJohn Chung return pldm__msgbuf_extract_uint16(ctx, buf);
243*7a8d932bSJohn Chung }
244*7a8d932bSJohn Chung
245*7a8d932bSJohn Chung template <typename T>
246*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int
pldm_msgbuf_typecheck_int16_t(struct pldm_msgbuf_ro * ctx,void * buf)247*7a8d932bSJohn Chung pldm_msgbuf_typecheck_int16_t(struct pldm_msgbuf_ro* ctx, void* buf)
248*7a8d932bSJohn Chung {
249*7a8d932bSJohn Chung static_assert(std::is_same<int16_t, T>::value);
250*7a8d932bSJohn Chung return pldm__msgbuf_extract_int16(ctx, buf);
251*7a8d932bSJohn Chung }
252*7a8d932bSJohn Chung
253*7a8d932bSJohn Chung template <typename T>
254*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int
pldm_msgbuf_typecheck_uint32_t(struct pldm_msgbuf_ro * ctx,void * buf)255*7a8d932bSJohn Chung pldm_msgbuf_typecheck_uint32_t(struct pldm_msgbuf_ro* ctx, void* buf)
256*7a8d932bSJohn Chung {
257*7a8d932bSJohn Chung static_assert(std::is_same<uint32_t, T>::value);
258*7a8d932bSJohn Chung return pldm__msgbuf_extract_uint32(ctx, buf);
259*7a8d932bSJohn Chung }
260*7a8d932bSJohn Chung
261*7a8d932bSJohn Chung template <typename T>
262*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int
pldm_msgbuf_typecheck_int32_t(struct pldm_msgbuf_ro * ctx,void * buf)263*7a8d932bSJohn Chung pldm_msgbuf_typecheck_int32_t(struct pldm_msgbuf_ro* ctx, void* buf)
264*7a8d932bSJohn Chung {
265*7a8d932bSJohn Chung static_assert(std::is_same<int32_t, T>::value);
266*7a8d932bSJohn Chung return pldm__msgbuf_extract_int32(ctx, buf);
267*7a8d932bSJohn Chung }
268*7a8d932bSJohn Chung
269*7a8d932bSJohn Chung template <typename T>
270*7a8d932bSJohn Chung LIBPLDM_CC_ALWAYS_INLINE int
pldm_msgbuf_typecheck_real32_t(struct pldm_msgbuf_ro * ctx,void * buf)271*7a8d932bSJohn Chung pldm_msgbuf_typecheck_real32_t(struct pldm_msgbuf_ro* ctx, void* buf)
272*7a8d932bSJohn Chung {
273*7a8d932bSJohn Chung static_assert(std::is_same<real32_t, T>::value);
274*7a8d932bSJohn Chung return pldm__msgbuf_extract_real32(ctx, buf);
275*7a8d932bSJohn Chung }
276*7a8d932bSJohn Chung
277*7a8d932bSJohn Chung #endif /* BUF_HPP */
278