1*76404edcSAsim Jamshed #ifndef _BUFFER_H_
2*76404edcSAsim Jamshed #define _BUFFER_H_
3*76404edcSAsim Jamshed 
4*76404edcSAsim Jamshed #ifdef HAVE_CONFIG_H
5*76404edcSAsim Jamshed # include "config.h"
6*76404edcSAsim Jamshed #endif
7*76404edcSAsim Jamshed 
8*76404edcSAsim Jamshed #include "settings.h"
9*76404edcSAsim Jamshed 
10*76404edcSAsim Jamshed #include <stdlib.h>
11*76404edcSAsim Jamshed #include <sys/types.h>
12*76404edcSAsim Jamshed #include <stdio.h>
13*76404edcSAsim Jamshed 
14*76404edcSAsim Jamshed typedef struct {
15*76404edcSAsim Jamshed 	char *ptr;
16*76404edcSAsim Jamshed 
17*76404edcSAsim Jamshed 	size_t used;
18*76404edcSAsim Jamshed 	size_t size;
19*76404edcSAsim Jamshed } buffer;
20*76404edcSAsim Jamshed 
21*76404edcSAsim Jamshed typedef struct {
22*76404edcSAsim Jamshed 	buffer **ptr;
23*76404edcSAsim Jamshed 
24*76404edcSAsim Jamshed 	size_t used;
25*76404edcSAsim Jamshed 	size_t size;
26*76404edcSAsim Jamshed } buffer_array;
27*76404edcSAsim Jamshed 
28*76404edcSAsim Jamshed typedef struct {
29*76404edcSAsim Jamshed 	char *ptr;
30*76404edcSAsim Jamshed 
31*76404edcSAsim Jamshed 	size_t offset; /* input-pointer */
32*76404edcSAsim Jamshed 
33*76404edcSAsim Jamshed 	size_t used;   /* output-pointer */
34*76404edcSAsim Jamshed 	size_t size;
35*76404edcSAsim Jamshed } read_buffer;
36*76404edcSAsim Jamshed 
37*76404edcSAsim Jamshed buffer_array* buffer_array_init(void);
38*76404edcSAsim Jamshed void buffer_array_free(buffer_array *b);
39*76404edcSAsim Jamshed void buffer_array_reset(buffer_array *b);
40*76404edcSAsim Jamshed buffer *buffer_array_append_get_buffer(buffer_array *b);
41*76404edcSAsim Jamshed 
42*76404edcSAsim Jamshed buffer* buffer_init(void);
43*76404edcSAsim Jamshed buffer* buffer_init_buffer(buffer *b);
44*76404edcSAsim Jamshed buffer* buffer_init_string(const char *str);
45*76404edcSAsim Jamshed void buffer_free(buffer *b);
46*76404edcSAsim Jamshed void buffer_reset(buffer *b);
47*76404edcSAsim Jamshed 
48*76404edcSAsim Jamshed int buffer_prepare_copy(buffer *b, size_t size);
49*76404edcSAsim Jamshed int buffer_prepare_append(buffer *b, size_t size);
50*76404edcSAsim Jamshed 
51*76404edcSAsim Jamshed int buffer_copy_string(buffer *b, const char *s);
52*76404edcSAsim Jamshed int buffer_copy_string_len(buffer *b, const char *s, size_t s_len);
53*76404edcSAsim Jamshed int buffer_copy_string_buffer(buffer *b, const buffer *src);
54*76404edcSAsim Jamshed int buffer_copy_string_hex(buffer *b, const char *in, size_t in_len);
55*76404edcSAsim Jamshed 
56*76404edcSAsim Jamshed int buffer_copy_long(buffer *b, long val);
57*76404edcSAsim Jamshed 
58*76404edcSAsim Jamshed int buffer_copy_memory(buffer *b, const char *s, size_t s_len);
59*76404edcSAsim Jamshed 
60*76404edcSAsim Jamshed int buffer_append_string(buffer *b, const char *s);
61*76404edcSAsim Jamshed int buffer_append_string_len(buffer *b, const char *s, size_t s_len);
62*76404edcSAsim Jamshed int buffer_append_string_buffer(buffer *b, const buffer *src);
63*76404edcSAsim Jamshed int buffer_append_string_lfill(buffer *b, const char *s, size_t maxlen);
64*76404edcSAsim Jamshed int buffer_append_string_rfill(buffer *b, const char *s, size_t maxlen);
65*76404edcSAsim Jamshed 
66*76404edcSAsim Jamshed int buffer_append_long_hex(buffer *b, unsigned long len);
67*76404edcSAsim Jamshed int buffer_append_long(buffer *b, long val);
68*76404edcSAsim Jamshed 
69*76404edcSAsim Jamshed #if defined(SIZEOF_LONG) && (SIZEOF_LONG == SIZEOF_OFF_T)
70*76404edcSAsim Jamshed #define buffer_copy_off_t(x, y)		buffer_copy_long(x, y)
71*76404edcSAsim Jamshed #define buffer_append_off_t(x, y)	buffer_append_long(x, y)
72*76404edcSAsim Jamshed #else
73*76404edcSAsim Jamshed int buffer_copy_off_t(buffer *b, off_t val);
74*76404edcSAsim Jamshed int buffer_append_off_t(buffer *b, off_t val);
75*76404edcSAsim Jamshed #endif
76*76404edcSAsim Jamshed 
77*76404edcSAsim Jamshed int buffer_append_memory(buffer *b, const char *s, size_t s_len);
78*76404edcSAsim Jamshed 
79*76404edcSAsim Jamshed char * buffer_search_string_len(buffer *b, const char *needle, size_t len);
80*76404edcSAsim Jamshed 
81*76404edcSAsim Jamshed int buffer_is_empty(buffer *b);
82*76404edcSAsim Jamshed int buffer_is_equal(buffer *a, buffer *b);
83*76404edcSAsim Jamshed int buffer_is_equal_right_len(buffer *a, buffer *b, size_t len);
84*76404edcSAsim Jamshed int buffer_is_equal_string(buffer *a, const char *s, size_t b_len);
85*76404edcSAsim Jamshed int buffer_caseless_compare(const char *a, size_t a_len, const char *b, size_t b_len);
86*76404edcSAsim Jamshed 
87*76404edcSAsim Jamshed typedef enum {
88*76404edcSAsim Jamshed 	ENCODING_UNSET,
89*76404edcSAsim Jamshed 	ENCODING_REL_URI, /* for coding a rel-uri (/with space/and%percent) nicely as part of a href */
90*76404edcSAsim Jamshed 	ENCODING_REL_URI_PART, /* same as ENC_REL_URL plus coding / too as %2F */
91*76404edcSAsim Jamshed 	ENCODING_HTML,         /* & becomes &amp; and so on */
92*76404edcSAsim Jamshed 	ENCODING_MINIMAL_XML,  /* minimal encoding for xml */
93*76404edcSAsim Jamshed 	ENCODING_HEX,          /* encode string as hex */
94*76404edcSAsim Jamshed 	ENCODING_HTTP_HEADER   /* encode \n with \t\n */
95*76404edcSAsim Jamshed } buffer_encoding_t;
96*76404edcSAsim Jamshed 
97*76404edcSAsim Jamshed int buffer_append_string_encoded(buffer *b, const char *s, size_t s_len, buffer_encoding_t encoding);
98*76404edcSAsim Jamshed 
99*76404edcSAsim Jamshed int buffer_urldecode_path(buffer *url);
100*76404edcSAsim Jamshed int buffer_urldecode_query(buffer *url);
101*76404edcSAsim Jamshed int buffer_path_simplify(buffer *dest, buffer *src);
102*76404edcSAsim Jamshed 
103*76404edcSAsim Jamshed int buffer_to_lower(buffer *b);
104*76404edcSAsim Jamshed int buffer_to_upper(buffer *b);
105*76404edcSAsim Jamshed 
106*76404edcSAsim Jamshed /** deprecated */
107*76404edcSAsim Jamshed int LI_ltostr(char *buf, long val);
108*76404edcSAsim Jamshed char hex2int(unsigned char c);
109*76404edcSAsim Jamshed char int2hex(char i);
110*76404edcSAsim Jamshed 
111*76404edcSAsim Jamshed int light_isdigit(int c);
112*76404edcSAsim Jamshed int light_isxdigit(int c);
113*76404edcSAsim Jamshed int light_isalpha(int c);
114*76404edcSAsim Jamshed int light_isalnum(int c);
115*76404edcSAsim Jamshed 
116*76404edcSAsim Jamshed #define BUFFER_APPEND_STRING_CONST(x, y) \
117*76404edcSAsim Jamshed 	buffer_append_string_len(x, y, sizeof(y) - 1)
118*76404edcSAsim Jamshed 
119*76404edcSAsim Jamshed #define BUFFER_COPY_STRING_CONST(x, y) \
120*76404edcSAsim Jamshed 	buffer_copy_string_len(x, y, sizeof(y) - 1)
121*76404edcSAsim Jamshed 
122*76404edcSAsim Jamshed #define BUFFER_APPEND_SLASH(x) \
123*76404edcSAsim Jamshed 	if (x->used > 1 && x->ptr[x->used - 2] != '/') { BUFFER_APPEND_STRING_CONST(x, "/"); }
124*76404edcSAsim Jamshed 
125*76404edcSAsim Jamshed #define CONST_STR_LEN(x) x, x ? sizeof(x) - 1 : 0
126*76404edcSAsim Jamshed #define CONST_BUF_LEN(x) x->ptr, x->used ? x->used - 1 : 0
127*76404edcSAsim Jamshed 
128*76404edcSAsim Jamshed 
129*76404edcSAsim Jamshed #define SEGFAULT() do { fprintf(stderr, "%s.%d: aborted\n", __FILE__, __LINE__); abort(); } while(0)
130*76404edcSAsim Jamshed #ifndef UNUSED
131*76404edcSAsim Jamshed #define UNUSED(x) ( (void)(x) )
132*76404edcSAsim Jamshed #endif
133*76404edcSAsim Jamshed 
134*76404edcSAsim Jamshed #endif
135