]> arthur.barton.de Git - netdata.git/blob - src/web_buffer.c
splitted netdata to multiple source files
[netdata.git] / src / web_buffer.c
1 #include <stdlib.h>
2
3 #include "web_buffer.h"
4
5 #include "common.h"
6 #include "log.h"
7
8 void web_buffer_strcpy(struct web_buffer *wb, const char *txt)
9 {
10         char *buffer = wb->buffer;
11         long bytes = wb->bytes, size = wb->size, i = 0;
12
13         while(txt[i] && bytes < size)
14                 buffer[bytes++] = txt[i++];
15
16         wb->bytes = bytes;
17 }
18
19 int print_calculated_number(char *str, calculated_number value)
20 {
21         char *wstr = str;
22
23         // make sure it is unsigned
24         unsigned long long uvalue = (unsigned long long)(((value < 0) ? -value : value) * (calculated_number)10000);
25
26         // print each digit
27         do *wstr++ = (char)(48 + (uvalue % 10)); while(uvalue /= 10);
28
29         // make sure we have 8 bytes at least
30         while((wstr - str) < 5) *wstr++ = '0';
31
32         // put the sign back
33         if (value < 0) *wstr++ = '-';
34
35         // reverse it
36         wstr--;
37         strreverse(str, wstr);
38
39         // terminate it, one position to the right
40         // to let space for a dot
41         wstr[2] = '\0';
42
43         int i;
44         for(i = 0; i < 4 ;i++) {
45                 wstr[1] = wstr[0];
46                 wstr--;
47         }
48         wstr[1] = '.';
49
50         // return the buffer length
51         return ( (wstr - str) + 6 );
52 }
53
54 void web_buffer_rrd_value(struct web_buffer *wb, calculated_number value)
55 {
56         if(wb->size - wb->bytes < 50) return;
57         wb->bytes += print_calculated_number(&wb->buffer[wb->bytes], value);
58 }
59
60 // generate a javascript date, the fastest possible way...
61 void web_buffer_jsdate(struct web_buffer *wb, int year, int month, int day, int hours, int minutes, int seconds)
62 {
63         //         10        20        30      = 35
64         // 01234567890123456789012345678901234
65         // Date(2014, 04, 01, 03, 28, 20, 065)
66
67         if(wb->size - wb->bytes < 36) return;
68
69         char *b = &wb->buffer[wb->bytes];
70
71         int i = 0;
72         b[i++]='D';
73         b[i++]='a';
74         b[i++]='t';
75         b[i++]='e';
76         b[i++]='(';
77         b[i++]= 48 + year / 1000; year -= (year / 1000) * 1000;
78         b[i++]= 48 + year / 100; year -= (year / 100) * 100;
79         b[i++]= 48 + year / 10;
80         b[i++]= 48 + year % 10;
81         b[i++]=',';
82         //b[i++]=' ';
83         b[i]= 48 + month / 10; if(b[i] != '0') i++;
84         b[i++]= 48 + month % 10;
85         b[i++]=',';
86         //b[i++]=' ';
87         b[i]= 48 + day / 10; if(b[i] != '0') i++;
88         b[i++]= 48 + day % 10;
89         b[i++]=',';
90         //b[i++]=' ';
91         b[i]= 48 + hours / 10; if(b[i] != '0') i++;
92         b[i++]= 48 + hours % 10;
93         b[i++]=',';
94         //b[i++]=' ';
95         b[i]= 48 + minutes / 10; if(b[i] != '0') i++;
96         b[i++]= 48 + minutes % 10;
97         b[i++]=',';
98         //b[i++]=' ';
99         b[i]= 48 + seconds / 10; if(b[i] != '0') i++;
100         b[i++]= 48 + seconds % 10;
101         b[i++]=')';
102         b[i]='\0';
103
104         wb->bytes += i;
105 }
106
107 struct web_buffer *web_buffer_create(long size)
108 {
109         struct web_buffer *b;
110
111         debug(D_WEB_BUFFER, "Creating new web buffer of size %d.", size);
112
113         b = calloc(1, sizeof(struct web_buffer));
114         if(!b) {
115                 error("Cannot allocate a web_buffer.");
116                 return NULL;
117         }
118
119         b->buffer = malloc(size);
120         if(!b->buffer) {
121                 error("Cannot allocate a buffer of size %u.", size);
122                 free(b);
123                 return NULL;
124         }
125         b->buffer[0] = '\0';
126         b->size = size;
127         b->contenttype = CT_TEXT_PLAIN;
128         return(b);
129 }
130
131 void web_buffer_free(struct web_buffer *b)
132 {
133         debug(D_WEB_BUFFER, "Freeing web buffer of size %d.", b->size);
134
135         if(b->buffer) free(b->buffer);
136         free(b);
137 }
138
139 void web_buffer_increase(struct web_buffer *b, long free_size_required)
140 {
141         long left = b->size - b->bytes;
142
143         if(left >= free_size_required) return;
144         long increase = free_size_required - left;
145         if(increase < WEB_DATA_LENGTH_INCREASE_STEP) increase = WEB_DATA_LENGTH_INCREASE_STEP;
146
147         debug(D_WEB_BUFFER, "Increasing data buffer from size %d to %d.", b->size, b->size + increase);
148
149         b->buffer = realloc(b->buffer, b->size + increase);
150         if(!b->buffer) fatal("Failed to increase data buffer from size %d to %d.", b->size, b->size + increase);
151         
152         b->size += increase;
153 }