cgit

commit a9d6e6e695da6c6ed7f4bb32630ab2f3d9314806

Author: Lars Hjemli <hjemli@gmail.com>

Merge branch 'ml/bugfix'

 Makefile | 8 ++++++++
 cache.h | 1 +
 cgit.c | 2 +-
 cgit.h | 1 +
 html.c | 18 +++++++++---------
 html.h | 3 +++
 ui-blob.c | 4 ++--
 ui-diff.c | 2 +-
 ui-log.c | 3 +--
 ui-repolist.c | 6 ------
 ui-stats.c | 18 ++++++++++++------
 ui-tree.c | 6 +++---


diff --git a/Makefile b/Makefile
index 23fdd53d2b382fb2c71f0077d9e39e8f03704789..6a47ed256d7ff4f5bef91e5e983f160bc6a1d11e 100644
--- a/Makefile
+++ b/Makefile
@@ -16,6 +16,11 @@ # implementation (slower).
 #
 # Define NEEDS_LIBICONV if linking with libc is not enough (eg. Darwin).
 #
+# Define NO_C99_FORMAT if your formatted IO functions (printf/scanf et.al.)
+# do not support the 'size specifiers' introduced by C99, namely ll, hh,
+# j, z, t. (representing long long int, char, intmax_t, size_t, ptrdiff_t).
+# some C compilers supported these specifiers prior to C99 as an extension.
+#
 
 #-include config.mak
 
@@ -126,6 +131,9 @@ 	CFLAGS += -DNO_ICONV
 endif
 ifdef NO_STRCASESTR
 	CFLAGS += -DNO_STRCASESTR
+endif
+ifdef NO_C99_FORMAT
+	CFLAGS += -DNO_C99_FORMAT
 endif
 ifdef NO_OPENSSL
 	CFLAGS += -DNO_OPENSSL




diff --git a/cache.h b/cache.h
index ac9276b5c43a410147bb63fa27565fc79d35e3f6..5cfdb4f37a2a82f5d83f073628d4d3803c97a551 100644
--- a/cache.h
+++ b/cache.h
@@ -30,6 +30,7 @@ /* List info about all cache entries on stdout */
 extern int cache_ls(const char *path);
 
 /* Print a message to stdout */
+__attribute__((format (printf,1,2)))
 extern void cache_log(const char *format, ...);
 
 extern unsigned long hash_str(const char *str);




diff --git a/cgit.c b/cgit.c
index e1d2216ffb3ae32b3a343cb677647fb716c01a40..96900bb5afbc04f02c0e643b22175c78e3886197 100644
--- a/cgit.c
+++ b/cgit.c
@@ -610,7 +610,7 @@
 	hash = hash_str(path);
 	if (ctx.cfg.project_list)
 		hash += hash_str(ctx.cfg.project_list);
