about summary refs log tree commit diff
path: root/html.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--html.c100
1 files changed, 100 insertions, 0 deletions
diff --git a/html.c b/html.c
new file mode 100644
index 0000000..5780dc1
--- /dev/null
+++ b/html.c
@@ -0,0 +1,100 @@
+#include "cgit.h"
+
+char *fmt(const char *format, ...)
+{
+	static char buf[8][1024];
+	static int bufidx;
+	int len;
+	va_list args;
+
+	bufidx++;
+	bufidx &= 7;
+
+	va_start(args, format);
+	len = vsnprintf(buf[bufidx], sizeof(buf[bufidx]), format, args);
+	va_end(args);
+	if (len>sizeof(buf[bufidx]))
+		die("[html.c] string truncated: %s", format);
+	return buf[bufidx];
+}
+
+void html(const char *txt)
+{
+	fputs(txt, stdout);
+}
+
+void htmlf(const char *format, ...)
+{
+	va_list args;
+
+	va_start(args, format);
+	vprintf(format, args);
+	va_end(args);
+}
+
+void html_txt(char *txt)
+{
+	char *t = txt;
+	while(*t){
+		int c = *t;
+		if (c=='<' || c=='>' || c=='&') {
+			*t = '\0';
+			html(txt);
+			*t = c;
+			if (c=='>')
+				html("&gt;");
+			else if (c=='<')
+				html("&lt;");
+			else if (c=='&')
+				html("&amp;");
+			txt = t+1;
+		}
+		t++;
+	}
+	if (t!=txt)
+		html(txt);
+}
+
+
+void html_attr(char *txt)
+{
+	char *t = txt;
+	while(*t){
+		int c = *t;
+		if (c=='<' || c=='>' || c=='\'') {
+			*t = '\0';
+			html(txt);
+			*t = c;
+			if (c=='>')
+				html("&gt;");
+			else if (c=='<')
+				html("&lt;");
+			else if (c=='\'')
+				html("&quote;");
+			txt = t+1;
+		}
+		t++;
+	}
+	if (t!=txt)
+		html(txt);
+}
+
+void html_link_open(char *url, char *title, char *class)
+{
+	html("<a href='");
+	html_attr(url);
+	if (title) {
+		html("' title='");
+		html_attr(title);
+	}
+	if (class) {
+		html("' class='");
+		html_attr(class);
+	}
+	html("'>");
+}
+
+void html_link_close(void)
+{
+	html("</a>");
+}