root/trunk/src/buffer.h

Revision 2220, 4.9 kB (checked in by stbuehler, 3 months ago)

Use SAFE_BUF_STR in all output calls.

  • Property svn:eol-style set to native
Line 
1#ifndef _BUFFER_H_
2#define _BUFFER_H_
3
4#include "settings.h"
5
6#include <stdlib.h>
7#include <sys/types.h>
8
9#include "array-static.h"
10
11typedef struct {
12        char *ptr;
13
14        size_t used;
15        size_t size;
16} buffer;
17
18typedef void (*buffer_ptr_free_t)(void *p);
19
20typedef struct {
21        void **ptr;
22        size_t size;
23        size_t used;
24        buffer_ptr_free_t free;
25} buffer_ptr;
26
27typedef struct {
28        buffer **ptr;
29
30        size_t used;
31        size_t size;
32} buffer_array;
33
34typedef struct {
35        char *ptr;
36
37        size_t offset; /* input pointer */
38
39        size_t used;   /* output pointer */
40        size_t size;
41} read_buffer;
42
43LI_API buffer_ptr* buffer_ptr_init(buffer_ptr_free_t freer);
44LI_API void buffer_ptr_free(buffer_ptr *b);
45LI_API void buffer_ptr_clear(buffer_ptr *b);
46LI_API void buffer_ptr_append(buffer_ptr *b, void *item);
47LI_API void* buffer_ptr_pop(buffer_ptr *b);
48LI_API void* buffer_ptr_top(buffer_ptr *b);
49
50LI_API buffer_array* buffer_array_init(void);
51LI_API void buffer_array_free(buffer_array *b);
52LI_API void buffer_array_reset(buffer_array *b);
53LI_API buffer* buffer_array_append_get_buffer(buffer_array *b);
54
55LI_API buffer* buffer_init(void);
56LI_API buffer* buffer_init_buffer(buffer *b);
57LI_API buffer* buffer_init_string(const char *str);
58LI_API void buffer_free(buffer *b);
59LI_API void buffer_reset(buffer *b);
60
61LI_API int buffer_prepare_copy(buffer *b, size_t size);
62LI_API int buffer_prepare_append(buffer *b, size_t size);
63
64LI_API int buffer_copy_string(buffer *b, const char *s);
65LI_API int buffer_copy_string_len(buffer *b, const char *s, size_t s_len);
66LI_API int buffer_copy_string_buffer(buffer *b, const buffer *src);
67LI_API int buffer_copy_string_hex(buffer *b, const char *in, size_t in_len);
68
69LI_API int buffer_copy_long(buffer *b, long val);
70
71LI_API int buffer_copy_memory(buffer *b, const char *s, size_t s_len);
72
73LI_API int buffer_append_string(buffer *b, const char *s);
74LI_API int buffer_append_string_len(buffer *b, const char *s, size_t s_len);
75LI_API int buffer_append_string_buffer(buffer *b, const buffer *src);
76LI_API int buffer_append_string_lfill(buffer *b, const char *s, size_t maxlen);
77LI_API int buffer_append_string_rfill(buffer *b, const char *s, size_t maxlen);
78
79LI_API int buffer_append_long_hex(buffer *b, unsigned long len);
80LI_API int buffer_append_long(buffer *b, long val);
81
82#if defined(SIZEOF_LONG) && (SIZEOF_LONG == SIZEOF_OFF_T)
83#define buffer_copy_off_t(x, y)         buffer_copy_long(x, y)
84#define buffer_append_off_t(x, y)       buffer_append_long(x, y)
85#else
86LI_API int buffer_copy_off_t(buffer *b, off_t val);
87LI_API int buffer_append_off_t(buffer *b, off_t val);
88#endif
89
90LI_API int buffer_append_memory(buffer *b, const char *s, size_t s_len);
91
92LI_API char* buffer_search_string_len(buffer *b, const char *needle, size_t len);
93
94LI_API int buffer_is_empty(buffer *b);
95LI_API int buffer_is_equal(buffer *a, buffer *b);
96LI_API int buffer_is_equal_right_len(buffer *a, buffer *b, size_t len);
97LI_API int buffer_is_equal_string(buffer *a, const char *s, size_t b_len);
98LI_API int buffer_caseless_compare(const char *a, size_t a_len, const char *b, size_t b_len);
99
100typedef enum {
101        ENCODING_UNSET,
102        ENCODING_REL_URI, /* for coding a rel-uri (/with space/and%percent) nicely as part of an href */
103        ENCODING_REL_URI_PART, /* same as ENC_REL_URL plus encoding "/" as "%2F" */
104        ENCODING_HTML,    /* "&" becomes "&amp;" and so on */
105        ENCODING_MINIMAL_XML, /* minimal encoding for xml */
106        ENCODING_HEX      /* encode string as hex */
107} buffer_encoding_t;
108
109LI_API int buffer_append_string_encoded(buffer *b, const char *s, size_t s_len, buffer_encoding_t encoding);
110
111LI_API int buffer_urldecode_path(buffer *url);
112LI_API int buffer_urldecode_query(buffer *url);
113LI_API int buffer_path_simplify(buffer *dest, buffer *src);
114
115LI_API int buffer_to_lower(buffer *b);
116LI_API int buffer_to_upper(buffer *b);
117
118/** deprecated */
119LI_API int LI_ltostr(char *buf, long val);
120LI_API char hex2int(unsigned char c);
121LI_API char int2hex(char i);
122
123LI_API int light_isdigit(int c);
124LI_API int light_isxdigit(int c);
125LI_API int light_isalpha(int c);
126LI_API int light_isalnum(int c);
127
128#define BUFFER_CTYPE_FUNC(type) int buffer_is##type(buffer *b);
129BUFFER_CTYPE_FUNC(digit)
130BUFFER_CTYPE_FUNC(xdigit)
131BUFFER_CTYPE_FUNC(alpha)
132BUFFER_CTYPE_FUNC(alnum)
133
134#define BUF_STR(x) x->ptr
135#define BUF_STR_LEN(x) (x->used ? x->used - 1 : 0)
136
137/* used on solaris as their vprintf() hates NULL for %s */
138#define SAFE_BUF_STR(x) x && x->ptr ? x->ptr : "(null)"
139
140#define BUFFER_APPEND_STRING_CONST(x, y) \
141        buffer_append_string_len(x, y, sizeof(y) - 1)
142
143#define BUFFER_COPY_STRING_CONST(x, y) \
144        buffer_copy_string_len(x, y, sizeof(y) - 1)
145
146#define CONST_STR_LEN(x) x, x ? sizeof(x) - 1 : 0
147#define CONST_BUF_LEN(x) BUF_STR(x), x->used ? x->used - 1 : 0
148
149
150#define UNUSED(x) ( (void)(x) )
151
152/**
153 * a pool of unused buffer *
154 */
155
156ARRAY_STATIC_DEF(buffer_pool, buffer, );
157
158buffer_pool* buffer_pool_init();
159void buffer_pool_free(buffer_pool* );
160
161buffer *buffer_pool_get(buffer_pool *bp);
162void buffer_pool_append(buffer_pool *bp, buffer *);
163
164#endif
165
Note: See TracBrowser for help on using the browser.