📄 buf.h
字号:
/*
buf.h
*/
#ifndef BUF_H
#define BUF_H
#ifndef BUF_S
#define BUF_S 32768
#endif
#define MAX_BUFREQ_PRI 10
#define ETH_PRI_PORTBUFS 3
#define ETH_PRI_EXP_FDBUFS 4
#define ETH_PRI_FDBUFS 5
#define ICMP_PRI_QUEUE 1
#define TCP_PRI_FRAG2SEND 4
#define TCP_PRI_CONNwoUSER 6
#define TCP_PRI_CONN_INUSE 9
#define UDP_PRI_EXP_FDBUFS 5
#define UDP_PRI_FDBUFS 6
struct buf;
typedef void (*buffree_t) ARGS(( struct buf *buffer ));
typedef void (*bf_freereq_t) ARGS(( int priority, size_t reqsize ));
typedef struct buf
{
int buf_linkC;
void *buf_next;
buffree_t buf_free;
size_t buf_size;
char *buf_data_p;
} buf_t;
typedef struct acc
{
int acc_linkC;
int acc_offset, acc_length;
buf_t *acc_buffer;
struct acc *acc_next, *acc_ext_link;
} acc_t;
extern size_t bf_free_buffsize;
extern acc_t *bf_temporary_acc;
/* For debugging... */
#if DEBUG & 256
#define bf_memreq(a) (bf_memreq_file= __FILE__, bf_memreq_line= __LINE__, \
_bf_memreq(a))
#endif
#if DEBUG & 256
#define bf_cut(a,b,c) (bf_cut_file= __FILE__, bf_cut_line= __LINE__, \
_bf_cut(a,b,c))
#endif
#if DEBUG & 256
#define bf_packIffLess(a,b) (bf_pack_file= __FILE__, bf_pack_line= __LINE__, \
_bf_packIffLess(a,b))
#endif
#if DEBUG & 256
#define bf_bufsize(a) (bf_bufsize_file= __FILE__, bf_bufsize_line= __LINE__, \
_bf_bufsize(a))
#endif
#ifdef bf_memreq
extern char *bf_memreq_file;
extern int bf_memreq_line;
#endif
#ifdef bf_cut
extern char *bf_cut_file;
extern int bf_cut_line;
#endif
#ifdef bf_packIffLess
extern char *bf_pack_file;
extern int bf_pack_line;
#endif
#ifdef bf_bufsize
extern char *bf_bufsize_file;
extern int bf_bufsize_line;
#endif
/* Prototypes */
void bf_init ARGS(( void ));
void bf_logon ARGS(( bf_freereq_t func ));
#ifndef bf_memreq
acc_t *bf_memreq ARGS(( unsigned size));
#else
acc_t *_bf_memreq ARGS(( unsigned size));
#endif
/* the result is an acc with linkC == 1 */
acc_t *bf_dupacc ARGS(( acc_t *acc ));
/* the result is an acc with linkC == 1 identical to the given one */
void bf_afree ARGS(( acc_t *acc));
/* this reduces the linkC off the given acc with one */
acc_t *bf_pack ARGS(( acc_t *pack));
/* this gives a packed copy of the given acc, the linkC of the given acc is
reduced by one, the linkC of the result == 1 */
#ifndef bf_packIffLess
acc_t *bf_packIffLess ARGS(( acc_t *pack, int min_len ));
#else
acc_t *_bf_packIffLess ARGS(( acc_t *pack, int min_len ));
#endif
/* this performs a bf_pack iff pack->acc_length<min_len */
#ifndef bf_bufsize
size_t bf_bufsize ARGS(( acc_t *pack));
#else
size_t _bf_bufsize ARGS(( acc_t *pack));
#endif
/* this gives the length of the buffer specified by the given acc. The linkC
of the given acc remains the same */
#ifndef bf_cut
acc_t *bf_cut ARGS(( acc_t *data, unsigned offset,
unsigned length ));
#else
acc_t *_bf_cut ARGS(( acc_t *data, unsigned offset,
unsigned length ));
#endif
/* the result is a cut of the buffer from offset with length length.
The linkC of the result == 1, the linkC of the given acc remains the
same. */
acc_t *bf_append ARGS(( acc_t *data_first, acc_t *data_second ));
/* data_second is appended after data_first, a link is returned to the
result and the linkCs of data_first and data_second are reduced.
further more, if the contents of the last part of data_first and
the first part of data_second fit in a buffer, both parts are
copied into a (possibly fresh) buffer
*/
#define ptr2acc_data(/* acc_t * */ a) (bf_temporary_acc=(a), \
(&bf_temporary_acc->acc_buffer->buf_data_p[bf_temporary_acc-> \
acc_offset]))
#define bf_chkbuf(buf) ((buf)? (assert((buf)->acc_linkC>0), \
assert((buf)->acc_buffer), \
assert((buf)->acc_buffer->buf_linkC>0)) : 0)
void bf_check_all_bufs ARGS(( void ));
/* try to get all buffers back for debug purposes */
#endif /* BUF_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -