Я новичок в C и хочу знать, правильно ли я обрабатываю что-то. Я создаю модуль для http://nginx.com/, и я создаю страницу состояния для моего модуля.Расчет размера строки C перед записью в буфер
Теперь страница состояния будет состоять из некоторых базовых таблиц HTML &. Вот некоторые из моего кода, чтобы создать это.
// Get size
size =
sizeof("<table>") +
sizeof("<tr><td align=\"right\">enabled:</td><td>YES</td></tr>") +
sizeof("<tr><td align=\"right\">activated:</td><td>YES</td></tr>") +
sizeof("<tr><td align=\"right\">connections/lt:</td><td>") + NGX_ATOMIC_T_LEN + sizeof("/") + NGX_ATOMIC_T_LEN + sizeof("</td></tr>") +
sizeof("<tr><td align=\"right\">remain on: xxxx-xx-xx xx:xx:xx GMT</td><td></td></tr>") +
sizeof("</table>");
// Start buffer
b = ngx_create_temp_buf(r->pool, size);
if (b == NULL) {
return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
// Start chain
out.buf = b;
out.next = NULL;
// Finish buffer
b->last = ngx_sprintf(b->last, "<table>");
b->last = ngx_sprintf(b->last, "<tr><td align=\"right\">enabled:</td><td>%s</td></tr>", alcf->enabled ? "YES" : "NO");
b->last = ngx_sprintf(b->last, "<tr><td align=\"right\">activated:</td><td>%s</td></tr>", alcf->activated ? "YES" : "NO");
b->last = ngx_sprintf(b->last, "<tr><td align=\"right\">connections/lt:</td><td>%uA/%uA</td></tr>", ac, alcf->connections_activate);
b->last = ngx_sprintf(b->last, "<tr><td align=\"right\">remain on:</td><td>");
b->last = !alcf->activatedEndTime ? ngx_sprintf(b->last,"") : ngx_http_cookie_time(b->last, alcf->activatedEndTime);
b->last = ngx_sprintf(b->last, "</td></tr>");
b->last = ngx_sprintf(b->last, "<table>");
Это единственный эффективный способ сделать это, я чувствую, что это было бы неправильно, чтобы написать HTML код дважды, один раз, чтобы получить размер, чтобы раздуть буфер, и один на самом деле хранить в буфер. Будет ли какое-то другое решение. Я стараюсь держать его как можно более эффективным.
http://stackoverflow.com/questions/5338446/predict-len-of-an-sprintf-ed-line –