3 #ifdef STORAGE_WITH_MATH
7 #include "web_buffer.h"
12 void web_buffer_strcpy(struct web_buffer *wb, const char *txt)
14 char *buffer = wb->buffer;
15 long bytes = wb->bytes, size = wb->size, i = 0;
17 while(txt[i] && bytes < size)
18 buffer[bytes++] = txt[i++];
23 int print_calculated_number(char *str, calculated_number value)
27 int sign = (value < 0) ? 1 : 0;
28 if(sign) value = -value;
30 #ifdef STORAGE_WITH_MATH
31 // without llrint() there are rounding problems
32 // for example 0.9 becomes 0.89
33 unsigned long long uvalue = llrint(value * (calculated_number)100000);
35 unsigned long long uvalue = value * (calculated_number)100000;
39 do *wstr++ = (char)(48 + (uvalue % 10)); while(uvalue /= 10);
41 // make sure we have 6 bytes at least
42 while((wstr - str) < 6) *wstr++ = '0';
45 if(sign) *wstr++ = '-';
48 char *begin = str, *end = --wstr, aux;
49 while (end > begin) aux = *end, *end-- = *begin, *begin++ = aux;
51 // strreverse(str, wstr);
53 // remove trailing zeros
55 while(decimal > 0 && *wstr == '0') {
60 // terminate it, one position to the right
61 // to let space for a dot
64 // make space for the dot
66 for(i = 0; i < decimal ;i++) {
72 if(wstr[2] == '\0') { wstr[1] = '\0'; decimal--; }
75 // return the buffer length
76 return ( (wstr - str) + 2 + decimal );
79 void web_buffer_rrd_value(struct web_buffer *wb, calculated_number value)
81 if(wb->size - wb->bytes < 50) return;
82 wb->bytes += print_calculated_number(&wb->buffer[wb->bytes], value);
85 // generate a javascript date, the fastest possible way...
86 void web_buffer_jsdate(struct web_buffer *wb, int year, int month, int day, int hours, int minutes, int seconds)
89 // 01234567890123456789012345678901234
90 // Date(2014, 04, 01, 03, 28, 20, 065)
92 if(wb->size - wb->bytes < 36) return;
94 char *b = &wb->buffer[wb->bytes];
102 b[i++]= 48 + year / 1000; year -= (year / 1000) * 1000;
103 b[i++]= 48 + year / 100; year -= (year / 100) * 100;
104 b[i++]= 48 + year / 10;
105 b[i++]= 48 + year % 10;
108 b[i]= 48 + month / 10; if(b[i] != '0') i++;
109 b[i++]= 48 + month % 10;
112 b[i]= 48 + day / 10; if(b[i] != '0') i++;
113 b[i++]= 48 + day % 10;
116 b[i]= 48 + hours / 10; if(b[i] != '0') i++;
117 b[i++]= 48 + hours % 10;
120 b[i]= 48 + minutes / 10; if(b[i] != '0') i++;
121 b[i++]= 48 + minutes % 10;
124 b[i]= 48 + seconds / 10; if(b[i] != '0') i++;
125 b[i++]= 48 + seconds % 10;
132 struct web_buffer *web_buffer_create(long size)
134 struct web_buffer *b;
136 debug(D_WEB_BUFFER, "Creating new web buffer of size %d.", size);
138 b = calloc(1, sizeof(struct web_buffer));
140 error("Cannot allocate a web_buffer.");
144 b->buffer = malloc(size);
146 error("Cannot allocate a buffer of size %u.", size);
152 b->contenttype = CT_TEXT_PLAIN;
156 void web_buffer_free(struct web_buffer *b)
158 debug(D_WEB_BUFFER, "Freeing web buffer of size %d.", b->size);
160 if(b->buffer) free(b->buffer);
164 void web_buffer_increase(struct web_buffer *b, long free_size_required)
166 long left = b->size - b->bytes;
168 if(left >= free_size_required) return;
169 long increase = free_size_required - left;
170 if(increase < WEB_DATA_LENGTH_INCREASE_STEP) increase = WEB_DATA_LENGTH_INCREASE_STEP;
172 debug(D_WEB_BUFFER, "Increasing data buffer from size %d to %d.", b->size, b->size + increase);
174 b->buffer = realloc(b->buffer, b->size + increase);
175 if(!b->buffer) fatal("Failed to increase data buffer from size %d to %d.", b->size, b->size + increase);