/* * Chunk management functions. * * Copyright 2000-2012 Willy Tarreau * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * */ #include #include #include #include #include #include /* * Does an snprintf() at the end of chunk , respecting the limit of * at most chk->size chars. If the chk->len is over, nothing is added. Returns * the new chunk size. */ int chunk_printf(struct chunk *chk, const char *fmt, ...) { va_list argp; int ret; if (!chk->str || !chk->size) return 0; va_start(argp, fmt); ret = vsnprintf(chk->str + chk->len, chk->size - chk->len, fmt, argp); if (ret >= chk->size - chk->len) /* do not copy anything in case of truncation */ chk->str[chk->len] = 0; else chk->len += ret; va_end(argp); return chk->len; } /* * Encode chunk into chunk , respecting the limit of at most * chk->size chars. Replace non-printable or special chracters with "&#%d;". * If the chk->len is over, nothing is added. Returns the new chunk size. */ int chunk_htmlencode(struct chunk *dst, struct chunk *src) { int i, l; int olen, free; char c; olen = dst->len; for (i = 0; i < src->len; i++) { free = dst->size - dst->len; if (!free) { dst->len = olen; return dst->len; } c = src->str[i]; if (!isascii(c) || !isprint((unsigned char)c) || c == '&' || c == '"' || c == '\'' || c == '<' || c == '>') { l = snprintf(dst->str + dst->len, free, "&#%u;", (unsigned char)c); if (free < l) { dst->len = olen; return dst->len; } dst->len += l; } else { dst->str[dst->len] = c; dst->len++; } } return dst->len; } /* * Encode chunk into chunk , respecting the limit of at most * chk->size chars. Replace non-printable or char passed in qc with "<%02X>". * If the chk->len is over, nothing is added. Returns the new chunk size. */ int chunk_asciiencode(struct chunk *dst, struct chunk *src, char qc) { int i, l; int olen, free; char c; olen = dst->len; for (i = 0; i < src->len; i++) { free = dst->size - dst->len; if (!free) { dst->len = olen; return dst->len; } c = src->str[i]; if (!isascii(c) || !isprint((unsigned char)c) || c == '<' || c == '>' || c == qc) { l = snprintf(dst->str + dst->len, free, "<%02X>", (unsigned char)c); if (free < l) { dst->len = olen; return dst->len; } dst->len += l; } else { dst->str[dst->len] = c; dst->len++; } } return dst->len; } /* * Local variables: * c-indent-level: 8 * c-basic-offset: 8 * End: */