File: dbuf.h

package info (click to toggle)
dancer-ircd 1.0.36-8
  • links: PTS, VCS
  • area: main
  • in suites: lenny, squeeze
  • size: 3,204 kB
  • ctags: 2,703
  • sloc: ansic: 36,121; sh: 3,534; perl: 612; makefile: 307
file content (133 lines) | stat: -rw-r--r-- 4,695 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/************************************************************************
 *   IRC - Internet Relay Chat, include/dbuf.h
 *   Copyright (C) 1990 Markku Savela
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 1, or (at your option)
 *   any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
/*  */
#ifndef INCLUDED_dbuf_h
#define INCLUDED_dbuf_h
#ifndef INCLUDED_config_h
#include "config.h"
#endif
#ifndef INCLUDED_sys_types_h
#include <sys/types.h>
#define INCLUDED_sys_types_h
#endif

/*
** dbuf is a collection of functions which can be used to
** maintain a dynamic buffering of a byte stream.
** Functions allocate and release memory dynamically as
** required [Actually, there is nothing that prevents
** this package maintaining the buffer on disk, either]
*/
struct DBufBuffer;

/*
** These structure definitions are only here to be used
** as a whole, *DO NOT EVER REFER TO THESE FIELDS INSIDE
** THE STRUCTURES*! It must be possible to change the internal
** implementation of this package without changing the
** interface.
*/
struct DBuf {
  struct DBufBuffer* head;   /* First data buffer, if length > 0 */
  struct DBufBuffer* tail;   /* last data buffer, if length > 0 */
  size_t             length; /* Current number of bytes stored */
};

extern int DBufCount;
extern int DBufUsedCount;

/*
** dbuf_put
**      Append the number of bytes to the buffer, allocating more
**      memory as needed. Bytes are copied into internal buffers
**      from users buffer.
**
**      returns > 0, if operation successfull
**              < 0, if failed (due memory allocation problem)
*/
extern int dbuf_put(struct DBuf* dyn, const char* buf, size_t len);

/*
** dbuf_get
**      Remove number of bytes from the buffer, releasing dynamic
**      memory, if applicaple. Bytes are copied from internal buffers
**      to users buffer.
**
**      returns the number of bytes actually copied to users buffer,
**              if >= 0, any value less than the size of the users
**              buffer indicates the dbuf became empty by this operation.
**
**              Return 0 indicates that buffer was already empty.
**
**              Negative return values indicate some unspecified
**              error condition, rather fatal...
*/
extern size_t dbuf_get(struct DBuf* dbuf, char* buf, size_t len);

/*
** dbuf_map, dbuf_delete
**      These functions are meant to be used in pairs and offer
**      a more efficient way of emptying the buffer than the
**      normal 'dbuf_get' would allow--less copying needed.
**
**      map     returns a pointer to a largest contiguous section
**              of bytes in front of the buffer, the length of the
**              section is placed into the indicated "long int"
**              variable. Returns NULL *and* zero length, if the
**              buffer is empty.
**
**      delete  removes the specified number of bytes from the
**              front of the buffer releasing any memory used for them.
**
**      Example use (ignoring empty condition here ;)
**
**              buf = dbuf_map(&dyn, &count);
**              <process N bytes (N <= count) of data pointed by 'buf'>
**              dbuf_delete(&dyn, N);
**
**      Note:   delete can be used alone, there is no real binding
**              between map and delete functions...
*/
/*
 * dyn - Dynamic buffer header
 * len - Return number of bytes accessible 
 */
extern const char* dbuf_map(const struct DBuf* dyn, size_t* len);
extern void        dbuf_delete(struct DBuf* dyn, size_t len);

/*
** DBufLength
**      Return the current number of bytes stored into the buffer.
**      (One should use this instead of referencing the internal
**      length field explicitly...)
*/
#define DBufLength(dyn) ((dyn)->length)

/*
** DBufClear
**      Scratch the current content of the buffer. Release all
**      allocated buffers and make it empty.
*/
#define DBufClear(dyn)  dbuf_delete((dyn), DBufLength(dyn))

extern int  dbuf_getmsg(struct DBuf* dyn, char* buf, size_t len);
extern void dbuf_init(void);
extern void count_dbuf_memory(size_t* allocated, size_t* used);

#endif /* INCLUDED_dbuf_h */