-	cached_rc = xstrdup(fmt("%s/rc-%8x", ctx.cfg.cache_root, hash));
+	cached_rc = xstrdup(fmt("%s/rc-%8lx", ctx.cfg.cache_root, hash));
 
 	if (stat(cached_rc, &st)) {
 		/* Nothing is cached, we need to scan without forking. And




diff --git a/cgit.h b/cgit.h
index f8076c58061cdde0a1656006525e6e5c58f96b56..8f5dd2a7f2046eaca5b7eda311efa093f6f0f664 100644
--- a/cgit.h
+++ b/cgit.h
@@ -295,6 +295,7 @@ 			   filepair_fn fn, const char *prefix, int ignorews);
 
 extern void cgit_diff_commit(struct commit *commit, filepair_fn fn);
 
+__attribute__((format (printf,1,2)))
 extern char *fmt(const char *format,...);
 
 extern struct commitinfo *cgit_parse_commit(struct commit *commit);




diff --git a/html.c b/html.c
index eaabf7274eca79c7f9391f50130ff82e99199879..1305910b40f9513ef11a0eda21fb6d6d06e11ae5 100644
--- a/html.c
+++ b/html.c
@@ -95,7 +95,7 @@ 	const char *t = txt;
 	while(t && *t){
 		int c = *t;
 		if (c=='<' || c=='>' || c=='&') {
-			write(htmlfd, txt, t - txt);
+			html_raw(txt, t - txt);
 			if (c=='>')
 				html("&gt;");
 			else if (c=='<')
@@ -116,7 +116,7 @@ 	const char *t = txt;
 	while(t && *t && len--){
 		int c = *t;
 		if (c=='<' || c=='>' || c=='&') {
-			write(htmlfd, txt, t - txt);
+			html_raw(txt, t - txt);
 			if (c=='>')
 				html("&gt;");
 			else if (c=='<')
@@ -128,7 +128,7 @@ 		}
 		t++;
 	}
 	if (t!=txt)
-		write(htmlfd, txt, t - txt);
+		html_raw(txt, t - txt);
 	if (len<0)
 		html("...");
 }
@@ -139,7 +139,7 @@ 	const char *t = txt;
 	while(t && *t){
 		int c = *t;
 		if (c=='<' || c=='>' || c=='\'' || c=='\"') {
-			write(htmlfd, txt, t - txt);
+			html_raw(txt, t - txt);
 			if (c=='>')
 				html("&gt;");
 			else if (c=='<')
@@ -163,8 +163,8 @@ 	while(t && *t){
 		int c = *t;
 		const char *e = url_escape_table[c];
 		if (e && c!='+' && c!='&' && c!='+') {
-			write(htmlfd, txt, t - txt);
-			write(htmlfd, e, 3);
+			html_raw(txt, t - txt);
+			html_raw(e, 3);
 			txt = t+1;
 		}
 		t++;
@@ -180,8 +180,8 @@ 	while(t && *t){
 		int c = *t;
 		const char *e = url_escape_table[c];
 		if (e) {
-			write(htmlfd, txt, t - txt);
-			write(htmlfd, e, 3);
+			html_raw(txt, t - txt);
+			html_raw(e, 3);
 			txt = t+1;
 		}
 		t++;
@@ -249,7 +249,7 @@ 			filename, strerror(errno), errno);
 		return -1;
 	}
 	while((len = fread(buf, 1, 4096, f)) > 0)
-		write(htmlfd, buf, len);
+		html_raw(buf, len);
 	fclose(f);
 	return 0;
 }




diff --git a/html.h b/html.h
index 16d55ec9a29449f518d6df6ddccc8cd9da55bbd8..1135fb8928c4581bab2e2194fec1911751d5bc6d 100644
--- a/html.h
+++ b/html.h
@@ -5,7 +5,10 @@ extern int htmlfd;
 
 extern void html_raw(const char *txt, size_t size);
 extern void html(const char *txt);
+
+__attribute__((format (printf,1,2)))
 extern void htmlf(const char *format,...);
+
 extern void html_status(int code, const char *msg, int more_headers);
 extern void html_txt(const char *txt);
 extern void html_ntxt(int len, const char *txt);




diff --git a/ui-blob.c b/ui-blob.c
index 667a45111bf16c8fc7d8bf55303782f27ebd357a..ec435e1bc1c616b753b38a387ae27af31cc21c0d 100644
--- a/ui-blob.c
+++ b/ui-blob.c
@@ -52,7 +52,7 @@ 	buf = read_sha1_file(sha1, &type, &size);
 	if (!buf)
 		return -1;
 	buf[size] = '\0';
-	write(htmlfd, buf, size);
+	html_raw(buf, size);
 	return 0;
 }
 
@@ -108,5 +108,5 @@ 			ctx.page.mimetype = "text/plain";
 	}
 	ctx.page.filename = path;
 	cgit_print_http_headers(&ctx);
-	write(htmlfd, buf, size);
+	html_raw(buf, size);
 }




diff --git a/ui-diff.c b/ui-diff.c
index 0dcabe90b9931e4b53e009a89b9853dcf3ab8c76..7ff7e46d9e5b1551736900e0719a1d8147b69b67 100644
--- a/ui-diff.c
+++ b/ui-diff.c
@@ -92,7 +92,7 @@ 		      info->status == DIFF_STATUS_COPIED ? "copied" : "renamed",
 		      info->old_path);
 	html("</td><td class='right'>");
 	if (info->binary) {
-		htmlf("bin</td><td class='graph'>%d -> %d bytes",
+		htmlf("bin</td><td class='graph'>%ld -> %ld bytes",
 		      info->old_size, info->new_size);
 		return;
 	}




diff --git a/ui-log.c b/ui-log.c
index 0536b23ebaa1705e627dca637b742dbb713d053f..41b5225616933bcc7ab80a155ef0f7ba6c65b4cd 100644
--- a/ui-log.c
+++ b/ui-log.c
@@ -228,8 +228,7 @@ 		free_commit_list(commit->parents);
 		commit->parents = NULL;
 	}
 	if (pager) {
-		htmlf("</table><div class='pager'>",
-		     columns);
+		html("</table><div class='pager'>");
 		if (ofs > 0) {
 			cgit_log_link("[prev]", NULL, NULL, ctx.qry.head,
 				      ctx.qry.sha1, ctx.qry.vpath,




diff --git a/ui-repolist.c b/ui-repolist.c
index 0a0b6ca19e942f0ddcb52128594f8584aab8c12c..2c98668ad931489ad54632d3c869c06de294f1cb 100644
--- a/ui-repolist.c
+++ b/ui-repolist.c
@@ -6,12 +6,6 @@  * Licensed under GNU General Public License v2
  *   (see COPYING for full license text)
  */
 
-/* This is needed for strcasestr to be defined by <string.h> */
-#define _GNU_SOURCE 1
-#include <string.h>
-
-#include <time.h>
-
 #include "cgit.h"
 #include "html.h"
 #include "ui-shared.h"




diff --git a/ui-stats.c b/ui-stats.c
index 50c2540c860b6275b06b84576ecfd81c032e208d..946a6ea9a53f8efb709fe36032651eb2e297476d 100644
--- a/ui-stats.c
+++ b/ui-stats.c
@@ -5,6 +5,12 @@ #include "html.h"
 #include "ui-shared.h"
 #include "ui-stats.h"
 
+#ifdef NO_C99_FORMAT
+#define SZ_FMT "%u"
+#else
+#define SZ_FMT "%zu"
+#endif
+
 #define MONTHS 6
 
 struct authorstat {
@@ -283,10 +289,10 @@ 			date = string_list_lookup(items, tmp);
 			if (date)
 				subtotal += (size_t)date->util;
 		}
-		htmlf("<td class='%s'>%d</td>", centerclass, subtotal);
+		htmlf("<td class='%s'>%ld</td>", centerclass, subtotal);
 		total += subtotal;
 	}
