netdata
web_buffer.h
1 // SPDX-License-Identifier: GPL-3.0+
2 
3 #ifndef NETDATA_WEB_BUFFER_H
4 #define NETDATA_WEB_BUFFER_H 1
5 
6 #define WEB_DATA_LENGTH_INCREASE_STEP 1024
7 
8 typedef struct web_buffer {
9  size_t size; // allocation size of buffer, in bytes
10  size_t len; // current data length in buffer, in bytes
11  char *buffer; // the buffer itself
12  uint8_t contenttype; // the content type of the data in the buffer
13  uint8_t options; // options related to the content
14  time_t date; // the timestamp this content has been generated
15  time_t expires; // the timestamp this content expires
16 } BUFFER;
17 
18 // options
19 #define WB_CONTENT_CACHEABLE 1
20 #define WB_CONTENT_NO_CACHEABLE 2
21 
22 // content-types
23 #define CT_APPLICATION_JSON 1
24 #define CT_TEXT_PLAIN 2
25 #define CT_TEXT_HTML 3
26 #define CT_APPLICATION_X_JAVASCRIPT 4
27 #define CT_TEXT_CSS 5
28 #define CT_TEXT_XML 6
29 #define CT_APPLICATION_XML 7
30 #define CT_TEXT_XSL 8
31 #define CT_APPLICATION_OCTET_STREAM 9
32 #define CT_APPLICATION_X_FONT_TRUETYPE 10
33 #define CT_APPLICATION_X_FONT_OPENTYPE 11
34 #define CT_APPLICATION_FONT_WOFF 12
35 #define CT_APPLICATION_FONT_WOFF2 13
36 #define CT_APPLICATION_VND_MS_FONTOBJ 14
37 #define CT_IMAGE_SVG_XML 15
38 #define CT_IMAGE_PNG 16
39 #define CT_IMAGE_JPG 17
40 #define CT_IMAGE_GIF 18
41 #define CT_IMAGE_XICON 19
42 #define CT_IMAGE_ICNS 20
43 #define CT_IMAGE_BMP 21
44 #define CT_PROMETHEUS 22
45 
46 #define buffer_cacheable(wb) do { (wb)->options |= WB_CONTENT_CACHEABLE; if((wb)->options & WB_CONTENT_NO_CACHEABLE) (wb)->options &= ~WB_CONTENT_NO_CACHEABLE; } while(0)
47 #define buffer_no_cacheable(wb) do { (wb)->options |= WB_CONTENT_NO_CACHEABLE; if((wb)->options & WB_CONTENT_CACHEABLE) (wb)->options &= ~WB_CONTENT_CACHEABLE; (wb)->expires = 0; } while(0)
48 
49 #define buffer_strlen(wb) ((wb)->len)
50 extern const char *buffer_tostring(BUFFER *wb);
51 
52 #define buffer_flush(wb) wb->buffer[(wb)->len = 0] = '\0'
53 extern void buffer_reset(BUFFER *wb);
54 
55 extern void buffer_strcat(BUFFER *wb, const char *txt);
56 extern void buffer_rrd_value(BUFFER *wb, calculated_number value);
57 
58 extern void buffer_date(BUFFER *wb, int year, int month, int day, int hours, int minutes, int seconds);
59 extern void buffer_jsdate(BUFFER *wb, int year, int month, int day, int hours, int minutes, int seconds);
60 
61 extern BUFFER *buffer_create(size_t size);
62 extern void buffer_free(BUFFER *b);
63 extern void buffer_increase(BUFFER *b, size_t free_size_required);
64 
65 extern void buffer_snprintf(BUFFER *wb, size_t len, const char *fmt, ...) PRINTFLIKE(3, 4);
66 extern void buffer_vsprintf(BUFFER *wb, const char *fmt, va_list args);
67 extern void buffer_sprintf(BUFFER *wb, const char *fmt, ...) PRINTFLIKE(2,3);
68 extern void buffer_strcat_htmlescape(BUFFER *wb, const char *txt);
69 
70 extern void buffer_char_replace(BUFFER *wb, char from, char to);
71 
72 extern char *print_number_lu_r(char *str, unsigned long uvalue);
73 extern char *print_number_llu_r(char *str, unsigned long long uvalue);
74 extern char *print_number_llu_r_smart(char *str, unsigned long long uvalue);
75 
76 extern void buffer_print_llu(BUFFER *wb, unsigned long long uvalue);
77 
78 static inline void buffer_need_bytes(BUFFER *buffer, size_t needed_free_size) {
79  if(unlikely(buffer->size - buffer->len < needed_free_size))
80  buffer_increase(buffer, needed_free_size);
81 }
82 
83 #endif /* NETDATA_WEB_BUFFER_H */
Definition: web_buffer.h:8