summaryrefslogtreecommitdiffabout
authorMark Lodato <lodatom@gmail.com>2010-09-04 15:30:18 (UTC)
committer Mark Lodato <lodatom@gmail.com>2010-09-04 15:35:38 (UTC)
commite4ddc8f72b5a7d8c55a6c2042c7b7f945ba4b1a2 (patch) (unidiff)
tree2ade0bb45e15ad5466ca4d3433201477f0c9214e
parenta4c58d92bfee0cf2e35ab1c5e828a6d790108a69 (diff)
downloadcgit-e4ddc8f72b5a7d8c55a6c2042c7b7f945ba4b1a2.zip
cgit-e4ddc8f72b5a7d8c55a6c2042c7b7f945ba4b1a2.tar.gz
cgit-e4ddc8f72b5a7d8c55a6c2042c7b7f945ba4b1a2.tar.bz2
fix errors in printf-style format strings
There were many places where the arguments to a printf-like function did not match the format string. Mostly, these were a missing 'l' flag, but there were three exceptions: - In ui-stats.c, a size_t argument must be printed. C99 has the "%zu" flag for this purpose, but not all compilers support this. Therefore, we mimic what git does - use a NO_C99_FORMAT Makefile variable. - In ui-stats.c, cgit_print_error() was called with a pointer instead of a character. - In ui-log.c, the "columns" argument was never used. Signed-off-by: Mark Lodato <lodatom@gmail.com>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--Makefile8
-rw-r--r--cgit.c2
-rw-r--r--ui-diff.c2
-rw-r--r--ui-log.c3
-rw-r--r--ui-stats.c18
-rw-r--r--ui-tree.c4
6 files changed, 25 insertions, 12 deletions
diff --git a/Makefile b/Makefile
index 2a15469..6c9d118 100644
--- a/Makefile
+++ b/Makefile
@@ -7,24 +7,29 @@ CACHE_ROOT = /var/cache/cgit
7SHA1_HEADER = <openssl/sha.h> 7SHA1_HEADER = <openssl/sha.h>
8GIT_VER = 1.7.2.2 8GIT_VER = 1.7.2.2
9GIT_URL = http://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.bz2 9GIT_URL = http://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.bz2
10INSTALL = install 10INSTALL = 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')
27uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not') 32uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not')
28uname_R := $(shell sh -c 'uname -r 2>/dev/null || echo not') 33uname_R := $(shell sh -c 'uname -r 2>/dev/null || echo not')
29 34
30ifeq ($(uname_O),Cygwin) 35ifeq ($(uname_O),Cygwin)
@@ -118,24 +123,27 @@ CFLAGS += -g -Wall -Igit
118CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER)' 123CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER)'
119CFLAGS += -DCGIT_VERSION='"$(CGIT_VERSION)"' 124CFLAGS += -DCGIT_VERSION='"$(CGIT_VERSION)"'
120CFLAGS += -DCGIT_CONFIG='"$(CGIT_CONFIG)"' 125CFLAGS += -DCGIT_CONFIG='"$(CGIT_CONFIG)"'
121CFLAGS += -DCGIT_SCRIPT_NAME='"$(CGIT_SCRIPT_NAME)"' 126CFLAGS += -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
138 $(QUIET_CC)$(CC) $(CFLAGS) $(LDFLAGS) -o cgit $(OBJECTS) $(EXTLIBS) 146 $(QUIET_CC)$(CC) $(CFLAGS) $(LDFLAGS) -o cgit $(OBJECTS) $(EXTLIBS)
139 147
140cgit.o: VERSION 148cgit.o: VERSION
141 149
diff --git a/cgit.c b/cgit.c
index d6146e2..3b3f8d9 100644
--- a/cgit.c
+++ b/cgit.c
@@ -601,25 +601,25 @@ static int generate_cached_repolist(const char *path, const char *cached_rc)
601} 601}
602 602
603static void process_cached_repolist(const char *path) 603static void process_cached_repolist(const char *path)
604{ 604{
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)
622 scan_projects(path, ctx.cfg.project_list, 622 scan_projects(path, ctx.cfg.project_list,
623 repo_config); 623 repo_config);
624 else 624 else
625 scan_tree(path, repo_config); 625 scan_tree(path, repo_config);
diff --git a/ui-diff.c b/ui-diff.c
index 0dcabe9..7ff7e46 100644
--- a/ui-diff.c
+++ b/ui-diff.c
@@ -83,25 +83,25 @@ static void print_fileinfo(struct fileinfo *info)
83 cgit_print_filemode(info->old_mode); 83 cgit_print_filemode(info->old_mode);
84 html("]</span>"); 84 html("]</span>");
85 } 85 }
86 htmlf("</td><td class='%s'>", class); 86 htmlf("</td><td class='%s'>", class);
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);
104 htmlf("<td class='rem' style='width: %.1f%%;'/>", 104 htmlf("<td class='rem' style='width: %.1f%%;'/>",
105 info->removed * 100.0 / max_changes); 105 info->removed * 100.0 / max_changes);
106 htmlf("<td class='none' style='width: %.1f%%;'/>", 106 htmlf("<td class='none' style='width: %.1f%%;'/>",
107 (max_changes - info->removed - info->added) * 100.0 / max_changes); 107 (max_changes - info->removed - 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
@@ -219,26 +219,25 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern
219 free_commit_list(commit->parents); 219 free_commit_list(commit->parents);
220 commit->parents = NULL; 220 commit->parents = NULL;
221 } 221 }
222 222
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) {
241 cgit_log_link("[next]", NULL, NULL, ctx.qry.head, 240 cgit_log_link("[next]", NULL, NULL, ctx.qry.head,
242 ctx.qry.sha1, ctx.qry.vpath, 241 ctx.qry.sha1, ctx.qry.vpath,
243 ofs + cnt, ctx.qry.grep, 242 ofs + cnt, ctx.qry.grep,
244 ctx.qry.search, ctx.qry.showmsg); 243 ctx.qry.search, ctx.qry.showmsg);
diff --git a/ui-stats.c b/ui-stats.c
index 50c2540..946a6ea 100644
--- a/ui-stats.c
+++ b/ui-stats.c
@@ -1,19 +1,25 @@
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)
16#define WEEK_SECS (DAY_SECS * 7) 22#define WEEK_SECS (DAY_SECS * 7)
17 23
18static void trunc_week(struct tm *tm) 24static void trunc_week(struct tm *tm)
19{ 25{
@@ -274,28 +280,28 @@ void print_combined_authorrow(struct string_list *authors, int from, int to,
274 for (j = 0; j < period->count; j++) { 280 for (j = 0; j < period->count; j++) {
275 tmp = period->pretty(tm); 281 tmp = period->pretty(tm);
276 period->inc(tm); 282 period->inc(tm);
277 subtotal = 0; 283 subtotal = 0;
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;
298 struct string_list_item *date; 304 struct string_list_item *date;
299 time_t now; 305 time_t now;
300 long i, j, total; 306 long i, j, total;
301 struct tm *tm; 307 struct tm *tm;
@@ -326,57 +332,57 @@ void print_authors(struct string_list *authors, int top,
326 authorstat = author->util; 332 authorstat = author->util;
327 items = &authorstat->list; 333 items = &authorstat->list;
328 total = 0; 334 total = 0;
329 for (j = 0; j < period->count; j++) 335 for (j = 0; j < period->count; j++)
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
356 * number of commits per time-interval. 362 * number of commits per time-interval.
357 */ 363 */
358void cgit_show_stats(struct cgit_context *ctx) 364void cgit_show_stats(struct cgit_context *ctx)
359{ 365{
360 struct string_list authors; 366 struct string_list authors;
361 struct cgit_period *period; 367 struct cgit_period *period;
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);
379 qsort(authors.items, authors.nr, sizeof(struct string_list_item), 385 qsort(authors.items, authors.nr, sizeof(struct string_list_item),
380 cmp_total_commits); 386 cmp_total_commits);
381 387
382 top = ctx->qry.ofs; 388 top = ctx->qry.ofs;
diff --git a/ui-tree.c b/ui-tree.c
index 75ec9cb..0cdbf6d 100644
--- a/ui-tree.c
+++ b/ui-tree.c
@@ -58,25 +58,25 @@ static void print_text_buffer(const char *name, char *buf, unsigned long size)
58} 58}
59 59
60#define ROWLEN 32 60#define ROWLEN 32
61 61
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';
79 html_txt(ascii); 79 html_txt(ascii);
80 html("</td></tr>\n"); 80 html("</td></tr>\n");
81 } 81 }
82 html("</table>\n"); 82 html("</table>\n");
@@ -99,25 +99,25 @@ static void print_object(const unsigned char *sha1, char *path, const char *base
99 if (!buf) { 99 if (!buf) {
100 cgit_print_error(fmt("Error reading object %s", 100 cgit_print_error(fmt("Error reading object %s",
101 sha1_to_hex(sha1))); 101 sha1_to_hex(sha1)));
102 return; 102 return;
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);
120} 120}
121 121
122 122
123static int ls_item(const unsigned char *sha1, const char *base, int baselen, 123static int ls_item(const unsigned char *sha1, const char *base, int baselen,