blob: 957b3268be1a49a5a1d336d3412a4e71d4ca5959 [file] [log] [blame]
Lars Hjemli7640d902006-12-10 22:41:14 +01001/* html.c: helper functions for html output
2 *
3 * Copyright (C) 2006 Lars Hjemli
4 *
5 * Licensed under GNU General Public License v2
6 * (see COPYING for full license text)
7 */
8
Lars Hjemli0d169ad2006-12-09 15:18:17 +01009#include "cgit.h"
10
11char *fmt(const char *format, ...)
12{
13 static char buf[8][1024];
14 static int bufidx;
15 int len;
16 va_list args;
17
18 bufidx++;
19 bufidx &= 7;
20
21 va_start(args, format);
22 len = vsnprintf(buf[bufidx], sizeof(buf[bufidx]), format, args);
23 va_end(args);
24 if (len>sizeof(buf[bufidx]))
25 die("[html.c] string truncated: %s", format);
26 return buf[bufidx];
27}
28
29void html(const char *txt)
30{
Lars Hjemli25105d72006-12-10 22:31:36 +010031 write(htmlfd, txt, strlen(txt));
Lars Hjemli0d169ad2006-12-09 15:18:17 +010032}
33
34void htmlf(const char *format, ...)
35{
Lars Hjemli25105d72006-12-10 22:31:36 +010036 static char buf[65536];
Lars Hjemli0d169ad2006-12-09 15:18:17 +010037 va_list args;
38
39 va_start(args, format);
Lars Hjemli25105d72006-12-10 22:31:36 +010040 vsnprintf(buf, sizeof(buf), format, args);
Lars Hjemli0d169ad2006-12-09 15:18:17 +010041 va_end(args);
Lars Hjemli25105d72006-12-10 22:31:36 +010042 html(buf);
Lars Hjemli0d169ad2006-12-09 15:18:17 +010043}
44
45void html_txt(char *txt)
46{
47 char *t = txt;
48 while(*t){
49 int c = *t;
50 if (c=='<' || c=='>' || c=='&') {
51 *t = '\0';
52 html(txt);
53 *t = c;
54 if (c=='>')
55 html("&gt;");
56 else if (c=='<')
57 html("&lt;");
58 else if (c=='&')
59 html("&amp;");
60 txt = t+1;
61 }
62 t++;
63 }
64 if (t!=txt)
65 html(txt);
66}
67
Lars Hjemli9d8d9b62006-12-22 00:58:18 +010068void html_ntxt(int len, char *txt)
69{
70 char *t = txt;
71 while(*t && len--){
72 int c = *t;
73 if (c=='<' || c=='>' || c=='&') {
74 *t = '\0';
75 html(txt);
76 *t = c;
77 if (c=='>')
78 html("&gt;");
79 else if (c=='<')
80 html("&lt;");
81 else if (c=='&')
82 html("&amp;");
83 txt = t+1;
84 }
85 t++;
86 }
87 if (t!=txt) {
88 char c = *t;
89 *t = '\0';
90 html(txt);
91 *t = c;
92 }
93 if (len<0)
94 html("...");
95}
Lars Hjemli0d169ad2006-12-09 15:18:17 +010096
97void html_attr(char *txt)
98{
99 char *t = txt;
100 while(*t){
101 int c = *t;
102 if (c=='<' || c=='>' || c=='\'') {
103 *t = '\0';
104 html(txt);
105 *t = c;
106 if (c=='>')
107 html("&gt;");
108 else if (c=='<')
109 html("&lt;");
110 else if (c=='\'')
111 html("&quote;");
112 txt = t+1;
113 }
114 t++;
115 }
116 if (t!=txt)
117 html(txt);
118}
119
120void html_link_open(char *url, char *title, char *class)
121{
122 html("<a href='");
123 html_attr(url);
124 if (title) {
125 html("' title='");
126 html_attr(title);
127 }
128 if (class) {
129 html("' class='");
130 html_attr(class);
131 }
132 html("'>");
133}
134
135void html_link_close(void)
136{
137 html("</a>");
138}
Lars Hjemli6cb326c2006-12-17 23:07:28 +0100139
140void html_fileperm(unsigned short mode)
141{
142 htmlf("%c%c%c", (mode & 4 ? 'r' : '-'),
143 (mode & 2 ? 'w' : '-'), (mode & 1 ? 'x' : '-'));
144}
145
146void html_filemode(unsigned short mode)
147{
148 if (S_ISDIR(mode))
149 html("d");
150 else if (S_ISLNK(mode))
151 html("l");
152 else
153 html("-");
154 html_fileperm(mode >> 6);
155 html_fileperm(mode >> 3);
156 html_fileperm(mode);
157}
158