7 #ifdef STORAGE_WITH_MATH
12 #include "web_buffer.h"
15 void web_buffer_reset(struct web_buffer *wb)
21 wb->contenttype = CT_TEXT_PLAIN;
25 void web_buffer_char_replace(struct web_buffer *wb, char from, char to)
27 char *s = wb->buffer, *end = &wb->buffer[wb->len];
30 if(*s == from) *s = to;
36 void web_buffer_strcat(struct web_buffer *wb, const char *txt)
38 char *buffer = wb->buffer;
40 long bytes = wb->len, size = wb->size;
42 while(*s && bytes < size)
43 buffer[bytes++] = *s++;
48 web_buffer_need_bytes(wb, strlen(s));
49 web_buffer_strcat(wb, s);
52 // terminate the string
53 // without increasing the length
54 web_buffer_need_bytes(wb, 1);
55 wb->buffer[wb->len] = '\0';
60 void web_buffer_snprintf(struct web_buffer *wb, size_t len, const char *fmt, ...)
62 web_buffer_need_bytes(wb, len+1);
66 wb->len += vsnprintf(&wb->buffer[wb->len], len+1, fmt, args);
69 // the buffer is \0 terminated by vsnprintf
73 void web_buffer_rrd_value(struct web_buffer *wb, calculated_number value)
75 web_buffer_need_bytes(wb, 50);
76 wb->len += print_calculated_number(&wb->buffer[wb->len], value);
79 web_buffer_need_bytes(wb, 1);
80 wb->buffer[wb->len] = '\0';
83 // generate a javascript date, the fastest possible way...
84 void web_buffer_jsdate(struct web_buffer *wb, int year, int month, int day, int hours, int minutes, int seconds)
87 // 01234567890123456789012345678901234
88 // Date(2014, 04, 01, 03, 28, 20, 065)
90 web_buffer_need_bytes(wb, 36);
92 char *b = &wb->buffer[wb->len];
100 b[i++]= 48 + year / 1000; year -= (year / 1000) * 1000;
101 b[i++]= 48 + year / 100; year -= (year / 100) * 100;
102 b[i++]= 48 + year / 10;
103 b[i++]= 48 + year % 10;
106 b[i]= 48 + month / 10; if(b[i] != '0') i++;
107 b[i++]= 48 + month % 10;
110 b[i]= 48 + day / 10; if(b[i] != '0') i++;
111 b[i++]= 48 + day % 10;
114 b[i]= 48 + hours / 10; if(b[i] != '0') i++;
115 b[i++]= 48 + hours % 10;
118 b[i]= 48 + minutes / 10; if(b[i] != '0') i++;
119 b[i++]= 48 + minutes % 10;
122 b[i]= 48 + seconds / 10; if(b[i] != '0') i++;
123 b[i++]= 48 + seconds % 10;
130 web_buffer_need_bytes(wb, 1);
131 wb->buffer[wb->len] = '\0';
134 struct web_buffer *web_buffer_create(long size)
136 struct web_buffer *b;
138 debug(D_WEB_BUFFER, "Creating new web buffer of size %d.", size);
140 b = calloc(1, sizeof(struct web_buffer));
142 error("Cannot allocate a web_buffer.");
146 b->buffer = malloc(size);
148 error("Cannot allocate a buffer of size %u.", size);
154 b->contenttype = CT_TEXT_PLAIN;
158 void web_buffer_free(struct web_buffer *b)
160 debug(D_WEB_BUFFER, "Freeing web buffer of size %d.", b->size);
162 if(b->buffer) free(b->buffer);
166 void web_buffer_increase(struct web_buffer *b, long free_size_required)
168 long left = b->size - b->len;
170 if(left >= free_size_required) return;
172 long increase = free_size_required - left;
173 if(increase < WEB_DATA_LENGTH_INCREASE_STEP) increase = WEB_DATA_LENGTH_INCREASE_STEP;
175 debug(D_WEB_BUFFER, "Increasing data buffer from size %d to %d.", b->size, b->size + increase);
177 b->buffer = realloc(b->buffer, b->size + increase);
178 if(!b->buffer) fatal("Failed to increase data buffer from size %d to %d.", b->size, b->size + increase);