-	htmlf("<td class='%s'>%d</td></tr>", rightclass, total);
+	htmlf("<td class='%s'>%ld</td></tr>", rightclass, total);
 }
 
 void print_authors(struct string_list *authors, int top,
@@ -335,16 +341,16 @@ 			date = string_list_lookup(items, tmp);
 			if (!date)
 				html("<td>0</td>");
 			else {
-				htmlf("<td>%d</td>", date->util);
+				htmlf("<td>"SZ_FMT"</td>", (size_t)date->util);
 				total += (size_t)date->util;
 			}
 		}
-		htmlf("<td class='sum'>%d</td></tr>", total);
+		htmlf("<td class='sum'>%ld</td></tr>", total);
 	}
 
 	if (top < authors->nr)
 		print_combined_authorrow(authors, top, authors->nr - 1,
-			"Others (%d)", "left", "", "sum", period);
+			"Others (%ld)", "left", "", "sum", period);
 
 	print_combined_authorrow(authors, 0, authors->nr - 1, "Total",
 		"total", "sum", "sum", period);
@@ -367,7 +373,7 @@ 		code = ctx->qry.period;
 
 	i = cgit_find_stats_period(code, &period);
 	if (!i) {
-		cgit_print_error(fmt("Unknown statistics type: %c", code));
+		cgit_print_error(fmt("Unknown statistics type: %c", code[0]));
 		return;
 	}
 	if (i > ctx->repo->max_stats) {




diff --git a/ui-tree.c b/ui-tree.c
index 75ec9cb76cda7405205fb990c0b4524680fec39f..0b1b531494c4f24c059d4b80cf7d6faaf8612d0d 100644
--- a/ui-tree.c
+++ b/ui-tree.c
@@ -46,7 +46,7 @@ 	if (ctx.repo->source_filter) {
 		html("<td class='lines'><pre><code>");
 		ctx.repo->source_filter->argv[1] = xstrdup(name);
 		cgit_open_filter(ctx.repo->source_filter);
-		write(STDOUT_FILENO, buf, size);
+		html_raw(buf, size);
 		cgit_close_filter(ctx.repo->source_filter);
 		html("</code></pre></td></tr></table>\n");
 		return;
@@ -67,7 +67,7 @@
 	html("<table summary='blob content' class='bin-blob'>\n");
 	html("<tr><th>ofs</th><th>hex dump</th><th>ascii</th></tr>");
 	for (ofs = 0; ofs < size; ofs += ROWLEN, buf += ROWLEN) {
-		htmlf("<tr><td class='right'>%04x</td><td class='hex'>", ofs);
+		htmlf("<tr><td class='right'>%04lx</td><td class='hex'>", ofs);
 		for (idx = 0; idx < ROWLEN && ofs + idx < size; idx++)
 			htmlf("%*s%02x",
 			      idx == 16 ? 4 : 1, "",
@@ -108,7 +108,7 @@ 		        curr_rev, path);
 	html(")\n");
 
 	if (ctx.cfg.max_blob_size && size / 1024 > ctx.cfg.max_blob_size) {
-		htmlf("<div class='error'>blob size (%dKB) exceeds display size limit (%dKB).</div>",
+		htmlf("<div class='error'>blob size (%ldKB) exceeds display size limit (%dKB).</div>",
 				size / 1024, ctx.cfg.max_blob_size);
 		return;
 	}