diff options
| author | Lars Hjemli <hjemli@gmail.com> | 2006-12-09 15:18:17 +0100 | 
|---|---|---|
| committer | Lars Hjemli <hjemli@gmail.com> | 2006-12-09 15:18:17 +0100 | 
| commit | 0d169ada2ba81210ab1191a5f2212662e90db77e (patch) | |
| tree | 402b54583db269323ebb28e5fbf2075c4c1b3d85 /config.c | |
| download | cgit-0d169ada2ba81210ab1191a5f2212662e90db77e.tar.gz cgit-0d169ada2ba81210ab1191a5f2212662e90db77e.tar.bz2 cgit-0d169ada2ba81210ab1191a5f2212662e90db77e.zip | |
Import cgit prototype from git tree
This enables basic cgit functionality, using libgit.a and xdiff/lib.a from
git + a custom "git.h" + openssl for sha1 routines.
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to 'config.c')
| -rw-r--r-- | config.c | 73 | 
1 files changed, 73 insertions, 0 deletions
| diff --git a/config.c b/config.c new file mode 100644 index 0000000..858ab69 --- /dev/null +++ b/config.c @@ -0,0 +1,73 @@ +#include "cgit.h" + +int next_char(FILE *f) +{ +	int c = fgetc(f); +	if (c=='\r') { +		c = fgetc(f); +		if (c!='\n') { +			ungetc(c, f); +			c = '\r'; +		} +	} +	return c; +} + +void skip_line(FILE *f) +{ +	int c; + +	while((c=next_char(f)) && c!='\n' && c!=EOF) +		; +} + +int read_config_line(FILE *f, char *line, const char **value, int bufsize) +{ +	int i = 0, isname = 0; + +	*value = NULL; +	while(i<bufsize-1) { +		int c = next_char(f); +		if (!isname && (c=='#' || c==';')) { +			skip_line(f); +			continue; +		} +		if (!isname && isblank(c)) +			continue; + +		if (c=='=' && !*value) { +			line[i] = 0; +			*value = &line[i+1]; +		} else if (c=='\n' && !isname) { +			i = 0; +			continue; +		} else if (c=='\n' || c==EOF) { +			line[i] = 0; +			break; +		} else { +			line[i]=c; +		} +		isname = 1; +		i++; +	} +	line[i+1] = 0; +	return i; +} + +int cgit_read_config(const char *filename, configfn fn) +{ +	int ret = 0, len; +	char line[256]; +	const char *value; +	FILE *f = fopen(filename, "r"); + +	if (!f) +		return -1; + +	while(len = read_config_line(f, line, &value, sizeof(line))) +		(*fn)(line, value); + +	fclose(f); +	return ret; +} + | 
