]> gitweb.ps.run Git - ps-cgit/blob - html.c
Merge branch 'stable'
[ps-cgit] / html.c
1 /* 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
9 #include "cgit.h"
10
11 char *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
29 void html(const char *txt)
30 {
31         write(htmlfd, txt, strlen(txt));
32 }
33
34 void htmlf(const char *format, ...)
35 {
36         static char buf[65536];
37         va_list args;
38
39         va_start(args, format);
40         vsnprintf(buf, sizeof(buf), format, args);
41         va_end(args);
42         html(buf);
43 }
44
45 void html_txt(char *txt)
46 {
47         char *t = txt;
48         while(t && *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
68 void html_ntxt(int len, char *txt)
69 {
70         char *t = txt;
71         while(t && *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 }
96
97 void html_attr(char *txt)
98 {
99         char *t = txt;
100         while(t && *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
120 void 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
129 void 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))
135                 html(" selected='selected'");
136         html(">");
137         html_txt(text);
138         html("</option>\n");
139 }
140
141 void 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
156 void html_link_close(void)
157 {
158         html("</a>");
159 }
160
161 void html_fileperm(unsigned short mode)
162 {
163         htmlf("%c%c%c", (mode & 4 ? 'r' : '-'), 
164               (mode & 2 ? 'w' : '-'), (mode & 1 ? 'x' : '-'));
165 }
166
167 void html_filemode(unsigned short mode)
168 {
169         if (S_ISDIR(mode))
170                 html("d");
171         else if (S_ISLNK(mode))
172                 html("l");
173         else if (S_ISGITLINK(mode))
174                 html("m");
175         else
176                 html("-");
177         html_fileperm(mode >> 6);
178         html_fileperm(mode >> 3);
179         html_fileperm(mode);
180 }
181
182 int 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 }