summaryrefslogtreecommitdiffabout
authorLars Hjemli <hjemli@gmail.com>2008-03-24 15:50:57 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2008-03-24 15:50:57 (UTC)
commita4d1ca1dc6ff8171694d9e2280b6075a1beced0c (patch) (unidiff)
tree8ccfdd78b7fe61a54bf09c11a130cfbfa8ed50c8
parentc5984a9896b39748e61daf6e620483749654b102 (diff)
downloadcgit-a4d1ca1dc6ff8171694d9e2280b6075a1beced0c.zip
cgit-a4d1ca1dc6ff8171694d9e2280b6075a1beced0c.tar.gz
cgit-a4d1ca1dc6ff8171694d9e2280b6075a1beced0c.tar.bz2
Add ui-shared.h
This is finally a proper headerfile for the shared ui-functions which used to reside in cgit.h Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c1
-rw-r--r--cgit.h32
-rw-r--r--ui-blob.c1
-rw-r--r--ui-commit.c1
-rw-r--r--ui-diff.c1
-rw-r--r--ui-log.c1
-rw-r--r--ui-patch.c1
-rw-r--r--ui-refs.c1
-rw-r--r--ui-repolist.c1
-rw-r--r--ui-shared.h36
-rw-r--r--ui-snapshot.c1
-rw-r--r--ui-tag.c1
-rw-r--r--ui-tree.c1
13 files changed, 47 insertions, 32 deletions
diff --git a/cgit.c b/cgit.c
index 79e0e43..dbb023e 100644
--- a/cgit.c
+++ b/cgit.c
@@ -1,58 +1,59 @@
1/* cgit.c: cgi for the git scm 1/* cgit.c: cgi for the git scm
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#include "cgit.h" 9#include "cgit.h"
10#include "cmd.h" 10#include "cmd.h"
11#include "ui-shared.h"
11 12
12static int cgit_prepare_cache(struct cacheitem *item) 13static int cgit_prepare_cache(struct cacheitem *item)
13{ 14{
14 if (!ctx.repo && ctx.qry.repo) { 15 if (!ctx.repo && ctx.qry.repo) {
15 ctx.page.title = fmt("%s - %s", ctx.cfg.root_title, 16 ctx.page.title = fmt("%s - %s", ctx.cfg.root_title,
16 "Bad request"); 17 "Bad request");
17 cgit_print_http_headers(&ctx); 18 cgit_print_http_headers(&ctx);
18 cgit_print_docstart(&ctx); 19 cgit_print_docstart(&ctx);
19 cgit_print_pageheader(&ctx); 20 cgit_print_pageheader(&ctx);
20 cgit_print_error(fmt("Unknown repo: %s", ctx.qry.repo)); 21 cgit_print_error(fmt("Unknown repo: %s", ctx.qry.repo));
21 cgit_print_docend(); 22 cgit_print_docend();
22 return 0; 23 return 0;
23 } 24 }
24 25
25 if (!ctx.repo) { 26 if (!ctx.repo) {
26 item->name = xstrdup(fmt("%s/index.html", ctx.cfg.cache_root)); 27 item->name = xstrdup(fmt("%s/index.html", ctx.cfg.cache_root));
27 item->ttl = ctx.cfg.cache_root_ttl; 28 item->ttl = ctx.cfg.cache_root_ttl;
28 return 1; 29 return 1;
29 } 30 }
30 31
31 if (!cgit_cmd) { 32 if (!cgit_cmd) {
32 item->name = xstrdup(fmt("%s/%s/index.%s.html", ctx.cfg.cache_root, 33 item->name = xstrdup(fmt("%s/%s/index.%s.html", ctx.cfg.cache_root,
33 cache_safe_filename(ctx.repo->url), 34 cache_safe_filename(ctx.repo->url),
34 cache_safe_filename(ctx.qry.raw))); 35 cache_safe_filename(ctx.qry.raw)));
35 item->ttl = ctx.cfg.cache_repo_ttl; 36 item->ttl = ctx.cfg.cache_repo_ttl;
36 } else { 37 } else {
37 item->name = xstrdup(fmt("%s/%s/%s/%s.html", ctx.cfg.cache_root, 38 item->name = xstrdup(fmt("%s/%s/%s/%s.html", ctx.cfg.cache_root,
38 cache_safe_filename(ctx.repo->url), 39 cache_safe_filename(ctx.repo->url),
39 ctx.qry.page, 40 ctx.qry.page,
40 cache_safe_filename(ctx.qry.raw))); 41 cache_safe_filename(ctx.qry.raw)));
41 if (ctx.qry.has_symref) 42 if (ctx.qry.has_symref)
42 item->ttl = ctx.cfg.cache_dynamic_ttl; 43 item->ttl = ctx.cfg.cache_dynamic_ttl;
43 else if (ctx.qry.has_sha1) 44 else if (ctx.qry.has_sha1)
44 item->ttl = ctx.cfg.cache_static_ttl; 45 item->ttl = ctx.cfg.cache_static_ttl;
45 else 46 else
46 item->ttl = ctx.cfg.cache_repo_ttl; 47 item->ttl = ctx.cfg.cache_repo_ttl;
47 } 48 }
48 return 1; 49 return 1;
49} 50}
50 51
51struct refmatch { 52struct refmatch {
52 char *req_ref; 53 char *req_ref;
53 char *first_ref; 54 char *first_ref;
54 int match; 55 int match;
55}; 56};
56 57
57int find_current_ref(const char *refname, const unsigned char *sha1, 58int find_current_ref(const char *refname, const unsigned char *sha1,
58 int flags, void *cb_data) 59 int flags, void *cb_data)
diff --git a/cgit.h b/cgit.h
index 1b23369..c1a231d 100644
--- a/cgit.h
+++ b/cgit.h
@@ -192,85 +192,53 @@ extern const struct cgit_snapshot_format cgit_snapshot_formats[];
192extern int cgit_cmd; 192extern int cgit_cmd;
193 193
194extern void cgit_prepare_context(struct cgit_context *ctx); 194extern void cgit_prepare_context(struct cgit_context *ctx);
195extern struct cgit_repo *cgit_get_repoinfo(const char *url); 195extern struct cgit_repo *cgit_get_repoinfo(const char *url);
196extern void cgit_global_config_cb(const char *name, const char *value); 196extern void cgit_global_config_cb(const char *name, const char *value);
197extern void cgit_repo_config_cb(const char *name, const char *value); 197extern void cgit_repo_config_cb(const char *name, const char *value);
198extern void cgit_querystring_cb(const char *name, const char *value); 198extern void cgit_querystring_cb(const char *name, const char *value);
199 199
200extern int chk_zero(int result, char *msg); 200extern int chk_zero(int result, char *msg);
201extern int chk_positive(int result, char *msg); 201extern int chk_positive(int result, char *msg);
202extern int chk_non_negative(int result, char *msg); 202extern int chk_non_negative(int result, char *msg);
203 203
204extern int hextoint(char c); 204extern int hextoint(char c);
205extern char *trim_end(const char *str, char c); 205extern char *trim_end(const char *str, char c);
206extern char *strlpart(char *txt, int maxlen); 206extern char *strlpart(char *txt, int maxlen);
207extern char *strrpart(char *txt, int maxlen); 207extern char *strrpart(char *txt, int maxlen);
208 208
209extern void cgit_add_ref(struct reflist *list, struct refinfo *ref); 209extern void cgit_add_ref(struct reflist *list, struct refinfo *ref);
210extern int cgit_refs_cb(const char *refname, const unsigned char *sha1, 210extern int cgit_refs_cb(const char *refname, const unsigned char *sha1,
211 int flags, void *cb_data); 211 int flags, void *cb_data);
212 212
213extern void *cgit_free_commitinfo(struct commitinfo *info); 213extern void *cgit_free_commitinfo(struct commitinfo *info);
214 214
215extern int cgit_diff_files(const unsigned char *old_sha1, 215extern int cgit_diff_files(const unsigned char *old_sha1,
216 const unsigned char *new_sha1, 216 const unsigned char *new_sha1,
217 linediff_fn fn); 217 linediff_fn fn);
218 218
219extern void cgit_diff_tree(const unsigned char *old_sha1, 219extern void cgit_diff_tree(const unsigned char *old_sha1,
220 const unsigned char *new_sha1, 220 const unsigned char *new_sha1,
221 filepair_fn fn, const char *prefix); 221 filepair_fn fn, const char *prefix);
222 222
223extern void cgit_diff_commit(struct commit *commit, filepair_fn fn); 223extern void cgit_diff_commit(struct commit *commit, filepair_fn fn);
224 224
225extern char *fmt(const char *format,...); 225extern char *fmt(const char *format,...);
226 226
227extern int cgit_read_config(const char *filename, configfn fn); 227extern int cgit_read_config(const char *filename, configfn fn);
228extern int cgit_parse_query(char *txt, configfn fn); 228extern int cgit_parse_query(char *txt, configfn fn);
229extern struct commitinfo *cgit_parse_commit(struct commit *commit); 229extern struct commitinfo *cgit_parse_commit(struct commit *commit);
230extern struct taginfo *cgit_parse_tag(struct tag *tag); 230extern struct taginfo *cgit_parse_tag(struct tag *tag);
231extern void cgit_parse_url(const char *url); 231extern void cgit_parse_url(const char *url);
232 232
233extern char *cache_safe_filename(const char *unsafe); 233extern char *cache_safe_filename(const char *unsafe);
234extern int cache_lock(struct cacheitem *item); 234extern int cache_lock(struct cacheitem *item);
235extern int cache_unlock(struct cacheitem *item); 235extern int cache_unlock(struct cacheitem *item);
236extern int cache_cancel_lock(struct cacheitem *item); 236extern int cache_cancel_lock(struct cacheitem *item);
237extern int cache_exist(struct cacheitem *item); 237extern int cache_exist(struct cacheitem *item);
238extern int cache_expired(struct cacheitem *item); 238extern int cache_expired(struct cacheitem *item);
239 239
240extern char *cgit_repourl(const char *reponame);
241extern char *cgit_fileurl(const char *reponame, const char *pagename,
242 const char *filename, const char *query);
243extern char *cgit_pageurl(const char *reponame, const char *pagename,
244 const char *query);
245
246extern const char *cgit_repobasename(const char *reponame); 240extern const char *cgit_repobasename(const char *reponame);
247 241
248extern void cgit_tree_link(char *name, char *title, char *class, char *head,
249 char *rev, char *path);
250extern void cgit_log_link(char *name, char *title, char *class, char *head,
251 char *rev, char *path, int ofs, char *grep,
252 char *pattern);
253extern void cgit_commit_link(char *name, char *title, char *class, char *head,
254 char *rev);
255extern void cgit_refs_link(char *name, char *title, char *class, char *head,
256 char *rev, char *path);
257extern void cgit_snapshot_link(char *name, char *title, char *class,
258 char *head, char *rev, char *archivename);
259extern void cgit_diff_link(char *name, char *title, char *class, char *head,
260 char *new_rev, char *old_rev, char *path);
261
262extern void cgit_object_link(struct object *obj);
263
264extern void cgit_print_error(char *msg);
265extern void cgit_print_date(time_t secs, char *format);
266extern void cgit_print_age(time_t t, time_t max_relative, char *format);
267extern void cgit_print_http_headers(struct cgit_context *ctx);
268extern void cgit_print_docstart(struct cgit_context *ctx);
269extern void cgit_print_docend();
270extern void cgit_print_pageheader(struct cgit_context *ctx);
271extern void cgit_print_filemode(unsigned short mode);
272extern void cgit_print_snapshot_links(const char *repo, const char *head,
273 const char *hex, int snapshots);
274extern int cgit_parse_snapshots_mask(const char *str); 242extern int cgit_parse_snapshots_mask(const char *str);
275 243
276#endif /* CGIT_H */ 244#endif /* CGIT_H */
diff --git a/ui-blob.c b/ui-blob.c
index 3b29132..11589db 100644
--- a/ui-blob.c
+++ b/ui-blob.c
@@ -1,42 +1,43 @@
1/* ui-blob.c: show blob content 1/* ui-blob.c: show blob content
2 * 2 *
3 * Copyright (C) 2008 Lars Hjemli 3 * Copyright (C) 2008 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#include "cgit.h" 9#include "cgit.h"
10#include "html.h" 10#include "html.h"
11#include "ui-shared.h"
11 12
12void cgit_print_blob(const char *hex, char *path) 13void cgit_print_blob(const char *hex, char *path)
13{ 14{
14 15
15 unsigned char sha1[20]; 16 unsigned char sha1[20];
16 enum object_type type; 17 enum object_type type;
17 unsigned char *buf; 18 unsigned char *buf;
18 unsigned long size; 19 unsigned long size;
19 20
20 if (get_sha1_hex(hex, sha1)){ 21 if (get_sha1_hex(hex, sha1)){
21 cgit_print_error(fmt("Bad hex value: %s", hex)); 22 cgit_print_error(fmt("Bad hex value: %s", hex));
22 return; 23 return;
23 } 24 }
24 25
25 type = sha1_object_info(sha1, &size); 26 type = sha1_object_info(sha1, &size);
26 if (type == OBJ_BAD) { 27 if (type == OBJ_BAD) {
27 cgit_print_error(fmt("Bad object name: %s", hex)); 28 cgit_print_error(fmt("Bad object name: %s", hex));
28 return; 29 return;
29 } 30 }
30 31
31 buf = read_sha1_file(sha1, &type, &size); 32 buf = read_sha1_file(sha1, &type, &size);
32 if (!buf) { 33 if (!buf) {
33 cgit_print_error(fmt("Error reading object %s", hex)); 34 cgit_print_error(fmt("Error reading object %s", hex));
34 return; 35 return;
35 } 36 }
36 37
37 buf[size] = '\0'; 38 buf[size] = '\0';
38 ctx.page.mimetype = "text/plain"; 39 ctx.page.mimetype = "text/plain";
39 ctx.page.filename = path; 40 ctx.page.filename = path;
40 cgit_print_http_headers(&ctx); 41 cgit_print_http_headers(&ctx);
41 write(htmlfd, buf, size); 42 write(htmlfd, buf, size);
42} 43}
diff --git a/ui-commit.c b/ui-commit.c
index ed25824..8019e36 100644
--- a/ui-commit.c
+++ b/ui-commit.c
@@ -1,58 +1,59 @@
1/* ui-commit.c: generate commit view 1/* ui-commit.c: generate commit view
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#include "cgit.h" 9#include "cgit.h"
10#include "html.h" 10#include "html.h"
11#include "ui-shared.h"
11 12
12static int files, slots; 13static int files, slots;
13static int total_adds, total_rems, max_changes; 14static int total_adds, total_rems, max_changes;
14static int lines_added, lines_removed; 15static int lines_added, lines_removed;
15static char *curr_rev; 16static char *curr_rev;
16 17
17static struct fileinfo { 18static struct fileinfo {
18 char status; 19 char status;
19 unsigned char old_sha1[20]; 20 unsigned char old_sha1[20];
20 unsigned char new_sha1[20]; 21 unsigned char new_sha1[20];
21 unsigned short old_mode; 22 unsigned short old_mode;
22 unsigned short new_mode; 23 unsigned short new_mode;
23 char *old_path; 24 char *old_path;
24 char *new_path; 25 char *new_path;
25 unsigned int added; 26 unsigned int added;
26 unsigned int removed; 27 unsigned int removed;
27} *items; 28} *items;
28 29
29 30
30void print_fileinfo(struct fileinfo *info) 31void print_fileinfo(struct fileinfo *info)
31{ 32{
32 char *class; 33 char *class;
33 34
34 switch (info->status) { 35 switch (info->status) {
35 case DIFF_STATUS_ADDED: 36 case DIFF_STATUS_ADDED:
36 class = "add"; 37 class = "add";
37 break; 38 break;
38 case DIFF_STATUS_COPIED: 39 case DIFF_STATUS_COPIED:
39 class = "cpy"; 40 class = "cpy";
40 break; 41 break;
41 case DIFF_STATUS_DELETED: 42 case DIFF_STATUS_DELETED:
42 class = "del"; 43 class = "del";
43 break; 44 break;
44 case DIFF_STATUS_MODIFIED: 45 case DIFF_STATUS_MODIFIED:
45 class = "upd"; 46 class = "upd";
46 break; 47 break;
47 case DIFF_STATUS_RENAMED: 48 case DIFF_STATUS_RENAMED:
48 class = "mov"; 49 class = "mov";
49 break; 50 break;
50 case DIFF_STATUS_TYPE_CHANGED: 51 case DIFF_STATUS_TYPE_CHANGED:
51 class = "typ"; 52 class = "typ";
52 break; 53 break;
53 case DIFF_STATUS_UNKNOWN: 54 case DIFF_STATUS_UNKNOWN:
54 class = "unk"; 55 class = "unk";
55 break; 56 break;
56 case DIFF_STATUS_UNMERGED: 57 case DIFF_STATUS_UNMERGED:
57 class = "stg"; 58 class = "stg";
58 break; 59 break;
diff --git a/ui-diff.c b/ui-diff.c
index 5c3bc98..2a22009 100644
--- a/ui-diff.c
+++ b/ui-diff.c
@@ -1,58 +1,59 @@
1/* ui-diff.c: show diff between two blobs 1/* ui-diff.c: show diff between two blobs
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#include "cgit.h" 9#include "cgit.h"
10#include "html.h" 10#include "html.h"
11#include "ui-shared.h"
11 12
12unsigned char old_rev_sha1[20]; 13unsigned char old_rev_sha1[20];
13unsigned char new_rev_sha1[20]; 14unsigned char new_rev_sha1[20];
14 15
15/* 16/*
16 * print a single line returned from xdiff 17 * print a single line returned from xdiff
17 */ 18 */
18static void print_line(char *line, int len) 19static void print_line(char *line, int len)
19{ 20{
20 char *class = "ctx"; 21 char *class = "ctx";
21 char c = line[len-1]; 22 char c = line[len-1];
22 23
23 if (line[0] == '+') 24 if (line[0] == '+')
24 class = "add"; 25 class = "add";
25 else if (line[0] == '-') 26 else if (line[0] == '-')
26 class = "del"; 27 class = "del";
27 else if (line[0] == '@') 28 else if (line[0] == '@')
28 class = "hunk"; 29 class = "hunk";
29 30
30 htmlf("<div class='%s'>", class); 31 htmlf("<div class='%s'>", class);
31 line[len-1] = '\0'; 32 line[len-1] = '\0';
32 html_txt(line); 33 html_txt(line);
33 html("</div>"); 34 html("</div>");
34 line[len-1] = c; 35 line[len-1] = c;
35} 36}
36 37
37static void header(unsigned char *sha1, char *path1, int mode1, 38static void header(unsigned char *sha1, char *path1, int mode1,
38 unsigned char *sha2, char *path2, int mode2) 39 unsigned char *sha2, char *path2, int mode2)
39{ 40{
40 char *abbrev1, *abbrev2; 41 char *abbrev1, *abbrev2;
41 int subproject; 42 int subproject;
42 43
43 subproject = (S_ISGITLINK(mode1) || S_ISGITLINK(mode2)); 44 subproject = (S_ISGITLINK(mode1) || S_ISGITLINK(mode2));
44 html("<div class='head'>"); 45 html("<div class='head'>");
45 html("diff --git a/"); 46 html("diff --git a/");
46 html_txt(path1); 47 html_txt(path1);
47 html(" b/"); 48 html(" b/");
48 html_txt(path2); 49 html_txt(path2);
49 50
50 if (is_null_sha1(sha1)) 51 if (is_null_sha1(sha1))
51 path1 = "dev/null"; 52 path1 = "dev/null";
52 if (is_null_sha1(sha2)) 53 if (is_null_sha1(sha2))
53 path2 = "dev/null"; 54 path2 = "dev/null";
54 55
55 if (mode1 == 0) 56 if (mode1 == 0)
56 htmlf("<br/>new file mode %.6o", mode2); 57 htmlf("<br/>new file mode %.6o", mode2);
57 58
58 if (mode2 == 0) 59 if (mode2 == 0)
diff --git a/ui-log.c b/ui-log.c
index e1d324d..60c9269 100644
--- a/ui-log.c
+++ b/ui-log.c
@@ -1,58 +1,59 @@
1/* ui-log.c: functions for log output 1/* ui-log.c: functions for log output
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#include "cgit.h" 9#include "cgit.h"
10#include "html.h" 10#include "html.h"
11#include "ui-shared.h"
11 12
12int files, add_lines, rem_lines; 13int files, add_lines, rem_lines;
13 14
14void count_lines(char *line, int size) 15void count_lines(char *line, int size)
15{ 16{
16 if (size <= 0) 17 if (size <= 0)
17 return; 18 return;
18 19
19 if (line[0] == '+') 20 if (line[0] == '+')
20 add_lines++; 21 add_lines++;
21 22
22 else if (line[0] == '-') 23 else if (line[0] == '-')
23 rem_lines++; 24 rem_lines++;
24} 25}
25 26
26void inspect_files(struct diff_filepair *pair) 27void inspect_files(struct diff_filepair *pair)
27{ 28{
28 files++; 29 files++;
29 if (ctx.repo->enable_log_linecount) 30 if (ctx.repo->enable_log_linecount)
30 cgit_diff_files(pair->one->sha1, pair->two->sha1, count_lines); 31 cgit_diff_files(pair->one->sha1, pair->two->sha1, count_lines);
31} 32}
32 33
33void print_commit(struct commit *commit) 34void print_commit(struct commit *commit)
34{ 35{
35 struct commitinfo *info; 36 struct commitinfo *info;
36 37
37 info = cgit_parse_commit(commit); 38 info = cgit_parse_commit(commit);
38 html("<tr><td>"); 39 html("<tr><td>");
39 cgit_print_age(commit->date, TM_WEEK * 2, FMT_SHORTDATE); 40 cgit_print_age(commit->date, TM_WEEK * 2, FMT_SHORTDATE);
40 html("</td><td>"); 41 html("</td><td>");
41 cgit_commit_link(info->subject, NULL, NULL, ctx.qry.head, 42 cgit_commit_link(info->subject, NULL, NULL, ctx.qry.head,
42 sha1_to_hex(commit->object.sha1)); 43 sha1_to_hex(commit->object.sha1));
43 if (ctx.repo->enable_log_filecount) { 44 if (ctx.repo->enable_log_filecount) {
44 files = 0; 45 files = 0;
45 add_lines = 0; 46 add_lines = 0;
46 rem_lines = 0; 47 rem_lines = 0;
47 cgit_diff_commit(commit, inspect_files); 48 cgit_diff_commit(commit, inspect_files);
48 html("</td><td class='right'>"); 49 html("</td><td class='right'>");
49 htmlf("%d", files); 50 htmlf("%d", files);
50 if (ctx.repo->enable_log_linecount) { 51 if (ctx.repo->enable_log_linecount) {
51 html("</td><td class='right'>"); 52 html("</td><td class='right'>");
52 htmlf("-%d/+%d", rem_lines, add_lines); 53 htmlf("-%d/+%d", rem_lines, add_lines);
53 } 54 }
54 } 55 }
55 html("</td><td>"); 56 html("</td><td>");
56 html_txt(info->author); 57 html_txt(info->author);
57 html("</td></tr>\n"); 58 html("</td></tr>\n");
58 cgit_free_commitinfo(info); 59 cgit_free_commitinfo(info);
diff --git a/ui-patch.c b/ui-patch.c
index 68ebb15..36bfae4 100644
--- a/ui-patch.c
+++ b/ui-patch.c
@@ -1,58 +1,59 @@
1/* ui-patch.c: generate patch view 1/* ui-patch.c: generate patch view
2 * 2 *
3 * Copyright (C) 2007 Lars Hjemli 3 * Copyright (C) 2007 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#include "cgit.h" 9#include "cgit.h"
10#include "html.h" 10#include "html.h"
11#include "ui-shared.h"
11 12
12static void print_line(char *line, int len) 13static void print_line(char *line, int len)
13{ 14{
14 char c = line[len-1]; 15 char c = line[len-1];
15 16
16 line[len-1] = '\0'; 17 line[len-1] = '\0';
17 htmlf("%s\n", line); 18 htmlf("%s\n", line);
18 line[len-1] = c; 19 line[len-1] = c;
19} 20}
20 21
21static void header(unsigned char *sha1, char *path1, int mode1, 22static void header(unsigned char *sha1, char *path1, int mode1,
22 unsigned char *sha2, char *path2, int mode2) 23 unsigned char *sha2, char *path2, int mode2)
23{ 24{
24 char *abbrev1, *abbrev2; 25 char *abbrev1, *abbrev2;
25 int subproject; 26 int subproject;
26 27
27 subproject = (S_ISGITLINK(mode1) || S_ISGITLINK(mode2)); 28 subproject = (S_ISGITLINK(mode1) || S_ISGITLINK(mode2));
28 htmlf("diff --git a/%s b/%s\n", path1, path2); 29 htmlf("diff --git a/%s b/%s\n", path1, path2);
29 30
30 if (is_null_sha1(sha1)) 31 if (is_null_sha1(sha1))
31 path1 = "dev/null"; 32 path1 = "dev/null";
32 if (is_null_sha1(sha2)) 33 if (is_null_sha1(sha2))
33 path2 = "dev/null"; 34 path2 = "dev/null";
34 35
35 if (mode1 == 0) 36 if (mode1 == 0)
36 htmlf("new file mode %.6o\n", mode2); 37 htmlf("new file mode %.6o\n", mode2);
37 38
38 if (mode2 == 0) 39 if (mode2 == 0)
39 htmlf("deleted file mode %.6o\n", mode1); 40 htmlf("deleted file mode %.6o\n", mode1);
40 41
41 if (!subproject) { 42 if (!subproject) {
42 abbrev1 = xstrdup(find_unique_abbrev(sha1, DEFAULT_ABBREV)); 43 abbrev1 = xstrdup(find_unique_abbrev(sha1, DEFAULT_ABBREV));
43 abbrev2 = xstrdup(find_unique_abbrev(sha2, DEFAULT_ABBREV)); 44 abbrev2 = xstrdup(find_unique_abbrev(sha2, DEFAULT_ABBREV));
44 htmlf("index %s..%s", abbrev1, abbrev2); 45 htmlf("index %s..%s", abbrev1, abbrev2);
45 free(abbrev1); 46 free(abbrev1);
46 free(abbrev2); 47 free(abbrev2);
47 if (mode1 != 0 && mode2 != 0) { 48 if (mode1 != 0 && mode2 != 0) {
48 htmlf(" %.6o", mode1); 49 htmlf(" %.6o", mode1);
49 if (mode2 != mode1) 50 if (mode2 != mode1)
50 htmlf("..%.6o", mode2); 51 htmlf("..%.6o", mode2);
51 } 52 }
52 htmlf("\n--- a/%s\n", path1); 53 htmlf("\n--- a/%s\n", path1);
53 htmlf("+++ b/%s\n", path2); 54 htmlf("+++ b/%s\n", path2);
54 } 55 }
55} 56}
56 57
57static void filepair_cb(struct diff_filepair *pair) 58static void filepair_cb(struct diff_filepair *pair)
58{ 59{
diff --git a/ui-refs.c b/ui-refs.c
index fc82ca7..12533cd 100644
--- a/ui-refs.c
+++ b/ui-refs.c
@@ -1,58 +1,59 @@
1/* ui-refs.c: browse symbolic refs 1/* ui-refs.c: browse symbolic refs
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#include "cgit.h" 9#include "cgit.h"
10#include "html.h" 10#include "html.h"
11#include "ui-shared.h"
11 12
12static int header; 13static int header;
13 14
14static int cmp_age(int age1, int age2) 15static int cmp_age(int age1, int age2)
15{ 16{
16 if (age1 != 0 && age2 != 0) 17 if (age1 != 0 && age2 != 0)
17 return age2 - age1; 18 return age2 - age1;
18 19
19 if (age1 == 0 && age2 == 0) 20 if (age1 == 0 && age2 == 0)
20 return 0; 21 return 0;
21 22
22 if (age1 == 0) 23 if (age1 == 0)
23 return +1; 24 return +1;
24 25
25 return -1; 26 return -1;
26} 27}
27 28
28static int cmp_ref_name(const void *a, const void *b) 29static int cmp_ref_name(const void *a, const void *b)
29{ 30{
30 struct refinfo *r1 = *(struct refinfo **)a; 31 struct refinfo *r1 = *(struct refinfo **)a;
31 struct refinfo *r2 = *(struct refinfo **)b; 32 struct refinfo *r2 = *(struct refinfo **)b;
32 33
33 return strcmp(r1->refname, r2->refname); 34 return strcmp(r1->refname, r2->refname);
34} 35}
35 36
36static int cmp_branch_age(const void *a, const void *b) 37static int cmp_branch_age(const void *a, const void *b)
37{ 38{
38 struct refinfo *r1 = *(struct refinfo **)a; 39 struct refinfo *r1 = *(struct refinfo **)a;
39 struct refinfo *r2 = *(struct refinfo **)b; 40 struct refinfo *r2 = *(struct refinfo **)b;
40 41
41 return cmp_age(r1->commit->committer_date, r2->commit->committer_date); 42 return cmp_age(r1->commit->committer_date, r2->commit->committer_date);
42} 43}
43 44
44static int cmp_tag_age(const void *a, const void *b) 45static int cmp_tag_age(const void *a, const void *b)
45{ 46{
46 struct refinfo *r1 = *(struct refinfo **)a; 47 struct refinfo *r1 = *(struct refinfo **)a;
47 struct refinfo *r2 = *(struct refinfo **)b; 48 struct refinfo *r2 = *(struct refinfo **)b;
48 49
49 return cmp_age(r1->tag->tagger_date, r2->tag->tagger_date); 50 return cmp_age(r1->tag->tagger_date, r2->tag->tagger_date);
50} 51}
51 52
52static int print_branch(struct refinfo *ref) 53static int print_branch(struct refinfo *ref)
53{ 54{
54 struct commitinfo *info = ref->commit; 55 struct commitinfo *info = ref->commit;
55 char *name = (char *)ref->refname; 56 char *name = (char *)ref->refname;
56 57
57 if (!info) 58 if (!info)
58 return 1; 59 return 1;
diff --git a/ui-repolist.c b/ui-repolist.c
index ad9b1bc..eeeaf3d 100644
--- a/ui-repolist.c
+++ b/ui-repolist.c
@@ -1,60 +1,61 @@
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#include <time.h> 9#include <time.h>
10 10
11#include "cgit.h" 11#include "cgit.h"
12#include "html.h" 12#include "html.h"
13#include "ui-shared.h"
13 14
14time_t read_agefile(char *path) 15time_t read_agefile(char *path)
15{ 16{
16 FILE *f; 17 FILE *f;
17 static char buf[64], buf2[64]; 18 static char buf[64], buf2[64];
18 19
19 if (!(f = fopen(path, "r"))) 20 if (!(f = fopen(path, "r")))
20 return -1; 21 return -1;
21 fgets(buf, sizeof(buf), f); 22 fgets(buf, sizeof(buf), f);
22 fclose(f); 23 fclose(f);
23 if (parse_date(buf, buf2, sizeof(buf2))) 24 if (parse_date(buf, buf2, sizeof(buf2)))
24 return strtoul(buf2, NULL, 10); 25 return strtoul(buf2, NULL, 10);
25 else 26 else
26 return 0; 27 return 0;
27} 28}
28 29
29static void print_modtime(struct cgit_repo *repo) 30static void print_modtime(struct cgit_repo *repo)
30{ 31{
31 char *path; 32 char *path;
32 struct stat s; 33 struct stat s;
33 34
34 path = fmt("%s/%s", repo->path, ctx.cfg.agefile); 35 path = fmt("%s/%s", repo->path, ctx.cfg.agefile);
35 if (stat(path, &s) == 0) { 36 if (stat(path, &s) == 0) {
36 cgit_print_age(read_agefile(path), -1, NULL); 37 cgit_print_age(read_agefile(path), -1, NULL);
37 return; 38 return;
38 } 39 }
39 40
40 path = fmt("%s/refs/heads/%s", repo->path, repo->defbranch); 41 path = fmt("%s/refs/heads/%s", repo->path, repo->defbranch);
41 if (stat(path, &s) != 0) 42 if (stat(path, &s) != 0)
42 return; 43 return;
43 cgit_print_age(s.st_mtime, -1, NULL); 44 cgit_print_age(s.st_mtime, -1, NULL);
44} 45}
45 46
46void cgit_print_repolist() 47void cgit_print_repolist()
47{ 48{
48 int i, columns = 4; 49 int i, columns = 4;
49 char *last_group = NULL; 50 char *last_group = NULL;
50 51
51 if (ctx.cfg.enable_index_links) 52 if (ctx.cfg.enable_index_links)
52 columns++; 53 columns++;
53 54
54 ctx.page.title = ctx.cfg.root_title; 55 ctx.page.title = ctx.cfg.root_title;
55 cgit_print_http_headers(&ctx); 56 cgit_print_http_headers(&ctx);
56 cgit_print_docstart(&ctx); 57 cgit_print_docstart(&ctx);
57 cgit_print_pageheader(&ctx); 58 cgit_print_pageheader(&ctx);
58 59
59 html("<table summary='repository list' class='list nowrap'>"); 60 html("<table summary='repository list' class='list nowrap'>");
60 if (ctx.cfg.index_header) { 61 if (ctx.cfg.index_header) {
diff --git a/ui-shared.h b/ui-shared.h
new file mode 100644
index 0000000..94de884
--- a/dev/null
+++ b/ui-shared.h
@@ -0,0 +1,36 @@
1#ifndef UI_SHARED_H
2#define UI_SHARED_H
3
4extern char *cgit_repourl(const char *reponame);
5extern char *cgit_fileurl(const char *reponame, const char *pagename,
6 const char *filename, const char *query);
7extern char *cgit_pageurl(const char *reponame, const char *pagename,
8 const char *query);
9
10extern void cgit_tree_link(char *name, char *title, char *class, char *head,
11 char *rev, char *path);
12extern void cgit_log_link(char *name, char *title, char *class, char *head,
13 char *rev, char *path, int ofs, char *grep,
14 char *pattern);
15extern void cgit_commit_link(char *name, char *title, char *class, char *head,
16 char *rev);
17extern void cgit_refs_link(char *name, char *title, char *class, char *head,
18 char *rev, char *path);
19extern void cgit_snapshot_link(char *name, char *title, char *class,
20 char *head, char *rev, char *archivename);
21extern void cgit_diff_link(char *name, char *title, char *class, char *head,
22 char *new_rev, char *old_rev, char *path);
23extern void cgit_object_link(struct object *obj);
24
25extern void cgit_print_error(char *msg);
26extern void cgit_print_date(time_t secs, char *format);
27extern void cgit_print_age(time_t t, time_t max_relative, char *format);
28extern void cgit_print_http_headers(struct cgit_context *ctx);
29extern void cgit_print_docstart(struct cgit_context *ctx);
30extern void cgit_print_docend();
31extern void cgit_print_pageheader(struct cgit_context *ctx);
32extern void cgit_print_filemode(unsigned short mode);
33extern void cgit_print_snapshot_links(const char *repo, const char *head,
34 const char *hex, int snapshots);
35
36#endif /* UI_SHARED_H */
diff --git a/ui-snapshot.c b/ui-snapshot.c
index 512fcd2..966a140 100644
--- a/ui-snapshot.c
+++ b/ui-snapshot.c
@@ -1,58 +1,59 @@
1/* ui-snapshot.c: generate snapshot of a commit 1/* ui-snapshot.c: generate snapshot of a commit
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#include "cgit.h" 9#include "cgit.h"
10#include "html.h" 10#include "html.h"
11#include "ui-shared.h"
11 12
12static int write_compressed_tar_archive(struct archiver_args *args,const char *filter) 13static int write_compressed_tar_archive(struct archiver_args *args,const char *filter)
13{ 14{
14 int rw[2]; 15 int rw[2];
15 pid_t gzpid; 16 pid_t gzpid;
16 int stdout2; 17 int stdout2;
17 int status; 18 int status;
18 int rv; 19 int rv;
19 20
20 stdout2 = chk_non_negative(dup(STDIN_FILENO), "Preserving STDOUT before compressing"); 21 stdout2 = chk_non_negative(dup(STDIN_FILENO), "Preserving STDOUT before compressing");
21 chk_zero(pipe(rw), "Opening pipe from compressor subprocess"); 22 chk_zero(pipe(rw), "Opening pipe from compressor subprocess");
22 gzpid = chk_non_negative(fork(), "Forking compressor subprocess"); 23 gzpid = chk_non_negative(fork(), "Forking compressor subprocess");
23 if(gzpid==0) { 24 if(gzpid==0) {
24 /* child */ 25 /* child */
25 chk_zero(close(rw[1]), "Closing write end of pipe in child"); 26 chk_zero(close(rw[1]), "Closing write end of pipe in child");
26 chk_zero(close(STDIN_FILENO), "Closing STDIN"); 27 chk_zero(close(STDIN_FILENO), "Closing STDIN");
27 chk_non_negative(dup2(rw[0],STDIN_FILENO), "Redirecting compressor input to stdin"); 28 chk_non_negative(dup2(rw[0],STDIN_FILENO), "Redirecting compressor input to stdin");
28 execlp(filter,filter,NULL); 29 execlp(filter,filter,NULL);
29 _exit(-1); 30 _exit(-1);
30 } 31 }
31 /* parent */ 32 /* parent */
32 chk_zero(close(rw[0]), "Closing read end of pipe"); 33 chk_zero(close(rw[0]), "Closing read end of pipe");
33 chk_non_negative(dup2(rw[1],STDOUT_FILENO), "Redirecting output to compressor"); 34 chk_non_negative(dup2(rw[1],STDOUT_FILENO), "Redirecting output to compressor");
34 35
35 rv = write_tar_archive(args); 36 rv = write_tar_archive(args);
36 37
37 chk_zero(close(STDOUT_FILENO), "Closing STDOUT redirected to compressor"); 38 chk_zero(close(STDOUT_FILENO), "Closing STDOUT redirected to compressor");
38 chk_non_negative(dup2(stdout2,STDOUT_FILENO), "Restoring uncompressed STDOUT"); 39 chk_non_negative(dup2(stdout2,STDOUT_FILENO), "Restoring uncompressed STDOUT");
39 chk_zero(close(stdout2), "Closing uncompressed STDOUT"); 40 chk_zero(close(stdout2), "Closing uncompressed STDOUT");
40 chk_zero(close(rw[1]), "Closing write end of pipe in parent"); 41 chk_zero(close(rw[1]), "Closing write end of pipe in parent");
41 chk_positive(waitpid(gzpid,&status,0), "Waiting on compressor process"); 42 chk_positive(waitpid(gzpid,&status,0), "Waiting on compressor process");
42 if(! ( WIFEXITED(status) && WEXITSTATUS(status)==0 ) ) 43 if(! ( WIFEXITED(status) && WEXITSTATUS(status)==0 ) )
43 cgit_print_error("Failed to compress archive"); 44 cgit_print_error("Failed to compress archive");
44 45
45 return rv; 46 return rv;
46} 47}
47 48
48static int write_tar_gzip_archive(struct archiver_args *args) 49static int write_tar_gzip_archive(struct archiver_args *args)
49{ 50{
50 return write_compressed_tar_archive(args,"gzip"); 51 return write_compressed_tar_archive(args,"gzip");
51} 52}
52 53
53static int write_tar_bzip2_archive(struct archiver_args *args) 54static int write_tar_bzip2_archive(struct archiver_args *args)
54{ 55{
55 return write_compressed_tar_archive(args,"bzip2"); 56 return write_compressed_tar_archive(args,"bzip2");
56} 57}
57 58
58const struct cgit_snapshot_format cgit_snapshot_formats[] = { 59const struct cgit_snapshot_format cgit_snapshot_formats[] = {
diff --git a/ui-tag.c b/ui-tag.c
index 2998d02..ab2c66d 100644
--- a/ui-tag.c
+++ b/ui-tag.c
@@ -1,58 +1,59 @@
1/* ui-tag.c: display a tag 1/* ui-tag.c: display a tag
2 * 2 *
3 * Copyright (C) 2007 Lars Hjemli 3 * Copyright (C) 2007 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#include "cgit.h" 9#include "cgit.h"
10#include "html.h" 10#include "html.h"
11#include "ui-shared.h"
11 12
12static void print_tag_content(char *buf) 13static void print_tag_content(char *buf)
13{ 14{
14 char *p; 15 char *p;
15 16
16 if (!buf) 17 if (!buf)
17 return; 18 return;
18 19
19 html("<div class='commit-subject'>"); 20 html("<div class='commit-subject'>");
20 p = strchr(buf, '\n'); 21 p = strchr(buf, '\n');
21 if (p) 22 if (p)
22 *p = '\0'; 23 *p = '\0';
23 html_txt(buf); 24 html_txt(buf);
24 html("</div>"); 25 html("</div>");
25 if (p) { 26 if (p) {
26 html("<div class='commit-msg'>"); 27 html("<div class='commit-msg'>");
27 html_txt(++p); 28 html_txt(++p);
28 html("</div>"); 29 html("</div>");
29 } 30 }
30} 31}
31 32
32void cgit_print_tag(char *revname) 33void cgit_print_tag(char *revname)
33{ 34{
34 unsigned char sha1[20]; 35 unsigned char sha1[20];
35 struct object *obj; 36 struct object *obj;
36 struct tag *tag; 37 struct tag *tag;
37 struct taginfo *info; 38 struct taginfo *info;
38 39
39 if (get_sha1(revname, sha1)) { 40 if (get_sha1(revname, sha1)) {
40 cgit_print_error(fmt("Bad tag reference: %s", revname)); 41 cgit_print_error(fmt("Bad tag reference: %s", revname));
41 return; 42 return;
42 } 43 }
43 obj = parse_object(sha1); 44 obj = parse_object(sha1);
44 if (!obj) { 45 if (!obj) {
45 cgit_print_error(fmt("Bad object id: %s", sha1_to_hex(sha1))); 46 cgit_print_error(fmt("Bad object id: %s", sha1_to_hex(sha1)));
46 return; 47 return;
47 } 48 }
48 if (obj->type == OBJ_TAG) { 49 if (obj->type == OBJ_TAG) {
49 tag = lookup_tag(sha1); 50 tag = lookup_tag(sha1);
50 if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag))) { 51 if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag))) {
51 cgit_print_error(fmt("Bad tag object: %s", revname)); 52 cgit_print_error(fmt("Bad tag object: %s", revname));
52 return; 53 return;
53 } 54 }
54 html("<table class='commit-info'>\n"); 55 html("<table class='commit-info'>\n");
55 htmlf("<tr><td>Tag name</td><td>%s (%s)</td></tr>\n", 56 htmlf("<tr><td>Tag name</td><td>%s (%s)</td></tr>\n",
56 revname, sha1_to_hex(sha1)); 57 revname, sha1_to_hex(sha1));
57 if (info->tagger_date > 0) { 58 if (info->tagger_date > 0) {
58 html("<tr><td>Tag date</td><td>"); 59 html("<tr><td>Tag date</td><td>");
diff --git a/ui-tree.c b/ui-tree.c
index 7912784..9be3140 100644
--- a/ui-tree.c
+++ b/ui-tree.c
@@ -1,58 +1,59 @@
1/* ui-tree.c: functions for tree output 1/* ui-tree.c: functions for tree output
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#include "cgit.h" 9#include "cgit.h"
10#include "html.h" 10#include "html.h"
11#include "ui-shared.h"
11 12
12char *curr_rev; 13char *curr_rev;
13char *match_path; 14char *match_path;
14int header = 0; 15int header = 0;
15 16
16static void print_object(const unsigned char *sha1, char *path) 17static void print_object(const unsigned char *sha1, char *path)
17{ 18{
18 enum object_type type; 19 enum object_type type;
19 char *buf; 20 char *buf;
20 unsigned long size, lineno, start, idx; 21 unsigned long size, lineno, start, idx;
21 const char *linefmt = "<tr><td class='no'><a id='n%1$d' name='n%1$d' href='#n%1$d'>%1$d</a></td><td class='txt'>"; 22 const char *linefmt = "<tr><td class='no'><a id='n%1$d' name='n%1$d' href='#n%1$d'>%1$d</a></td><td class='txt'>";
22 23
23 type = sha1_object_info(sha1, &size); 24 type = sha1_object_info(sha1, &size);
24 if (type == OBJ_BAD) { 25 if (type == OBJ_BAD) {
25 cgit_print_error(fmt("Bad object name: %s", 26 cgit_print_error(fmt("Bad object name: %s",
26 sha1_to_hex(sha1))); 27 sha1_to_hex(sha1)));
27 return; 28 return;
28 } 29 }
29 30
30 buf = read_sha1_file(sha1, &type, &size); 31 buf = read_sha1_file(sha1, &type, &size);
31 if (!buf) { 32 if (!buf) {
32 cgit_print_error(fmt("Error reading object %s", 33 cgit_print_error(fmt("Error reading object %s",
33 sha1_to_hex(sha1))); 34 sha1_to_hex(sha1)));
34 return; 35 return;
35 } 36 }
36 37
37 html(" blob: <a href='"); 38 html(" blob: <a href='");
38 html_attr(cgit_pageurl(ctx.qry.repo, "blob", fmt("id=%s", sha1_to_hex(sha1)))); 39 html_attr(cgit_pageurl(ctx.qry.repo, "blob", fmt("id=%s", sha1_to_hex(sha1))));
39 htmlf("'>%s</a>",sha1_to_hex(sha1)); 40 htmlf("'>%s</a>",sha1_to_hex(sha1));
40 41
41 html("<table summary='blob content' class='blob'>\n"); 42 html("<table summary='blob content' class='blob'>\n");
42 idx = 0; 43 idx = 0;
43 start = 0; 44 start = 0;
44 lineno = 0; 45 lineno = 0;
45 while(idx < size) { 46 while(idx < size) {
46 if (buf[idx] == '\n') { 47 if (buf[idx] == '\n') {
47 buf[idx] = '\0'; 48 buf[idx] = '\0';
48 htmlf(linefmt, ++lineno); 49 htmlf(linefmt, ++lineno);
49 html_txt(buf + start); 50 html_txt(buf + start);
50 html("</td></tr>\n"); 51 html("</td></tr>\n");
51 start = idx + 1; 52 start = idx + 1;
52 } 53 }
53 idx++; 54 idx++;
54 } 55 }
55 htmlf(linefmt, ++lineno); 56 htmlf(linefmt, ++lineno);
56 html_txt(buf + start); 57 html_txt(buf + start);
57 html("</td></tr>\n"); 58 html("</td></tr>\n");
58 html("</table>\n"); 59 html("</table>\n");