4 #include "web_buffer.h"
9 void web_buffer_strcpy(struct web_buffer *wb, const char *txt)
11 char *buffer = wb->buffer;
12 long bytes = wb->bytes, size = wb->size, i = 0;
14 while(txt[i] && bytes < size)
15 buffer[bytes++] = txt[i++];
20 int print_calculated_number(char *str, calculated_number value)
24 int sign = (value < 0) ? 1 : 0;
25 if(sign) value = -value;
27 // without llrint() there are rounding problems
28 // for example 0.9 becomes 0.89
29 unsigned long long uvalue = llrint(value * (calculated_number)100000);
32 do *wstr++ = (char)(48 + (uvalue % 10)); while(uvalue /= 10);
34 // make sure we have 6 bytes at least
35 while((wstr - str) < 6) *wstr++ = '0';
38 if(sign) *wstr++ = '-';
41 char *begin = str, *end = --wstr, aux;
42 while (end > begin) aux = *end, *end-- = *begin, *begin++ = aux;
44 // strreverse(str, wstr);
46 // remove trailing zeros
48 while(decimal > 0 && *wstr == '0') {
53 // terminate it, one position to the right
54 // to let space for a dot
57 // make space for the dot
59 for(i = 0; i < decimal ;i++) {
65 if(wstr[2] == '\0') { wstr[1] = '\0'; decimal--; }
68 // return the buffer length
69 return ( (wstr - str) + 2 + decimal );
72 void web_buffer_rrd_value(struct web_buffer *wb, calculated_number value)
74 if(wb->size - wb->bytes < 50) return;
75 wb->bytes += print_calculated_number(&wb->buffer[wb->bytes], value);
78 // generate a javascript date, the fastest possible way...
79 void web_buffer_jsdate(struct web_buffer *wb, int year, int month, int day, int hours, int minutes, int seconds)
82 // 01234567890123456789012345678901234
83 // Date(2014, 04, 01, 03, 28, 20, 065)
85 if(wb->size - wb->bytes < 36) return;
87 char *b = &wb->buffer[wb->bytes];
95 b[i++]= 48 + year / 1000; year -= (year / 1000) * 1000;
96 b[i++]= 48 + year / 100; year -= (year / 100) * 100;
97 b[i++]= 48 + year / 10;
98 b[i++]= 48 + year % 10;
101 b[i]= 48 + month / 10; if(b[i] != '0') i++;
102 b[i++]= 48 + month % 10;
105 b[i]= 48 + day / 10; if(b[i] != '0') i++;
106 b[i++]= 48 + day % 10;
109 b[i]= 48 + hours / 10; if(b[i] != '0') i++;
110 b[i++]= 48 + hours % 10;
113 b[i]= 48 + minutes / 10; if(b[i] != '0') i++;
114 b[i++]= 48 + minutes % 10;
117 b[i]= 48 + seconds / 10; if(b[i] != '0') i++;
118 b[i++]= 48 + seconds % 10;
125 struct web_buffer *web_buffer_create(long size)
127 struct web_buffer *b;
129 debug(D_WEB_BUFFER, "Creating new web buffer of size %d.", size);
131 b = calloc(1, sizeof(struct web_buffer));
133 error("Cannot allocate a web_buffer.");
137 b->buffer = malloc(size);
139 error("Cannot allocate a buffer of size %u.", size);
145 b->contenttype = CT_TEXT_PLAIN;
149 void web_buffer_free(struct web_buffer *b)
151 debug(D_WEB_BUFFER, "Freeing web buffer of size %d.", b->size);
153 if(b->buffer) free(b->buffer);
157 void web_buffer_increase(struct web_buffer *b, long free_size_required)
159 long left = b->size - b->bytes;
161 if(left >= free_size_required) return;
162 long increase = free_size_required - left;
163 if(increase < WEB_DATA_LENGTH_INCREASE_STEP) increase = WEB_DATA_LENGTH_INCREASE_STEP;
165 debug(D_WEB_BUFFER, "Increasing data buffer from size %d to %d.", b->size, b->size + increase);
167 b->buffer = realloc(b->buffer, b->size + increase);
168 if(!b->buffer) fatal("Failed to increase data buffer from size %d to %d.", b->size, b->size + increase);