Merge branch 'lh/menu'
* lh/menu: Add ofs argument to cgit_log_link and use it in ui-log.c Add trim_end() and use it to remove trailing slashes from repo paths Do not include current path in the "tree" menu link Add setting to enable/disable extra links on index page Change S/L/T to summary/log/tree Change "files" to "tree" Include querystring as part of cached filename for repo summary page Add more menuitems on repo pages
This commit is contained in:
commit
16a3d2779c
10
cgit.c
10
cgit.c
@ -26,13 +26,15 @@ static int cgit_prepare_cache(struct cacheitem *item)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!cgit_cmd) {
|
if (!cgit_cmd) {
|
||||||
item->name = xstrdup(fmt("%s/%s/index.html", cgit_cache_root,
|
item->name = xstrdup(fmt("%s/%s/index.%s.html", cgit_cache_root,
|
||||||
cache_safe_filename(cgit_repo->url)));
|
cache_safe_filename(cgit_repo->url),
|
||||||
|
cache_safe_filename(cgit_querystring)));
|
||||||
item->ttl = cgit_cache_repo_ttl;
|
item->ttl = cgit_cache_repo_ttl;
|
||||||
} else {
|
} else {
|
||||||
item->name = xstrdup(fmt("%s/%s/%s/%s.html", cgit_cache_root,
|
item->name = xstrdup(fmt("%s/%s/%s/%s.html", cgit_cache_root,
|
||||||
cache_safe_filename(cgit_repo->url), cgit_query_page,
|
cache_safe_filename(cgit_repo->url),
|
||||||
cache_safe_filename(cgit_querystring)));
|
cgit_query_page,
|
||||||
|
cache_safe_filename(cgit_querystring)));
|
||||||
if (cgit_query_has_symref)
|
if (cgit_query_has_symref)
|
||||||
item->ttl = cgit_cache_dynamic_ttl;
|
item->ttl = cgit_cache_dynamic_ttl;
|
||||||
else if (cgit_query_has_sha1)
|
else if (cgit_query_has_sha1)
|
||||||
|
23
cgit.css
23
cgit.css
@ -95,6 +95,14 @@ td#header {
|
|||||||
vertical-align: text-bottom;
|
vertical-align: text-bottom;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
td#header a {
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
td#header a:hoved {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
td#logo {
|
td#logo {
|
||||||
text-align: right;
|
text-align: right;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
@ -116,11 +124,13 @@ td#crumb {
|
|||||||
td#crumb a {
|
td#crumb a {
|
||||||
color: #ccc;
|
color: #ccc;
|
||||||
background-color: #666;
|
background-color: #666;
|
||||||
|
padding: 0em 0.5em 0em 0.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
td#crumb a:hover {
|
td#crumb a:hover {
|
||||||
color: #eee;
|
color: #666;
|
||||||
background-color: #666;
|
background-color: #ccc;
|
||||||
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
td#search {
|
td#search {
|
||||||
@ -361,16 +371,17 @@ table.list td.repogroup {
|
|||||||
|
|
||||||
a.button {
|
a.button {
|
||||||
font-size: 80%;
|
font-size: 80%;
|
||||||
color: #333;
|
color: #aaa;
|
||||||
background-color: #ccc;
|
background-color: #eee;
|
||||||
border: solid 1px #999;
|
border: solid 1px #aaa;
|
||||||
padding: 0em 0.5em;
|
padding: 0em 0.5em;
|
||||||
margin: 0.1em 0.25em;
|
margin: 0.1em 0.25em;
|
||||||
}
|
}
|
||||||
|
|
||||||
a.button:hover {
|
a.button:hover {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
background-color: #eee;
|
color: #333;
|
||||||
|
background-color: #ccc;
|
||||||
}
|
}
|
||||||
|
|
||||||
a.primary {
|
a.primary {
|
||||||
|
4
cgit.h
4
cgit.h
@ -118,6 +118,7 @@ extern char *cgit_repo_group;
|
|||||||
|
|
||||||
extern int cgit_nocache;
|
extern int cgit_nocache;
|
||||||
extern int cgit_snapshots;
|
extern int cgit_snapshots;
|
||||||
|
extern int cgit_enable_index_links;
|
||||||
extern int cgit_enable_log_filecount;
|
extern int cgit_enable_log_filecount;
|
||||||
extern int cgit_enable_log_linecount;
|
extern int cgit_enable_log_linecount;
|
||||||
extern int cgit_max_lock_attempts;
|
extern int cgit_max_lock_attempts;
|
||||||
@ -158,6 +159,7 @@ extern int chk_zero(int result, char *msg);
|
|||||||
extern int chk_positive(int result, char *msg);
|
extern int chk_positive(int result, char *msg);
|
||||||
|
|
||||||
extern int hextoint(char c);
|
extern int hextoint(char c);
|
||||||
|
extern char *trim_end(const char *str, char c);
|
||||||
|
|
||||||
extern void *cgit_free_commitinfo(struct commitinfo *info);
|
extern void *cgit_free_commitinfo(struct commitinfo *info);
|
||||||
|
|
||||||
@ -204,7 +206,7 @@ extern char *cgit_pageurl(const char *reponame, const char *pagename,
|
|||||||
extern void cgit_tree_link(char *name, char *title, char *class, char *head,
|
extern void cgit_tree_link(char *name, char *title, char *class, char *head,
|
||||||
char *rev, char *path);
|
char *rev, char *path);
|
||||||
extern void cgit_log_link(char *name, char *title, char *class, char *head,
|
extern void cgit_log_link(char *name, char *title, char *class, char *head,
|
||||||
char *rev, char *path);
|
char *rev, char *path, int ofs);
|
||||||
extern void cgit_commit_link(char *name, char *title, char *class, char *head,
|
extern void cgit_commit_link(char *name, char *title, char *class, char *head,
|
||||||
char *rev);
|
char *rev);
|
||||||
extern void cgit_diff_link(char *name, char *title, char *class, char *head,
|
extern void cgit_diff_link(char *name, char *title, char *class, char *head,
|
||||||
|
4
cgitrc
4
cgitrc
@ -12,6 +12,10 @@
|
|||||||
#snapshots=0
|
#snapshots=0
|
||||||
|
|
||||||
|
|
||||||
|
## Enable/disable extra links to summary/log/tree per repo on index page
|
||||||
|
#enable-index-links=0
|
||||||
|
|
||||||
|
|
||||||
## Enable/disable display of 'number of files changed' in log view
|
## Enable/disable display of 'number of files changed' in log view
|
||||||
#enable-log-filecount=0
|
#enable-log-filecount=0
|
||||||
|
|
||||||
|
@ -168,7 +168,7 @@ void cgit_parse_url(const char *url)
|
|||||||
if (p) {
|
if (p) {
|
||||||
p[0] = '\0';
|
p[0] = '\0';
|
||||||
if (p[1])
|
if (p[1])
|
||||||
cgit_query_path = xstrdup(p + 1);
|
cgit_query_path = trim_end(p + 1, '/');
|
||||||
}
|
}
|
||||||
cgit_cmd = cgit_get_cmd_index(cmd + 1);
|
cgit_cmd = cgit_get_cmd_index(cmd + 1);
|
||||||
cgit_query_page = xstrdup(cmd + 1);
|
cgit_query_page = xstrdup(cmd + 1);
|
||||||
|
27
shared.c
27
shared.c
@ -28,6 +28,7 @@ char *cgit_repo_group = NULL;
|
|||||||
|
|
||||||
int cgit_nocache = 0;
|
int cgit_nocache = 0;
|
||||||
int cgit_snapshots = 0;
|
int cgit_snapshots = 0;
|
||||||
|
int cgit_enable_index_links = 0;
|
||||||
int cgit_enable_log_filecount = 0;
|
int cgit_enable_log_filecount = 0;
|
||||||
int cgit_enable_log_linecount = 0;
|
int cgit_enable_log_linecount = 0;
|
||||||
int cgit_max_lock_attempts = 5;
|
int cgit_max_lock_attempts = 5;
|
||||||
@ -148,6 +149,8 @@ void cgit_global_config_cb(const char *name, const char *value)
|
|||||||
cgit_nocache = atoi(value);
|
cgit_nocache = atoi(value);
|
||||||
else if (!strcmp(name, "snapshots"))
|
else if (!strcmp(name, "snapshots"))
|
||||||
cgit_snapshots = atoi(value);
|
cgit_snapshots = atoi(value);
|
||||||
|
else if (!strcmp(name, "enable-index-links"))
|
||||||
|
cgit_enable_index_links = atoi(value);
|
||||||
else if (!strcmp(name, "enable-log-filecount"))
|
else if (!strcmp(name, "enable-log-filecount"))
|
||||||
cgit_enable_log_filecount = atoi(value);
|
cgit_enable_log_filecount = atoi(value);
|
||||||
else if (!strcmp(name, "enable-log-linecount"))
|
else if (!strcmp(name, "enable-log-linecount"))
|
||||||
@ -227,7 +230,7 @@ void cgit_querystring_cb(const char *name, const char *value)
|
|||||||
} else if (!strcmp(name, "ofs")) {
|
} else if (!strcmp(name, "ofs")) {
|
||||||
cgit_query_ofs = atoi(value);
|
cgit_query_ofs = atoi(value);
|
||||||
} else if (!strcmp(name, "path")) {
|
} else if (!strcmp(name, "path")) {
|
||||||
cgit_query_path = xstrdup(value);
|
cgit_query_path = trim_end(value, '/');
|
||||||
} else if (!strcmp(name, "name")) {
|
} else if (!strcmp(name, "name")) {
|
||||||
cgit_query_name = xstrdup(value);
|
cgit_query_name = xstrdup(value);
|
||||||
}
|
}
|
||||||
@ -256,6 +259,28 @@ int hextoint(char c)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *trim_end(const char *str, char c)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
char *s, *t;
|
||||||
|
|
||||||
|
if (str == NULL)
|
||||||
|
return NULL;
|
||||||
|
t = (char *)str;
|
||||||
|
len = strlen(t);
|
||||||
|
while(len > 0 && t[len - 1] == c)
|
||||||
|
len--;
|
||||||
|
|
||||||
|
if (len == 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
c = t[len];
|
||||||
|
t[len] = '\0';
|
||||||
|
s = xstrdup(t);
|
||||||
|
t[len] = c;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
void cgit_diff_tree_cb(struct diff_queue_struct *q,
|
void cgit_diff_tree_cb(struct diff_queue_struct *q,
|
||||||
struct diff_options *options, void *data)
|
struct diff_options *options, void *data)
|
||||||
{
|
{
|
||||||
|
16
ui-log.c
16
ui-log.c
@ -113,17 +113,15 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *path, i
|
|||||||
if (pager) {
|
if (pager) {
|
||||||
html("<div class='pager'>");
|
html("<div class='pager'>");
|
||||||
if (ofs > 0) {
|
if (ofs > 0) {
|
||||||
html(" <a href='");
|
cgit_log_link("[prev]", NULL, NULL, cgit_query_head,
|
||||||
html(cgit_pageurl(cgit_query_repo, cgit_query_page,
|
cgit_query_sha1, cgit_query_path,
|
||||||
fmt("h=%s&ofs=%d", tip, ofs-cnt)));
|
ofs - cnt);
|
||||||
html("'>[prev]</a> ");
|
html(" ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((commit = get_revision(&rev)) != NULL) {
|
if ((commit = get_revision(&rev)) != NULL) {
|
||||||
html(" <a href='");
|
cgit_log_link("[next]", NULL, NULL, cgit_query_head,
|
||||||
html(cgit_pageurl(cgit_query_repo, "log",
|
cgit_query_sha1, cgit_query_path,
|
||||||
fmt("h=%s&ofs=%d", tip, ofs+cnt)));
|
ofs + cnt);
|
||||||
html("'>[next]</a> ");
|
|
||||||
}
|
}
|
||||||
html("</div>");
|
html("</div>");
|
||||||
}
|
}
|
||||||
|
@ -44,15 +44,19 @@ static void print_modtime(struct repoinfo *repo)
|
|||||||
|
|
||||||
void cgit_print_repolist(struct cacheitem *item)
|
void cgit_print_repolist(struct cacheitem *item)
|
||||||
{
|
{
|
||||||
int i;
|
int i, columns = 4;
|
||||||
char *last_group = NULL;
|
char *last_group = NULL;
|
||||||
|
|
||||||
|
if (cgit_enable_index_links)
|
||||||
|
columns++;
|
||||||
|
|
||||||
cgit_print_docstart(cgit_root_title, item);
|
cgit_print_docstart(cgit_root_title, item);
|
||||||
cgit_print_pageheader(cgit_root_title, 0);
|
cgit_print_pageheader(cgit_root_title, 0);
|
||||||
|
|
||||||
html("<table class='list nowrap'>");
|
html("<table class='list nowrap'>");
|
||||||
if (cgit_index_header) {
|
if (cgit_index_header) {
|
||||||
html("<tr class='nohover'><td colspan='5' class='include-block'>");
|
htmlf("<tr class='nohover'><td colspan='%d' class='include-block'>",
|
||||||
|
columns);
|
||||||
html_include(cgit_index_header);
|
html_include(cgit_index_header);
|
||||||
html("</td></tr>");
|
html("</td></tr>");
|
||||||
}
|
}
|
||||||
@ -60,8 +64,10 @@ void cgit_print_repolist(struct cacheitem *item)
|
|||||||
"<th class='left'>Name</th>"
|
"<th class='left'>Name</th>"
|
||||||
"<th class='left'>Description</th>"
|
"<th class='left'>Description</th>"
|
||||||
"<th class='left'>Owner</th>"
|
"<th class='left'>Owner</th>"
|
||||||
"<th class='left'>Idle</th>"
|
"<th class='left'>Idle</th>");
|
||||||
"<th>Links</th></tr>\n");
|
if (cgit_enable_index_links)
|
||||||
|
html("<th>Links</th>");
|
||||||
|
html("</tr>\n");
|
||||||
|
|
||||||
for (i=0; i<cgit_repolist.count; i++) {
|
for (i=0; i<cgit_repolist.count; i++) {
|
||||||
cgit_repo = &cgit_repolist.repos[i];
|
cgit_repo = &cgit_repolist.repos[i];
|
||||||
@ -69,7 +75,8 @@ void cgit_print_repolist(struct cacheitem *item)
|
|||||||
(last_group != NULL && cgit_repo->group == NULL) ||
|
(last_group != NULL && cgit_repo->group == NULL) ||
|
||||||
(last_group != NULL && cgit_repo->group != NULL &&
|
(last_group != NULL && cgit_repo->group != NULL &&
|
||||||
strcmp(cgit_repo->group, last_group))) {
|
strcmp(cgit_repo->group, last_group))) {
|
||||||
html("<tr class='nohover'><td colspan='4' class='repogroup'>");
|
htmlf("<tr class='nohover'><td colspan='%d' class='repogroup'>",
|
||||||
|
columns);
|
||||||
html_txt(cgit_repo->group);
|
html_txt(cgit_repo->group);
|
||||||
html("</td></tr>");
|
html("</td></tr>");
|
||||||
last_group = cgit_repo->group;
|
last_group = cgit_repo->group;
|
||||||
@ -85,13 +92,17 @@ void cgit_print_repolist(struct cacheitem *item)
|
|||||||
html_txt(cgit_repo->owner);
|
html_txt(cgit_repo->owner);
|
||||||
html("</td><td>");
|
html("</td><td>");
|
||||||
print_modtime(cgit_repo);
|
print_modtime(cgit_repo);
|
||||||
html("</td><td>");
|
html("</td>");
|
||||||
html_link_open(cgit_repourl(cgit_repo->url),
|
if (cgit_enable_index_links) {
|
||||||
"Summary", "button");
|
html("<td>");
|
||||||
html("S</a>");
|
html_link_open(cgit_repourl(cgit_repo->url),
|
||||||
cgit_log_link("L", "Log", "button", NULL, NULL, NULL);
|
NULL, "button");
|
||||||
cgit_tree_link("F", "Files", "button", NULL, NULL, NULL);
|
html("summary</a>");
|
||||||
html("</td></tr>\n");
|
cgit_log_link("log", NULL, "button", NULL, NULL, NULL, 0);
|
||||||
|
cgit_tree_link("tree", NULL, "button", NULL, NULL, NULL);
|
||||||
|
html("</td>");
|
||||||
|
}
|
||||||
|
html("</tr>\n");
|
||||||
}
|
}
|
||||||
html("</table>");
|
html("</table>");
|
||||||
cgit_print_docend();
|
cgit_print_docend();
|
||||||
|
71
ui-shared.c
71
ui-shared.c
@ -111,20 +111,24 @@ static char *repolink(char *title, char *class, char *page, char *head,
|
|||||||
html_attr(cgit_repo->url);
|
html_attr(cgit_repo->url);
|
||||||
if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/')
|
if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/')
|
||||||
html("/");
|
html("/");
|
||||||
html(page);
|
if (page) {
|
||||||
html("/");
|
html(page);
|
||||||
if (path)
|
html("/");
|
||||||
html_attr(path);
|
if (path)
|
||||||
|
html_attr(path);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
html(cgit_script_name);
|
html(cgit_script_name);
|
||||||
html("?url=");
|
html("?url=");
|
||||||
html_attr(cgit_repo->url);
|
html_attr(cgit_repo->url);
|
||||||
if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/')
|
if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/')
|
||||||
html("/");
|
html("/");
|
||||||
html(page);
|
if (page) {
|
||||||
html("/");
|
html(page);
|
||||||
if (path)
|
html("/");
|
||||||
html_attr(path);
|
if (path)
|
||||||
|
html_attr(path);
|
||||||
|
}
|
||||||
delim = "&";
|
delim = "&";
|
||||||
}
|
}
|
||||||
if (head && strcmp(head, cgit_repo->defbranch)) {
|
if (head && strcmp(head, cgit_repo->defbranch)) {
|
||||||
@ -159,9 +163,25 @@ void cgit_tree_link(char *name, char *title, char *class, char *head,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void cgit_log_link(char *name, char *title, char *class, char *head,
|
void cgit_log_link(char *name, char *title, char *class, char *head,
|
||||||
char *rev, char *path)
|
char *rev, char *path, int ofs)
|
||||||
{
|
{
|
||||||
reporevlink("log", name, title, class, head, rev, path);
|
char *delim;
|
||||||
|
|
||||||
|
delim = repolink(title, class, "log", head, path);
|
||||||
|
if (rev && strcmp(rev, cgit_query_head)) {
|
||||||
|
html(delim);
|
||||||
|
html("id=");
|
||||||
|
html_attr(rev);
|
||||||
|
delim = "&";
|
||||||
|
}
|
||||||
|
if (ofs > 0) {
|
||||||
|
html(delim);
|
||||||
|
html("ofs=");
|
||||||
|
htmlf("%d", ofs);
|
||||||
|
}
|
||||||
|
html("'>");
|
||||||
|
html_txt(name);
|
||||||
|
html("</a>");
|
||||||
}
|
}
|
||||||
|
|
||||||
void cgit_commit_link(char *name, char *title, char *class, char *head,
|
void cgit_commit_link(char *name, char *title, char *class, char *head,
|
||||||
@ -279,19 +299,38 @@ void cgit_print_docend()
|
|||||||
void cgit_print_pageheader(char *title, int show_search)
|
void cgit_print_pageheader(char *title, int show_search)
|
||||||
{
|
{
|
||||||
html("<table id='layout'>");
|
html("<table id='layout'>");
|
||||||
html("<tr><td id='header'>");
|
html("<tr><td id='header'><a href='");
|
||||||
html(cgit_root_title);
|
html_attr(cgit_rooturl());
|
||||||
html("</td><td id='logo'>");
|
html("'>");
|
||||||
|
html_txt(cgit_root_title);
|
||||||
|
html("</a></td><td id='logo'>");
|
||||||
html("<a href='");
|
html("<a href='");
|
||||||
html_attr(cgit_logo_link);
|
html_attr(cgit_logo_link);
|
||||||
htmlf("'><img src='%s' alt='logo'/></a>", cgit_logo);
|
htmlf("'><img src='%s' alt='logo'/></a>", cgit_logo);
|
||||||
html("</td></tr>");
|
html("</td></tr>");
|
||||||
html("<tr><td id='crumb'>");
|
html("<tr><td id='crumb'>");
|
||||||
htmlf("<a href='%s'>root</a>", cgit_rooturl());
|
|
||||||
if (cgit_query_repo) {
|
if (cgit_query_repo) {
|
||||||
htmlf(" : <a href='%s'>", cgit_repourl(cgit_repo->url));
|
|
||||||
html_txt(cgit_repo->name);
|
html_txt(cgit_repo->name);
|
||||||
htmlf("</a> : %s", title);
|
html(" (");
|
||||||
|
html_txt(cgit_query_head);
|
||||||
|
html(") : ");
|
||||||
|
reporevlink(NULL, "summary", NULL, NULL, cgit_query_head,
|
||||||
|
NULL, NULL);
|
||||||
|
html(" ");
|
||||||
|
cgit_log_link("log", NULL, NULL, cgit_query_head,
|
||||||
|
cgit_query_sha1, cgit_query_path, 0);
|
||||||
|
html(" ");
|
||||||
|
cgit_tree_link("tree", NULL, NULL, cgit_query_head,
|
||||||
|
cgit_query_sha1, NULL);
|
||||||
|
html(" ");
|
||||||
|
cgit_commit_link("commit", NULL, NULL, cgit_query_head,
|
||||||
|
cgit_query_sha1);
|
||||||
|
html(" ");
|
||||||
|
cgit_diff_link("diff", NULL, NULL, cgit_query_head,
|
||||||
|
cgit_query_sha1, cgit_query_sha2,
|
||||||
|
cgit_query_path);
|
||||||
|
} else {
|
||||||
|
html_txt("Index of repositories");
|
||||||
}
|
}
|
||||||
html("</td>");
|
html("</td>");
|
||||||
html("<td id='search'>");
|
html("<td id='search'>");
|
||||||
|
@ -27,7 +27,7 @@ static int cgit_print_branch_cb(const char *refname, const unsigned char *sha1,
|
|||||||
if (commit && !parse_commit(commit)){
|
if (commit && !parse_commit(commit)){
|
||||||
info = cgit_parse_commit(commit);
|
info = cgit_parse_commit(commit);
|
||||||
html("<tr><td>");
|
html("<tr><td>");
|
||||||
cgit_log_link(ref, NULL, NULL, ref, NULL, NULL);
|
cgit_log_link(ref, NULL, NULL, ref, NULL, NULL, 0);
|
||||||
html("</td><td>");
|
html("</td><td>");
|
||||||
cgit_print_age(commit->date, -1, NULL);
|
cgit_print_age(commit->date, -1, NULL);
|
||||||
html("</td><td>");
|
html("</td><td>");
|
||||||
|
@ -92,8 +92,8 @@ static int ls_item(const unsigned char *sha1, const char *base, int baselen,
|
|||||||
htmlf("</td><td class='ls-size'>%li</td>", size);
|
htmlf("</td><td class='ls-size'>%li</td>", size);
|
||||||
|
|
||||||
html("<td>");
|
html("<td>");
|
||||||
cgit_log_link("L", "Log", "button", cgit_query_head, curr_rev,
|
cgit_log_link("log", NULL, "button", cgit_query_head, curr_rev,
|
||||||
fullpath);
|
fullpath, 0);
|
||||||
html("</td></tr>\n");
|
html("</td></tr>\n");
|
||||||
free(name);
|
free(name);
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user