]> git.cameronkatri.com Git - cgit.git/blobdiff - html.c
filters: migrate from luacrypto to luaossl
[cgit.git] / html.c
diff --git a/html.c b/html.c
index 155cde58d26093114e4cca4d78fb20f29fdcc93b..7f81965fddcd837cc880f3a28b120d9fe71b504c 100644 (file)
--- a/html.c
+++ b/html.c
@@ -8,12 +8,7 @@
 
 #include "cgit.h"
 #include "html.h"
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <errno.h>
+#include "url.h"
 
 /* Percent-encoding of each character, except: a-zA-Z0-9!$()*,./:;@- */
 static const char* url_escape_table[256] = {
@@ -127,38 +122,22 @@ void html_vtxtf(const char *format, va_list ap)
        strbuf_release(&buf);
 }
 
-void html_status(int code, const char *msg, int more_headers)
-{
-       htmlf("Status: %d %s\n", code, msg);
-       if (!more_headers)
-               html("\n");
-}
-
 void html_txt(const char *txt)
 {
-       const char *t = txt;
-       while (t && *t) {
-               int c = *t;
-               if (c == '<' || c == '>' || c == '&') {
-                       html_raw(txt, t - txt);
-                       if (c == '>')
-                               html("&gt;");
-                       else if (c == '<')
-                               html("&lt;");
-                       else if (c == '&')
-                               html("&amp;");
-                       txt = t + 1;
-               }
-               t++;
-       }
-       if (t != txt)
-               html(txt);
+       if (txt)
+               html_ntxt(txt, strlen(txt));
 }
 
-void html_ntxt(int len, const char *txt)
+ssize_t html_ntxt(const char *txt, size_t len)
 {
        const char *t = txt;
-       while (t && *t && len--) {
+       ssize_t slen;
+
+       if (len > SSIZE_MAX)
+               return -1;
+
+       slen = (ssize_t) len;
+       while (t && *t && slen--) {
                int c = *t;
                if (c == '<' || c == '>' || c == '&') {
                        html_raw(txt, t - txt);
@@ -174,8 +153,7 @@ void html_ntxt(int len, const char *txt)
        }
        if (t != txt)
                html_raw(txt, t - txt);
-       if (len < 0)
-               html("...");
+       return slen;
 }
 
 void html_attrf(const char *fmt, ...)
@@ -252,6 +230,32 @@ void html_url_arg(const char *txt)
                html(txt);
 }
 
+void html_header_arg_in_quotes(const char *txt)
+{
+       const char *t = txt;
+       while (t && *t) {
+               unsigned char c = *t;
+               const char *e = NULL;
+               if (c == '\\')
+                       e = "\\\\";
+               else if (c == '\r')
+                       e = "\\r";
+               else if (c == '\n')
+                       e = "\\n";
+               else if (c == '"')
+                       e = "\\\"";
+               if (e) {
+                       html_raw(txt, t - txt);
+                       html(e);
+                       txt = t + 1;
+               }
+               t++;
+       }
+       if (t != txt)
+               html(txt);
+
+}
+
 void html_hidden(const char *name, const char *value)
 {
        html("<input type='hidden' name='");
@@ -324,64 +328,17 @@ int html_include(const char *filename)
        return 0;
 }
 
-static int hextoint(char c)
-{
-       if (c >= 'a' && c <= 'f')
-               return 10 + c - 'a';
-       else if (c >= 'A' && c <= 'F')
-               return 10 + c - 'A';
-       else if (c >= '0' && c <= '9')
-               return c - '0';
-       else
-               return -1;
-}
-
-static char *convert_query_hexchar(char *txt)
+void http_parse_querystring(const char *txt, void (*fn)(const char *name, const char *value))
 {
-       int d1, d2, n;
-       n = strlen(txt);
-       if (n < 3) {
-               *txt = '\0';
-               return txt-1;
-       }
-       d1 = hextoint(*(txt + 1));
-       d2 = hextoint(*(txt + 2));
-       if (d1 < 0 || d2 < 0) {
-               memmove(txt, txt + 3, n - 2);
-               return txt-1;
-       } else {
-               *txt = d1 * 16 + d2;
-               memmove(txt + 1, txt + 3, n - 2);
-               return txt;
-       }
-}
+       const char *t = txt;
 
-int http_parse_querystring(const char *txt_, void (*fn)(const char *name, const char *value))
-{
-       char *o, *t, *txt, *value = NULL, c;
-
-       if (!txt_)
-               return 0;
-
-       o = t = txt = xstrdup(txt_);
-       while ((c=*t) != '\0') {
-               if (c == '=') {
-                       *t = '\0';
-                       value = t + 1;
-               } else if (c == '+') {
-                       *t = ' ';
-               } else if (c == '%') {
-                       t = convert_query_hexchar(t);
-               } else if (c == '&') {
-                       *t = '\0';
-                       (*fn)(txt, value);
-                       txt = t + 1;
-                       value = NULL;
+       while (t && *t) {
+               char *name = url_decode_parameter_name(&t);
+               if (*name) {
+                       char *value = url_decode_parameter_value(&t);
+                       fn(name, value);
+                       free(value);
                }
-               t++;
+               free(name);
        }
-       if (t != txt)
-               (*fn)(txt, value);
-       free(o);
-       return 0;
 }