summaryrefslogtreecommitdiff
path: root/html.c
diff options
context:
space:
mode:
Diffstat (limited to 'html.c')
-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>");
+}