blob: eb163d9d1f3a249feb36ee155ab5a464ef4aa64a [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;
Lars Hjemli27cd3b22006-12-28 01:54:43 +010048 while(t && *t){
Lars Hjemli0d169ad2006-12-09 15:18:17 +010049 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;
Lars Hjemli27cd3b22006-12-28 01:54:43 +010071 while(t && *t && len--){
Lars Hjemli9d8d9b62006-12-22 00:58:18 +010072 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;
Lars Hjemli27cd3b22006-12-28 01:54:43 +0100100 while(t && *t){
Lars Hjemli0d169ad2006-12-09 15:18:17 +0100101 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
Lars Hjemlie39d7382006-12-28 02:01:49 +0100120void html_hidden(char *name, char *value)
121{
122 html("<input type='hidden' name='");
123 html_attr(name);
124 html("' value='");
125 html_attr(value);
126 html("'/>");
127}
128
Lars Hjemli6ec5f362007-10-28 12:08:45 +0100129void html_option(char *value, char *text, char *selected_value)
130{
131 html("<option value='");
132 html_attr(value);
133 html("'");
134 if (selected_value && !strcmp(selected_value, value))
Lars Hjemli29154832007-11-11 13:04:28 +0100135 html(" selected='selected'");
Lars Hjemli6ec5f362007-10-28 12:08:45 +0100136 html(">");
137 html_txt(text);
138 html("</option>\n");
139}
140
Lars Hjemli0d169ad2006-12-09 15:18:17 +0100141void html_link_open(char *url, char *title, char *class)
142{
143 html("<a href='");
144 html_attr(url);
145 if (title) {
146 html("' title='");
147 html_attr(title);
148 }
149 if (class) {
150 html("' class='");
151 html_attr(class);
152 }
153 html("'>");
154}
155
156void html_link_close(void)
157{
158 html("</a>");
159}
Lars Hjemli6cb326c2006-12-17 23:07:28 +0100160
161void html_fileperm(unsigned short mode)
162{
163 htmlf("%c%c%c", (mode & 4 ? 'r' : '-'),
164 (mode & 2 ? 'w' : '-'), (mode & 1 ? 'x' : '-'));
165}
166
167void html_filemode(unsigned short mode)
168{
169 if (S_ISDIR(mode))
170 html("d");
171 else if (S_ISLNK(mode))
172 html("l");
Jeffrey C. Olliee651cb02007-06-04 12:28:56 -0500173 else if (S_ISGITLINK(mode))
Lars Hjemlided93932007-05-11 12:12:48 +0200174 html("m");
Lars Hjemli6cb326c2006-12-17 23:07:28 +0100175 else
176 html("-");
177 html_fileperm(mode >> 6);
178 html_fileperm(mode >> 3);
179 html_fileperm(mode);
180}
Lars Hjemli5e751282007-05-18 23:56:10 +0200181
182int html_include(const char *filename)
183{
184 FILE *f;
185 char buf[4096];
186 size_t len;
187
188 if (!(f = fopen(filename, "r")))
189 return -1;
190 while((len = fread(buf, 1, 4096, f)) > 0)
191 write(htmlfd, buf, len);
192 fclose(f);
193 return 0;
194}