X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Futils_cgi.c;h=9efa01f72af575af7eb035b881517aa67d1f1cdb;hb=f2f5199194d22cd15681fdf02469dce4445f3d14;hp=184578869cacda2f8f062084d19835e677d0187a;hpb=e9d94ae68f4081b25c4d278cea49b51354062e7d;p=collection4.git diff --git a/src/utils_cgi.c b/src/utils_cgi.c index 1845788..9efa01f 100644 --- a/src/utils_cgi.c +++ b/src/utils_cgi.c @@ -288,4 +288,68 @@ int time_to_rfc1123 (time_t t, char *buffer, size_t buffer_size) /* {{{ */ return (0); } /* }}} int time_to_rfc1123 */ +#define COPY_ENTITY(e) do { \ + size_t len = strlen (e); \ + if (dest_size < (len + 1)) \ + break; \ + strcpy (dest_ptr, (e)); \ + dest_ptr += len; \ + dest_size -= len; \ +} while (0) + +char *html_escape_copy (char *dest, const char *src, size_t n) /* {{{ */ +{ + char *dest_ptr; + size_t dest_size; + size_t pos; + + dest[0] = 0; + dest_ptr = dest; + dest_size = n; + for (pos = 0; src[pos] != 0; pos++) + { + if (src[pos] == '"') + COPY_ENTITY ("""); + else if (src[pos] == '<') + COPY_ENTITY ("<"); + else if (src[pos] == '>') + COPY_ENTITY (">"); + else if (src[pos] == '&') + COPY_ENTITY ("&"); + else + { + *dest_ptr = src[pos]; + dest_ptr++; + dest_size--; + *dest_ptr = 0; + } + + if (dest_size <= 1) + break; + } + + return (src); +} /* }}} char *html_escape_copy */ + +#undef COPY_ENTITY + +char *html_escape_buffer (char *buffer, size_t buffer_size) /* {{{ */ +{ + char tmp[buffer_size]; + + html_escape_copy (tmp, buffer, sizeof (tmp)); + memcpy (buffer, tmp, buffer_size); + + return (buffer); +} /* }}} char *html_escape_buffer */ + +char *html_escape (const char *string) /* {{{ */ +{ + char buffer[4096]; + + html_escape_copy (buffer, string, sizeof (buffer)); + + return (strdup (buffer)); +} /* }}} char *html_escape */ + /* vim: set sw=2 sts=2 et fdm=marker : */