]> arthur.barton.de Git - netdata.git/blob - src/web_buffer.c
build: migrate to autotools
[netdata.git] / src / web_buffer.c
1 #ifdef HAVE_CONFIG_H
2 #include <config.h>
3 #endif
4 #include <stdlib.h>
5
6 #ifdef STORAGE_WITH_MATH
7 #include <math.h>
8 #endif
9
10 #include "common.h"
11 #include "web_buffer.h"
12 #include "log.h"
13
14 void web_buffer_strcpy(struct web_buffer *wb, const char *txt)
15 {
16         char *buffer = wb->buffer;
17         long bytes = wb->bytes, size = wb->size, i = 0;
18
19         while(txt[i] && bytes < size)
20                 buffer[bytes++] = txt[i++];
21
22         wb->bytes = bytes;
23 }
24
25 void web_buffer_rrd_value(struct web_buffer *wb, calculated_number value)
26 {
27         if(wb->size - wb->bytes < 50) return;
28         wb->bytes += print_calculated_number(&wb->buffer[wb->bytes], value);
29 }
30
31 // generate a javascript date, the fastest possible way...
32 void web_buffer_jsdate(struct web_buffer *wb, int year, int month, int day, int hours, int minutes, int seconds)
33 {
34         //         10        20        30      = 35
35         // 01234567890123456789012345678901234
36         // Date(2014, 04, 01, 03, 28, 20, 065)
37
38         if(wb->size - wb->bytes < 36) return;
39
40         char *b = &wb->buffer[wb->bytes];
41
42         int i = 0;
43         b[i++]='D';
44         b[i++]='a';
45         b[i++]='t';
46         b[i++]='e';
47         b[i++]='(';
48         b[i++]= 48 + year / 1000; year -= (year / 1000) * 1000;
49         b[i++]= 48 + year / 100; year -= (year / 100) * 100;
50         b[i++]= 48 + year / 10;
51         b[i++]= 48 + year % 10;
52         b[i++]=',';
53         //b[i++]=' ';
54         b[i]= 48 + month / 10; if(b[i] != '0') i++;
55         b[i++]= 48 + month % 10;
56         b[i++]=',';
57         //b[i++]=' ';
58         b[i]= 48 + day / 10; if(b[i] != '0') i++;
59         b[i++]= 48 + day % 10;
60         b[i++]=',';
61         //b[i++]=' ';
62         b[i]= 48 + hours / 10; if(b[i] != '0') i++;
63         b[i++]= 48 + hours % 10;
64         b[i++]=',';
65         //b[i++]=' ';
66         b[i]= 48 + minutes / 10; if(b[i] != '0') i++;
67         b[i++]= 48 + minutes % 10;
68         b[i++]=',';
69         //b[i++]=' ';
70         b[i]= 48 + seconds / 10; if(b[i] != '0') i++;
71         b[i++]= 48 + seconds % 10;
72         b[i++]=')';
73         b[i]='\0';
74
75         wb->bytes += i;
76 }
77
78 struct web_buffer *web_buffer_create(long size)
79 {
80         struct web_buffer *b;
81
82         debug(D_WEB_BUFFER, "Creating new web buffer of size %d.", size);
83
84         b = calloc(1, sizeof(struct web_buffer));
85         if(!b) {
86                 error("Cannot allocate a web_buffer.");
87                 return NULL;
88         }
89
90         b->buffer = malloc(size);
91         if(!b->buffer) {
92                 error("Cannot allocate a buffer of size %u.", size);
93                 free(b);
94                 return NULL;
95         }
96         b->buffer[0] = '\0';
97         b->size = size;
98         b->contenttype = CT_TEXT_PLAIN;
99         return(b);
100 }
101
102 void web_buffer_free(struct web_buffer *b)
103 {
104         debug(D_WEB_BUFFER, "Freeing web buffer of size %d.", b->size);
105
106         if(b->buffer) free(b->buffer);
107         free(b);
108 }
109
110 void web_buffer_increase(struct web_buffer *b, long free_size_required)
111 {
112         long left = b->size - b->bytes;
113
114         if(left >= free_size_required) return;
115         long increase = free_size_required - left;
116         if(increase < WEB_DATA_LENGTH_INCREASE_STEP) increase = WEB_DATA_LENGTH_INCREASE_STEP;
117
118         debug(D_WEB_BUFFER, "Increasing data buffer from size %d to %d.", b->size, b->size + increase);
119
120         b->buffer = realloc(b->buffer, b->size + increase);
121         if(!b->buffer) fatal("Failed to increase data buffer from size %d to %d.", b->size, b->size + increase);
122         
123         b->size += increase;
124 }