html.c (view raw)
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
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{
31 write(htmlfd, txt, strlen(txt));
32}
33
34void 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
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(">");
56 else if (c=='<')
57 html("<");
58 else if (c=='&')
59 html("&");
60 txt = t+1;
61 }
62 t++;
63 }
64 if (t!=txt)
65 html(txt);
66}
67
68
69void html_attr(char *txt)
70{
71 char *t = txt;
72 while(*t){
73 int c = *t;
74 if (c=='<' || c=='>' || c=='\'') {
75 *t = '\0';
76 html(txt);
77 *t = c;
78 if (c=='>')
79 html(">");
80 else if (c=='<')
81 html("<");
82 else if (c=='\'')
83 html(""e;");
84 txt = t+1;
85 }
86 t++;
87 }
88 if (t!=txt)
89 html(txt);
90}
91
92void html_link_open(char *url, char *title, char *class)
93{
94 html("<a href='");
95 html_attr(url);
96 if (title) {
97 html("' title='");
98 html_attr(title);
99 }
100 if (class) {
101 html("' class='");
102 html_attr(class);
103 }
104 html("'>");
105}
106
107void html_link_close(void)
108{
109 html("</a>");
110}
111
112void html_fileperm(unsigned short mode)
113{
114 htmlf("%c%c%c", (mode & 4 ? 'r' : '-'),
115 (mode & 2 ? 'w' : '-'), (mode & 1 ? 'x' : '-'));
116}
117
118void html_filemode(unsigned short mode)
119{
120 if (S_ISDIR(mode))
121 html("d");
122 else if (S_ISLNK(mode))
123 html("l");
124 else
125 html("-");
126 html_fileperm(mode >> 6);
127 html_fileperm(mode >> 3);
128 html_fileperm(mode);
129}
130