summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--Makefile8
-rw-r--r--cache.h1
-rw-r--r--cgit.c2
-rw-r--r--cgit.h1
-rw-r--r--html.c18
-rw-r--r--html.h3
-rw-r--r--ui-blob.c4
-rw-r--r--ui-diff.c2
-rw-r--r--ui-log.c3
-rw-r--r--ui-repolist.c6
-rw-r--r--ui-stats.c18
-rw-r--r--ui-tree.c6
12 files changed, 42 insertions, 30 deletions
diff --git a/Makefile b/Makefile
index 23fdd53..6a47ed2 100644
--- a/Makefile
+++ b/Makefile
@@ -11,16 +11,21 @@ INSTALL = install
11 11
12# Define NO_STRCASESTR if you don't have strcasestr. 12# Define NO_STRCASESTR if you don't have strcasestr.
13# 13#
14# Define NO_OPENSSL to disable linking with OpenSSL and use bundled SHA1 14# Define NO_OPENSSL to disable linking with OpenSSL and use bundled SHA1
15# implementation (slower). 15# implementation (slower).
16# 16#
17# Define NEEDS_LIBICONV if linking with libc is not enough (eg. Darwin). 17# Define NEEDS_LIBICONV if linking with libc is not enough (eg. Darwin).
18# 18#
19# Define NO_C99_FORMAT if your formatted IO functions (printf/scanf et.al.)
20# do not support the 'size specifiers' introduced by C99, namely ll, hh,
21# j, z, t. (representing long long int, char, intmax_t, size_t, ptrdiff_t).
22# some C compilers supported these specifiers prior to C99 as an extension.
23#
19 24
20#-include config.mak 25#-include config.mak
21 26
22# 27#
23# Platform specific tweaks 28# Platform specific tweaks
24# 29#
25 30
26uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not') 31uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
@@ -122,16 +127,19 @@ CFLAGS += -DCGIT_SCRIPT_NAME='"$(CGIT_SCRIPT_NAME)"'
122CFLAGS += -DCGIT_CACHE_ROOT='"$(CACHE_ROOT)"' 127CFLAGS += -DCGIT_CACHE_ROOT='"$(CACHE_ROOT)"'
123 128
124ifdef NO_ICONV 129ifdef NO_ICONV
125 CFLAGS += -DNO_ICONV 130 CFLAGS += -DNO_ICONV
126endif 131endif
127ifdef NO_STRCASESTR 132ifdef NO_STRCASESTR
128 CFLAGS += -DNO_STRCASESTR 133 CFLAGS += -DNO_STRCASESTR
129endif 134endif
135ifdef NO_C99_FORMAT
136 CFLAGS += -DNO_C99_FORMAT
137endif
130ifdef NO_OPENSSL 138ifdef NO_OPENSSL
131 CFLAGS += -DNO_OPENSSL 139 CFLAGS += -DNO_OPENSSL
132 GIT_OPTIONS += NO_OPENSSL=1 140 GIT_OPTIONS += NO_OPENSSL=1
133else 141else
134 EXTLIBS += -lcrypto 142 EXTLIBS += -lcrypto
135endif 143endif
136 144
137cgit: $(OBJECTS) libgit 145cgit: $(OBJECTS) libgit
diff --git a/cache.h b/cache.h
index ac9276b..5cfdb4f 100644
--- a/cache.h
+++ b/cache.h
@@ -25,13 +25,14 @@ typedef void (*cache_fill_fn)(void *cbdata);
25extern int cache_process(int size, const char *path, const char *key, int ttl, 25extern int cache_process(int size, const char *path, const char *key, int ttl,
26 cache_fill_fn fn, void *cbdata); 26 cache_fill_fn fn, void *cbdata);
27 27
28 28
29/* List info about all cache entries on stdout */ 29/* List info about all cache entries on stdout */
30extern int cache_ls(const char *path); 30extern int cache_ls(const char *path);
31 31
32/* Print a message to stdout */ 32/* Print a message to stdout */
33__attribute__((format (printf,1,2)))
33extern void cache_log(const char *format, ...); 34extern void cache_log(const char *format, ...);
34 35
35extern unsigned long hash_str(const char *str); 36extern unsigned long hash_str(const char *str);
36 37
37#endif /* CGIT_CACHE_H */ 38#endif /* CGIT_CACHE_H */
diff --git a/cgit.c b/cgit.c
index e1d2216..96900bb 100644
--- a/cgit.c
+++ b/cgit.c
@@ -605,17 +605,17 @@ static void process_cached_repolist(const char *path)
605 struct stat st; 605 struct stat st;
606 char *cached_rc; 606 char *cached_rc;
607 time_t age; 607 time_t age;
608 unsigned long hash; 608 unsigned long hash;
609 609
610 hash = hash_str(path); 610 hash = hash_str(path);
611 if (ctx.cfg.project_list) 611 if (ctx.cfg.project_list)
612 hash += hash_str(ctx.cfg.project_list); 612 hash += hash_str(ctx.cfg.project_list);
613 cached_rc = xstrdup(fmt("%s/rc-%8x", ctx.cfg.cache_root, hash)); 613 cached_rc = xstrdup(fmt("%s/rc-%8lx", ctx.cfg.cache_root, hash));
614 614
615 if (stat(cached_rc, &st)) { 615 if (stat(cached_rc, &st)) {
616 /* Nothing is cached, we need to scan without forking. And 616 /* Nothing is cached, we need to scan without forking. And
617 * if we fail to generate a cached repolist, we need to 617 * if we fail to generate a cached repolist, we need to
618 * invoke scan_tree manually. 618 * invoke scan_tree manually.
619 */ 619 */
620 if (generate_cached_repolist(path, cached_rc)) { 620 if (generate_cached_repolist(path, cached_rc)) {
621 if (ctx.cfg.project_list) 621 if (ctx.cfg.project_list)
diff --git a/cgit.h b/cgit.h
index f8076c5..8f5dd2a 100644
--- a/cgit.h
+++ b/cgit.h
@@ -290,16 +290,17 @@ extern int cgit_diff_files(const unsigned char *old_sha1,
290 linediff_fn fn); 290 linediff_fn fn);
291 291
292extern void cgit_diff_tree(const unsigned char *old_sha1, 292extern void cgit_diff_tree(const unsigned char *old_sha1,
293 const unsigned char *new_sha1, 293 const unsigned char *new_sha1,
294 filepair_fn fn, const char *prefix, int ignorews); 294 filepair_fn fn, const char *prefix, int ignorews);
295 295
296extern void cgit_diff_commit(struct commit *commit, filepair_fn fn); 296extern void cgit_diff_commit(struct commit *commit, filepair_fn fn);
297 297
298__attribute__((format (printf,1,2)))
298extern char *fmt(const char *format,...); 299extern char *fmt(const char *format,...);
299 300
300extern struct commitinfo *cgit_parse_commit(struct commit *commit); 301extern struct commitinfo *cgit_parse_commit(struct commit *commit);
301extern struct taginfo *cgit_parse_tag(struct tag *tag); 302extern struct taginfo *cgit_parse_tag(struct tag *tag);
302extern void cgit_parse_url(const char *url); 303extern void cgit_parse_url(const char *url);
303 304
304extern const char *cgit_repobasename(const char *reponame); 305extern const char *cgit_repobasename(const char *reponame);
305 306
diff --git a/html.c b/html.c
index eaabf72..1305910 100644
--- a/html.c
+++ b/html.c
@@ -90,17 +90,17 @@ void html_status(int code, const char *msg, int more_headers)
90} 90}
91 91
92void html_txt(const char *txt) 92void html_txt(const char *txt)
93{ 93{
94 const char *t = txt; 94 const char *t = txt;
95 while(t && *t){ 95 while(t && *t){
96 int c = *t; 96 int c = *t;
97 if (c=='<' || c=='>' || c=='&') { 97 if (c=='<' || c=='>' || c=='&') {
98 write(htmlfd, txt, t - txt); 98 html_raw(txt, t - txt);
99 if (c=='>') 99 if (c=='>')
100 html("&gt;"); 100 html("&gt;");
101 else if (c=='<') 101 else if (c=='<')
102 html("&lt;"); 102 html("&lt;");
103 else if (c=='&') 103 else if (c=='&')
104 html("&amp;"); 104 html("&amp;");
105 txt = t+1; 105 txt = t+1;
106 } 106 }
@@ -111,40 +111,40 @@ void html_txt(const char *txt)
111} 111}
112 112
113void html_ntxt(int len, const char *txt) 113void html_ntxt(int len, const char *txt)
114{ 114{
115 const char *t = txt; 115 const char *t = txt;
116 while(t && *t && len--){ 116 while(t && *t && len--){
117 int c = *t; 117 int c = *t;
118 if (c=='<' || c=='>' || c=='&') { 118 if (c=='<' || c=='>' || c=='&') {
119 write(htmlfd, txt, t - txt); 119 html_raw(txt, t - txt);
120 if (c=='>') 120 if (c=='>')
121 html("&gt;"); 121 html("&gt;");
122 else if (c=='<') 122 else if (c=='<')
123 html("&lt;"); 123 html("&lt;");
124 else if (c=='&') 124 else if (c=='&')
125 html("&amp;"); 125 html("&amp;");
126 txt = t+1; 126 txt = t+1;
127 } 127 }
128 t++; 128 t++;
129 } 129 }
130 if (t!=txt) 130 if (t!=txt)
131 write(htmlfd, txt, t - txt); 131 html_raw(txt, t - txt);
132 if (len<0) 132 if (len<0)
133 html("..."); 133 html("...");
134} 134}
135 135
136void html_attr(const char *txt) 136void html_attr(const char *txt)
137{ 137{
138 const char *t = txt; 138 const char *t = txt;
139 while(t && *t){ 139 while(t && *t){
140 int c = *t; 140 int c = *t;
141 if (c=='<' || c=='>' || c=='\'' || c=='\"') { 141 if (c=='<' || c=='>' || c=='\'' || c=='\"') {
142 write(htmlfd, txt, t - txt); 142 html_raw(txt, t - txt);
143 if (c=='>') 143 if (c=='>')
144 html("&gt;"); 144 html("&gt;");
145 else if (c=='<') 145 else if (c=='<')
146 html("&lt;"); 146 html("&lt;");
147 else if (c=='\'') 147 else if (c=='\'')
148 html("&#x27;"); 148 html("&#x27;");
149 else if (c=='"') 149 else if (c=='"')
150 html("&quot;"); 150 html("&quot;");
@@ -158,35 +158,35 @@ void html_attr(const char *txt)
158 158
159void html_url_path(const char *txt) 159void html_url_path(const char *txt)
160{ 160{
161 const char *t = txt; 161 const char *t = txt;
162 while(t && *t){ 162 while(t && *t){
163 int c = *t; 163 int c = *t;
164 const char *e = url_escape_table[c]; 164 const char *e = url_escape_table[c];
165 if (e && c!='+' && c!='&' && c!='+') { 165 if (e && c!='+' && c!='&' && c!='+') {
166 write(htmlfd, txt, t - txt); 166 html_raw(txt, t - txt);
167 write(htmlfd, e, 3); 167 html_raw(e, 3);
168 txt = t+1; 168 txt = t+1;
169 } 169 }
170 t++; 170 t++;
171 } 171 }
172 if (t!=txt) 172 if (t!=txt)
173 html(txt); 173 html(txt);
174} 174}
175 175
176void html_url_arg(const char *txt) 176void html_url_arg(const char *txt)
177{ 177{
178 const char *t = txt; 178 const char *t = txt;
179 while(t && *t){ 179 while(t && *t){
180 int c = *t; 180 int c = *t;
181 const char *e = url_escape_table[c]; 181 const char *e = url_escape_table[c];
182 if (e) { 182 if (e) {
183 write(htmlfd, txt, t - txt); 183 html_raw(txt, t - txt);
184 write(htmlfd, e, 3); 184 html_raw(e, 3);
185 txt = t+1; 185 txt = t+1;
186 } 186 }
187 t++; 187 t++;
188 } 188 }
189 if (t!=txt) 189 if (t!=txt)
190 html(txt); 190 html(txt);
191} 191}
192 192
@@ -244,17 +244,17 @@ int html_include(const char *filename)
244 size_t len; 244 size_t len;
245 245
246 if (!(f = fopen(filename, "r"))) { 246 if (!(f = fopen(filename, "r"))) {
247 fprintf(stderr, "[cgit] Failed to include file %s: %s (%d).\n", 247 fprintf(stderr, "[cgit] Failed to include file %s: %s (%d).\n",
248 filename, strerror(errno), errno); 248 filename, strerror(errno), errno);
249 return -1; 249 return -1;
250 } 250 }
251 while((len = fread(buf, 1, 4096, f)) > 0) 251 while((len = fread(buf, 1, 4096, f)) > 0)
252 write(htmlfd, buf, len); 252 html_raw(buf, len);
253 fclose(f); 253 fclose(f);
254 return 0; 254 return 0;
255} 255}
256 256
257int hextoint(char c) 257int hextoint(char c)
258{ 258{
259 if (c >= 'a' && c <= 'f') 259 if (c >= 'a' && c <= 'f')
260 return 10 + c - 'a'; 260 return 10 + c - 'a';
diff --git a/html.h b/html.h
index 16d55ec..1135fb8 100644
--- a/html.h
+++ b/html.h
@@ -1,16 +1,19 @@
1#ifndef HTML_H 1#ifndef HTML_H
2#define HTML_H 2#define HTML_H
3 3
4extern int htmlfd; 4extern int htmlfd;
5 5
6extern void html_raw(const char *txt, size_t size); 6extern void html_raw(const char *txt, size_t size);
7extern void html(const char *txt); 7extern void html(const char *txt);
8
9__attribute__((format (printf,1,2)))
8extern void htmlf(const char *format,...); 10extern void htmlf(const char *format,...);
11
9extern void html_status(int code, const char *msg, int more_headers); 12extern void html_status(int code, const char *msg, int more_headers);
10extern void html_txt(const char *txt); 13extern void html_txt(const char *txt);
11extern void html_ntxt(int len, const char *txt); 14extern void html_ntxt(int len, const char *txt);
12extern void html_attr(const char *txt); 15extern void html_attr(const char *txt);
13extern void html_url_path(const char *txt); 16extern void html_url_path(const char *txt);
14extern void html_url_arg(const char *txt); 17extern void html_url_arg(const char *txt);
15extern void html_hidden(const char *name, const char *value); 18extern void html_hidden(const char *name, const char *value);
16extern void html_option(const char *value, const char *text, const char *selected_value); 19extern void html_option(const char *value, const char *text, const char *selected_value);
diff --git a/ui-blob.c b/ui-blob.c
index 667a451..ec435e1 100644
--- a/ui-blob.c
+++ b/ui-blob.c
@@ -47,17 +47,17 @@ int cgit_print_file(char *path, const char *head)
47 type = sha1_object_info(sha1, &size); 47 type = sha1_object_info(sha1, &size);
48 } 48 }
49 if (type == OBJ_BAD) 49 if (type == OBJ_BAD)
50 return -1; 50 return -1;
51 buf = read_sha1_file(sha1, &type, &size); 51 buf = read_sha1_file(sha1, &type, &size);
52 if (!buf) 52 if (!buf)
53 return -1; 53 return -1;
54 buf[size] = '\0'; 54 buf[size] = '\0';
55 write(htmlfd, buf, size); 55 html_raw(buf, size);
56 return 0; 56 return 0;
57} 57}
58 58
59void cgit_print_blob(const char *hex, char *path, const char *head) 59void cgit_print_blob(const char *hex, char *path, const char *head)
60{ 60{
61 unsigned char sha1[20]; 61 unsigned char sha1[20];
62 enum object_type type; 62 enum object_type type;
63 char *buf; 63 char *buf;
@@ -103,10 +103,10 @@ void cgit_print_blob(const char *hex, char *path, const char *head)
103 if (!ctx.page.mimetype) { 103 if (!ctx.page.mimetype) {
104 if (buffer_is_binary(buf, size)) 104 if (buffer_is_binary(buf, size))
105 ctx.page.mimetype = "application/octet-stream"; 105 ctx.page.mimetype = "application/octet-stream";
106 else 106 else
107 ctx.page.mimetype = "text/plain"; 107 ctx.page.mimetype = "text/plain";
108 } 108 }
109 ctx.page.filename = path; 109 ctx.page.filename = path;
110 cgit_print_http_headers(&ctx); 110 cgit_print_http_headers(&ctx);
111 write(htmlfd, buf, size); 111 html_raw(buf, size);
112} 112}
diff --git a/ui-diff.c b/ui-diff.c
index 0dcabe9..7ff7e46 100644
--- a/ui-diff.c
+++ b/ui-diff.c
@@ -87,17 +87,17 @@ static void print_fileinfo(struct fileinfo *info)
87 cgit_diff_link(info->new_path, NULL, NULL, ctx.qry.head, ctx.qry.sha1, 87 cgit_diff_link(info->new_path, NULL, NULL, ctx.qry.head, ctx.qry.sha1,
88 ctx.qry.sha2, info->new_path, 0); 88 ctx.qry.sha2, info->new_path, 0);
89 if (info->status == DIFF_STATUS_COPIED || info->status == DIFF_STATUS_RENAMED) 89 if (info->status == DIFF_STATUS_COPIED || info->status == DIFF_STATUS_RENAMED)
90 htmlf(" (%s from %s)", 90 htmlf(" (%s from %s)",
91 info->status == DIFF_STATUS_COPIED ? "copied" : "renamed", 91 info->status == DIFF_STATUS_COPIED ? "copied" : "renamed",
92 info->old_path); 92 info->old_path);
93 html("</td><td class='right'>"); 93 html("</td><td class='right'>");
94 if (info->binary) { 94 if (info->binary) {
95 htmlf("bin</td><td class='graph'>%d -> %d bytes", 95 htmlf("bin</td><td class='graph'>%ld -> %ld bytes",
96 info->old_size, info->new_size); 96 info->old_size, info->new_size);
97 return; 97 return;
98 } 98 }
99 htmlf("%d", info->added + info->removed); 99 htmlf("%d", info->added + info->removed);
100 html("</td><td class='graph'>"); 100 html("</td><td class='graph'>");
101 htmlf("<table summary='file diffstat' width='%d%%'><tr>", (max_changes > 100 ? 100 : max_changes)); 101 htmlf("<table summary='file diffstat' width='%d%%'><tr>", (max_changes > 100 ? 100 : max_changes));
102 htmlf("<td class='add' style='width: %.1f%%;'/>", 102 htmlf("<td class='add' style='width: %.1f%%;'/>",
103 info->added * 100.0 / max_changes); 103 info->added * 100.0 / max_changes);
diff --git a/ui-log.c b/ui-log.c
index 0536b23..41b5225 100644
--- a/ui-log.c
+++ b/ui-log.c
@@ -223,18 +223,17 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern
223 for (i = 0; i < cnt && (commit = get_revision(&rev)) != NULL; i++) { 223 for (i = 0; i < cnt && (commit = get_revision(&rev)) != NULL; i++) {
224 print_commit(commit); 224 print_commit(commit);
225 free(commit->buffer); 225 free(commit->buffer);
226 commit->buffer = NULL; 226 commit->buffer = NULL;
227 free_commit_list(commit->parents); 227 free_commit_list(commit->parents);
228 commit->parents = NULL; 228 commit->parents = NULL;
229 } 229 }
230 if (pager) { 230 if (pager) {
231 htmlf("</table><div class='pager'>", 231 html("</table><div class='pager'>");
232 columns);
233 if (ofs > 0) { 232 if (ofs > 0) {
234 cgit_log_link("[prev]", NULL, NULL, ctx.qry.head, 233 cgit_log_link("[prev]", NULL, NULL, ctx.qry.head,
235 ctx.qry.sha1, ctx.qry.vpath, 234 ctx.qry.sha1, ctx.qry.vpath,
236 ofs - cnt, ctx.qry.grep, 235 ofs - cnt, ctx.qry.grep,
237 ctx.qry.search, ctx.qry.showmsg); 236 ctx.qry.search, ctx.qry.showmsg);
238 html("&nbsp;"); 237 html("&nbsp;");
239 } 238 }
240 if ((commit = get_revision(&rev)) != NULL) { 239 if ((commit = get_revision(&rev)) != NULL) {
diff --git a/ui-repolist.c b/ui-repolist.c
index 0a0b6ca..2c98668 100644
--- a/ui-repolist.c
+++ b/ui-repolist.c
@@ -1,22 +1,16 @@
1/* ui-repolist.c: functions for generating the repolist page 1/* ui-repolist.c: functions for generating the repolist page
2 * 2 *
3 * Copyright (C) 2006 Lars Hjemli 3 * Copyright (C) 2006 Lars Hjemli
4 * 4 *
5 * Licensed under GNU General Public License v2 5 * Licensed under GNU General Public License v2
6 * (see COPYING for full license text) 6 * (see COPYING for full license text)
7 */ 7 */
8 8
9/* This is needed for strcasestr to be defined by <string.h> */
10#define _GNU_SOURCE 1
11#include <string.h>
12
13#include <time.h>
14
15#include "cgit.h" 9#include "cgit.h"
16#include "html.h" 10#include "html.h"
17#include "ui-shared.h" 11#include "ui-shared.h"
18 12
19time_t read_agefile(char *path) 13time_t read_agefile(char *path)
20{ 14{
21 time_t result; 15 time_t result;
22 size_t size; 16 size_t size;
diff --git a/ui-stats.c b/ui-stats.c
index 50c2540..946a6ea 100644
--- a/ui-stats.c
+++ b/ui-stats.c
@@ -1,15 +1,21 @@
1#include <string-list.h> 1#include <string-list.h>
2 2
3#include "cgit.h" 3#include "cgit.h"
4#include "html.h" 4#include "html.h"
5#include "ui-shared.h" 5#include "ui-shared.h"
6#include "ui-stats.h" 6#include "ui-stats.h"
7 7
8#ifdef NO_C99_FORMAT
9#define SZ_FMT "%u"
10#else
11#define SZ_FMT "%zu"
12#endif
13
8#define MONTHS 6 14#define MONTHS 6
9 15
10struct authorstat { 16struct authorstat {
11 long total; 17 long total;
12 struct string_list list; 18 struct string_list list;
13}; 19};
14 20
15#define DAY_SECS (60 * 60 * 24) 21#define DAY_SECS (60 * 60 * 24)
@@ -278,20 +284,20 @@ void print_combined_authorrow(struct string_list *authors, int from, int to,
278 for (i = from; i <= to; i++) { 284 for (i = from; i <= to; i++) {
279 author = &authors->items[i]; 285 author = &authors->items[i];
280 authorstat = author->util; 286 authorstat = author->util;
281 items = &authorstat->list; 287 items = &authorstat->list;
282 date = string_list_lookup(items, tmp); 288 date = string_list_lookup(items, tmp);
283 if (date) 289 if (date)
284 subtotal += (size_t)date->util; 290 subtotal += (size_t)date->util;
285 } 291 }
286 htmlf("<td class='%s'>%d</td>", centerclass, subtotal); 292 htmlf("<td class='%s'>%ld</td>", centerclass, subtotal);
287 total += subtotal; 293 total += subtotal;
288 } 294 }
289 htmlf("<td class='%s'>%d</td></tr>", rightclass, total); 295 htmlf("<td class='%s'>%ld</td></tr>", rightclass, total);
290} 296}
291 297
292void print_authors(struct string_list *authors, int top, 298void print_authors(struct string_list *authors, int top,
293 struct cgit_period *period) 299 struct cgit_period *period)
294{ 300{
295 struct string_list_item *author; 301 struct string_list_item *author;
296 struct authorstat *authorstat; 302 struct authorstat *authorstat;
297 struct string_list *items; 303 struct string_list *items;
@@ -330,26 +336,26 @@ void print_authors(struct string_list *authors, int top,
330 period->dec(tm); 336 period->dec(tm);
331 for (j = 0; j < period->count; j++) { 337 for (j = 0; j < period->count; j++) {
332 tmp = period->pretty(tm); 338 tmp = period->pretty(tm);
333 period->inc(tm); 339 period->inc(tm);
334 date = string_list_lookup(items, tmp); 340 date = string_list_lookup(items, tmp);
335 if (!date) 341 if (!date)
336 html("<td>0</td>"); 342 html("<td>0</td>");
337 else { 343 else {
338 htmlf("<td>%d</td>", date->util); 344 htmlf("<td>"SZ_FMT"</td>", (size_t)date->util);
339 total += (size_t)date->util; 345 total += (size_t)date->util;
340 } 346 }
341 } 347 }
342 htmlf("<td class='sum'>%d</td></tr>", total); 348 htmlf("<td class='sum'>%ld</td></tr>", total);
343 } 349 }
344 350
345 if (top < authors->nr) 351 if (top < authors->nr)
346 print_combined_authorrow(authors, top, authors->nr - 1, 352 print_combined_authorrow(authors, top, authors->nr - 1,
347 "Others (%d)", "left", "", "sum", period); 353 "Others (%ld)", "left", "", "sum", period);
348 354
349 print_combined_authorrow(authors, 0, authors->nr - 1, "Total", 355 print_combined_authorrow(authors, 0, authors->nr - 1, "Total",
350 "total", "sum", "sum", period); 356 "total", "sum", "sum", period);
351 html("</table>"); 357 html("</table>");
352} 358}
353 359
354/* Create a sorted string_list with one entry per author. The util-field 360/* Create a sorted string_list with one entry per author. The util-field
355 * for each author is another string_list which is used to calculate the 361 * for each author is another string_list which is used to calculate the
@@ -362,17 +368,17 @@ void cgit_show_stats(struct cgit_context *ctx)
362 int top, i; 368 int top, i;
363 const char *code = "w"; 369 const char *code = "w";
364 370
365 if (ctx->qry.period) 371 if (ctx->qry.period)
366 code = ctx->qry.period; 372 code = ctx->qry.period;
367 373
368 i = cgit_find_stats_period(code, &period); 374 i = cgit_find_stats_period(code, &period);
369 if (!i) { 375 if (!i) {
370 cgit_print_error(fmt("Unknown statistics type: %c", code)); 376 cgit_print_error(fmt("Unknown statistics type: %c", code[0]));
371 return; 377 return;
372 } 378 }
373 if (i > ctx->repo->max_stats) { 379 if (i > ctx->repo->max_stats) {
374 cgit_print_error(fmt("Statistics type disabled: %s", 380 cgit_print_error(fmt("Statistics type disabled: %s",
375 period->name)); 381 period->name));
376 return; 382 return;
377 } 383 }
378 authors = collect_stats(ctx, period); 384 authors = collect_stats(ctx, period);
diff --git a/ui-tree.c b/ui-tree.c
index 75ec9cb..0b1b531 100644
--- a/ui-tree.c
+++ b/ui-tree.c
@@ -41,17 +41,17 @@ static void print_text_buffer(const char *name, char *buf, unsigned long size)
41 else { 41 else {
42 html("<tr>\n"); 42 html("<tr>\n");
43 } 43 }
44 44
45 if (ctx.repo->source_filter) { 45 if (ctx.repo->source_filter) {
46 html("<td class='lines'><pre><code>"); 46 html("<td class='lines'><pre><code>");
47 ctx.repo->source_filter->argv[1] = xstrdup(name); 47 ctx.repo->source_filter->argv[1] = xstrdup(name);
48 cgit_open_filter(ctx.repo->source_filter); 48 cgit_open_filter(ctx.repo->source_filter);
49 write(STDOUT_FILENO, buf, size); 49 html_raw(buf, size);
50 cgit_close_filter(ctx.repo->source_filter); 50 cgit_close_filter(ctx.repo->source_filter);
51 html("</code></pre></td></tr></table>\n"); 51 html("</code></pre></td></tr></table>\n");
52 return; 52 return;
53 } 53 }
54 54
55 html("<td class='lines'><pre><code>"); 55 html("<td class='lines'><pre><code>");
56 html_txt(buf); 56 html_txt(buf);
57 html("</code></pre></td></tr></table>\n"); 57 html("</code></pre></td></tr></table>\n");
@@ -62,17 +62,17 @@ static void print_text_buffer(const char *name, char *buf, unsigned long size)
62static void print_binary_buffer(char *buf, unsigned long size) 62static void print_binary_buffer(char *buf, unsigned long size)
63{ 63{
64 unsigned long ofs, idx; 64 unsigned long ofs, idx;
65 static char ascii[ROWLEN + 1]; 65 static char ascii[ROWLEN + 1];
66 66
67 html("<table summary='blob content' class='bin-blob'>\n"); 67 html("<table summary='blob content' class='bin-blob'>\n");
68 html("<tr><th>ofs</th><th>hex dump</th><th>ascii</th></tr>"); 68 html("<tr><th>ofs</th><th>hex dump</th><th>ascii</th></tr>");
69 for (ofs = 0; ofs < size; ofs += ROWLEN, buf += ROWLEN) { 69 for (ofs = 0; ofs < size; ofs += ROWLEN, buf += ROWLEN) {
70 htmlf("<tr><td class='right'>%04x</td><td class='hex'>", ofs); 70 htmlf("<tr><td class='right'>%04lx</td><td class='hex'>", ofs);
71 for (idx = 0; idx < ROWLEN && ofs + idx < size; idx++) 71 for (idx = 0; idx < ROWLEN && ofs + idx < size; idx++)
72 htmlf("%*s%02x", 72 htmlf("%*s%02x",
73 idx == 16 ? 4 : 1, "", 73 idx == 16 ? 4 : 1, "",
74 buf[idx] & 0xff); 74 buf[idx] & 0xff);
75 html(" </td><td class='hex'>"); 75 html(" </td><td class='hex'>");
76 for (idx = 0; idx < ROWLEN && ofs + idx < size; idx++) 76 for (idx = 0; idx < ROWLEN && ofs + idx < size; idx++)
77 ascii[idx] = isgraph(buf[idx]) ? buf[idx] : '.'; 77 ascii[idx] = isgraph(buf[idx]) ? buf[idx] : '.';
78 ascii[idx] = '\0'; 78 ascii[idx] = '\0';
@@ -103,17 +103,17 @@ static void print_object(const unsigned char *sha1, char *path, const char *base
103 } 103 }
104 104
105 htmlf("blob: %s (", sha1_to_hex(sha1)); 105 htmlf("blob: %s (", sha1_to_hex(sha1));
106 cgit_plain_link("plain", NULL, NULL, ctx.qry.head, 106 cgit_plain_link("plain", NULL, NULL, ctx.qry.head,
107 curr_rev, path); 107 curr_rev, path);
108 html(")\n"); 108 html(")\n");
109 109
110 if (ctx.cfg.max_blob_size && size / 1024 > ctx.cfg.max_blob_size) { 110 if (ctx.cfg.max_blob_size && size / 1024 > ctx.cfg.max_blob_size) {
111 htmlf("<div class='error'>blob size (%dKB) exceeds display size limit (%dKB).</div>", 111 htmlf("<div class='error'>blob size (%ldKB) exceeds display size limit (%dKB).</div>",
112 size / 1024, ctx.cfg.max_blob_size); 112 size / 1024, ctx.cfg.max_blob_size);
113 return; 113 return;
114 } 114 }
115 115
116 if (buffer_is_binary(buf, size)) 116 if (buffer_is_binary(buf, size))
117 print_binary_buffer(buf, size); 117 print_binary_buffer(buf, size);
118 else 118 else
119 print_text_buffer(basename, buf, size); 119 print_text_buffer(basename, buf, size);