| 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 | |
|---|
| 11 | typedef struct { |
|---|
| 12 | char *ptr; |
|---|
| 13 | |
|---|
| 14 | size_t used; |
|---|
| 15 | size_t size; |
|---|
| 16 | } buffer; |
|---|
| 17 | |
|---|
| 18 | typedef void (*buffer_ptr_free_t)(void *p); |
|---|
| 19 | |
|---|
| 20 | typedef struct { |
|---|
| 21 | void **ptr; |
|---|
| 22 | size_t size; |
|---|
| 23 | size_t used; |
|---|
| 24 | buffer_ptr_free_t free; |
|---|
| 25 | } buffer_ptr; |
|---|
| 26 | |
|---|
| 27 | typedef struct { |
|---|
| 28 | buffer **ptr; |
|---|
| 29 | |
|---|
| 30 | size_t used; |
|---|
| 31 | size_t size; |
|---|
| 32 | } buffer_array; |
|---|
| 33 | |
|---|
| 34 | typedef 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 | |
|---|
| 43 | LI_API buffer_ptr* buffer_ptr_init(buffer_ptr_free_t freer); |
|---|
| 44 | LI_API void buffer_ptr_free(buffer_ptr *b); |
|---|
| 45 | LI_API void buffer_ptr_clear(buffer_ptr *b); |
|---|
| 46 | LI_API void buffer_ptr_append(buffer_ptr *b, void *item); |
|---|
| 47 | LI_API void* buffer_ptr_pop(buffer_ptr *b); |
|---|
| 48 | LI_API void* buffer_ptr_top(buffer_ptr *b); |
|---|
| 49 | |
|---|
| 50 | LI_API buffer_array* buffer_array_init(void); |
|---|
| 51 | LI_API void buffer_array_free(buffer_array *b); |
|---|
| 52 | LI_API void buffer_array_reset(buffer_array *b); |
|---|
| 53 | LI_API buffer* buffer_array_append_get_buffer(buffer_array *b); |
|---|
| 54 | |
|---|
| 55 | LI_API buffer* buffer_init(void); |
|---|
| 56 | LI_API buffer* buffer_init_buffer(buffer *b); |
|---|
| 57 | LI_API buffer* buffer_init_string(const char *str); |
|---|
| 58 | LI_API void buffer_free(buffer *b); |
|---|
| 59 | LI_API void buffer_reset(buffer *b); |
|---|
| 60 | |
|---|
| 61 | LI_API int buffer_prepare_copy(buffer *b, size_t size); |
|---|
| 62 | LI_API int buffer_prepare_append(buffer *b, size_t size); |
|---|
| 63 | |
|---|
| 64 | LI_API int buffer_copy_string(buffer *b, const char *s); |
|---|
| 65 | LI_API int buffer_copy_string_len(buffer *b, const char *s, size_t s_len); |
|---|
| 66 | LI_API int buffer_copy_string_buffer(buffer *b, const buffer *src); |
|---|
| 67 | LI_API int buffer_copy_string_hex(buffer *b, const char *in, size_t in_len); |
|---|
| 68 | |
|---|
| 69 | LI_API int buffer_copy_long(buffer *b, long val); |
|---|
| 70 | |
|---|
| 71 | LI_API int buffer_copy_memory(buffer *b, const char *s, size_t s_len); |
|---|
| 72 | |
|---|
| 73 | LI_API int buffer_append_string(buffer *b, const char *s); |
|---|
| 74 | LI_API int buffer_append_string_len(buffer *b, const char *s, size_t s_len); |
|---|
| 75 | LI_API int buffer_append_string_buffer(buffer *b, const buffer *src); |
|---|
| 76 | LI_API int buffer_append_string_lfill(buffer *b, const char *s, size_t maxlen); |
|---|
| 77 | LI_API int buffer_append_string_rfill(buffer *b, const char *s, size_t maxlen); |
|---|
| 78 | |
|---|
| 79 | LI_API int buffer_append_long_hex(buffer *b, unsigned long len); |
|---|
| 80 | LI_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 |
|---|
| 86 | LI_API int buffer_copy_off_t(buffer *b, off_t val); |
|---|
| 87 | LI_API int buffer_append_off_t(buffer *b, off_t val); |
|---|
| 88 | #endif |
|---|
| 89 | |
|---|
| 90 | LI_API int buffer_append_memory(buffer *b, const char *s, size_t s_len); |
|---|
| 91 | |
|---|
| 92 | LI_API char* buffer_search_string_len(buffer *b, const char *needle, size_t len); |
|---|
| 93 | |
|---|
| 94 | LI_API int buffer_is_empty(buffer *b); |
|---|
| 95 | LI_API int buffer_is_equal(buffer *a, buffer *b); |
|---|
| 96 | LI_API int buffer_is_equal_right_len(buffer *a, buffer *b, size_t len); |
|---|
| 97 | LI_API int buffer_is_equal_string(buffer *a, const char *s, size_t b_len); |
|---|
| 98 | LI_API int buffer_caseless_compare(const char *a, size_t a_len, const char *b, size_t b_len); |
|---|
| 99 | |
|---|
| 100 | typedef 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 "&" and so on */ |
|---|
| 105 | ENCODING_MINIMAL_XML, /* minimal encoding for xml */ |
|---|
| 106 | ENCODING_HEX /* encode string as hex */ |
|---|
| 107 | } buffer_encoding_t; |
|---|
| 108 | |
|---|
| 109 | LI_API int buffer_append_string_encoded(buffer *b, const char *s, size_t s_len, buffer_encoding_t encoding); |
|---|
| 110 | |
|---|
| 111 | LI_API int buffer_urldecode_path(buffer *url); |
|---|
| 112 | LI_API int buffer_urldecode_query(buffer *url); |
|---|
| 113 | LI_API int buffer_path_simplify(buffer *dest, buffer *src); |
|---|
| 114 | |
|---|
| 115 | LI_API int buffer_to_lower(buffer *b); |
|---|
| 116 | LI_API int buffer_to_upper(buffer *b); |
|---|
| 117 | |
|---|
| 118 | /** deprecated */ |
|---|
| 119 | LI_API int LI_ltostr(char *buf, long val); |
|---|
| 120 | LI_API char hex2int(unsigned char c); |
|---|
| 121 | LI_API char int2hex(char i); |
|---|
| 122 | |
|---|
| 123 | LI_API int light_isdigit(int c); |
|---|
| 124 | LI_API int light_isxdigit(int c); |
|---|
| 125 | LI_API int light_isalpha(int c); |
|---|
| 126 | LI_API int light_isalnum(int c); |
|---|
| 127 | |
|---|
| 128 | #define BUFFER_CTYPE_FUNC(type) int buffer_is##type(buffer *b); |
|---|
| 129 | BUFFER_CTYPE_FUNC(digit) |
|---|
| 130 | BUFFER_CTYPE_FUNC(xdigit) |
|---|
| 131 | BUFFER_CTYPE_FUNC(alpha) |
|---|
| 132 | BUFFER_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 | |
|---|
| 156 | ARRAY_STATIC_DEF(buffer_pool, buffer, ); |
|---|
| 157 | |
|---|
| 158 | buffer_pool* buffer_pool_init(); |
|---|
| 159 | void buffer_pool_free(buffer_pool* ); |
|---|
| 160 | |
|---|
| 161 | buffer *buffer_pool_get(buffer_pool *bp); |
|---|
| 162 | void buffer_pool_append(buffer_pool *bp, buffer *); |
|---|
| 163 | |
|---|
| 164 | #endif |
|---|
| 165 | |
|---|