3 #include "web_buffer.h"
8 void web_buffer_strcpy(struct web_buffer *wb, const char *txt)
10 char *buffer = wb->buffer;
11 long bytes = wb->bytes, size = wb->size, i = 0;
13 while(txt[i] && bytes < size)
14 buffer[bytes++] = txt[i++];
19 int print_calculated_number(char *str, calculated_number value)
23 // make sure it is unsigned
24 unsigned long long uvalue = (unsigned long long)(((value < 0) ? -value : value) * (calculated_number)10000);
27 do *wstr++ = (char)(48 + (uvalue % 10)); while(uvalue /= 10);
29 // make sure we have 8 bytes at least
30 while((wstr - str) < 5) *wstr++ = '0';
33 if (value < 0) *wstr++ = '-';
37 strreverse(str, wstr);
39 // terminate it, one position to the right
40 // to let space for a dot
44 for(i = 0; i < 4 ;i++) {
50 // return the buffer length
51 return ( (wstr - str) + 6 );
54 void web_buffer_rrd_value(struct web_buffer *wb, calculated_number value)
56 if(wb->size - wb->bytes < 50) return;
57 wb->bytes += print_calculated_number(&wb->buffer[wb->bytes], value);
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)
64 // 01234567890123456789012345678901234
65 // Date(2014, 04, 01, 03, 28, 20, 065)
67 if(wb->size - wb->bytes < 36) return;
69 char *b = &wb->buffer[wb->bytes];
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;
83 b[i]= 48 + month / 10; if(b[i] != '0') i++;
84 b[i++]= 48 + month % 10;
87 b[i]= 48 + day / 10; if(b[i] != '0') i++;
88 b[i++]= 48 + day % 10;
91 b[i]= 48 + hours / 10; if(b[i] != '0') i++;
92 b[i++]= 48 + hours % 10;
95 b[i]= 48 + minutes / 10; if(b[i] != '0') i++;
96 b[i++]= 48 + minutes % 10;
99 b[i]= 48 + seconds / 10; if(b[i] != '0') i++;
100 b[i++]= 48 + seconds % 10;
107 struct web_buffer *web_buffer_create(long size)
109 struct web_buffer *b;
111 debug(D_WEB_BUFFER, "Creating new web buffer of size %d.", size);
113 b = calloc(1, sizeof(struct web_buffer));
115 error("Cannot allocate a web_buffer.");
119 b->buffer = malloc(size);
121 error("Cannot allocate a buffer of size %u.", size);
127 b->contenttype = CT_TEXT_PLAIN;
131 void web_buffer_free(struct web_buffer *b)
133 debug(D_WEB_BUFFER, "Freeing web buffer of size %d.", b->size);
135 if(b->buffer) free(b->buffer);
139 void web_buffer_increase(struct web_buffer *b, long free_size_required)
141 long left = b->size - b->bytes;
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;
147 debug(D_WEB_BUFFER, "Increasing data buffer from size %d to %d.", b->size, b->size + increase);
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);