]> arthur.barton.de Git - netdata.git/blob - src/web_buffer.c
code cleanup
[netdata.git] / src / web_buffer.c
1 #ifdef HAVE_CONFIG_H
2 #include <config.h>
3 #endif
4 #include <stdlib.h>
5 #include <string.h>
6
7 #ifdef STORAGE_WITH_MATH
8 #include <math.h>
9 #endif
10
11 #include "common.h"
12 #include "web_buffer.h"
13 #include "log.h"
14
15 void web_buffer_reset(struct web_buffer *wb)
16 {
17         web_buffer_flush(wb);
18
19         wb->sent = 0;
20         wb->rlen = 0;
21         wb->contenttype = CT_TEXT_PLAIN;
22         wb->date = 0;
23 }
24
25 void web_buffer_char_replace(struct web_buffer *wb, char from, char to)
26 {
27         char *s = wb->buffer, *end = &wb->buffer[wb->len];
28
29         while(s != end) {
30                 if(*s == from) *s = to;
31                 s++;
32         }
33 }
34
35
36 void web_buffer_strcat(struct web_buffer *wb, const char *txt)
37 {
38         char *buffer = wb->buffer;
39         const char *s = txt;
40         long bytes = wb->len, size = wb->size;
41
42         while(*s && bytes < size)
43                 buffer[bytes++] = *s++;
44
45         wb->len = bytes;
46
47         if(*s) {
48                 web_buffer_need_bytes(wb, strlen(s));
49                 web_buffer_strcat(wb, s);
50         }
51         else {
52                 // terminate the string
53                 // without increasing the length
54                 web_buffer_need_bytes(wb, 1);
55                 wb->buffer[wb->len] = '\0';
56         }
57 }
58
59
60 void web_buffer_snprintf(struct web_buffer *wb, size_t len, const char *fmt, ...)
61 {
62         web_buffer_need_bytes(wb, len+1);
63
64         va_list args;
65         va_start(args, fmt);
66         wb->len += vsnprintf(&wb->buffer[wb->len], len+1, fmt, args);
67         va_end(args);
68
69         // the buffer is \0 terminated by vsnprintf
70 }
71
72
73 void web_buffer_rrd_value(struct web_buffer *wb, calculated_number value)
74 {
75         web_buffer_need_bytes(wb, 50);
76         wb->len += print_calculated_number(&wb->buffer[wb->len], value);
77
78         // terminate it
79         web_buffer_need_bytes(wb, 1);
80         wb->buffer[wb->len] = '\0';
81 }
82
83 // generate a javascript date, the fastest possible way...
84 void web_buffer_jsdate(struct web_buffer *wb, int year, int month, int day, int hours, int minutes, int seconds)
85 {
86         //         10        20        30      = 35
87         // 01234567890123456789012345678901234
88         // Date(2014, 04, 01, 03, 28, 20, 065)
89
90         web_buffer_need_bytes(wb, 36);
91
92         char *b = &wb->buffer[wb->len];
93
94         int i = 0;
95         b[i++]='D';
96         b[i++]='a';
97         b[i++]='t';
98         b[i++]='e';
99         b[i++]='(';
100         b[i++]= 48 + year / 1000; year -= (year / 1000) * 1000;
101         b[i++]= 48 + year / 100; year -= (year / 100) * 100;
102         b[i++]= 48 + year / 10;
103         b[i++]= 48 + year % 10;
104         b[i++]=',';
105         //b[i++]=' ';
106         b[i]= 48 + month / 10; if(b[i] != '0') i++;
107         b[i++]= 48 + month % 10;
108         b[i++]=',';
109         //b[i++]=' ';
110         b[i]= 48 + day / 10; if(b[i] != '0') i++;
111         b[i++]= 48 + day % 10;
112         b[i++]=',';
113         //b[i++]=' ';
114         b[i]= 48 + hours / 10; if(b[i] != '0') i++;
115         b[i++]= 48 + hours % 10;
116         b[i++]=',';
117         //b[i++]=' ';
118         b[i]= 48 + minutes / 10; if(b[i] != '0') i++;
119         b[i++]= 48 + minutes % 10;
120         b[i++]=',';
121         //b[i++]=' ';
122         b[i]= 48 + seconds / 10; if(b[i] != '0') i++;
123         b[i++]= 48 + seconds % 10;
124         b[i++]=')';
125         b[i]='\0';
126
127         wb->len += i;
128
129         // terminate it
130         web_buffer_need_bytes(wb, 1);
131         wb->buffer[wb->len] = '\0';
132 }
133
134 struct web_buffer *web_buffer_create(long size)
135 {
136         struct web_buffer *b;
137
138         debug(D_WEB_BUFFER, "Creating new web buffer of size %d.", size);
139
140         b = calloc(1, sizeof(struct web_buffer));
141         if(!b) {
142                 error("Cannot allocate a web_buffer.");
143                 return NULL;
144         }
145
146         b->buffer = malloc(size);
147         if(!b->buffer) {
148                 error("Cannot allocate a buffer of size %u.", size);
149                 free(b);
150                 return NULL;
151         }
152         b->buffer[0] = '\0';
153         b->size = size;
154         b->contenttype = CT_TEXT_PLAIN;
155         return(b);
156 }
157
158 void web_buffer_free(struct web_buffer *b)
159 {
160         debug(D_WEB_BUFFER, "Freeing web buffer of size %d.", b->size);
161
162         if(b->buffer) free(b->buffer);
163         free(b);
164 }
165
166 void web_buffer_increase(struct web_buffer *b, long free_size_required)
167 {
168         long left = b->size - b->len;
169
170         if(left >= free_size_required) return;
171
172         long increase = free_size_required - left;
173         if(increase < WEB_DATA_LENGTH_INCREASE_STEP) increase = WEB_DATA_LENGTH_INCREASE_STEP;
174
175         debug(D_WEB_BUFFER, "Increasing data buffer from size %d to %d.", b->size, b->size + increase);
176
177         b->buffer = realloc(b->buffer, b->size + increase);
178         if(!b->buffer) fatal("Failed to increase data buffer from size %d to %d.", b->size, b->size + increase);
179         
180         b->size += increase;
181 }