summaryrefslogtreecommitdiffstatshomepage
path: root/ui-patch.c
Commit message (Expand)AuthorAge
* Introduce noplainemail option to hide email adresses from spambotsMartin Szulecki2009-08-08
* Handle binary files in diffsLars Hjemli2009-01-31
* ui-patch: whitespace changes in the patch generation codeTomas Carnecky2008-12-30
* Added `local-time` option to cgitrcStefan Naewe2008-08-01
* Merge branch 'lh/cleanup'Lars Hjemli2008-04-08
|\
| * Add ui-shared.hLars Hjemli2008-03-24
| * Remove obsolete cacheitem parameter to ui-functionsLars Hjemli2008-03-24
| * Add struct cgit_page to cgit_contextLars Hjemli2008-03-24
| * Introduce html.hLars Hjemli2008-03-18
| * Introduce struct cgit_contextLars Hjemli2008-02-16
* | Fix segfault in patch view for root commitLars Hjemli2008-03-17
|/
* Check for NULL-subject in patch viewLars Hjemli2008-01-10
* Add plain patch viewLars Hjemli2007-12-11
148' href='#n148'>148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
/* html.c: helper functions for html output
 *
 * Copyright (C) 2006 Lars Hjemli
 *
 * Licensed under GNU General Public License v2
 *   (see COPYING for full license text)
 */

#include "cgit.h"

char *fmt(const char *format, ...)
{
	static char buf[8][1024];
	static int bufidx;
	int len;
	va_list args;

	bufidx++;
	bufidx &= 7;

	va_start(args, format);
	len = vsnprintf(buf[bufidx], sizeof(buf[bufidx]), format, args);
	va_end(args);
	if (len>sizeof(buf[bufidx]))
		die("[html.c] string truncated: %s", format);
	return buf[bufidx];
}

void html(const char *txt)
{
	write(htmlfd, txt, strlen(txt));
}

void htmlf(const char *format, ...)
{
	static char buf[65536];
	va_list args;

	va_start(args, format);
	vsnprintf(buf, sizeof(buf), format, args);
	va_end(args);
	html(buf);
}

void html_txt(char *txt)
{
	char *t = txt;
	while(t && *t){
		int c = *t;
		if (c=='<' || c=='>' || c=='&') {
			*t = '\0';
			html(txt);
			*t = c;
			if (c=='>')
				html("&gt;");
			else if (c=='<')
				html("&lt;");
			else if (c=='&')
				html("&amp;");
			txt = t+1;
		}
		t++;
	}
	if (t!=txt)
		html(txt);
}

void html_ntxt(int len, char *txt)
{
	char *t = txt;
	while(t && *t && len--){
		int c = *t;
		if (c=='<' || c=='>' || c=='&') {
			*t = '\0';
			html(txt);
			*t = c;
			if (c=='>')
				html("&gt;");
			else if (c=='<')
				html("&lt;");
			else if (c=='&')
				html("&amp;");
			txt = t+1;
		}
		t++;
	}
	if (t!=txt) {
		char c = *t;
		*t = '\0';
		html(txt);
		*t = c;
	}
	if (len<0)
		html("...");
}

void html_attr(char *txt)
{
	char *t = txt;
	while(t && *t){
		int c = *t;
		if (c=='<' || c=='>' || c=='\'') {
			*t = '\0';
			html(txt);
			*t = c;
			if (c=='>')
				html("&gt;");
			else if (c=='<')
				html("&lt;");
			else if (c=='\'')
				html("&quote;");
			txt = t+1;
		}
		t++;
	}
	if (t!=txt)
		html(txt);
}

void html_hidden(char *name, char *value)
{
	html("<input type='hidden' name='");
	html_attr(name);
	html("' value='");
	html_attr(value);
	html("'/>");
}

void html_link_open(char *url, char *title, char *class)
{
	html("<a href='");
	html_attr(url);
	if (title) {
		html("' title='");
		html_attr(title);
	}
	if (class) {
		html("' class='");
		html_attr(class);
	}
	html("'>");
}

void html_link_close(void)
{
	html("</a>");
}

void html_fileperm(unsigned short mode)
{
	htmlf("%c%c%c", (mode & 4 ? 'r' : '-'), 
	      (mode & 2 ? 'w' : '-'), (mode & 1 ? 'x' : '-'));
}

void html_filemode(unsigned short mode)
{
	if (S_ISDIR(mode))
		html("d");
	else if (S_ISLNK(mode))
		html("l");
	else if (S_ISGITLINK(mode))
		html("m");
	else
		html("-");
	html_fileperm(mode >> 6);
	html_fileperm(mode >> 3);
	html_fileperm(mode);
}

int html_include(const char *filename)
{
	FILE *f;
	char buf[4096];
	size_t len;

	if (!(f = fopen(filename, "r")))
		return -1;
	while((len = fread(buf, 1, 4096, f)) > 0)
		write(htmlfd, buf, len);
	fclose(f);
	return 0;
}